diff --git a/home/.chezmoiscripts/run_before_52_pi_extensions.sh.tmpl b/home/.chezmoiscripts/run_before_52_pi_extensions.sh.tmpl index 83ec7888..aadf53a6 100644 --- a/home/.chezmoiscripts/run_before_52_pi_extensions.sh.tmpl +++ b/home/.chezmoiscripts/run_before_52_pi_extensions.sh.tmpl @@ -73,6 +73,7 @@ NODE target_dependency="${starship_dir}/node_modules/${dependency}" [[ -e ${target_dependency} ]] && continue [[ -d ${source_dependency} ]] || { printf 'Pi-starship dependency is missing after install: %s\n' "${dependency}" >&2; exit 1; } + mkdir -p "$(dirname "${target_dependency}")" cp -R "${source_dependency}" "${target_dependency}" done diff --git a/home/dot_local/share/private_pi-extensions/REVIEW.md b/home/dot_local/share/private_pi-extensions/REVIEW.md index 7d903e33..431cd44a 100644 --- a/home/dot_local/share/private_pi-extensions/REVIEW.md +++ b/home/dot_local/share/private_pi-extensions/REVIEW.md @@ -32,41 +32,72 @@ inside `~/.local/share/pi-extensions`; chezmoi owns `current` and its builds. ## Scope And Limits -The approved baseline is only `pi-ask-user@0.14.0`, -`@narumitw/pi-starship@0.52.2`, `@tintinweb/pi-subagents@0.18.0`, and -`pi-web-search@1.3.1` on the current Linux host with Pi 0.84.2, -`pi-local.json`, and the `nono-pi` launcher. -It accepts the expected terminal-rendering risk and that the subagents run -in-process with Pi's environment and Nono-authorized authority. Upstream -defaults keep transcripts and scheduling enabled; transcripts use Pi's private -`/tmp/pi-$UID` directory, and project schedules, optional memory, and explicit -worktree mode can write Pi or Git state. The installer is portable to macOS, -but macOS requires a separate review and approval before activation. Re-review -after changing any package, Pi, operating system, Nono profile, or launcher. - -`pi-web-search@1.3.1` is approved from npm registry tarball integrity -`sha512-FBmGupWahqLU+uMSDLy+As7zn/4oiHGxC/MPtGuzOZNHEJw8ACJvCsZhyflprBJB31m0WIa4iiRKtbARRByaZg==`, -signed with npm key `SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U`, and source commit -`118b3eee3f5900cef3141745109a300315630592`. It registers `web_search` and -Gemini-only `url_context`; it reads Pi's configured provider credentials and -sends user queries and supplied public URLs to OpenAI, Anthropic, or Gemini. -It also reads the optional `~/.pi/agent/web-search.json` model selection file -and resolves Google grounding redirects. No lifecycle script, binary, native -or WASM component, or direct production dependency is present. It relies on -Pi-provided peers including `typebox`; its Pi peer minimum is 0.80.3. - -`@narumitw/pi-starship@0.52.2` is approved from npm registry tarball integrity -`sha512-HabpICSacpZ5fSuNU+Yip8FtI0rwhQ9idphj+ucshGexT6ZGRNFHtPudksiuRtzGEFsBD0OOOzh/53NIUOsDqA==`, -signed with npm key `SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U`, and -SLSA provenance for source commit `d1879fd073ff1bbe9ef6570f42974a926ccecb57`. -It replaces Pi's footer and uses its palette-free built-in default unless the -user explicitly saves `~/.pi/agent/pi-starship.toml`; it never reads -`~/.config/starship.toml`. Its default does not enable the optional -GitHub-CLI-backed pull-request module. The locked production closure adds -`@narumitw/pi-tui-kit@0.58.2`, `smol-toml@1.8.0`, and `yaml@2.9.0`; the -`yaml` CLI is present but not invoked. The package has a build-only `prepack` -script, which the installer does not run. No native or WASM component is -present. +The approved baseline is only `pi-ask-user@0.15.0`, +`@narumitw/pi-starship@0.55.0`, `@tintinweb/pi-subagents@0.19.0`, and +`pi-web-search@1.4.0` on the current Linux host with Pi 0.85.0, +`pi-local.json`, and the `nono-pi` launcher. All four registry artifacts are +signed with npm key +`SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U`. + +The exact 13-package production closure matches the physical install by path, +name, and version. Every package has registry integrity and a valid registry +signature; eight have verified SLSA attestations. `npm audit` reports zero +known vulnerabilities. No install lifecycle script, native addon, executable +object, WASM payload, non-registry source, or missing integrity is present. +Only `nanoid` and `yaml` expose binaries, and no extension invokes them. + +`@narumitw/pi-starship@0.55.0` is approved at integrity +`sha512-jxZfRtDMJHZvCHZg9Sa2tPTAhOBjZsGSTsHPijuoc8BKzpkMJsSc88fQVo0ya4MMSCa/QD9pWFSy03ptEGS08g==` +with SLSA provenance for source commit +`f6b9711f6e208d632703a03282717e63f2223710`. Its locked runtime dependencies +are `@narumitw/pi-tui-kit@0.59.0`, `smol-toml@1.8.0`, and `yaml@2.9.0`; +pi-tui-kit is now hoisted to the install root, and the installer copies all +three into pi-starship's package and generated-chunk module roots. The update +adds provider aliases, thinking styles, prompt-state and terminal-capability +handling, plus a manually invoked configuration skill whose guarded helper can +atomically write `pi-starship.toml`. Its existing optional GitHub module can +invoke authenticated `gh`; the default configuration does not enable it. + +`@tintinweb/pi-subagents@0.19.0` is approved at integrity +`sha512-DZsU33Urfb9dhEsJmsmpx0dayIHMYUbxng6AA7B6+bIgspNcTckcSnQRsbrv+QCS7jVKYJTzHIT/j1SU2B/nVQ==` +and source commit `4f572eaa04c09d3dbc16e4a5f13a16b295e84e14`. npm publishes no provenance, +but all shipped source matched that commit and a clean build reproduced all +generated files. Its new `typebox@1.3.28` dependency validates workflow JSON +Schema and is distinct from retained `@sinclair/typebox@0.34.52`; the exact +version is signed, provenance-verified, scriptless, binless, and pure JS/TS. +The new default-on workflow tool runs model-authored scripts in a determinism +boundary, not a security sandbox. Workflows can launch many subagents, read +Nono-readable script paths, persist scripts and journals, and run gate commands +through `sh -c`. These capabilities and the existing transcript, scheduling, +memory, process, worktree, environment, and Pi/Git state authority are accepted +only inside the current Nono-confined single-user workflow. Pi 0.85.0 satisfies +the package's `>=0.84.0` Pi peer floor. + +`pi-ask-user@0.15.0` is approved at integrity +`sha512-wmgcHUSGptAS+u+9AT4Fbjxo+iclOXERDym9m/VeX7pDcVs5vwloSKP+BcQ96beuxMEVEhFVydPkXzoYmIvpVQ==` +and source tag commit `705fdc60eaea5b9588f3aa6a6cb6a577516b17af`. npm publishes neither +provenance nor `gitHead`, but all seven signed-artifact files matched that +immutable source. It has no production dependency, lifecycle script, binary, +native code, or WASM. The update adds context-expansion preferences, TypeBox +shim compatibility, and keyboard repeat handling, and reduces answer data sent +to other extensions unless `PI_ASK_USER_EMIT_FULL_EVENTS=true` is set. + +`pi-web-search@1.4.0` is approved at integrity +`sha512-PzOeHhadVvMgg3pJ942fT80u6lkud5KLCfYfhf+WChCFl9N1eYAXHZ/FZG7HsLl4ZXylX4iUD3gn8TuJVBrXBQ==` +and source commit `83ac115e87bce29cf4c93af329b94ce5c306eaa8`; all seven artifact files match +source, but npm publishes no provenance. It has no production dependency, +lifecycle script, binary, native code, or WASM. In addition to the existing +OpenAI, Anthropic, and Gemini search paths, it adds Azure OpenAI Responses and +validated GitHub Copilot Enterprise routing and displays collapsed tool results. +It reads Pi's provider credentials and optional web-search configuration and +sends user queries or supplied public URLs to the selected provider. Pi 0.85.0 +satisfies its `>=0.80.3` peer floor. + +The installer requires Bash 4 or newer; macOS also requires a separate review +and approval before activation. Re-review after changing any package, Pi, +operating system, Nono profile, or launcher. Registry signatures and exact +artifact/source matches establish identity, not benign intent; missing +provenance and unsigned source commits remain evidence limitations. The lock and review establish the identity of downloaded artifacts; they do not prove an extension is benign. Extensions execute inside Pi with Pi's authority. diff --git a/home/dot_local/share/private_pi-extensions/package-lock.json b/home/dot_local/share/private_pi-extensions/package-lock.json index bcdb15d2..cc015fd3 100644 --- a/home/dot_local/share/private_pi-extensions/package-lock.json +++ b/home/dot_local/share/private_pi-extensions/package-lock.json @@ -6,19 +6,19 @@ "": { "name": "pi-extensions", "dependencies": { - "@narumitw/pi-starship": "0.52.2", - "@tintinweb/pi-subagents": "0.18.2", - "pi-ask-user": "0.14.0", - "pi-web-search": "1.3.1" + "@narumitw/pi-starship": "0.55.0", + "@tintinweb/pi-subagents": "0.19.0", + "pi-ask-user": "0.15.0", + "pi-web-search": "1.4.0" } }, "node_modules/@narumitw/pi-starship": { - "version": "0.52.2", - "resolved": "https://registry.npmjs.org/@narumitw/pi-starship/-/pi-starship-0.52.2.tgz", - "integrity": "sha512-HabpICSacpZ5fSuNU+Yip8FtI0rwhQ9idphj+ucshGexT6ZGRNFHtPudksiuRtzGEFsBD0OOOzh/53NIUOsDqA==", + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@narumitw/pi-starship/-/pi-starship-0.55.0.tgz", + "integrity": "sha512-jxZfRtDMJHZvCHZg9Sa2tPTAhOBjZsGSTsHPijuoc8BKzpkMJsSc88fQVo0ya4MMSCa/QD9pWFSy03ptEGS08g==", "license": "MIT", "dependencies": { - "@narumitw/pi-tui-kit": "^0.58.0", + "@narumitw/pi-tui-kit": "^0.59.0", "smol-toml": "^1.8.0", "yaml": "^2.9.0" }, @@ -27,10 +27,10 @@ "@earendil-works/pi-tui": "*" } }, - "node_modules/@narumitw/pi-starship/node_modules/@narumitw/pi-tui-kit": { - "version": "0.58.2", - "resolved": "https://registry.npmjs.org/@narumitw/pi-tui-kit/-/pi-tui-kit-0.58.2.tgz", - "integrity": "sha512-p72n08ADbuAgUejyMhjsk7CyG1Gk+MVjceqaZUzOUu5h6LZi2ctxp6SLsgPbxnUcmWDYjNEhIX8oSy62e/gyDg==", + "node_modules/@narumitw/pi-tui-kit": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@narumitw/pi-tui-kit/-/pi-tui-kit-0.59.0.tgz", + "integrity": "sha512-KBbOcciJD+HVbeduUwBUiSy2AehMGYeOwiRPXvac5tcjuh3SDoQ+7qsNPt2s/ku6exJKZp0GYtAVsiu5ySddmA==", "license": "MIT", "dependencies": { "grok-mermaid": "0.2.3", @@ -48,19 +48,20 @@ "license": "MIT" }, "node_modules/@tintinweb/pi-subagents": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@tintinweb/pi-subagents/-/pi-subagents-0.18.2.tgz", - "integrity": "sha512-VzAD6flKPLs2A1WMu6ovAH+icyAVFVFLv9YJ04+8eWLusDLMElNMG5UjnAvnUV7G+VX4z7w4eBiW5QW7RV7miw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@tintinweb/pi-subagents/-/pi-subagents-0.19.0.tgz", + "integrity": "sha512-DZsU33Urfb9dhEsJmsmpx0dayIHMYUbxng6AA7B6+bIgspNcTckcSnQRsbrv+QCS7jVKYJTzHIT/j1SU2B/nVQ==", "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.34.49", "croner": "^10.0.1", - "nanoid": "^5.1.16" + "nanoid": "^5.1.16", + "typebox": "^1.3.7" }, "peerDependencies": { - "@earendil-works/pi-ai": ">=0.81.0", - "@earendil-works/pi-coding-agent": ">=0.81.0", - "@earendil-works/pi-tui": ">=0.81.0" + "@earendil-works/pi-ai": ">=0.84.0", + "@earendil-works/pi-coding-agent": ">=0.84.0", + "@earendil-works/pi-tui": ">=0.84.0" } }, "node_modules/croner": { @@ -119,9 +120,9 @@ } }, "node_modules/pi-ask-user": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/pi-ask-user/-/pi-ask-user-0.14.0.tgz", - "integrity": "sha512-XKP01z1ly0v6r2ttC9dd3HWv2dmxGIxPRMBhPh2pv3vBWqQ1kZ65n98vW29uZTHvkwPHeTIkdQ06ZoWd5c4GlQ==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/pi-ask-user/-/pi-ask-user-0.15.0.tgz", + "integrity": "sha512-wmgcHUSGptAS+u+9AT4Fbjxo+iclOXERDym9m/VeX7pDcVs5vwloSKP+BcQ96beuxMEVEhFVydPkXzoYmIvpVQ==", "license": "MIT", "peerDependencies": { "@earendil-works/pi-coding-agent": ">=0.74.0", @@ -130,13 +131,14 @@ } }, "node_modules/pi-web-search": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pi-web-search/-/pi-web-search-1.3.1.tgz", - "integrity": "sha512-FBmGupWahqLU+uMSDLy+As7zn/4oiHGxC/MPtGuzOZNHEJw8ACJvCsZhyflprBJB31m0WIa4iiRKtbARRByaZg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pi-web-search/-/pi-web-search-1.4.0.tgz", + "integrity": "sha512-PzOeHhadVvMgg3pJ942fT80u6lkud5KLCfYfhf+WChCFl9N1eYAXHZ/FZG7HsLl4ZXylX4iUD3gn8TuJVBrXBQ==", "license": "MIT", "peerDependencies": { "@earendil-works/pi-ai": ">=0.80.3", "@earendil-works/pi-coding-agent": ">=0.80.3", + "@earendil-works/pi-tui": "*", "typebox": "*" } }, @@ -152,6 +154,12 @@ "url": "https://github.com/sponsors/cyyynthia" } }, + "node_modules/typebox": { + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.3.28.tgz", + "integrity": "sha512-5hTNlwzKj7BPPqhT91TPa4fK9bh/ZOei7mzweMpNidwLTxtduXHgr/OAbwx4mRW8aKFYu1I8fT1+0+PQtst1/g==", + "license": "MIT" + }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", diff --git a/home/dot_local/share/private_pi-extensions/package.json b/home/dot_local/share/private_pi-extensions/package.json index f6ab1adc..8e69e0f0 100644 --- a/home/dot_local/share/private_pi-extensions/package.json +++ b/home/dot_local/share/private_pi-extensions/package.json @@ -2,9 +2,9 @@ "name": "pi-extensions", "private": true, "dependencies": { - "@narumitw/pi-starship": "0.52.2", - "pi-ask-user": "0.14.0", - "pi-web-search": "1.3.1", - "@tintinweb/pi-subagents": "0.18.2" + "@narumitw/pi-starship": "0.55.0", + "pi-ask-user": "0.15.0", + "pi-web-search": "1.4.0", + "@tintinweb/pi-subagents": "0.19.0" } } diff --git a/scripts/test-pi-extension-supply-chain.sh b/scripts/test-pi-extension-supply-chain.sh index e7a9012e..3e3154b6 100755 --- a/scripts/test-pi-extension-supply-chain.sh +++ b/scripts/test-pi-extension-supply-chain.sh @@ -89,8 +89,7 @@ assert.equal(profile.extends, 'pi'); assert.ok(profile.filesystem.read.includes(root)); assert.ok(!profile.filesystem.allow.includes(root)); assert.ok(profile.filesystem.read.includes('/proc')); -assert.ok(profile.filesystem.read.includes(`${process.env.HOME_DIR}/.config/mise`)); -assert.ok(profile.filesystem.read_file.includes(`${process.env.HOME_DIR}/.config/agents/AGENTS.md`)); +assert.ok(profile.filesystem.read.includes(`${process.env.HOME_DIR}/.config`)); assert.ok(profile.filesystem.allow.includes(`${process.env.HOME_DIR}/.npm`)); assert.ok(profile.filesystem.allow.includes('/tmp/pi-$UID')); assert.ok(!profile.filesystem.allow.includes('/tmp')); @@ -310,9 +309,9 @@ case "$1" in while IFS= read -r package; do mkdir -p "${prefix}/node_modules/${package}" done <"${PI_EXTENSION_PACKAGES_FILE}" - mkdir -p "${prefix}/node_modules/@narumitw/pi-starship/node_modules/@narumitw/pi-tui-kit" "${prefix}/node_modules/smol-toml" "${prefix}/node_modules/yaml" + mkdir -p "${prefix}/node_modules/@narumitw/pi-tui-kit" "${prefix}/node_modules/smol-toml" "${prefix}/node_modules/yaml" cat >"${prefix}/node_modules/@narumitw/pi-starship/package.json" <<'JSON' -{"dependencies":{"@narumitw/pi-tui-kit":"^0.58.0","smol-toml":"^1.8.0","yaml":"^2.9.0"}} +{"dependencies":{"@narumitw/pi-tui-kit":"^0.59.0","smol-toml":"^1.8.0","yaml":"^2.9.0"}} JSON mkdir -p "${prefix}/node_modules/@narumitw/pi-starship/dist/chunks" cat >"${prefix}/node_modules/@narumitw/pi-starship/dist/chunks/chunk-test.js" <<'JS' @@ -338,7 +337,7 @@ PI_EXTENSION_PACKAGES_FILE="${package_list}" HOME="${fixture_home}" PATH="${stub for package in "${extension_packages[@]}"; do [[ -d ${extensions_dir}/current/node_modules/${package} ]] || fail "current is missing ${package}" done -for dependency in smol-toml yaml; do +for dependency in @narumitw/pi-tui-kit smol-toml yaml; do target_dependency="${extensions_dir}/current/node_modules/@narumitw/pi-starship/node_modules/${dependency}" chunk_dependency="${extensions_dir}/current/node_modules/@narumitw/pi-starship/dist/chunks/node_modules/${dependency}" [[ -d ${target_dependency} && ! -L ${target_dependency} ]] || fail "pi-starship is missing copied ${dependency}"