@herbertgao/pi-extensions 2026.9.19 → 2026.10.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 +14 -16
- package/THIRD_PARTY_NOTICES.md +29 -3
- package/node_modules/@herbertgao/pi-bark/README.md +39 -3
- package/node_modules/@herbertgao/pi-bark/package.json +1 -1
- package/node_modules/@herbertgao/pi-bark/src/index.ts +275 -15
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +85 -68
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +79 -62
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +116 -34
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +370 -118
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +6 -36
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/index.ts +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +31 -33
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +330 -360
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/index.ts +56 -108
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/session.ts +97 -15
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/subagent.ts +80 -45
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/flush-docked-bash.ts +36 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-layout.ts +229 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +521 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/mcp-chip.ts +136 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/startup-header.ts +92 -61
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +58 -38
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1127 -231
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +267 -262
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +38 -48
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +8 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +2 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +287 -114
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +15 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +18 -72
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +61 -26
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +303 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/ansi-utils.ts +25 -57
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-component.ts +125 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +227 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +136 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +151 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-inline.ts +324 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-layout.ts +762 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-limits.ts +152 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-palette.ts +410 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-parse.ts +535 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +4 -4
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +21 -3219
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-text.ts +44 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +568 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +103 -48
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +8 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +2 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +171 -196
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/mcp-title.ts +39 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{message-display.ts → tool/message-display.ts} +27 -93
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +429 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +259 -164
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{show-more-hint.ts → tool/show-more-hint.ts} +10 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +8 -26
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-color.ts +44 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +77 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/component-tree.ts +34 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +28 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +51 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +124 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/sgr-mouse.ts +70 -0
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +10 -8
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +1 -1
- package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +3 -2
- package/node_modules/@herbertgao/sol-pi/CONTRIBUTING.md +22 -0
- package/node_modules/@herbertgao/sol-pi/README.md +36 -17
- package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +10 -6
- package/node_modules/@herbertgao/sol-pi/agents-install.md +15 -12
- package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +24 -8
- package/node_modules/@herbertgao/sol-pi/docs/configuration.md +2 -2
- package/node_modules/@herbertgao/sol-pi/docs/star-history.md +18 -0
- package/node_modules/@herbertgao/sol-pi/package.json +4 -2
- package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +23 -4
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +32 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +3 -2
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +1 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +27 -7
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +137 -41
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +1 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +2 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/projection.ts +58 -0
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +28 -6
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +2 -1
- package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +15 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
- package/node_modules/@pi-plugins/fast-mode/README.md +7 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +7 -1
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/package.json +5 -5
- package/node_modules/pi-antigravity/README.md +3 -0
- package/node_modules/pi-antigravity/package.json +8 -8
- package/node_modules/pi-antigravity/src/auth/oauth.ts +6 -3
- package/node_modules/pi-antigravity/src/index.ts +114 -110
- package/node_modules/pi-antigravity/src/stream/stream.ts +1 -1
- package/node_modules/pi-antigravity/src/utils/util.ts +18 -1
- package/node_modules/pi-multi-account/CHANGELOG.md +20 -0
- package/node_modules/pi-multi-account/README.md +46 -8
- package/node_modules/pi-multi-account/config-file-transaction.ts +42 -0
- package/node_modules/pi-multi-account/index.ts +255 -269
- package/node_modules/pi-multi-account/model-pins.ts +36 -0
- package/node_modules/pi-multi-account/package.json +9 -7
- package/node_modules/pi-multi-account/slot-proxy-auth.ts +12 -2
- package/node_modules/pi-multi-account/slot-proxy.ts +27 -5
- package/node_modules/pi-web-access/CHANGELOG.md +17 -0
- package/node_modules/pi-web-access/README.md +6 -3
- package/node_modules/pi-web-access/brave-rate-limit.ts +170 -0
- package/node_modules/pi-web-access/brave.ts +28 -11
- package/node_modules/pi-web-access/dist/index.js +202 -33
- package/node_modules/pi-web-access/gemini-search.ts +2 -5
- package/node_modules/pi-web-access/index.ts +13 -7
- package/node_modules/pi-web-access/openai-search.ts +24 -10
- package/node_modules/pi-web-access/package.json +1 -1
- package/node_modules/pi-web-access/summary-review.ts +8 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/README.md +16 -12
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.d.ts +0 -5
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.js +2 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.d.ts +3 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.js +27 -15
- package/node_modules/{@herbertgao/resume-from/dist/adapters/codex → resume-from/dist/adapters/claude-code}/redaction.js +16 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.d.ts +2 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.js +1 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.d.ts +2 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.js +1 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/read.d.ts +16 -0
- package/node_modules/resume-from/dist/adapters/codex/read.js +723 -0
- package/node_modules/{@herbertgao/resume-from/dist/adapters/pi → resume-from/dist/adapters/codex}/redaction.js +16 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.d.ts +44 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.js +88 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.d.ts +5 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.js +10 -6
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from/dist/adapters/claude-code → resume-from/dist/adapters/pi}/redaction.js +16 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.d.ts +2 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.d.ts +1 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.js +4 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.js +31 -8
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.d.ts +1 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.js +1 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.d.ts +4 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.js +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.d.ts +8 -6
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.d.ts +10 -5
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/finder.d.ts +2 -1
- package/node_modules/resume-from/dist/import/discovery/finder.js +269 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.d.ts +3 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.js +3 -3
- package/node_modules/resume-from/dist/import/pipeline.d.ts +28 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/pipeline.js +31 -11
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.d.ts +2 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.js +9 -5
- package/node_modules/resume-from/dist/import/preview/warnings.d.ts +14 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/warnings.js +26 -20
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.js +12 -2
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.d.ts +9 -3
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.d.ts +4 -4
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.js +7 -4
- package/node_modules/resume-from/dist/platform/repo/reader.d.ts +3 -0
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/reader.js +60 -20
- package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.d.ts +8 -1
- package/node_modules/{@herbertgao/resume-from → resume-from}/package.json +19 -32
- package/node_modules/{@herbertgao/resume-from → resume-from}/shims/pi/extensions/resume-from.js +2 -2
- package/package.json +18 -22
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +0 -101
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.svg +0 -101
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/welcome.webp +0 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/render-utils.ts +0 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +0 -30
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +0 -12
- package/node_modules/@herbertgao/resume-from/dist/adapters/codex/read.js +0 -270
- package/node_modules/@herbertgao/resume-from/dist/import/discovery/finder.js +0 -129
- package/node_modules/@herbertgao/resume-from/dist/import/pipeline.d.ts +0 -17
- package/node_modules/@herbertgao/resume-from/dist/import/preview/warnings.d.ts +0 -11
- package/node_modules/@herbertgao/resume-from/dist/platform/repo/reader.d.ts +0 -8
- package/node_modules/pi-footer/CHANGELOG.md +0 -145
- package/node_modules/pi-footer/LICENSE +0 -21
- package/node_modules/pi-footer/README.md +0 -354
- package/node_modules/pi-footer/package.json +0 -68
- package/node_modules/pi-footer/src/cache.ts +0 -106
- package/node_modules/pi-footer/src/colors.ts +0 -237
- package/node_modules/pi-footer/src/config.ts +0 -202
- package/node_modules/pi-footer/src/event-widgets.ts +0 -41
- package/node_modules/pi-footer/src/extension-statuses.ts +0 -102
- package/node_modules/pi-footer/src/git.ts +0 -135
- package/node_modules/pi-footer/src/index.ts +0 -268
- package/node_modules/pi-footer/src/metrics.ts +0 -141
- package/node_modules/pi-footer/src/presets.ts +0 -383
- package/node_modules/pi-footer/src/render.ts +0 -114
- package/node_modules/pi-footer/src/separators.ts +0 -52
- package/node_modules/pi-footer/src/types.ts +0 -122
- package/node_modules/pi-footer/src/ui/color-level-confirm.ts +0 -22
- package/node_modules/pi-footer/src/ui/color-options.ts +0 -195
- package/node_modules/pi-footer/src/ui/config-lifecycle.ts +0 -61
- package/node_modules/pi-footer/src/ui/edit-colors.ts +0 -13
- package/node_modules/pi-footer/src/ui/events.ts +0 -35
- package/node_modules/pi-footer/src/ui/extension-status-picker.ts +0 -60
- package/node_modules/pi-footer/src/ui/extension-statuses.ts +0 -73
- package/node_modules/pi-footer/src/ui/fields.ts +0 -252
- package/node_modules/pi-footer/src/ui/global-menu.ts +0 -126
- package/node_modules/pi-footer/src/ui/helpers.ts +0 -44
- package/node_modules/pi-footer/src/ui/layout.ts +0 -17
- package/node_modules/pi-footer/src/ui/line-list.ts +0 -19
- package/node_modules/pi-footer/src/ui/model.ts +0 -64
- package/node_modules/pi-footer/src/ui/navigation.ts +0 -29
- package/node_modules/pi-footer/src/ui/option-edit.ts +0 -93
- package/node_modules/pi-footer/src/ui/overlay-render.ts +0 -103
- package/node_modules/pi-footer/src/ui/screen-context.ts +0 -18
- package/node_modules/pi-footer/src/ui/screen-controller.ts +0 -27
- package/node_modules/pi-footer/src/ui/screen-render.ts +0 -32
- package/node_modules/pi-footer/src/ui/screen-state.ts +0 -20
- package/node_modules/pi-footer/src/ui/screen.ts +0 -243
- package/node_modules/pi-footer/src/ui/screens/add-widget.ts +0 -92
- package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +0 -52
- package/node_modules/pi-footer/src/ui/screens/controller.ts +0 -12
- package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +0 -68
- package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +0 -115
- package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +0 -61
- package/node_modules/pi-footer/src/ui/screens/global.ts +0 -75
- package/node_modules/pi-footer/src/ui/screens/line-list.ts +0 -108
- package/node_modules/pi-footer/src/ui/screens/main.ts +0 -99
- package/node_modules/pi-footer/src/ui/screens/terminal.ts +0 -121
- package/node_modules/pi-footer/src/ui/screens/widget-list.ts +0 -154
- package/node_modules/pi-footer/src/ui/terminal-menu.ts +0 -32
- package/node_modules/pi-footer/src/ui/theme.ts +0 -48
- package/node_modules/pi-footer/src/ui/title-bar.ts +0 -100
- package/node_modules/pi-footer/src/ui/widget-actions.ts +0 -76
- package/node_modules/pi-footer/src/ui.ts +0 -66
- package/node_modules/pi-footer/src/widgets/context.ts +0 -28
- package/node_modules/pi-footer/src/widgets/core/active-tools.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/context-window.ts +0 -24
- package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +0 -19
- package/node_modules/pi-footer/src/widgets/core/cwd.ts +0 -108
- package/node_modules/pi-footer/src/widgets/core/event.ts +0 -34
- package/node_modules/pi-footer/src/widgets/core/external-status.ts +0 -102
- package/node_modules/pi-footer/src/widgets/core/model-provider.ts +0 -20
- package/node_modules/pi-footer/src/widgets/core/model.ts +0 -35
- package/node_modules/pi-footer/src/widgets/core/provider.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/session-name.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +0 -17
- package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/branch.ts +0 -81
- package/node_modules/pi-footer/src/widgets/git/clean.ts +0 -19
- package/node_modules/pi-footer/src/widgets/git/deletions.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/diff.ts +0 -38
- package/node_modules/pi-footer/src/widgets/git/insertions.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/remote.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/root.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/sha.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/staged.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/status.ts +0 -19
- package/node_modules/pi-footer/src/widgets/git/unstaged.ts +0 -17
- package/node_modules/pi-footer/src/widgets/git/untracked.ts +0 -17
- package/node_modules/pi-footer/src/widgets/instance.ts +0 -118
- package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +0 -18
- package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +0 -32
- package/node_modules/pi-footer/src/widgets/layout/separator.ts +0 -57
- package/node_modules/pi-footer/src/widgets/layout/spacer.ts +0 -31
- package/node_modules/pi-footer/src/widgets/options.ts +0 -122
- package/node_modules/pi-footer/src/widgets/project/runtime.ts +0 -361
- package/node_modules/pi-footer/src/widgets/registry.ts +0 -223
- package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/compactions.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/elapsed.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/last-activity.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/messages.ts +0 -19
- package/node_modules/pi-footer/src/widgets/session/session-id.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/session-start.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/tool-results.ts +0 -17
- package/node_modules/pi-footer/src/widgets/session/total-messages.ts +0 -19
- package/node_modules/pi-footer/src/widgets/session/total-time.ts +0 -18
- package/node_modules/pi-footer/src/widgets/session/user-messages.ts +0 -17
- package/node_modules/pi-footer/src/widgets/store.ts +0 -26
- package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +0 -55
- package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +0 -108
- package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +0 -26
- package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +0 -29
- package/node_modules/pi-footer/src/widgets/tokens/context.ts +0 -29
- package/node_modules/pi-footer/src/widgets/tokens/cost.ts +0 -51
- package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +0 -25
- package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +0 -25
- package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +0 -18
- package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +0 -20
- package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +0 -25
- package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +0 -18
- package/node_modules/pi-footer/src/widgets/types.ts +0 -181
- package/node_modules/pi-footer/src/widgets/utils/colors.ts +0 -11
- package/node_modules/pi-footer/src/widgets/utils/context.ts +0 -112
- package/node_modules/pi-footer/src/widgets/utils/session.ts +0 -19
- package/node_modules/pi-footer/src/widgets/utils/token-format.ts +0 -78
- /package/node_modules/{@herbertgao/resume-from → resume-from}/LICENSE +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/redaction.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/redaction.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/redaction.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.d.ts +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.js +0 -0
- /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-plugins/fast-mode",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "Fast service-tier extension for pi-agent.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fast",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"access": "public"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
39
|
-
"@earendil-works/pi-tui": "0.
|
|
38
|
+
"@earendil-works/pi-coding-agent": "0.99.1",
|
|
39
|
+
"@earendil-works/pi-tui": "0.99.1",
|
|
40
40
|
"@effect/platform-node": "4.0.0-rc.115",
|
|
41
41
|
"@types/node": "26.1.2",
|
|
42
42
|
"effect": "4.0.0-rc.115",
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"tsdown": "0.22.14",
|
|
46
46
|
"typescript": "7.0.2",
|
|
47
47
|
"@pi-plugins/fmt": "0.0.0",
|
|
48
|
-
"@pi-plugins/
|
|
48
|
+
"@pi-plugins/lint": "0.0.0",
|
|
49
49
|
"@pi-plugins/shared": "0.0.0",
|
|
50
|
-
"@pi-plugins/
|
|
50
|
+
"@pi-plugins/tsconfig": "0.0.0"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"@earendil-works/pi-coding-agent": "*",
|
|
@@ -174,6 +174,9 @@ All primary environment variables start with `ANTIGRAVITY_`. The legacy `NOAGY_`
|
|
|
174
174
|
| `ANTIGRAVITY_CLIENT_SECRET` | Use a custom Google OAuth client secret. Keep it out of source control and shell history. |
|
|
175
175
|
| `ANTIGRAVITY_NO_KEEPALIVE` | Set to `1` to skip the keep-alive connection pool. |
|
|
176
176
|
| `ANTIGRAVITY_NO_PREWARM` | Set to `1` to skip the TLS pre-warm request made on the first Antigravity request. |
|
|
177
|
+
| `ANTIGRAVITY_NO_EXTRA_TOOLS` | Set to `1` to stop registering the model-facing `google_search` and `generate_image` tools. The `/antigravity.search` and `/antigravity.image` commands stay available. |
|
|
178
|
+
| `ANTIGRAVITY_NO_SEARCH_TOOL` | Set to `1` to skip only the `google_search` tool, e.g. when another extension provides web search. |
|
|
179
|
+
| `ANTIGRAVITY_NO_IMAGE_TOOL` | Set to `1` to skip only the `generate_image` tool. |
|
|
177
180
|
|
|
178
181
|
By default, the provider tries `https://daily-cloudcode-pa.googleapis.com`, then the sandbox host, then `https://cloudcode-pa.googleapis.com`. Prefer the built-in OAuth client unless you have a reason to use your own credentials.
|
|
179
182
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-antigravity",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Personal Antigravity / Cloud Code Assist provider for Pi Coding Agent",
|
|
5
5
|
"author": "Rahul Arya",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"format": "prettier --write .",
|
|
40
40
|
"format:check": "prettier --check .",
|
|
41
41
|
"security-check": "node scripts/run-ts.mjs scripts/security-check.ts",
|
|
42
|
-
"test": "node scripts/run-ts.mjs scripts/test-model-routing.ts && node scripts/run-ts.mjs scripts/test-model-discovery.ts && node scripts/run-ts.mjs scripts/test-usage-formatter.ts && node scripts/run-ts.mjs scripts/test-stream-sse.ts && node scripts/run-ts.mjs scripts/test-stream-header-deadline.ts && node scripts/run-ts.mjs scripts/test-http-proxy.ts && node scripts/run-ts.mjs scripts/test-image-gen.ts && node scripts/run-ts.mjs scripts/test-transcript-context.ts && node scripts/run-ts.mjs scripts/test-accounts.ts && node scripts/run-ts.mjs scripts/test-search.ts",
|
|
42
|
+
"test": "node scripts/run-ts.mjs scripts/test-sanitize-text.ts && node scripts/run-ts.mjs scripts/test-model-routing.ts && node scripts/run-ts.mjs scripts/test-model-discovery.ts && node scripts/run-ts.mjs scripts/test-usage-formatter.ts && node scripts/run-ts.mjs scripts/test-stream-sse.ts && node scripts/run-ts.mjs scripts/test-stream-header-deadline.ts && node scripts/run-ts.mjs scripts/test-http-proxy.ts && node scripts/run-ts.mjs scripts/test-oauth-fetch.ts && node scripts/run-ts.mjs scripts/test-image-gen.ts && node scripts/run-ts.mjs scripts/test-transcript-context.ts && node scripts/run-ts.mjs scripts/test-accounts.ts && node scripts/run-ts.mjs scripts/test-search.ts && node scripts/run-ts.mjs scripts/test-extra-tools-toggle.ts",
|
|
43
43
|
"smoke:tools": "node scripts/run-ts.mjs scripts/smoke-tool-schema.ts",
|
|
44
44
|
"smoke:models": "node scripts/run-ts.mjs scripts/smoke-all-models.mjs",
|
|
45
45
|
"audit": "yarn npm audit --environment production --recursive && yarn npm audit --severity high --all --recursive",
|
|
@@ -55,18 +55,18 @@
|
|
|
55
55
|
"@earendil-works/pi-coding-agent": "*"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@earendil-works/pi-ai": "^0.
|
|
59
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
58
|
+
"@earendil-works/pi-ai": "^0.86.1",
|
|
59
|
+
"@earendil-works/pi-coding-agent": "^0.86.1",
|
|
60
60
|
"@eslint/js": "^10.0.1",
|
|
61
|
-
"@types/node": "^26.
|
|
62
|
-
"eslint": "^10.
|
|
61
|
+
"@types/node": "^26.6.2",
|
|
62
|
+
"eslint": "^10.11.0",
|
|
63
63
|
"eslint-config-prettier": "^10.1.8",
|
|
64
64
|
"globals": "^17.7.0",
|
|
65
|
-
"prettier": "^3.9.
|
|
65
|
+
"prettier": "^3.9.8",
|
|
66
66
|
"typescript": "^6.0.3",
|
|
67
67
|
"typescript-eslint": "^8.64.0"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"undici": "^8.
|
|
70
|
+
"undici": "^8.11.2"
|
|
71
71
|
}
|
|
72
72
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash, randomBytes } from "node:crypto";
|
|
2
2
|
import { createServer, type Server } from "node:http";
|
|
3
|
+
import { fetch as oauthFetch } from "undici";
|
|
3
4
|
import type { OAuthCredentials, OAuthLoginCallbacks } from "@earendil-works/pi-ai";
|
|
4
5
|
import { defaultProjectId, loadCodeAssist } from "../client/client.js";
|
|
5
6
|
import { escapeHtml, antigravityEnv } from "../utils/util.js";
|
|
@@ -74,7 +75,7 @@ function generatePKCE(): { verifier: string; challenge: string } {
|
|
|
74
75
|
|
|
75
76
|
async function getUserEmail(token: string): Promise<string | undefined> {
|
|
76
77
|
try {
|
|
77
|
-
const res = await
|
|
78
|
+
const res = await oauthFetch("https://www.googleapis.com/oauth2/v1/userinfo?alt=json", {
|
|
78
79
|
headers: { Authorization: `Bearer ${token}` },
|
|
79
80
|
});
|
|
80
81
|
if (!res.ok) return undefined;
|
|
@@ -348,7 +349,7 @@ export async function loginAntigravity(
|
|
|
348
349
|
});
|
|
349
350
|
if (returnedState !== state) throw new Error("OAuth state mismatch");
|
|
350
351
|
|
|
351
|
-
const tokenResponse = await
|
|
352
|
+
const tokenResponse = await oauthFetch(TOKEN_URL, {
|
|
352
353
|
method: "POST",
|
|
353
354
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
354
355
|
body: new URLSearchParams({
|
|
@@ -395,7 +396,9 @@ export async function loginAntigravity(
|
|
|
395
396
|
export async function refreshAntigravityToken(
|
|
396
397
|
credentials: OAuthCredentials,
|
|
397
398
|
): Promise<AntigravityOAuthCredentials> {
|
|
398
|
-
|
|
399
|
+
// SDK hosts may use Node 26 built-in fetch with a separate Undici dispatcher.
|
|
400
|
+
// Use Undici's fetch to keep response decompression on the same implementation.
|
|
401
|
+
const response = await oauthFetch(TOKEN_URL, {
|
|
399
402
|
method: "POST",
|
|
400
403
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
401
404
|
body: new URLSearchParams({
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
formatUsageSummary,
|
|
39
39
|
resolveApiKeyFromContext,
|
|
40
40
|
} from "./usage/index.js";
|
|
41
|
-
import { redactSecrets, maskEmail } from "./utils/index.js";
|
|
41
|
+
import { isExtraToolEnabled, redactSecrets, maskEmail } from "./utils/index.js";
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* Pi's interactive `notify` writes into the chat transcript. `console.log` in that
|
|
@@ -353,118 +353,122 @@ export default function (pi: ExtensionAPI): void {
|
|
|
353
353
|
},
|
|
354
354
|
});
|
|
355
355
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
Type.
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
Type.
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
cwd: ctx.cwd,
|
|
388
|
-
prompt: params.prompt,
|
|
389
|
-
aspectRatio: params.aspectRatio,
|
|
390
|
-
model: params.model,
|
|
391
|
-
path: params.path,
|
|
392
|
-
signal,
|
|
393
|
-
});
|
|
394
|
-
const notes = result.text.join(" ").trim();
|
|
395
|
-
return {
|
|
396
|
-
content: [
|
|
397
|
-
{
|
|
398
|
-
type: "text" as const,
|
|
399
|
-
text: `Saved image to ${result.savedPaths.join(", ")}${notes ? `. ${notes}` : ""}`,
|
|
400
|
-
},
|
|
401
|
-
...result.images.map((image) => ({
|
|
402
|
-
type: "image" as const,
|
|
403
|
-
data: image.data,
|
|
404
|
-
mimeType: image.mimeType,
|
|
405
|
-
})),
|
|
406
|
-
],
|
|
407
|
-
details: { model: result.model, savedPaths: result.savedPaths },
|
|
408
|
-
};
|
|
409
|
-
},
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
pi.registerTool({
|
|
413
|
-
name: "google_search",
|
|
414
|
-
label: "Google Search",
|
|
415
|
-
description:
|
|
416
|
-
"Search the web using Google Search via Antigravity Grounding powered by Gemini 3 Flash. Returns real-time web results with multi-angle deep search and source citations. Use this whenever current, real-time information or web research is needed.",
|
|
417
|
-
promptSnippet: "Real-time Google Search grounding via Antigravity (Gemini 3 Flash)",
|
|
418
|
-
promptGuidelines: [
|
|
419
|
-
"Use google_search when you need real-time, up-to-date web information, latest news, documentation, or fact checking.",
|
|
420
|
-
"Pass specific URLs into the urls array if you want the search engine to fetch and analyze specific pages.",
|
|
421
|
-
"Set instruction to provide special research directives from the lead agent (e.g. focus on issues, compare benchmarks, restrict time range).",
|
|
422
|
-
],
|
|
423
|
-
parameters: Type.Object({
|
|
424
|
-
query: Type.String({ description: "Search query or question." }),
|
|
425
|
-
instruction: Type.Optional(
|
|
426
|
-
Type.String({
|
|
427
|
-
description:
|
|
428
|
-
"Specific directive or focus from the lead agent (e.g., '重点关注英文社区近七天的讨论', 'focus on GitHub issues and benchmarks', 'ignore marketing announcements').",
|
|
429
|
-
}),
|
|
430
|
-
),
|
|
431
|
-
urls: Type.Optional(
|
|
432
|
-
Type.Array(Type.String(), {
|
|
433
|
-
description: "Optional specific URLs to fetch and analyze alongside the search.",
|
|
434
|
-
}),
|
|
435
|
-
),
|
|
436
|
-
thinking: Type.Optional(
|
|
437
|
-
Type.Boolean({
|
|
438
|
-
description: "Enable deeper thinking for complex analysis (default: false).",
|
|
439
|
-
}),
|
|
440
|
-
),
|
|
441
|
-
}),
|
|
442
|
-
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
443
|
-
const apiKey = await ctx.modelRegistry.getApiKeyForProvider("antigravity");
|
|
444
|
-
if (!apiKey) {
|
|
445
|
-
throw new Error("No Antigravity credentials. Run /login antigravity first.");
|
|
446
|
-
}
|
|
447
|
-
onUpdate?.({
|
|
448
|
-
content: [{ type: "text", text: `Searching Google for: "${params.query}"…` }],
|
|
449
|
-
details: {},
|
|
450
|
-
});
|
|
451
|
-
try {
|
|
452
|
-
const result = await executeAntigravitySearch({
|
|
356
|
+
if (isExtraToolEnabled("IMAGE")) {
|
|
357
|
+
pi.registerTool({
|
|
358
|
+
name: "generate_image",
|
|
359
|
+
label: "Generate image",
|
|
360
|
+
description:
|
|
361
|
+
"Generate an image via Antigravity using the signed-in Google account. Saves under .pi/generated-images/ unless path is set.",
|
|
362
|
+
promptSnippet: "Generate images via Antigravity OAuth (Gemini image models)",
|
|
363
|
+
promptGuidelines: [
|
|
364
|
+
"Use generate_image when the user asks to create, draw, or generate an image.",
|
|
365
|
+
],
|
|
366
|
+
parameters: Type.Object({
|
|
367
|
+
prompt: Type.String({ description: "Image description." }),
|
|
368
|
+
aspectRatio: Type.Optional(StringEnum(IMAGE_ASPECT_RATIOS)),
|
|
369
|
+
model: Type.Optional(
|
|
370
|
+
Type.String({
|
|
371
|
+
description: `Image model id. Default: ${DEFAULT_IMAGE_MODEL}.`,
|
|
372
|
+
}),
|
|
373
|
+
),
|
|
374
|
+
path: Type.Optional(
|
|
375
|
+
Type.String({
|
|
376
|
+
description: "Project-relative file or directory to save the image.",
|
|
377
|
+
}),
|
|
378
|
+
),
|
|
379
|
+
}),
|
|
380
|
+
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
381
|
+
const apiKey = await ctx.modelRegistry.getApiKeyForProvider("antigravity");
|
|
382
|
+
if (!apiKey) {
|
|
383
|
+
throw new Error("No Antigravity credentials. Run /login antigravity first.");
|
|
384
|
+
}
|
|
385
|
+
onUpdate?.({ content: [{ type: "text", text: "Generating image…" }], details: {} });
|
|
386
|
+
const result = await generateAntigravityImage({
|
|
453
387
|
apiKey,
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
388
|
+
cwd: ctx.cwd,
|
|
389
|
+
prompt: params.prompt,
|
|
390
|
+
aspectRatio: params.aspectRatio,
|
|
391
|
+
model: params.model,
|
|
392
|
+
path: params.path,
|
|
458
393
|
signal,
|
|
459
394
|
});
|
|
395
|
+
const notes = result.text.join(" ").trim();
|
|
460
396
|
return {
|
|
461
|
-
content: [
|
|
462
|
-
|
|
397
|
+
content: [
|
|
398
|
+
{
|
|
399
|
+
type: "text" as const,
|
|
400
|
+
text: `Saved image to ${result.savedPaths.join(", ")}${notes ? `. ${notes}` : ""}`,
|
|
401
|
+
},
|
|
402
|
+
...result.images.map((image) => ({
|
|
403
|
+
type: "image" as const,
|
|
404
|
+
data: image.data,
|
|
405
|
+
mimeType: image.mimeType,
|
|
406
|
+
})),
|
|
407
|
+
],
|
|
408
|
+
details: { model: result.model, savedPaths: result.savedPaths },
|
|
463
409
|
};
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
410
|
+
},
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
if (isExtraToolEnabled("SEARCH")) {
|
|
415
|
+
pi.registerTool({
|
|
416
|
+
name: "google_search",
|
|
417
|
+
label: "Google Search",
|
|
418
|
+
description:
|
|
419
|
+
"Search the web using Google Search via Antigravity Grounding powered by Gemini 3 Flash. Returns real-time web results with multi-angle deep search and source citations. Use this whenever current, real-time information or web research is needed.",
|
|
420
|
+
promptSnippet: "Real-time Google Search grounding via Antigravity (Gemini 3 Flash)",
|
|
421
|
+
promptGuidelines: [
|
|
422
|
+
"Use google_search when you need real-time, up-to-date web information, latest news, documentation, or fact checking.",
|
|
423
|
+
"Pass specific URLs into the urls array if you want the search engine to fetch and analyze specific pages.",
|
|
424
|
+
"Set instruction to provide special research directives from the lead agent (e.g. focus on issues, compare benchmarks, restrict time range).",
|
|
425
|
+
],
|
|
426
|
+
parameters: Type.Object({
|
|
427
|
+
query: Type.String({ description: "Search query or question." }),
|
|
428
|
+
instruction: Type.Optional(
|
|
429
|
+
Type.String({
|
|
430
|
+
description:
|
|
431
|
+
"Specific directive or focus from the lead agent (e.g., '重点关注英文社区近七天的讨论', 'focus on GitHub issues and benchmarks', 'ignore marketing announcements').",
|
|
432
|
+
}),
|
|
433
|
+
),
|
|
434
|
+
urls: Type.Optional(
|
|
435
|
+
Type.Array(Type.String(), {
|
|
436
|
+
description: "Optional specific URLs to fetch and analyze alongside the search.",
|
|
437
|
+
}),
|
|
438
|
+
),
|
|
439
|
+
thinking: Type.Optional(
|
|
440
|
+
Type.Boolean({
|
|
441
|
+
description: "Enable deeper thinking for complex analysis (default: false).",
|
|
442
|
+
}),
|
|
443
|
+
),
|
|
444
|
+
}),
|
|
445
|
+
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
446
|
+
const apiKey = await ctx.modelRegistry.getApiKeyForProvider("antigravity");
|
|
447
|
+
if (!apiKey) {
|
|
448
|
+
throw new Error("No Antigravity credentials. Run /login antigravity first.");
|
|
449
|
+
}
|
|
450
|
+
onUpdate?.({
|
|
451
|
+
content: [{ type: "text", text: `Searching Google for: "${params.query}"…` }],
|
|
452
|
+
details: {},
|
|
453
|
+
});
|
|
454
|
+
try {
|
|
455
|
+
const result = await executeAntigravitySearch({
|
|
456
|
+
apiKey,
|
|
457
|
+
query: params.query,
|
|
458
|
+
instruction: params.instruction,
|
|
459
|
+
urls: params.urls,
|
|
460
|
+
thinking: params.thinking,
|
|
461
|
+
signal,
|
|
462
|
+
});
|
|
463
|
+
return {
|
|
464
|
+
content: [{ type: "text", text: result }],
|
|
465
|
+
details: {},
|
|
466
|
+
};
|
|
467
|
+
} catch (error) {
|
|
468
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
469
|
+
throw new Error(redactSecrets(msg), { cause: error });
|
|
470
|
+
}
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
}
|
|
470
474
|
}
|
|
@@ -118,7 +118,7 @@ interface PiAiTranscriptModule {
|
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
function transcriptModule(): PiAiTranscriptModule {
|
|
121
|
-
return piAi
|
|
121
|
+
return piAi;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
function asSystemMessages(messages: Context["messages"] | undefined): SystemMessageLike[] {
|
|
@@ -5,6 +5,15 @@ export function antigravityEnv(name: string): string | undefined {
|
|
|
5
5
|
return process.env[`ANTIGRAVITY_${name}`] || process.env[`NOAGY_${name}`];
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Whether a model-facing extra tool (`google_search`, `generate_image`) is registered.
|
|
10
|
+
* `ANTIGRAVITY_NO_EXTRA_TOOLS=1` disables both; `ANTIGRAVITY_NO_SEARCH_TOOL=1` and
|
|
11
|
+
* `ANTIGRAVITY_NO_IMAGE_TOOL=1` disable one, e.g. to avoid clashing with another search provider.
|
|
12
|
+
*/
|
|
13
|
+
export function isExtraToolEnabled(tool: "SEARCH" | "IMAGE"): boolean {
|
|
14
|
+
return antigravityEnv("NO_EXTRA_TOOLS") !== "1" && antigravityEnv(`NO_${tool}_TOOL`) !== "1";
|
|
15
|
+
}
|
|
16
|
+
|
|
8
17
|
export function isRecord(value: unknown): value is Record<string, unknown> {
|
|
9
18
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
19
|
}
|
|
@@ -14,7 +23,15 @@ export function asString(value: unknown): string | undefined {
|
|
|
14
23
|
}
|
|
15
24
|
|
|
16
25
|
export function sanitizeText(text: unknown): string {
|
|
17
|
-
|
|
26
|
+
const str = String(text ?? "");
|
|
27
|
+
const toWellFormed = (str as unknown as { toWellFormed?: () => string }).toWellFormed;
|
|
28
|
+
if (typeof toWellFormed === "function") {
|
|
29
|
+
return toWellFormed.call(str);
|
|
30
|
+
}
|
|
31
|
+
return str.replace(
|
|
32
|
+
/(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF]))|(?:(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])/g,
|
|
33
|
+
"\uFFFD",
|
|
34
|
+
);
|
|
18
35
|
}
|
|
19
36
|
|
|
20
37
|
export function escapeHtml(text: string): string {
|
|
@@ -4,6 +4,26 @@ All notable changes to this project are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.24.0] — 2026-10-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Explicit `/multi-account pin provider/model`, `unpin provider-or-family` and `pins [list]` controls (#74). Pins persist one preference per account group across reload/restart, without changing Pi's foreground model, shared registry or startup defaults. Exact siblings, account availability and automatic quality bands still win; missing models remain saved but inactive. All extension config commands share locked field-scoped persistence, preserving concurrent unrelated settings. Pins reject busy, passive-child, closed or stale sessions and cannot authorize cheaper provider-only switching or automatic compaction. Thanks @MarsLuay for the feature request.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Refresh expired opaque Anthropic OAuth tokens from their stored expiry before proxy forwarding, including seconds/milliseconds and flight slack; the newly persisted token reaches upstream (#79, thanks @unclejobs-ai).
|
|
17
|
+
- Numbered Anthropic OAuth slots publish a non-secret OAuth-shaped placeholder so Pi retains native Claude identity, `x-app: cli`, tool-name serialization and response mapping (#80). Real credentials stay parent-side. Sidecar-backed legacy publications migrate safely; production refresh writes privately under the auth lock without briefly unshadowing a child. API-key aliases remain direct and real API keys are not rewritten. Parent/native and real `pi --no-extensions` tool roundtrips run against deterministic fake upstreams. A disconnected proxy caller aborts its upstream request without poisoning provider health. These tests do not claim live Anthropic acceptance.
|
|
18
|
+
- Normalize only Codex `/images/generations` and `/images/edits` routes by adding exactly one `/codex` segment, preserving queries and leaving chat, usage, authentication and similar paths unchanged (#83, thanks @hantusk). Live image-service success remains outside the deterministic routing guarantee.
|
|
19
|
+
- Update the Anthropic billing-header Claude Code version to **2.1.288**, the current registry version at release preparation (#81).
|
|
20
|
+
|
|
21
|
+
### Compatibility
|
|
22
|
+
|
|
23
|
+
- Bind OAuth, catalogs and transports to the running host's public SDK surfaces, including Pi **0.99.2 and 1.0.0** alongside **0.85.1, 0.86.1 and 0.87.1** (#82, thanks @zieglar). Both SDKs are host peers; a private runtime SDK is no longer required for the factory bridge. Pi 0.99+ requires Node >=22.19.0.
|
|
24
|
+
- Pi-owned virtual selections and configured image/classifier models remain host-owned and never become account chat fallback targets. Modern transcript/context conversion preserves system instructions, tools and streamed tool results.
|
|
25
|
+
- Replace the split SDK updates in #84/#87 with a matched development pair at **0.87.1** and a regenerated lockfile. Update protobuf to **2.15.0** (#85) and Node types to **22.20.4** (#86). Thanks to Dependabot for the dependency updates.
|
|
26
|
+
|
|
7
27
|
## [1.23.2] — 2026-09-24
|
|
8
28
|
|
|
9
29
|
### Fixed
|
|
@@ -8,6 +8,7 @@ When the account you are using hits a quota or rate limit, `pi-multi-account` tr
|
|
|
8
8
|
|
|
9
9
|
- **Auto-discovers** every authenticated account from `~/.pi/agent/auth.json` (Anthropic Claude Pro/Max, OpenAI/ChatGPT Codex, Kimi For Coding, Cursor, Qwen/Alibaba, and Ollama) and builds the failover rotation dynamically — no manual config editing.
|
|
10
10
|
- **Grows the rotation on login.** Run `/login`, choose **Use a subscription**, then select a numbered slot such as `anthropic-account-3` or `openai-codex-account-5`. The next discovery sweep adds it to the rotation automatically.
|
|
11
|
+
- **Pins a preferred model per account group.** `/multi-account pin provider/model` persists a routing preference across sibling accounts; `unpin` removes it and `pins` explains its current applicability. It never changes the current model, Pi's registry, cooldowns, startup defaults, or automatic quality-band rules.
|
|
11
12
|
- **Auto-discovers new Codex models per account.** At session start (and on `reload` / `rediscover`) it reads OpenAI's authenticated model catalog, mirrors each account's actually available models onto its Pi alias, and follows OpenAI's server priority. A new flagship can therefore win immediately without an extension release or a hard-coded model id.
|
|
12
13
|
- **Handles auth failures without poisoning healthy OAuth accounts.** A generic final 401 briefly cools down a refreshable account and moves the current task forward. Explicit provider verdicts such as `authentication token has been invalidated` force an early refresh; if the refresh token is dead too, the slot is removed and Pi prints the interactive `/login` recovery steps.
|
|
13
14
|
- **Fails over on quota / rate-limit** (429 / 402 / 403 and friends): the exhausted account goes on cooldown (parsed from the provider's own reset metadata when available) and Pi first tries another account with the same model. If it must leave the family, it preserves the model's quality band — Sol/Opus/other frontier flagships stay frontier; Terra/Sonnet stay balanced; Luna/Haiku stay fast — and keeps the session's thinking level. A fresh provider verdict of `blocked` or 100% is skipped automatically instead of wasting the turn; manual `next` remains an explicit one-attempt override for stale telemetry.
|
|
@@ -26,13 +27,17 @@ pi install npm:pi-multi-account
|
|
|
26
27
|
|
|
27
28
|
Restart Pi or run `/reload` after installation.
|
|
28
29
|
|
|
29
|
-
Requires Node 22+ and Agent Pi / pi-ai **>=0.85.1, <0.88.0
|
|
30
|
-
|
|
31
|
-
Pi
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
Requires Node 22+ and Agent Pi / pi-ai **>=0.85.1, <0.88.0; >=0.99.0, <0.100.0; or >=1.0.0, <2.0.0**.
|
|
31
|
+
CI covers Pi **0.85.1, 0.86.1, 0.87.1, 0.99.2 and 1.0.0**; Pi 0.99+ requires Node >=22.19.0.
|
|
32
|
+
Both Pi SDK packages are peers supplied by the running host. OAuth, catalogs and transports
|
|
33
|
+
use public host-bound imports; do not install a private runtime pi-ai copy alongside this extension.
|
|
34
|
+
Standalone SDK callers must supply matching Pi SDK versions. Pi 0.99+ support retains numbered
|
|
35
|
+
account aliases and existing rotation/continuation semantics; it does not introduce a virtual model.
|
|
36
|
+
Pi-owned virtual selections and image/classifier models are not account chat failover targets.
|
|
37
|
+
|
|
38
|
+
This release does not arbitrate multiple extensions calling `pi.setModel`. Keep one automatic
|
|
39
|
+
foreground selection owner: independent routing extensions can otherwise overwrite each other's
|
|
40
|
+
choices. Account failover still owns ordinary selected chat accounts; virtual models remain host-owned.
|
|
36
41
|
|
|
37
42
|
Kimi OAuth spares remain available in `/login`, but are not written to `models.json`: without a
|
|
38
43
|
Kimi child OAuth proxy those aliases would be resolvable but unauthenticated. Only real API-key
|
|
@@ -105,6 +110,9 @@ All three names are aliases for the same command: `/multi-account`, `/provider-f
|
|
|
105
110
|
| `add [anthropic\|codex\|kimi\|cursor\|ollama\|qwen]` | Print the next free account slot to select from the interactive `/login` picker. Subscription families (Anthropic, Codex, Kimi, Cursor) are logged in through `/login`; API-key families are filled in `auth.json`. |
|
|
106
111
|
| `remove [anthropic\|codex\|kimi\|cursor\|ollama\|qwen\|<provider-id>]` | Remove an account from `auth.json` and rotation. Family name drops the highest numbered alias slot; a full provider id removes that exact slot. Aliases: `rm`, `delete`. |
|
|
107
112
|
| `next` | Manually switch to the next compatible-quality fallback, deliberately overriding recorded cooldowns for one attempt. Use explicit `switch` to select a different tier. |
|
|
113
|
+
| `pin <provider/model>` | Persist a model preference for that provider's account group. A numbered alias applies to its siblings too. Requires an idle live parent; does not select the model. |
|
|
114
|
+
| `unpin <provider-or-family>` | Remove one group's pin without changing its underlying `preferredModels` or catalog order. Idempotent; requires an idle live parent. |
|
|
115
|
+
| `pins [list]` | Read-only sorted list of pins and known catalog/account/cooldown/quality applicability. Never refreshes credentials or probes providers. |
|
|
108
116
|
| `pick` | Open a model picker for the current account only. Uses native model selection and its thinking default; never removes models from the shared registry. Requires an idle interactive session. Built-in `/model` remains unchanged. |
|
|
109
117
|
| `save-default` | Save the current model and effective thinking level together as global startup defaults for new sessions. Preserves other models' thinking preferences. Project overrides, explicit CLI options, and resumed-session settings still take precedence. Automatic rotation never invokes this. |
|
|
110
118
|
| `only-active [on\|off]` | Legacy picker preference; use `pick` for a current-account-only menu. The complete Pi model registry remains available to all clients. Alias: `focus`. |
|
|
@@ -113,6 +121,27 @@ All three names are aliases for the same command: `/multi-account`, `/provider-f
|
|
|
113
121
|
| `reload` | Reload config from disk and re-discover accounts. |
|
|
114
122
|
| `enable` / `disable` | Turn failover on/off for the current Pi process. |
|
|
115
123
|
|
|
124
|
+
### Model pins
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
/multi-account pin openai-codex-account-2/gpt-5.4
|
|
128
|
+
/multi-account pins
|
|
129
|
+
/multi-account unpin openai-codex
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Pins live in `provider-failover.json` under `pinnedModels`, keyed by account group (for example
|
|
133
|
+
`openai-codex`, `anthropic` or a custom provider's base ID). Other sessions adopt edits on
|
|
134
|
+
`reload` or restart. Extension configuration commands share a locked read-latest transaction;
|
|
135
|
+
unrelated settings and other groups' pins survive concurrent extension writes. A failed/cancelled write does not change the runtime preference.
|
|
136
|
+
|
|
137
|
+
A pin leads the group's underlying preference/catalog order, but **a healthy exact-model
|
|
138
|
+
sibling still wins**. A pin is not evidence that an older model is a newer flagship. Missing
|
|
139
|
+
models remain saved but inactive until the catalog supplies them; cooling or unauthenticated
|
|
140
|
+
accounts stay ineligible. A cheaper pin cannot demote frontier work. Select the cheaper model
|
|
141
|
+
explicitly with `/model`, `pick` or `switch provider/model` to enter that quality band. A
|
|
142
|
+
provider-only `switch` and automatic compaction cannot use a pin as cheaper-tier consent. Pi-owned
|
|
143
|
+
virtual/image/classifier models cannot be pinned as account chat fallbacks.
|
|
144
|
+
|
|
116
145
|
## How rotation membership works
|
|
117
146
|
|
|
118
147
|
- **Joins the rotation** when an account has a present, non-expired credential in `auth.json` (after `/login`).
|
|
@@ -163,7 +192,8 @@ A default config is created at `~/.pi/agent/provider-failover.json` on first run
|
|
|
163
192
|
| `debugLog` | `true` | Write a structured "black box" decision log to `provider-failover-debug.log` (no credentials — only provider/model ids and truncated reasons). View with `/multi-account log`. |
|
|
164
193
|
| `preferLatestModel` | `true` | Rank the strongest/current model ahead of older siblings within the current quality band during automatic failover. |
|
|
165
194
|
| `reasoningLevel` | `"auto"` | `"auto"` follows the level the session actually runs at (your Pi default, `/thinking`, per-agent `--thinking`) and only restores it after switches. Set an explicit level (`"off"`…`"xhigh"`) to **force** it on every turn regardless of the session — `"xhigh"` only if you really want the extreme level. |
|
|
166
|
-
| `preferredModels` | `{}` | Optional manual strongest-first override per family; when present it wins over live catalog priority. |
|
|
195
|
+
| `preferredModels` | `{}` | Optional manual strongest-first override per family; when present it wins over live catalog priority. A model pin leads this order without rewriting it. |
|
|
196
|
+
| `pinnedModels` | `{}` | One explicit model ID per account group, managed by `pin` / `unpin`. Inactive when unavailable/incompatible; never grants account health or a different automatic quality band. |
|
|
167
197
|
|
|
168
198
|
State (cooldowns, invalidations, recent switches, credential-free Codex model catalogs, and a diagnostic pending marker) is persisted to `~/.pi/agent/provider-failover-state.json`. The actual pending task is session-local: one Pi window never consumes or resumes another window's work. Pending work is discarded when its owning session closes.
|
|
169
199
|
|
|
@@ -217,6 +247,14 @@ A failover is only useful if the agent actually keeps working afterward. These g
|
|
|
217
247
|
the suite on the supported newer Pi versions. Host-binding tests load the real extension wrapper
|
|
218
248
|
through Pi with a deliberately incompatible nested pi-ai, inspect native request bodies, and
|
|
219
249
|
complete a streamed tool-call/result cycle without real credentials or provider traffic.
|
|
250
|
+
A real `pi --no-extensions` subprocess also exercises a numbered Anthropic OAuth slot and native
|
|
251
|
+
`read` tool roundtrip against a fake upstream. Its non-secret OAuth-shaped placeholder preserves
|
|
252
|
+
native identity and tool mapping; real credentials remain in the parent. Legacy publications
|
|
253
|
+
migrate only with an intact parent-side recovery copy. Production refresh persists into the
|
|
254
|
+
private sidecar under the auth lock without briefly replacing the child's placeholder. API-key
|
|
255
|
+
aliases remain direct native publications; stale loopback metadata accepts only the current key.
|
|
256
|
+
Cancellation aborts the proxy's upstream request; ordinary API-key request semantics remain unchanged. These are deterministic regressions,
|
|
257
|
+
not a claim of live Anthropic or Codex-image acceptance.
|
|
220
258
|
|
|
221
259
|
The optional companion Goal integration is selected explicitly; it never assumes a personal path:
|
|
222
260
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Shared read-latest/field-scoped transaction for every extension config writer. */
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const pause = new Int32Array(new SharedArrayBuffer(4));
|
|
8
|
+
|
|
9
|
+
export function mutateConfigFile(
|
|
10
|
+
path: string,
|
|
11
|
+
patch: (disk: Record<string, any>) => Record<string, unknown>,
|
|
12
|
+
canCommit: () => boolean = () => true,
|
|
13
|
+
): Record<string, any> {
|
|
14
|
+
// Preserve config symlinks and make aliases coordinate on the same target lock.
|
|
15
|
+
const target = realpathSync(path);
|
|
16
|
+
const lockfile = require("proper-lockfile") as { lockSync(path: string, options: object): () => void };
|
|
17
|
+
let release: (() => void) | undefined;
|
|
18
|
+
const deadline = Date.now() + 250;
|
|
19
|
+
while (!release) {
|
|
20
|
+
if (!canCommit()) throw new Error("session changed before config persistence");
|
|
21
|
+
try { release = lockfile.lockSync(target, { realpath: false }); }
|
|
22
|
+
catch (error: any) {
|
|
23
|
+
if (error?.code !== "ELOCKED" || Date.now() >= deadline) throw error;
|
|
24
|
+
Atomics.wait(pause, 0, 0, 5);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const temp = `${target}.${process.pid}.${randomUUID()}.tmp`;
|
|
28
|
+
try {
|
|
29
|
+
const disk = JSON.parse(readFileSync(target, "utf8"));
|
|
30
|
+
if (!disk || typeof disk !== "object" || Array.isArray(disk)) throw new Error("config must be an object");
|
|
31
|
+
const delta = patch(disk);
|
|
32
|
+
if (!delta || typeof delta !== "object" || Array.isArray(delta)) throw new Error("config patch must be an object");
|
|
33
|
+
const next = { ...disk, ...delta };
|
|
34
|
+
if (!canCommit()) throw new Error("session changed before config persistence");
|
|
35
|
+
writeFileSync(temp, `${JSON.stringify(next, null, "\t")}\n`, { mode: 0o600, flag: "wx" });
|
|
36
|
+
if (!canCommit()) throw new Error("session changed before config persistence");
|
|
37
|
+
renameSync(temp, target);
|
|
38
|
+
return next;
|
|
39
|
+
} finally {
|
|
40
|
+
try { rmSync(temp, { force: true }); } finally { release(); }
|
|
41
|
+
}
|
|
42
|
+
}
|