gentle-pi 3.7.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -10
- package/assets/agents/gentle-ai-explore.md +13 -6
- package/assets/agents/gentle-ai-verify.md +27 -6
- package/assets/agents/gentle-ai-worker.md +13 -15
- 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 +75 -169
- package/assets/orchestrator-memory.md +12 -26
- package/assets/orchestrator-prompts.md +48 -0
- package/assets/orchestrator-skills.md +1 -1
- 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 +30 -38
- 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/assets/support/strict-tdd-verify.md +4 -266
- package/assets/support/strict-tdd.md +8 -360
- package/bin/engram-guard +9 -0
- package/bin/gentle-shell-install.mjs +302 -0
- package/bin/gentle-shell.mjs +956 -50
- 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/bundled-install.md +397 -0
- package/docs/delegated-verification.md +27 -4
- package/docs/gentle-agents-activity.md +537 -0
- package/docs/gentle-shell-uninstall.md +136 -0
- package/docs/gentle-shell.md +165 -51
- package/docs/install-wizard.md +2040 -0
- package/docs/native-authority-architecture.md +3 -3
- package/docs/permission-modes.md +82 -0
- package/docs/prompt-history.md +280 -0
- package/docs/readme-reference.md +364 -231
- package/docs/render-cache-performance.md +28 -0
- package/docs/sound-notifications-proposal.md +191 -0
- package/docs/sound-notifications.md +114 -0
- package/docs/telemetry.md +1 -1
- package/docs/yolo-mode.md +86 -0
- package/extensions/child-context.ts +35 -0
- package/extensions/child-safety.ts +25 -0
- package/extensions/codegraph-tools.ts +18 -5
- package/extensions/gentle-agents.ts +1093 -326
- package/extensions/gentle-ai.ts +1636 -890
- package/extensions/gentle-herdr-activity.ts +81 -0
- package/extensions/gentle-notifications.ts +104 -0
- package/extensions/gentle-shell.ts +1619 -136
- package/extensions/gentle-stats.ts +101 -0
- package/extensions/gentle-todo.ts +126 -20
- package/extensions/history/atomic-write.ts +38 -0
- package/extensions/history/hide-prompts.ts +183 -0
- package/extensions/history/index.ts +1424 -0
- package/extensions/history/load-shared-history.ts +39 -0
- package/extensions/history/selector-helpers.ts +538 -0
- package/extensions/history/session-scan.ts +233 -0
- package/extensions/history/store.ts +1119 -0
- package/extensions/nan-provider.ts +6 -0
- package/extensions/pi-pretty.ts +39 -3
- package/extensions/quiet-tools.ts +254 -92
- package/extensions/resume-hint.ts +60 -0
- package/extensions/skill-registry.ts +191 -58
- package/extensions/startup-banner.ts +71 -33
- package/lib/agent-assets.ts +604 -0
- package/lib/agent-home.ts +10 -1
- package/lib/agent-model-resolution.ts +80 -0
- package/lib/agent-profile-pin.ts +12 -0
- package/lib/agent-profiles.ts +13 -3
- package/lib/agents-completion-delivery.ts +11 -3
- package/lib/agents-message-delivery.ts +181 -0
- package/lib/agents-messaging.ts +1 -1
- package/lib/agents-protocol.ts +99 -0
- package/lib/agents-runner.ts +180 -107
- package/lib/agents-view.ts +26 -3
- package/lib/agents-widget.ts +16 -9
- package/lib/append-system-prompt.ts +21 -0
- package/lib/auto-permission-classifier.ts +280 -0
- package/lib/auto-permission-runtime.ts +268 -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 +220 -0
- package/lib/builtin-codemode-optout.ts +166 -0
- package/lib/card-content-policy.ts +85 -0
- package/lib/card-style-policy.ts +60 -0
- package/lib/child-context-files.ts +166 -0
- package/lib/child-package-injection.ts +62 -0
- package/lib/codemode-renderer.ts +195 -0
- package/lib/command-palette-catalog.ts +5 -10
- package/lib/command-palette.ts +25 -14
- package/lib/context-threshold.ts +26 -0
- package/lib/destructive-command-guard.ts +144 -0
- package/lib/gentle-ai-binary.ts +109 -4
- package/lib/gentle-ai-elapsed-store.ts +87 -0
- package/lib/gentle-ai-renderer.ts +196 -39
- package/lib/gentle-shell-bundled.ts +517 -0
- package/lib/gentle-shell-launcher.ts +89 -27
- package/lib/gentle-shell-resume-hint.ts +176 -0
- 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/history-capture-policy.ts +95 -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 +5 -1
- package/lib/nan-provider.ts +249 -0
- package/lib/native-review-cli.ts +242 -180
- 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-inference.ts +231 -0
- package/lib/odd-phase.ts +141 -0
- 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/overlay-repaint.ts +26 -0
- package/lib/permission-mode-policy.ts +59 -0
- package/lib/pi-tui-keys.ts +53 -0
- package/lib/review-candidate-view-owner.ts +73 -21
- package/lib/review-candidate-view.ts +115 -27
- 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-reminder-receipt.ts +48 -8
- package/lib/review-risk-assessment.ts +227 -56
- package/lib/review-sidebar-state.ts +224 -0
- 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 +527 -0
- package/lib/session-change-capture.ts +5 -4
- package/lib/session-changes.ts +27 -22
- package/lib/session-messaging-grants.ts +135 -0
- package/lib/session-profile-binding.ts +83 -0
- package/lib/session-profile-freeze.ts +266 -0
- package/lib/session-worktree-registry.ts +87 -9
- package/lib/shell-bar.ts +215 -30
- package/lib/shell-card.ts +287 -18
- package/lib/shell-changes-view.ts +42 -14
- package/lib/shell-changes.ts +86 -71
- package/lib/shell-prompt.ts +102 -6
- package/lib/shell-sidebar-layout.ts +83 -15
- package/lib/shell-sidebar.ts +15 -1
- package/lib/shell-todo.ts +84 -31
- package/lib/shell-usage-view.ts +9 -4
- package/lib/shell-usage.ts +70 -13
- package/lib/stats-collector.ts +381 -0
- package/lib/stats-view.ts +431 -0
- package/lib/status-timing-diagnostics.ts +201 -0
- package/lib/telemetry-trigger.ts +3 -1
- package/lib/theme-customization.ts +52 -0
- package/lib/vim-editor-adapter.ts +383 -0
- package/lib/vim-normal-engine.ts +154 -0
- package/lib/vim-operator-engine.ts +416 -0
- package/lib/vim-policy.ts +49 -0
- package/lib/vim-visual-engine.ts +107 -0
- package/lib/visual-customization-policy.ts +119 -0
- package/lib/visual-customize-view.ts +481 -0
- package/lib/visual-profiles.ts +228 -0
- package/lib/writer-surfaces.ts +162 -0
- package/lib/yolo-session-policy.ts +317 -0
- package/package.json +20 -8
- package/runtime/child-package-injection.mjs +63 -0
- package/runtime/gentle-ai-binary.mjs +109 -4
- package/runtime/gentle-shell-bundled.mjs +518 -0
- package/runtime/gentle-shell-launcher.mjs +87 -25
- package/runtime/gentle-shell-resume-hint.mjs +177 -0
- 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 +239 -177
- package/runtime/review-integration-v2.mjs +100 -22
- package/runtime/review-risk-assessment.mjs +225 -54
- 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 +8 -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 +83 -35
- 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/mirror-odd-routing.mjs +2 -2
- package/scripts/npm-pack-result.mjs +31 -0
- package/scripts/render-cache-performance-worker.mjs +205 -0
- package/scripts/render-cache-performance.mjs +115 -0
- package/scripts/run-test-suite.mjs +90 -0
- package/scripts/test-installer-acceptance.sh +161 -0
- package/scripts/test-packed-runner.mjs +54 -19
- package/scripts/types-baseline.json +2 -92
- package/scripts/verify-package-files.mjs +91 -38
- package/skills/branch-pr/SKILL.md +24 -52
- package/skills/chained-pr/SKILL.md +31 -15
- package/skills/chained-pr/references/chaining-details.md +31 -20
- package/skills/gentle-ai/SKILL.md +16 -21
- package/skills/issue-creation/SKILL.md +8 -2
- package/skills/issue-creation/references/delegated-workflow-actions.md +19 -0
- package/skills/work-unit-commits/SKILL.md +4 -3
- package/tests/agent-home.test.ts +56 -3
- package/tests/agent-model-resolution.test.ts +113 -0
- package/tests/agent-profiles.test.ts +30 -0
- package/tests/agent-risk-escalation.test.ts +123 -0
- package/tests/agents-completion-delivery.test.ts +17 -0
- package/tests/agents-fake-child.ts +2 -2
- package/tests/agents-message-delivery.test.ts +106 -0
- package/tests/agents-protocol.test.ts +97 -0
- package/tests/agents-queries.test.ts +9 -9
- package/tests/agents-runner-process.test.ts +31 -0
- package/tests/agents-runner.test.ts +467 -93
- package/tests/agents-view-thread-identity.test.ts +169 -0
- package/tests/agents-view.test.ts +8 -2
- package/tests/agents-widget.test.ts +154 -15
- package/tests/append-system-prompt-route.test.ts +160 -0
- package/tests/append-system-prompt.test.ts +46 -0
- package/tests/artifact-language.test.ts +19 -213
- package/tests/ask-user-question.test.ts +44 -1
- package/tests/asset-installation-runtime.test.ts +5 -16
- package/tests/auto-mode-invariants.test.ts +258 -0
- package/tests/auto-mode-sdk.test.ts +57 -0
- package/tests/auto-mode.test.ts +49 -0
- package/tests/auto-permission-classifier.test.ts +283 -0
- package/tests/auto-permission-runtime.test.ts +196 -0
- package/tests/autonomous-guard.test.ts +69 -1
- 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 +146 -0
- package/tests/branch-pr-skill.test.ts +43 -0
- 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 +87 -0
- package/tests/chained-pr-skill.test.ts +124 -0
- package/tests/child-codegraph-bootstrap.test.ts +74 -0
- package/tests/child-context-files.test.ts +255 -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 +94 -0
- package/tests/child-web-package.test.ts +224 -0
- package/tests/codegraph-tools.test.ts +35 -0
- package/tests/codemode-rendering.test.ts +596 -0
- package/tests/command-palette.test.ts +43 -7
- 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 -78
- package/tests/destructive-command-guard.test.ts +84 -0
- package/tests/devbinary/native-review-parity.devtest.ts +171 -3
- package/tests/devbinary/non-git-subagent-bootstrap.devtest.ts +193 -0
- package/tests/devbinary/pi-host-relay.devtest.ts +173 -3
- package/tests/engram-safety.test.ts +288 -0
- package/tests/fixtures/stats/sessions/--work-alpha--/2026-09-28T10-00-00-000Z_aaa.jsonl +7 -0
- package/tests/fixtures/stats/sessions/--work-alpha--/2026-09-29T23-00-00-000Z_bbb.jsonl +3 -0
- package/tests/fixtures/stats/sessions/--work-alpha--/2026-09-30T08-00-00-000Z_ddd.jsonl +2 -0
- package/tests/fixtures/stats/sessions/--work-alpha--/2026-09-30T09-00-00-000Z_eee.jsonl +3 -0
- package/tests/fixtures/stats/sessions/--work-alpha--/run-1/session.jsonl +2 -0
- package/tests/fixtures/stats/sessions/--work-beta--/2026-09-01T12-00-00-000Z_ccc.jsonl +2 -0
- package/tests/fixtures/stats/user-pi/sessions/--work-alpha--/2026-09-28T10-00-00-000Z_aaa.jsonl +2 -0
- package/tests/fixtures/stats/user-pi/sessions/--work-alpha--/2026-09-29T23-00-00-000Z_bbb.jsonl +4 -0
- package/tests/fixtures/stats/user-pi/sessions/--work-gamma--/2026-09-20T09-00-00-000Z_fff.jsonl +3 -0
- package/tests/generic-agent-tools.test.ts +69 -0
- package/tests/gentle-agents.test.ts +2804 -346
- package/tests/gentle-ai-binary-isolation.test.ts +135 -0
- package/tests/gentle-ai-binary.test.ts +21 -4
- 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-elapsed-store.test.ts +68 -0
- package/tests/gentle-ai-installer.test.ts +566 -62
- package/tests/gentle-ai-prompt-model-routing.test.ts +123 -0
- package/tests/gentle-ai-renderer.test.ts +493 -14
- package/tests/gentle-ai.test.ts +1427 -236
- package/tests/gentle-card-text.ts +2 -1
- package/tests/gentle-herdr-activity.test.ts +100 -0
- package/tests/gentle-notifications.test.ts +427 -0
- package/tests/gentle-shell-bin.test.ts +896 -115
- package/tests/gentle-shell-bundled.test.ts +1002 -0
- package/tests/gentle-shell-launcher.test.ts +333 -65
- package/tests/gentle-shell-resume-hint.test.ts +270 -0
- 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 +4216 -119
- package/tests/gentle-stats.test.ts +152 -0
- package/tests/gentle-theme.test.ts +4 -1
- package/tests/gentle-todo.test.ts +333 -10
- package/tests/herdr-activity.test.ts +243 -0
- package/tests/history-agent-home.test.ts +81 -0
- package/tests/history-atomic-write.test.ts +57 -0
- package/tests/history-capture-policy.test.ts +102 -0
- package/tests/history-child-guard.test.ts +70 -0
- package/tests/history-command-registration.test.ts +164 -0
- package/tests/history-dedupe-entries.test.ts +123 -0
- package/tests/history-delete-backfill.test.ts +190 -0
- package/tests/history-delete-confirm.test.ts +460 -0
- package/tests/history-dispatch.test.ts +180 -0
- package/tests/history-drain-hidden.test.ts +110 -0
- package/tests/history-drain-order.test.ts +98 -0
- package/tests/history-expanded-globals.test.ts +62 -0
- package/tests/history-gc.test.ts +832 -0
- package/tests/history-header-layout.test.ts +265 -0
- package/tests/history-hide-prompts.test.ts +275 -0
- package/tests/history-lazy-windowing.test.ts +508 -0
- package/tests/history-legacy-migrate-v2.test.ts +297 -0
- package/tests/history-load-shared-history.test.ts +53 -0
- package/tests/history-max-results-cap.test.ts +76 -0
- package/tests/history-multi-reader.test.ts +203 -0
- package/tests/history-off-path.test.ts +170 -0
- package/tests/history-openflow-integration.test.ts +173 -0
- package/tests/history-overlay-margin.test.ts +326 -0
- package/tests/history-preview-layout.test.ts +93 -0
- package/tests/history-registry.test.ts +143 -0
- package/tests/history-scope-delete.test.ts +411 -0
- package/tests/history-search-caret-keys.test.ts +142 -0
- package/tests/history-seed-bootstrap.test.ts +170 -0
- package/tests/history-seed-regen.test.ts +129 -0
- package/tests/history-selector-windowing.test.ts +94 -0
- package/tests/history-session-scan-directory.test.ts +87 -0
- package/tests/history-session-scan-extract.test.ts +583 -0
- package/tests/history-session-writer.test.ts +351 -0
- package/tests/history-store-paths.test.ts +79 -0
- package/tests/history-tombstone-exact.test.ts +139 -0
- package/tests/history-wheel-mouse.test.ts +242 -0
- package/tests/inprocess-reviewer.test.ts +49 -19
- 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 +2158 -0
- package/tests/installer-server.test.ts +1567 -0
- package/tests/installer-windows-bootstrap.test.ts +2410 -0
- package/tests/issue-creation-skill.test.ts +61 -0
- package/tests/jobs-view.test.ts +160 -0
- package/tests/main-channel-upgrade.test.ts +389 -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-authority.test.ts +16 -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 +481 -0
- package/tests/native-binary-gate.test.ts +2 -0
- package/tests/native-review-capability-contract.test.ts +13 -1
- package/tests/native-review-cli.test.ts +239 -118
- package/tests/native-review-consent.test.ts +2 -2
- package/tests/native-review-parity-runtime.test.ts +101 -4
- 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 +76 -0
- package/tests/odd-phase-inference.test.ts +213 -0
- package/tests/odd-phase-loader.test.ts +253 -0
- package/tests/odd-phase.test.ts +307 -0
- package/tests/odd-routing-canonical-ratchet.test.ts +60 -14
- package/tests/odd-routing-contract.test.ts +158 -50
- package/tests/orchestrator-budget.test.ts +43 -45
- 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 +8 -7
- 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/overlay-repaint.test.ts +74 -0
- package/tests/package-manifest.test.ts +344 -123
- package/tests/packed-runner-owned-path.test.ts +80 -0
- 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 +10 -18
- package/tests/pi-pretty.test.ts +56 -0
- package/tests/provider-defect-handoff.test.ts +7 -14
- package/tests/quiet-bash-runtime.test.ts +76 -0
- package/tests/quiet-tool-rendering.test.ts +569 -187
- package/tests/rdd-aware-verification-contract.test.ts +103 -40
- package/tests/rdd-status-line.test.ts +9 -4
- package/tests/render-cache-performance.test.ts +48 -0
- package/tests/resume-hint-extension.test.ts +122 -0
- package/tests/review-agent-end-preflight.test.ts +237 -21
- package/tests/review-candidate-owner-retry.test.ts +22 -1
- package/tests/review-candidate-view.test.ts +399 -12
- package/tests/review-contract-prompt.test.ts +138 -44
- package/tests/review-controller-lock-status.test.ts +0 -1
- package/tests/review-controller-native-recovery.test.ts +327 -17
- package/tests/review-controller-native-routing.test.ts +866 -6
- package/tests/review-controller-workspace-root.test.ts +206 -6
- 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 +342 -4
- package/tests/review-host-relay.test.ts +49 -2
- package/tests/review-integration-v2-forward.test.ts +221 -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 +14 -37
- 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-reminder-receipt.test.ts +47 -1
- package/tests/review-risk-assessment.test.ts +594 -26
- 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-sidebar-state.test.ts +402 -0
- package/tests/review-test-fixtures.ts +7 -1
- package/tests/review-transaction.test.ts +18 -1
- package/tests/run-test-suite.test.ts +202 -0
- package/tests/runtime-harness.mjs +186 -800
- package/tests/runtime-metrics-children.test.ts +16 -23
- package/tests/runtime-metrics-extension.test.ts +1 -1
- package/tests/runtime-metrics-native.test.ts +31 -1
- package/tests/selection-engine.test.ts +451 -0
- 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-messaging-grants.test.ts +255 -0
- package/tests/session-profile-binding.test.ts +163 -0
- package/tests/session-profile-freeze.test.ts +381 -0
- package/tests/session-subject-routing-contract.test.ts +34 -0
- package/tests/session-worktree-registry.test.ts +134 -2
- package/tests/shell-bar.test.ts +422 -1
- package/tests/shell-card.test.ts +353 -1
- package/tests/shell-changes-view.test.ts +135 -32
- package/tests/shell-changes.test.ts +61 -62
- package/tests/shell-prompt.test.ts +94 -2
- 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 +351 -22
- package/tests/shell-sidebar-scroll-benchmark.test.ts +255 -0
- package/tests/shell-todo.test.ts +207 -3
- package/tests/shell-usage-view.test.ts +28 -1
- package/tests/shell-usage.test.ts +108 -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 +357 -2
- package/tests/startup-banner.test.ts +246 -4
- package/tests/startup-home-repo.test.ts +170 -0
- package/tests/stats-collector.test.ts +195 -0
- package/tests/stats-view.test.ts +202 -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 +107 -20
- package/tests/test-strength-contract.test.ts +124 -0
- package/tests/theme-customization.test.ts +72 -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-host-resolution.test.ts +37 -0
- package/tests/vim-editor-adapter.test.ts +804 -0
- package/tests/vim-normal-engine.test.ts +101 -0
- package/tests/vim-operator-engine.test.ts +215 -0
- package/tests/vim-policy.test.ts +19 -0
- package/tests/vim-visual-engine.test.ts +52 -0
- package/tests/visual-customization-policy.test.ts +139 -0
- package/tests/visual-customize-view.test.ts +696 -0
- package/tests/visual-profiles.test.ts +87 -0
- package/tests/writer-edit-surface-scope.test.ts +59 -2
- package/tests/writer-surfaces.test.ts +199 -0
- package/tests/yolo-customize.test.ts +271 -0
- package/tests/yolo-mode-runtime.test.ts +188 -0
- package/tests/yolo-mode.test.ts +289 -0
- package/tests/yolo-session-policy.test.ts +59 -0
- package/themes/Gentle.json +2 -1
- package/themes/Gentleman-Cute.json +2 -1
- package/themes/Gentleman-Sexy.json +2 -1
- package/assets/agents/sdd-apply.md +0 -159
- package/assets/agents/sdd-archive.md +0 -228
- package/assets/agents/sdd-design.md +0 -49
- package/assets/agents/sdd-explore.md +0 -48
- package/assets/agents/sdd-init.md +0 -56
- package/assets/agents/sdd-onboard.md +0 -52
- package/assets/agents/sdd-proposal.md +0 -64
- package/assets/agents/sdd-remediate.md +0 -37
- package/assets/agents/sdd-research.md +0 -49
- package/assets/agents/sdd-spec.md +0 -192
- package/assets/agents/sdd-status.md +0 -54
- package/assets/agents/sdd-tasks.md +0 -108
- package/assets/agents/sdd-verify.md +0 -124
- package/assets/chains/sdd-full.chain.md +0 -83
- package/assets/chains/sdd-plan.chain.md +0 -56
- package/assets/chains/sdd-verify.chain.md +0 -43
- package/assets/sdd-orchestrator-workflow.md +0 -319
- package/assets/support/sdd-status-contract.md +0 -77
- package/docs/assets/diagrams/sdd-cycle.svg +0 -14
- package/extensions/sdd-init.ts +0 -816
- package/lib/openspec-deltas.ts +0 -156
- package/lib/sdd-preflight.ts +0 -1066
- package/lib/sdd-research-capabilities.ts +0 -94
- package/lib/sdd-status.ts +0 -26
- package/tests/fixtures/legacy/sdd-research-v2.5.0.md +0 -54
- package/tests/fixtures/native-review-cli/v2.1.3/bind-sdd.json +0 -25
- package/tests/fixtures/v0.10.7/assets/agents/sdd-apply.md +0 -132
- package/tests/openspec-deltas.test.ts +0 -209
- package/tests/sdd-agent-tools.test.ts +0 -156
- package/tests/sdd-archive-replay.test.ts +0 -82
- package/tests/sdd-classical-continuation.test.ts +0 -74
- package/tests/sdd-execution-routing-contract.test.ts +0 -44
- package/tests/sdd-managed-runtime-settlement.test.ts +0 -155
- package/tests/sdd-native-managed-uptake.test.ts +0 -243
- package/tests/sdd-no-attempts-contract.test.ts +0 -15
- package/tests/sdd-odd-integration.test.ts +0 -33
- package/tests/sdd-optional-research.test.ts +0 -124
- package/tests/sdd-planning-routing-contract.test.ts +0 -45
- package/tests/sdd-preflight-rpc-input.test.ts +0 -125
- package/tests/sdd-preflight.test.ts +0 -541
- package/tests/sdd-research-capabilities.test.ts +0 -114
- package/tests/sdd-research-live.test.ts +0 -241
- package/tests/sdd-selection-transport.test.ts +0 -653
- package/tests/sdd-status.test.ts +0 -9
- package/tests/sdd-task-truth.test.ts +0 -43
- /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,302 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn as spawnChild } from "node:child_process";
|
|
3
|
+
import * as fsPromises from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join, posix, resolve, win32 } from "node:path";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
import { collectInventory, planPreflight, pnpmGlobalBin, requirements } from "../scripts/installer-preflight.mjs";
|
|
8
|
+
import { createProbes, hostAdapters, userEnvironment } from "../scripts/installer-probes.mjs";
|
|
9
|
+
import { acquireGo } from "../scripts/installer-downloads.mjs";
|
|
10
|
+
import { childEnvironment, goFirstEnvironment, lookPath, packageNativeGentleAi, pnpmInvocation, runStandardInstall, upgradeInvocation } from "../scripts/installer-runner.mjs";
|
|
11
|
+
import { createInstallerServer } from "../scripts/installer-server.mjs";
|
|
12
|
+
import { configHome, mainChannelAdapter, ownerManager, removeGlobalShell, runUpgrade } from "../scripts/main-channel.mjs";
|
|
13
|
+
import { ensureWindowsPnpmHome, windowsWizardEnvironment } from "../scripts/installer-windows.mjs";
|
|
14
|
+
import { pathEntryPlan, prefixLayout, prefixRoot } from "../scripts/bundled-install.mjs";
|
|
15
|
+
import { DISTRIBUTION_RELEASES, bundledGate, bundledPlan, fetchDistribution, migrationGate, runBundledInstall, windowsPathRegistry } from "../scripts/bundled-wizard.mjs";
|
|
16
|
+
|
|
17
|
+
// Browser installation wizard entry, started by the bootstrap with no argv.
|
|
18
|
+
// Thin wiring only: real probes and adapters, the standard or bundled runner
|
|
19
|
+
// and the loopback host. Exit 0 keeps the bootstrap's tools; nonzero removes them.
|
|
20
|
+
|
|
21
|
+
/** Fixed per-platform browser opener for a local file, spawned with shell:false; null when none. */
|
|
22
|
+
export function openerFor(platform, file, env) {
|
|
23
|
+
if (platform === "darwin") return { command: "/usr/bin/open", args: [file] };
|
|
24
|
+
if (platform === "linux") return { command: "xdg-open", args: [file] };
|
|
25
|
+
if (platform === "win32") {
|
|
26
|
+
// Absolute path: Windows would otherwise search the current directory first.
|
|
27
|
+
const systemRoot = env.SystemRoot ?? env.SYSTEMROOT;
|
|
28
|
+
if (typeof systemRoot !== "string" || !win32.isAbsolute(systemRoot)) return null;
|
|
29
|
+
return { command: win32.join(systemRoot, "System32", "rundll32.exe"), args: ["url.dll,FileProtocolHandler", file] };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function escapeHtml(value) {
|
|
35
|
+
return String(value).replace(/[&<>"']/g, (char) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[char]);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Static page that refreshes to the session URL; no script. */
|
|
39
|
+
export function redirectPage(url) {
|
|
40
|
+
const href = escapeHtml(url);
|
|
41
|
+
return [
|
|
42
|
+
"<!doctype html>",
|
|
43
|
+
'<meta charset="utf-8">',
|
|
44
|
+
'<meta name="referrer" content="no-referrer">',
|
|
45
|
+
`<meta http-equiv="refresh" content="0;url=${href}">`,
|
|
46
|
+
"<title>Gentle Shell installation wizard</title>",
|
|
47
|
+
`<p><a href="${href}">Continue to the Gentle Shell installation wizard</a></p>`,
|
|
48
|
+
"",
|
|
49
|
+
].join("\n");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Writes the redirect page into a fresh private directory (0700, file 0600)
|
|
54
|
+
* under tempDir, so the one-time code never appears in the opener's argv.
|
|
55
|
+
* remove() is idempotent and best effort: it deletes the file, then the directory.
|
|
56
|
+
*/
|
|
57
|
+
export async function writeRedirect(url, { tempDir = tmpdir(), files = fsPromises } = {}) {
|
|
58
|
+
const dir = await files.mkdtemp(join(tempDir, "gentle-shell-install-"));
|
|
59
|
+
const file = join(dir, "open.html");
|
|
60
|
+
let removed = false;
|
|
61
|
+
const remove = async () => {
|
|
62
|
+
if (removed) return;
|
|
63
|
+
removed = true;
|
|
64
|
+
await files.unlink(file).catch(() => {});
|
|
65
|
+
await files.rmdir(dir).catch(() => {});
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
await files.chmod(dir, 0o700);
|
|
69
|
+
await files.writeFile(file, redirectPage(url), { mode: 0o600, flag: "wx" });
|
|
70
|
+
} catch (error) {
|
|
71
|
+
await remove();
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
return { dir, file, remove };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Opens url through a private redirect file with the fixed opener (shell:false,
|
|
79
|
+
* detached). Returns { file, remove } while the file exists, or null when nothing
|
|
80
|
+
* was opened; a failed opener removes the file. The printed URL stays the fallback.
|
|
81
|
+
*/
|
|
82
|
+
export async function openBrowser(url, { platform = process.platform, env = process.env, tempDir = tmpdir(), files = fsPromises,
|
|
83
|
+
spawn = spawnChild } = {}) {
|
|
84
|
+
// Resolve the opener first so no file is written when there is none.
|
|
85
|
+
if (openerFor(platform, "", env) === null) return null;
|
|
86
|
+
let redirect;
|
|
87
|
+
try {
|
|
88
|
+
redirect = await writeRedirect(url, { tempDir, files });
|
|
89
|
+
} catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const opener = openerFor(platform, redirect.file, env);
|
|
93
|
+
try {
|
|
94
|
+
const child = spawn(opener.command, opener.args, { shell: false, detached: true, stdio: "ignore", windowsHide: true });
|
|
95
|
+
child.once("error", () => {
|
|
96
|
+
void redirect.remove();
|
|
97
|
+
});
|
|
98
|
+
child.unref();
|
|
99
|
+
} catch {
|
|
100
|
+
await redirect.remove();
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return { file: redirect.file, remove: redirect.remove };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** 0 only for a completed installation; blocked, failed or none is 1. */
|
|
107
|
+
export function exitCodeFor(outcome) {
|
|
108
|
+
return ["ready", "terminal-action-required"].includes(outcome?.outcome) ? 0 : 1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** The runner's environment: the user's real PATH, so a temporary bootstrap npm
|
|
112
|
+
* or node never counts as persistent and globalBin.onPath stays truthful. A
|
|
113
|
+
* POSIX bootstrap pnpm (passed only through PATH) comes first: the bootstrap
|
|
114
|
+
* acquired it because the user's pnpm is absent or incompatible, so the user's
|
|
115
|
+
* is never run. Windows passes pnpm through the GENTLE_INSTALL_PNPM_* handoff.
|
|
116
|
+
*/
|
|
117
|
+
export async function runnerEnvironment({ platform, env, fs }) {
|
|
118
|
+
const user = userEnvironment({ platform, env });
|
|
119
|
+
if (platform === "win32") return user;
|
|
120
|
+
const wizard = await pnpmInvocation(env, platform, fs);
|
|
121
|
+
if (wizard === null || wizard.prefix.length > 0 || (await pnpmInvocation(user, platform, fs))?.command === wizard.command) return user;
|
|
122
|
+
const rest = String(user.PATH ?? "").split(posix.delimiter).filter((entry) => entry.length > 0);
|
|
123
|
+
return { ...user, PATH: [posix.dirname(wizard.command), ...rest].join(posix.delimiter) };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** An update's children: with a private Windows PNPM_HOME, the runner children's
|
|
127
|
+
* environment (pnpm's folders, TEMP and TMP inside it); a pinned Go first on PATH.
|
|
128
|
+
*/
|
|
129
|
+
export function upgradeEnvironment({ platform, env, pnpmHome, goPath }) {
|
|
130
|
+
const globalBin = platform === "win32" && pnpmHome?.source === "private" ? pnpmGlobalBin({ platform, env }) : null;
|
|
131
|
+
const base = globalBin ? childEnvironment(env, platform, globalBin, { privateHome: true }) : env;
|
|
132
|
+
return goPath ? goFirstEnvironment(base, platform, goPath) : base;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** The wizard host's collectPlan and runInstall. Every plan starts from a fresh
|
|
136
|
+
* preflight. A new release installation whose release publishes the
|
|
137
|
+
* distribution assets gets the bundled plan (bundledGate) and the bundled
|
|
138
|
+
* runner; so does an existing Gentle Shell that a global pnpm or npm owns
|
|
139
|
+
* (migrationGate, S4), whose plan ends by removing that old package with its
|
|
140
|
+
* own manager. Everything else gets planPreflight and the standard runner, unchanged.
|
|
141
|
+
* `distributionBase`, `download` and `inventory` are trusted local overrides
|
|
142
|
+
* for tests and local checks.
|
|
143
|
+
*/
|
|
144
|
+
export function wizardHandlers({ platform, arch, env, run, fs, distributionBase = DISTRIBUTION_RELEASES, download, inventory: inventoryFor }) {
|
|
145
|
+
// Windows: the PNPM_HOME decision (S6) is made before any probe, on every
|
|
146
|
+
// preflight. The server re-collects right before an installation, so the
|
|
147
|
+
// installation uses the decision its consented plan was checked against.
|
|
148
|
+
let wizard = { env, pnpmHome: null };
|
|
149
|
+
// The distribution assets the latest bundled plan was made from; the bundled
|
|
150
|
+
// runner checks them against the consented plan's lockfile sha256.
|
|
151
|
+
let distribution = null;
|
|
152
|
+
const decide = () => (wizard = platform === "win32" ? windowsWizardEnvironment({ env }) : { env, pnpmHome: null });
|
|
153
|
+
// The user's own PATH and home (no bootstrap tools) for the bundled install's PATH entry and setup.
|
|
154
|
+
const user = userEnvironment({ platform, env });
|
|
155
|
+
const home = platform === "win32" ? env.USERPROFILE : env.HOME;
|
|
156
|
+
return {
|
|
157
|
+
collectPlan: async (channel) => {
|
|
158
|
+
const { env: wizardEnv, pnpmHome } = decide();
|
|
159
|
+
// Fresh probes every time: createProbes caches its global package listing.
|
|
160
|
+
const inventory = inventoryFor ? await inventoryFor(channel)
|
|
161
|
+
: await collectInventory({ platform, arch, probes: createProbes({ platform, env: wizardEnv, run, fs, pnpmHome }), pnpmHome });
|
|
162
|
+
// Only a new release installation, or one a global pnpm or npm owns, asks whether its release publishes the assets.
|
|
163
|
+
const owned = inventory.shell?.available === true && ["pnpm", "npm"].includes(inventory.shell.owner);
|
|
164
|
+
const assets = channel === "release" && (inventory.shell?.available === false || owned)
|
|
165
|
+
? await fetchDistribution({ version: requirements.shell, base: distributionBase, ...(download ? { download } : {}) }) : null;
|
|
166
|
+
const manager = migrationGate({ channel, inventory, distribution: assets, version: requirements.shell });
|
|
167
|
+
if (manager || bundledGate({ channel, inventory, distribution: assets, version: requirements.shell })) {
|
|
168
|
+
distribution = assets;
|
|
169
|
+
// The folder the claim will take (Windows may fall back to the profile), from read-only checks.
|
|
170
|
+
const layout = prefixLayout({ platform, env: user, home, root: prefixRoot({ platform, env: user }) });
|
|
171
|
+
return { inventory, plan: bundledPlan({ platform, distribution: assets, layout, path: pathEntryPlan(layout, { platform, env: user, home }),
|
|
172
|
+
...(manager ? { migrate: { manager, removal: "plan" } } : {}) }) };
|
|
173
|
+
}
|
|
174
|
+
return { inventory, plan: planPreflight(inventory, { channel }) };
|
|
175
|
+
},
|
|
176
|
+
runInstall: async (request, log) => {
|
|
177
|
+
const { env: wizardEnv, pnpmHome } = wizard;
|
|
178
|
+
// npm and pnpm as `gentle-shell upgrade` runs them (a pinned Go first on PATH when given). On
|
|
179
|
+
// Windows they are the bootstrap's handoff and run without cmd.exe.
|
|
180
|
+
const managers = (runnerEnv, goPath) => {
|
|
181
|
+
const upgradeEnv = upgradeEnvironment({ platform, env: runnerEnv, pnpmHome, goPath });
|
|
182
|
+
const invocation = upgradeInvocation({ platform, env: upgradeEnv, run, fs, handoff: true });
|
|
183
|
+
return {
|
|
184
|
+
fetch: globalThis.fetch,
|
|
185
|
+
fs: fsPromises,
|
|
186
|
+
which: (name) => lookPath(name, upgradeEnv, platform, fs),
|
|
187
|
+
...(invocation ? { invocation } : {}),
|
|
188
|
+
// stderrTail: a failed main build or extraction keeps its bounded stderr as the error's cause.
|
|
189
|
+
run: (command, argv, options = {}) => run(command, argv, { env: options.env ?? upgradeEnv, cwd: options.cwd, deadlineMs: options.deadlineMs ?? 20 * 60_000,
|
|
190
|
+
...(options.stderrTail === undefined ? {} : { stderrTail: options.stderrTail }) }),
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
const runnerContext = async () => {
|
|
194
|
+
const runnerEnv = await runnerEnvironment({ platform, env: wizardEnv, fs });
|
|
195
|
+
return { runnerEnv, ctx: { env: runnerEnv, home: runnerEnv.HOME ?? env.HOME ?? env.USERPROFILE } };
|
|
196
|
+
};
|
|
197
|
+
if (request?.plan?.bundled !== undefined) {
|
|
198
|
+
return runBundledInstall(request, { platform, arch, env: user, home, distribution, log,
|
|
199
|
+
...(platform === "win32" ? { registry: windowsPathRegistry(env) } : {}),
|
|
200
|
+
// The consented owner, found again now: the old gentle-pi is removed only with the manager that still owns it.
|
|
201
|
+
removeGlobal: async (name) => {
|
|
202
|
+
const located = await createProbes({ platform, env: wizardEnv, run, fs, pnpmHome }).locateShell();
|
|
203
|
+
if (located?.owner !== name) return false;
|
|
204
|
+
const { runnerEnv, ctx } = await runnerContext();
|
|
205
|
+
const adapters = managers(runnerEnv, null);
|
|
206
|
+
const manager = await ownerManager({ ctx, platform, packageRoot: located.root, adapters });
|
|
207
|
+
return manager.name === name && removeGlobalShell(manager, adapters.run);
|
|
208
|
+
} });
|
|
209
|
+
}
|
|
210
|
+
const { runnerEnv, ctx } = await runnerContext();
|
|
211
|
+
return runStandardInstall(request, {
|
|
212
|
+
platform,
|
|
213
|
+
nodePath: process.execPath,
|
|
214
|
+
env: runnerEnv,
|
|
215
|
+
run,
|
|
216
|
+
fs,
|
|
217
|
+
// An existing Gentle Shell: fresh probes find it, `gentle-shell upgrade`'s logic updates it.
|
|
218
|
+
locateShell: () => createProbes({ platform, env: wizardEnv, run, fs, pnpmHome }).locateShell(),
|
|
219
|
+
// An older Pi: fresh probes find it before its update and confirm it afterwards.
|
|
220
|
+
locatePi: () => createProbes({ platform, env: wizardEnv, run, fs, pnpmHome }).locatePi(),
|
|
221
|
+
// Only a plan with a private Windows PNPM_HOME: claimed, then walked again.
|
|
222
|
+
preparePnpmHome: (home) => ensureWindowsPnpmHome(home, runnerEnv),
|
|
223
|
+
// Only a plan that needs Go and found it missing, older or unchecked: verified go.dev
|
|
224
|
+
// bytes under <config home>/tools/go, used by path or child PATH only.
|
|
225
|
+
acquireGo: () => acquireGo({ root: join(configHome(ctx), "tools", "go"), platform, arch }),
|
|
226
|
+
// A pinned Go goes first on the PATH of the upgrade's children only.
|
|
227
|
+
upgradeShell: async ({ channel, packageRoot, currentVersion, goPath }) => (await runUpgrade({
|
|
228
|
+
args: ["--channel", channel],
|
|
229
|
+
ctx,
|
|
230
|
+
platform,
|
|
231
|
+
arch,
|
|
232
|
+
packageRoot,
|
|
233
|
+
currentVersion,
|
|
234
|
+
adapters: managers(runnerEnv, goPath),
|
|
235
|
+
out: () => {},
|
|
236
|
+
})) === 0,
|
|
237
|
+
verifyGentleAi: packageNativeGentleAi,
|
|
238
|
+
// Only a main plan uses it: network access and writes under ~/.pi/gentle-ai.
|
|
239
|
+
mainChannel: mainChannelAdapter({ fs: fsPromises }),
|
|
240
|
+
log,
|
|
241
|
+
});
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
async function main() {
|
|
247
|
+
const { platform, arch, env } = process;
|
|
248
|
+
const { run, fs } = hostAdapters();
|
|
249
|
+
// The redirect file is removed once the code is redeemed, or when the host closes.
|
|
250
|
+
let redeemed = false;
|
|
251
|
+
let redirect = null;
|
|
252
|
+
const host = createInstallerServer({
|
|
253
|
+
onRedeemed: () => {
|
|
254
|
+
redeemed = true;
|
|
255
|
+
void redirect?.remove();
|
|
256
|
+
},
|
|
257
|
+
assetsDir: fileURLToPath(new URL("../assets/install-wizard/", import.meta.url)),
|
|
258
|
+
...wizardHandlers({ platform, arch, env, run, fs }),
|
|
259
|
+
});
|
|
260
|
+
let started;
|
|
261
|
+
try {
|
|
262
|
+
started = await host.listen();
|
|
263
|
+
} catch {
|
|
264
|
+
console.error("The installation wizard could not start its local server. Nothing was installed.");
|
|
265
|
+
process.exitCode = 1;
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
console.log("Gentle Shell installation wizard");
|
|
269
|
+
console.log(`Open this link in your browser (it works once and expires in 2 minutes):\n ${started.url}`);
|
|
270
|
+
console.log("Press Ctrl+C to stop the wizard.");
|
|
271
|
+
|
|
272
|
+
let signalled = false;
|
|
273
|
+
const stop = () => {
|
|
274
|
+
signalled = true;
|
|
275
|
+
host.close("signal");
|
|
276
|
+
};
|
|
277
|
+
process.once("SIGINT", stop);
|
|
278
|
+
process.once("SIGTERM", stop);
|
|
279
|
+
const opening = openBrowser(started.url).then((opened) => {
|
|
280
|
+
redirect = opened;
|
|
281
|
+
// The printed URL may have been redeemed while the file was being written.
|
|
282
|
+
if (redeemed) void opened?.remove();
|
|
283
|
+
return opened;
|
|
284
|
+
});
|
|
285
|
+
const { reason, outcome } = await host.closed;
|
|
286
|
+
process.off("SIGINT", stop);
|
|
287
|
+
process.off("SIGTERM", stop);
|
|
288
|
+
await (await opening)?.remove();
|
|
289
|
+
const code = exitCodeFor(outcome);
|
|
290
|
+
if (outcome?.guidance) console.log(outcome.guidance);
|
|
291
|
+
else if (reason === "idle") console.log("The wizard closed after 30 minutes without activity. Nothing was installed.");
|
|
292
|
+
else console.log("The wizard closed without installing anything.");
|
|
293
|
+
if (signalled) process.exit(code);
|
|
294
|
+
process.exitCode = code;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
|
|
298
|
+
main().catch(() => {
|
|
299
|
+
console.error("The installation wizard stopped unexpectedly.");
|
|
300
|
+
process.exitCode = 1;
|
|
301
|
+
});
|
|
302
|
+
}
|