@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
|
@@ -11423,14 +11423,154 @@ async function searchWithExa(query, options = {}) {
|
|
|
11423
11423
|
|
|
11424
11424
|
// brave.ts
|
|
11425
11425
|
init_activity();
|
|
11426
|
+
import { existsSync as existsSync11, readFileSync as readFileSync12 } from "node:fs";
|
|
11427
|
+
|
|
11428
|
+
// brave-rate-limit.ts
|
|
11429
|
+
var DEFAULT_SAFETY_MARGIN_MS = 100;
|
|
11430
|
+
var DEFAULT_MAX_WAIT_MS = 3e4;
|
|
11431
|
+
function parseNumberList(value) {
|
|
11432
|
+
if (!value) return [];
|
|
11433
|
+
return value.split(",").map((part) => Number(part.trim()));
|
|
11434
|
+
}
|
|
11435
|
+
function parsePolicyWindows(value) {
|
|
11436
|
+
if (!value) return [];
|
|
11437
|
+
return value.split(",").map((part) => {
|
|
11438
|
+
const match = /(?:^|;)\s*w=(\d+(?:\.\d+)?)\s*(?:;|$)/i.exec(part.trim());
|
|
11439
|
+
if (!match) return null;
|
|
11440
|
+
const seconds = Number(match[1]);
|
|
11441
|
+
return Number.isFinite(seconds) && seconds >= 0 ? seconds : null;
|
|
11442
|
+
});
|
|
11443
|
+
}
|
|
11444
|
+
function parseBraveRateLimitHeaders(headers) {
|
|
11445
|
+
const limits = parseNumberList(headers.get("x-ratelimit-limit"));
|
|
11446
|
+
const remaining2 = parseNumberList(headers.get("x-ratelimit-remaining"));
|
|
11447
|
+
const resets = parseNumberList(headers.get("x-ratelimit-reset"));
|
|
11448
|
+
const windows = parsePolicyWindows(headers.get("x-ratelimit-policy"));
|
|
11449
|
+
const count = Math.max(limits.length, remaining2.length, resets.length, windows.length);
|
|
11450
|
+
const buckets = [];
|
|
11451
|
+
for (let index = 0; index < count; index++) {
|
|
11452
|
+
const limit = limits[index];
|
|
11453
|
+
const left = remaining2[index];
|
|
11454
|
+
const resetSeconds = resets[index];
|
|
11455
|
+
if (![limit, left, resetSeconds].every(Number.isFinite) || limit < 0 || left < 0 || resetSeconds < 0) continue;
|
|
11456
|
+
buckets.push({
|
|
11457
|
+
limit,
|
|
11458
|
+
windowSeconds: windows[index] ?? null,
|
|
11459
|
+
remaining: left,
|
|
11460
|
+
resetSeconds
|
|
11461
|
+
});
|
|
11462
|
+
}
|
|
11463
|
+
return buckets;
|
|
11464
|
+
}
|
|
11465
|
+
function parseRetryAfterMs(headers, now = Date.now()) {
|
|
11466
|
+
const value = headers.get("retry-after")?.trim();
|
|
11467
|
+
if (!value) return null;
|
|
11468
|
+
const seconds = Number(value);
|
|
11469
|
+
if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1e3;
|
|
11470
|
+
const date = Date.parse(value);
|
|
11471
|
+
if (!Number.isFinite(date)) return null;
|
|
11472
|
+
return Math.max(0, date - now);
|
|
11473
|
+
}
|
|
11474
|
+
function defaultSleep(ms, signal) {
|
|
11475
|
+
if (signal?.aborted) return Promise.reject(new Error("Aborted"));
|
|
11476
|
+
return new Promise((resolve2, reject) => {
|
|
11477
|
+
const cleanup = () => signal?.removeEventListener("abort", onAbort);
|
|
11478
|
+
const timer = setTimeout(() => {
|
|
11479
|
+
cleanup();
|
|
11480
|
+
resolve2();
|
|
11481
|
+
}, ms);
|
|
11482
|
+
const onAbort = () => {
|
|
11483
|
+
clearTimeout(timer);
|
|
11484
|
+
cleanup();
|
|
11485
|
+
reject(new Error("Aborted"));
|
|
11486
|
+
};
|
|
11487
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
11488
|
+
});
|
|
11489
|
+
}
|
|
11490
|
+
function formatWait(ms) {
|
|
11491
|
+
const seconds = Math.ceil(ms / 1e3);
|
|
11492
|
+
if (seconds < 60) return `${seconds}s`;
|
|
11493
|
+
const minutes = Math.ceil(seconds / 60);
|
|
11494
|
+
if (minutes < 60) return `${minutes}m`;
|
|
11495
|
+
const hours = Math.ceil(minutes / 60);
|
|
11496
|
+
return `${hours}h`;
|
|
11497
|
+
}
|
|
11498
|
+
var BraveRateLimitCoordinator = class {
|
|
11499
|
+
queue = Promise.resolve();
|
|
11500
|
+
blockedUntil = 0;
|
|
11501
|
+
now;
|
|
11502
|
+
sleep;
|
|
11503
|
+
safetyMarginMs;
|
|
11504
|
+
maxWaitMs;
|
|
11505
|
+
constructor(options = {}) {
|
|
11506
|
+
this.now = options.now ?? Date.now;
|
|
11507
|
+
this.sleep = options.sleep ?? defaultSleep;
|
|
11508
|
+
this.safetyMarginMs = options.safetyMarginMs ?? DEFAULT_SAFETY_MARGIN_MS;
|
|
11509
|
+
this.maxWaitMs = options.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;
|
|
11510
|
+
}
|
|
11511
|
+
run(operation, signal) {
|
|
11512
|
+
const scheduled = this.queue.then(async () => {
|
|
11513
|
+
await this.waitForAvailability(signal);
|
|
11514
|
+
if (signal?.aborted) throw new Error("Aborted");
|
|
11515
|
+
return operation();
|
|
11516
|
+
});
|
|
11517
|
+
this.queue = scheduled.then(() => void 0, () => void 0);
|
|
11518
|
+
if (!signal) return scheduled;
|
|
11519
|
+
if (signal.aborted) return Promise.reject(new Error("Aborted"));
|
|
11520
|
+
return new Promise((resolve2, reject) => {
|
|
11521
|
+
const onAbort = () => reject(new Error("Aborted"));
|
|
11522
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
11523
|
+
scheduled.then(resolve2, reject).finally(() => signal.removeEventListener("abort", onAbort));
|
|
11524
|
+
});
|
|
11525
|
+
}
|
|
11526
|
+
observe(headers) {
|
|
11527
|
+
const exhausted = parseBraveRateLimitHeaders(headers).filter((bucket) => bucket.remaining === 0);
|
|
11528
|
+
if (exhausted.length === 0) return;
|
|
11529
|
+
const resetMs = Math.max(...exhausted.map((bucket) => bucket.resetSeconds * 1e3));
|
|
11530
|
+
this.blockFor(resetMs);
|
|
11531
|
+
}
|
|
11532
|
+
retryDelay(headers) {
|
|
11533
|
+
const advertised = parseRetryAfterMs(headers, this.now());
|
|
11534
|
+
const exhausted = parseBraveRateLimitHeaders(headers).filter((bucket) => bucket.remaining === 0);
|
|
11535
|
+
const bucketDelay = exhausted.length > 0 ? Math.max(...exhausted.map((bucket) => bucket.resetSeconds * 1e3)) : null;
|
|
11536
|
+
if (advertised === null && bucketDelay === null) return null;
|
|
11537
|
+
return Math.max(advertised ?? 0, bucketDelay ?? 0) + this.safetyMarginMs;
|
|
11538
|
+
}
|
|
11539
|
+
recordRetryDelay(delayMs) {
|
|
11540
|
+
this.blockFor(delayMs, false);
|
|
11541
|
+
}
|
|
11542
|
+
async waitForRecordedCooldown(signal) {
|
|
11543
|
+
await this.waitForAvailability(signal);
|
|
11544
|
+
}
|
|
11545
|
+
async waitForRetry(delayMs, signal) {
|
|
11546
|
+
this.recordRetryDelay(delayMs);
|
|
11547
|
+
await this.waitForRecordedCooldown(signal);
|
|
11548
|
+
}
|
|
11549
|
+
blockFor(delayMs, addMargin = true) {
|
|
11550
|
+
const boundedDelay = Math.max(0, delayMs) + (addMargin ? this.safetyMarginMs : 0);
|
|
11551
|
+
this.blockedUntil = Math.max(this.blockedUntil, this.now() + boundedDelay);
|
|
11552
|
+
}
|
|
11553
|
+
async waitForAvailability(signal) {
|
|
11554
|
+
const waitMs = Math.max(0, this.blockedUntil - this.now());
|
|
11555
|
+
if (waitMs === 0) return;
|
|
11556
|
+
this.assertWaitIsBounded(waitMs);
|
|
11557
|
+
await this.sleep(waitMs, signal);
|
|
11558
|
+
}
|
|
11559
|
+
assertWaitIsBounded(waitMs) {
|
|
11560
|
+
if (waitMs <= this.maxWaitMs) return;
|
|
11561
|
+
throw new Error(`Brave Search quota exhausted; estimated reset in ${formatWait(waitMs)}. Refusing to wait longer than ${formatWait(this.maxWaitMs)} inside one search call.`);
|
|
11562
|
+
}
|
|
11563
|
+
};
|
|
11564
|
+
|
|
11565
|
+
// brave.ts
|
|
11426
11566
|
init_domain_filter_normalization();
|
|
11427
11567
|
init_search_result_count_normalization();
|
|
11428
11568
|
init_credential_source();
|
|
11429
11569
|
init_utils();
|
|
11430
|
-
import { existsSync as existsSync11, readFileSync as readFileSync12 } from "node:fs";
|
|
11431
11570
|
var BRAVE_API_BASE_URL = "https://api.search.brave.com/res/v1";
|
|
11432
11571
|
var CONFIG_PATH7 = getWebSearchConfigPath();
|
|
11433
11572
|
var SEARCH_TIMEOUT_MS = 3e4;
|
|
11573
|
+
var braveRateLimit = new BraveRateLimitCoordinator();
|
|
11434
11574
|
var cachedConfig7 = null;
|
|
11435
11575
|
function loadConfig6() {
|
|
11436
11576
|
if (cachedConfig7) return cachedConfig7;
|
|
@@ -11541,15 +11681,29 @@ Get a key at https://brave.com/search/api/`
|
|
|
11541
11681
|
if (freshness) params.set("freshness", freshness);
|
|
11542
11682
|
}
|
|
11543
11683
|
try {
|
|
11544
|
-
const
|
|
11545
|
-
|
|
11546
|
-
|
|
11547
|
-
|
|
11548
|
-
|
|
11549
|
-
|
|
11550
|
-
|
|
11551
|
-
|
|
11552
|
-
|
|
11684
|
+
const searchDeadline = AbortSignal.timeout(SEARCH_TIMEOUT_MS);
|
|
11685
|
+
const searchSignal = options.signal ? AbortSignal.any([searchDeadline, options.signal]) : searchDeadline;
|
|
11686
|
+
const response = await braveRateLimit.run(async () => {
|
|
11687
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
11688
|
+
const current = await fetchWithCredentialRedirects(`${apiUrl}?${params.toString()}`, {
|
|
11689
|
+
method: "GET",
|
|
11690
|
+
headers: {
|
|
11691
|
+
"X-Subscription-Token": apiKey,
|
|
11692
|
+
"Accept": "application/json",
|
|
11693
|
+
"Accept-Encoding": "gzip"
|
|
11694
|
+
},
|
|
11695
|
+
signal: searchSignal
|
|
11696
|
+
}, ["X-Subscription-Token"]);
|
|
11697
|
+
braveRateLimit.observe(current.headers);
|
|
11698
|
+
if (current.status !== 429 || attempt === 1) return current;
|
|
11699
|
+
const retryDelay = braveRateLimit.retryDelay(current.headers);
|
|
11700
|
+
if (retryDelay === null) return current;
|
|
11701
|
+
braveRateLimit.recordRetryDelay(retryDelay);
|
|
11702
|
+
await current.body?.cancel().catch(() => void 0);
|
|
11703
|
+
await braveRateLimit.waitForRecordedCooldown(searchSignal);
|
|
11704
|
+
}
|
|
11705
|
+
throw new Error("Brave Search retry loop exited unexpectedly");
|
|
11706
|
+
}, searchSignal);
|
|
11553
11707
|
if (!response.ok) {
|
|
11554
11708
|
activityMonitor.logError(activityId, `HTTP ${response.status}`);
|
|
11555
11709
|
const errorText = redactCredential(await response.text(), apiKey);
|
|
@@ -11631,6 +11785,11 @@ function resolveCurrentModelSearchTarget(model) {
|
|
|
11631
11785
|
}
|
|
11632
11786
|
throw new Error("Current model is not backed by an official OpenAI Responses endpoint");
|
|
11633
11787
|
}
|
|
11788
|
+
function isOpenAISubscriptionModelSelected(ctx) {
|
|
11789
|
+
const model = ctx?.model;
|
|
11790
|
+
if (model?.provider === "openai-codex") return true;
|
|
11791
|
+
return model?.provider === "openai" && ctx?.modelRegistry?.isUsingOAuth?.(model) === true;
|
|
11792
|
+
}
|
|
11634
11793
|
function isCurrentModelHostedSearchEligible(ctx) {
|
|
11635
11794
|
const model = ctx?.model;
|
|
11636
11795
|
if (!model || !/^gpt-/iu.test(model.id)) return false;
|
|
@@ -11687,6 +11846,14 @@ function isCodexJwt(token) {
|
|
|
11687
11846
|
const payload = decodeJwtPayload(token);
|
|
11688
11847
|
return !!payload?.["https://api.openai.com/auth"];
|
|
11689
11848
|
}
|
|
11849
|
+
function isOfficialOpenAIBaseUrl(baseUrl) {
|
|
11850
|
+
if (baseUrl === void 0) return false;
|
|
11851
|
+
try {
|
|
11852
|
+
return new URL(baseUrl).toString().replace(/\/+$/u, "") === "https://api.openai.com/v1";
|
|
11853
|
+
} catch {
|
|
11854
|
+
return false;
|
|
11855
|
+
}
|
|
11856
|
+
}
|
|
11690
11857
|
function extractAccountId(token) {
|
|
11691
11858
|
const payload = decodeJwtPayload(token);
|
|
11692
11859
|
const auth = payload?.["https://api.openai.com/auth"];
|
|
@@ -11796,16 +11963,10 @@ async function resolvePiAuth(ctx, responsesUrl, providers, modelOverride, hasExp
|
|
|
11796
11963
|
}
|
|
11797
11964
|
if (!resolved.ok || !resolved.apiKey) continue;
|
|
11798
11965
|
const baseUrl = resolved.baseUrl ?? preferred.baseUrl;
|
|
11799
|
-
const
|
|
11800
|
-
|
|
11801
|
-
|
|
11802
|
-
|
|
11803
|
-
isOfficial = new URL(baseUrl).toString().replace(/\/+$/u, "") === "https://api.openai.com/v1";
|
|
11804
|
-
} catch {
|
|
11805
|
-
}
|
|
11806
|
-
if (!isOfficial) {
|
|
11807
|
-
throw new CustomOpenAIBaseUrlError(`OpenAI web search cannot reuse Pi credentials with a custom baseUrl by default. Set openaiResponsesUrl in ${CONFIG_PATH8} to the full Responses endpoint for this credential.`);
|
|
11808
|
-
}
|
|
11966
|
+
const isOfficialBaseUrl = isOfficialOpenAIBaseUrl(baseUrl);
|
|
11967
|
+
const useCodexEndpoint = provider === "openai-codex" || !isOfficialBaseUrl && isCodexJwt(resolved.apiKey);
|
|
11968
|
+
if (!hasExplicitResponsesUrl && !useProviderBaseUrl && !useCodexEndpoint && baseUrl !== void 0 && !isOfficialBaseUrl) {
|
|
11969
|
+
throw new CustomOpenAIBaseUrlError(`OpenAI web search cannot reuse Pi credentials with a custom baseUrl by default. Set openaiResponsesUrl in ${CONFIG_PATH8} to the full Responses endpoint for this credential.`);
|
|
11809
11970
|
}
|
|
11810
11971
|
let providerResponsesUrl = responsesUrl;
|
|
11811
11972
|
if (useProviderBaseUrl) {
|
|
@@ -11823,6 +11984,7 @@ async function resolvePiAuth(ctx, responsesUrl, providers, modelOverride, hasExp
|
|
|
11823
11984
|
model: modelOverride ?? preferred.id,
|
|
11824
11985
|
headers: resolved.headers ?? {},
|
|
11825
11986
|
responsesUrl: providerResponsesUrl,
|
|
11987
|
+
useCodexEndpoint,
|
|
11826
11988
|
...useProviderBaseUrl ? { useProviderBaseUrl: true } : {}
|
|
11827
11989
|
};
|
|
11828
11990
|
}
|
|
@@ -16193,9 +16355,6 @@ function errorMessage24(err) {
|
|
|
16193
16355
|
function isAbortError2(err) {
|
|
16194
16356
|
return errorMessage24(err).toLowerCase().includes("abort");
|
|
16195
16357
|
}
|
|
16196
|
-
function isOpenAICodexSelected(ctx) {
|
|
16197
|
-
return ctx?.model?.provider === "openai-codex";
|
|
16198
|
-
}
|
|
16199
16358
|
async function tryOpenAIInAuto(query, options, fallbackErrors) {
|
|
16200
16359
|
try {
|
|
16201
16360
|
if (await isOpenAISearchAvailable(options.extensionContext)) {
|
|
@@ -16520,7 +16679,7 @@ async function search(query, options = {}) {
|
|
|
16520
16679
|
}
|
|
16521
16680
|
}
|
|
16522
16681
|
let triedOpenAI = false;
|
|
16523
|
-
if (allowed.has("openai") && (!options.extensionContext ||
|
|
16682
|
+
if (allowed.has("openai") && (!options.extensionContext || isOpenAISubscriptionModelSelected(options.extensionContext))) {
|
|
16524
16683
|
triedOpenAI = true;
|
|
16525
16684
|
const result = await tryOpenAIInAuto(query, options, fallbackErrors);
|
|
16526
16685
|
if (result) return result;
|
|
@@ -21493,7 +21652,7 @@ Error: ${result.error}`;
|
|
|
21493
21652
|
}
|
|
21494
21653
|
return lines.join("\n");
|
|
21495
21654
|
}
|
|
21496
|
-
function buildSummaryPrompt(results, feedback) {
|
|
21655
|
+
function buildSummaryPrompt(results, feedback, instructions) {
|
|
21497
21656
|
const sections = [
|
|
21498
21657
|
"You are writing the final web search summary for a coding assistant.",
|
|
21499
21658
|
"Write a concise, factual summary using only the provided search results.",
|
|
@@ -21504,6 +21663,10 @@ function buildSummaryPrompt(results, feedback) {
|
|
|
21504
21663
|
"- If evidence is weak or conflicting, say so explicitly.",
|
|
21505
21664
|
'- End with a short "Sources" section listing the most relevant URLs.'
|
|
21506
21665
|
];
|
|
21666
|
+
const extraInstructions = typeof instructions === "string" ? instructions.trim() : "";
|
|
21667
|
+
if (extraInstructions) {
|
|
21668
|
+
sections.push(extraInstructions);
|
|
21669
|
+
}
|
|
21507
21670
|
if (feedback) {
|
|
21508
21671
|
sections.push("- Incorporate the user feedback provided below into the summary.");
|
|
21509
21672
|
}
|
|
@@ -21676,7 +21839,7 @@ function getContentPartType(part) {
|
|
|
21676
21839
|
const value = part;
|
|
21677
21840
|
return typeof value.type === "string" ? value.type : "unknown";
|
|
21678
21841
|
}
|
|
21679
|
-
async function generateSummaryDraft(results, ctx, signal, modelOverride, feedback, completeFn, deadlineMs = SUMMARY_GENERATION_DEADLINE_MS) {
|
|
21842
|
+
async function generateSummaryDraft(results, ctx, signal, modelOverride, feedback, completeFn, deadlineMs = SUMMARY_GENERATION_DEADLINE_MS, instructions) {
|
|
21680
21843
|
if (!ctx || !ctx.modelRegistry) {
|
|
21681
21844
|
throw new Error("Summary generation context unavailable");
|
|
21682
21845
|
}
|
|
@@ -21720,7 +21883,7 @@ async function generateSummaryDraft(results, ctx, signal, modelOverride, feedbac
|
|
|
21720
21883
|
}
|
|
21721
21884
|
try {
|
|
21722
21885
|
if (signal?.aborted) throw new Error("Aborted");
|
|
21723
|
-
const prompt = buildSummaryPrompt(results, feedback);
|
|
21886
|
+
const prompt = buildSummaryPrompt(results, feedback, instructions);
|
|
21724
21887
|
let resolved;
|
|
21725
21888
|
try {
|
|
21726
21889
|
checkSummaryDeadline();
|
|
@@ -22445,6 +22608,12 @@ function getSummaryGenerationDeadlineMs() {
|
|
|
22445
22608
|
}
|
|
22446
22609
|
return Math.min(value, MAX_SUMMARY_GENERATION_DEADLINE_MS);
|
|
22447
22610
|
}
|
|
22611
|
+
function getSummaryInstructions() {
|
|
22612
|
+
const value = loadConfig37().summaryInstructions;
|
|
22613
|
+
if (typeof value !== "string") return void 0;
|
|
22614
|
+
const trimmed = value.trim();
|
|
22615
|
+
return trimmed.length > 0 ? trimmed : void 0;
|
|
22616
|
+
}
|
|
22448
22617
|
function shouldAutoOpenCuratorBrowser(config) {
|
|
22449
22618
|
if (config.autoOpenBrowser === false) return false;
|
|
22450
22619
|
if (resolveCuratorNetworkConfig().enabled && config.autoOpenBrowser !== true) return false;
|
|
@@ -22502,9 +22671,6 @@ async function getOptionalGeminiWebAvailability() {
|
|
|
22502
22671
|
return null;
|
|
22503
22672
|
}
|
|
22504
22673
|
}
|
|
22505
|
-
function shouldUseOpenAICodexDefault(ctx) {
|
|
22506
|
-
return ctx?.model?.provider === "openai-codex";
|
|
22507
|
-
}
|
|
22508
22674
|
function shouldPreferOpenAI(options, preferOpenAICodexDefault) {
|
|
22509
22675
|
if (options?.recencyFilter) return false;
|
|
22510
22676
|
if (typeof options?.numResults === "number" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {
|
|
@@ -22523,7 +22689,7 @@ async function loadCuratorBootstrap(requestedProvider, ctx, options) {
|
|
|
22523
22689
|
};
|
|
22524
22690
|
}
|
|
22525
22691
|
function resolveCuratorDefaultProvider(provider, available, ctx, options) {
|
|
22526
|
-
return resolveProvider(provider, available, options,
|
|
22692
|
+
return resolveProvider(provider, available, options, isOpenAISubscriptionModelSelected(ctx), ctx);
|
|
22527
22693
|
}
|
|
22528
22694
|
function firstAvailableProvider(available, preferOpenAI, fallback) {
|
|
22529
22695
|
if (available.searxng) return "searxng";
|
|
@@ -23103,7 +23269,8 @@ function index_default(pi) {
|
|
|
23103
23269
|
modelOverride,
|
|
23104
23270
|
feedback,
|
|
23105
23271
|
void 0,
|
|
23106
|
-
getSummaryGenerationDeadlineMs()
|
|
23272
|
+
getSummaryGenerationDeadlineMs(),
|
|
23273
|
+
getSummaryInstructions()
|
|
23107
23274
|
);
|
|
23108
23275
|
} catch (err) {
|
|
23109
23276
|
const isEmptyResponse = err instanceof Error && err.message.includes("Summary model returned empty response");
|
|
@@ -23908,7 +24075,8 @@ Open manually: ${handle.url}` }],
|
|
|
23908
24075
|
summaryModelChoices.defaultSummaryModel ?? void 0,
|
|
23909
24076
|
void 0,
|
|
23910
24077
|
void 0,
|
|
23911
|
-
getSummaryGenerationDeadlineMs()
|
|
24078
|
+
getSummaryGenerationDeadlineMs(),
|
|
24079
|
+
getSummaryInstructions()
|
|
23912
24080
|
);
|
|
23913
24081
|
approvedSummary = generated.summary;
|
|
23914
24082
|
summaryMeta = generated.meta;
|
|
@@ -25264,5 +25432,6 @@ Age: ${Math.floor((Date.now() - selected.timestamp) / 6e4)}m
|
|
|
25264
25432
|
export {
|
|
25265
25433
|
index_default as default,
|
|
25266
25434
|
getSummaryGenerationDeadlineMs,
|
|
25435
|
+
getSummaryInstructions,
|
|
25267
25436
|
resolveCuratorDefaultProvider
|
|
25268
25437
|
};
|
|
@@ -11,6 +11,7 @@ import { isBraveAvailable, searchWithBrave } from "./brave.ts";
|
|
|
11
11
|
import {
|
|
12
12
|
isCurrentModelHostedSearchEligible,
|
|
13
13
|
isOpenAISearchAvailable,
|
|
14
|
+
isOpenAISubscriptionModelSelected,
|
|
14
15
|
OpenAIAlphaSearchUnsupportedError,
|
|
15
16
|
searchWithCurrentModelOpenAI,
|
|
16
17
|
searchWithOpenAI,
|
|
@@ -273,10 +274,6 @@ function isAbortError(err: unknown): boolean {
|
|
|
273
274
|
return errorMessage(err).toLowerCase().includes("abort");
|
|
274
275
|
}
|
|
275
276
|
|
|
276
|
-
function isOpenAICodexSelected(ctx?: ExtensionContext): boolean {
|
|
277
|
-
return ctx?.model?.provider === "openai-codex";
|
|
278
|
-
}
|
|
279
|
-
|
|
280
277
|
async function tryOpenAIInAuto(query: string, options: FullSearchOptions, fallbackErrors: string[]): Promise<AttributedSearchResponse | null> {
|
|
281
278
|
try {
|
|
282
279
|
if (await isOpenAISearchAvailable(options.extensionContext)) {
|
|
@@ -648,7 +645,7 @@ export async function search(query: string, options: FullSearchOptions = {}): Pr
|
|
|
648
645
|
}
|
|
649
646
|
|
|
650
647
|
let triedOpenAI = false;
|
|
651
|
-
if (allowed.has("openai") && (!options.extensionContext ||
|
|
648
|
+
if (allowed.has("openai") && (!options.extensionContext || isOpenAISubscriptionModelSelected(options.extensionContext))) {
|
|
652
649
|
triedOpenAI = true;
|
|
653
650
|
const result = await tryOpenAIInAuto(query, options, fallbackErrors);
|
|
654
651
|
if (result) return result;
|
|
@@ -47,7 +47,7 @@ import { isGeminiApiAvailable } from "./gemini-api.ts";
|
|
|
47
47
|
import { getActiveGoogleEmail, getGeminiWebAvailabilityDiagnostic, getGeminiWebAvailabilityDiagnosticDetails, isGeminiWebAvailable } from "./gemini-web.ts";
|
|
48
48
|
import { isBrowserCookieAccessAllowed } from "./gemini-web-config.ts";
|
|
49
49
|
import { isBraveAvailable } from "./brave.ts";
|
|
50
|
-
import { isCurrentModelHostedSearchEligible, isOpenAISearchAvailable } from "./openai-search.ts";
|
|
50
|
+
import { isCurrentModelHostedSearchEligible, isOpenAISearchAvailable, isOpenAISubscriptionModelSelected } from "./openai-search.ts";
|
|
51
51
|
import { isParallelAvailable } from "./parallel.ts";
|
|
52
52
|
import { isParallelMcpAvailable } from "./parallel-mcp.ts";
|
|
53
53
|
import { isTinyFishAvailable } from "./tinyfish.ts";
|
|
@@ -173,6 +173,7 @@ interface WebSearchConfig {
|
|
|
173
173
|
curatorRemote?: unknown;
|
|
174
174
|
summaryModel?: string;
|
|
175
175
|
summaryGenerationDeadlineMs?: unknown;
|
|
176
|
+
summaryInstructions?: unknown;
|
|
176
177
|
maxInlineContentChars?: unknown;
|
|
177
178
|
fetch?: {
|
|
178
179
|
defaultMode?: unknown;
|
|
@@ -456,6 +457,13 @@ export function getSummaryGenerationDeadlineMs(): number {
|
|
|
456
457
|
return Math.min(value, MAX_SUMMARY_GENERATION_DEADLINE_MS);
|
|
457
458
|
}
|
|
458
459
|
|
|
460
|
+
export function getSummaryInstructions(): string | undefined {
|
|
461
|
+
const value = loadConfig().summaryInstructions;
|
|
462
|
+
if (typeof value !== "string") return undefined;
|
|
463
|
+
const trimmed = value.trim();
|
|
464
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
465
|
+
}
|
|
466
|
+
|
|
459
467
|
function shouldAutoOpenCuratorBrowser(config: WebSearchConfig): boolean {
|
|
460
468
|
if (config.autoOpenBrowser === false) return false;
|
|
461
469
|
if (resolveCuratorNetworkConfig().enabled && config.autoOpenBrowser !== true) return false;
|
|
@@ -516,10 +524,6 @@ async function getOptionalGeminiWebAvailability() {
|
|
|
516
524
|
}
|
|
517
525
|
}
|
|
518
526
|
|
|
519
|
-
function shouldUseOpenAICodexDefault(ctx?: Pick<ExtensionContext, "model">): boolean {
|
|
520
|
-
return ctx?.model?.provider === "openai-codex";
|
|
521
|
-
}
|
|
522
|
-
|
|
523
527
|
function shouldPreferOpenAI(options: Pick<PendingCurate, "numResults" | "recencyFilter"> | undefined, preferOpenAICodexDefault: boolean): boolean {
|
|
524
528
|
if (options?.recencyFilter) return false;
|
|
525
529
|
if (typeof options?.numResults === "number" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {
|
|
@@ -546,10 +550,10 @@ async function loadCuratorBootstrap(
|
|
|
546
550
|
export function resolveCuratorDefaultProvider(
|
|
547
551
|
provider: SearchProviderSelection,
|
|
548
552
|
available: ProviderAvailability,
|
|
549
|
-
ctx?:
|
|
553
|
+
ctx?: Parameters<typeof isOpenAISubscriptionModelSelected>[0],
|
|
550
554
|
options?: Pick<PendingCurate, "numResults" | "recencyFilter">,
|
|
551
555
|
): SearchProvider {
|
|
552
|
-
return resolveProvider(provider, available, options,
|
|
556
|
+
return resolveProvider(provider, available, options, isOpenAISubscriptionModelSelected(ctx), ctx);
|
|
553
557
|
}
|
|
554
558
|
|
|
555
559
|
function firstAvailableProvider(available: ProviderAvailability, preferOpenAI: boolean, fallback: ResolvedSearchProvider): ResolvedSearchProvider | "auto" {
|
|
@@ -1279,6 +1283,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
1279
1283
|
feedback,
|
|
1280
1284
|
undefined,
|
|
1281
1285
|
getSummaryGenerationDeadlineMs(),
|
|
1286
|
+
getSummaryInstructions(),
|
|
1282
1287
|
);
|
|
1283
1288
|
} catch (err) {
|
|
1284
1289
|
const isEmptyResponse = err instanceof Error && err.message.includes("Summary model returned empty response");
|
|
@@ -2153,6 +2158,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
2153
2158
|
undefined,
|
|
2154
2159
|
undefined,
|
|
2155
2160
|
getSummaryGenerationDeadlineMs(),
|
|
2161
|
+
getSummaryInstructions(),
|
|
2156
2162
|
);
|
|
2157
2163
|
approvedSummary = generated.summary;
|
|
2158
2164
|
summaryMeta = generated.meta;
|
|
@@ -91,6 +91,14 @@ function resolveCurrentModelSearchTarget(model: CurrentModel): CurrentModelSearc
|
|
|
91
91
|
throw new Error("Current model is not backed by an official OpenAI Responses endpoint");
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
// The active model draws on a ChatGPT subscription: openai-codex, or openai signed in
|
|
95
|
+
// through Pi's "Sign in with ChatGPT" OAuth rather than an API key.
|
|
96
|
+
export function isOpenAISubscriptionModelSelected(ctx?: Pick<ExtensionContext, "model"> & { modelRegistry?: Pick<ExtensionContext["modelRegistry"], "isUsingOAuth"> }): boolean {
|
|
97
|
+
const model = ctx?.model;
|
|
98
|
+
if (model?.provider === "openai-codex") return true;
|
|
99
|
+
return model?.provider === "openai" && ctx?.modelRegistry?.isUsingOAuth?.(model) === true;
|
|
100
|
+
}
|
|
101
|
+
|
|
94
102
|
export function isCurrentModelHostedSearchEligible(ctx?: Pick<ExtensionContext, "model">): boolean {
|
|
95
103
|
const model = ctx?.model;
|
|
96
104
|
if (!model || !/^gpt-/iu.test(model.id)) return false;
|
|
@@ -163,6 +171,15 @@ function isCodexJwt(token: string): boolean {
|
|
|
163
171
|
return !!payload?.["https://api.openai.com/auth"];
|
|
164
172
|
}
|
|
165
173
|
|
|
174
|
+
function isOfficialOpenAIBaseUrl(baseUrl: string | undefined): boolean {
|
|
175
|
+
if (baseUrl === undefined) return false;
|
|
176
|
+
try {
|
|
177
|
+
return new URL(baseUrl).toString().replace(/\/+$/u, "") === "https://api.openai.com/v1";
|
|
178
|
+
} catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
166
183
|
function extractAccountId(token: string): string | undefined {
|
|
167
184
|
const payload = decodeJwtPayload(token);
|
|
168
185
|
const auth = payload?.["https://api.openai.com/auth"];
|
|
@@ -282,16 +299,12 @@ async function resolvePiAuth(ctx: ExtensionContext, responsesUrl: string, provid
|
|
|
282
299
|
// Auth can override the model's base URL. Do not guess Responses/web_search
|
|
283
300
|
// support from a gateway URL, or pair its credential with the official API.
|
|
284
301
|
const baseUrl = resolved.baseUrl ?? preferred.baseUrl;
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
if (!isOfficial) {
|
|
293
|
-
throw new CustomOpenAIBaseUrlError(`OpenAI web search cannot reuse Pi credentials with a custom baseUrl by default. Set openaiResponsesUrl in ${CONFIG_PATH} to the full Responses endpoint for this credential.`);
|
|
294
|
-
}
|
|
302
|
+
const isOfficialBaseUrl = isOfficialOpenAIBaseUrl(baseUrl);
|
|
303
|
+
// Pi sends credentials for the official API base directly to api.openai.com, including
|
|
304
|
+
// "Sign in with ChatGPT" access tokens, which are ChatGPT JWTs but not Codex credentials.
|
|
305
|
+
const useCodexEndpoint = provider === "openai-codex" || (!isOfficialBaseUrl && isCodexJwt(resolved.apiKey));
|
|
306
|
+
if (!hasExplicitResponsesUrl && !useProviderBaseUrl && !useCodexEndpoint && baseUrl !== undefined && !isOfficialBaseUrl) {
|
|
307
|
+
throw new CustomOpenAIBaseUrlError(`OpenAI web search cannot reuse Pi credentials with a custom baseUrl by default. Set openaiResponsesUrl in ${CONFIG_PATH} to the full Responses endpoint for this credential.`);
|
|
295
308
|
}
|
|
296
309
|
let providerResponsesUrl = responsesUrl;
|
|
297
310
|
if (useProviderBaseUrl) {
|
|
@@ -309,6 +322,7 @@ async function resolvePiAuth(ctx: ExtensionContext, responsesUrl: string, provid
|
|
|
309
322
|
model: modelOverride ?? preferred.id,
|
|
310
323
|
headers: resolved.headers ?? {},
|
|
311
324
|
responsesUrl: providerResponsesUrl,
|
|
325
|
+
useCodexEndpoint,
|
|
312
326
|
...(useProviderBaseUrl ? { useProviderBaseUrl: true } : {}),
|
|
313
327
|
};
|
|
314
328
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-web-access",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Crawl4AI, Jina, SERPdive, Kagi, Ollama, AnySearch, Bright Data SERP, SerpBase, SerpApi, Serply, You.com, SearXNG, Exa, Perplexity, Gemini, Kimi, and Mistral.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -63,7 +63,7 @@ function summarizeQueryResult(result: QueryResultData): string {
|
|
|
63
63
|
return lines.join("\n");
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
export function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {
|
|
66
|
+
export function buildSummaryPrompt(results: QueryResultData[], feedback?: string, instructions?: string): string {
|
|
67
67
|
const sections = [
|
|
68
68
|
"You are writing the final web search summary for a coding assistant.",
|
|
69
69
|
"Write a concise, factual summary using only the provided search results.",
|
|
@@ -75,6 +75,11 @@ export function buildSummaryPrompt(results: QueryResultData[], feedback?: string
|
|
|
75
75
|
"- End with a short \"Sources\" section listing the most relevant URLs.",
|
|
76
76
|
];
|
|
77
77
|
|
|
78
|
+
const extraInstructions = typeof instructions === "string" ? instructions.trim() : "";
|
|
79
|
+
if (extraInstructions) {
|
|
80
|
+
sections.push(extraInstructions);
|
|
81
|
+
}
|
|
82
|
+
|
|
78
83
|
if (feedback) {
|
|
79
84
|
sections.push("- Incorporate the user feedback provided below into the summary.");
|
|
80
85
|
}
|
|
@@ -292,6 +297,7 @@ export async function generateSummaryDraft(
|
|
|
292
297
|
feedback?: string,
|
|
293
298
|
completeFn?: CompleteFunction,
|
|
294
299
|
deadlineMs = SUMMARY_GENERATION_DEADLINE_MS,
|
|
300
|
+
instructions?: string,
|
|
295
301
|
): Promise<{ summary: string; meta: SummaryMeta }> {
|
|
296
302
|
if (!ctx || !ctx.modelRegistry) {
|
|
297
303
|
throw new Error("Summary generation context unavailable");
|
|
@@ -349,7 +355,7 @@ export async function generateSummaryDraft(
|
|
|
349
355
|
|
|
350
356
|
try {
|
|
351
357
|
if (signal?.aborted) throw new Error("Aborted");
|
|
352
|
-
const prompt = buildSummaryPrompt(results, feedback);
|
|
358
|
+
const prompt = buildSummaryPrompt(results, feedback, instructions);
|
|
353
359
|
let resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;
|
|
354
360
|
try {
|
|
355
361
|
checkSummaryDeadline();
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
HerbertGao-maintained fork of [`alexei-led/resume-from`](https://github.com/alexei-led/resume-from), preserving its MIT license and cross-agent session format. Local fixes are contributed upstream when possible.
|
|
1
|
+
# resume-from
|
|
4
2
|
|
|
5
3
|
[](https://github.com/alexei-led/resume-from/actions/workflows/release.yml)
|
|
6
4
|
[](https://www.npmjs.com/package/resume-from)
|
|
@@ -35,7 +33,7 @@ The source session is never changed.
|
|
|
35
33
|
- **The current context is too large.** Import a budgeted history into a fresh native session.
|
|
36
34
|
- **You want an independent handoff.** Create a target-side copy for continued work or review while preserving the original session.
|
|
37
35
|
|
|
38
|
-
`resume-from` moves conversation context. It does not copy the repository or migrate a running process. The
|
|
36
|
+
`resume-from` moves conversation context. It does not copy the repository, transfer uncommitted work, switch branches, recreate removed worktrees, or migrate a running process. The destination can be the same checkout or another linked worktree of the same Git repository.
|
|
39
37
|
|
|
40
38
|
## Supported transfers
|
|
41
39
|
|
|
@@ -83,8 +81,10 @@ Install `resume-from` in the agent that will receive the new session.
|
|
|
83
81
|
|
|
84
82
|
### Pi
|
|
85
83
|
|
|
84
|
+
See the [Pi guide](docs/agents/pi.md#install) for supported Pi versions.
|
|
85
|
+
|
|
86
86
|
```sh
|
|
87
|
-
pi install npm
|
|
87
|
+
pi install npm:resume-from
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
Restart Pi, then run `/resume-from`.
|
|
@@ -107,7 +107,11 @@ The Codex prompt runs the matching published `resume-from` package through `npx`
|
|
|
107
107
|
|
|
108
108
|
## Run the first transfer
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
Start the destination agent in the directory whose files you intend to edit, including a checkout subdirectory. Main checkouts and linked worktrees share session discovery regardless of nested, sibling, or arbitrary external placement. Independent clones, submodules, and nested independent repositories remain separate.
|
|
111
|
+
|
|
112
|
+
For an alternate source profile in Claude Code or Codex, use `/resume-from claude --home ~/.claude-team`; this changes the source home, not the target profile or destination directory. In Pi, configure the source profile in [`extraHomes`](docs/configuration.md#add-another-profile).
|
|
113
|
+
|
|
114
|
+
Check the preview's canonical `Destination:` directory and warnings before confirming. Imports keep the destination agent's directory. A removed or moved source worktree needs a surviving recorded path that still identifies this repository; missing historical paths alone are insufficient. See [worktree workflows](docs/workflows.md#continue-in-another-worktree).
|
|
111
115
|
|
|
112
116
|
### In Pi
|
|
113
117
|
|
|
@@ -142,14 +146,14 @@ The user and maintainer documentation is organized in [`docs/`](docs/README.md).
|
|
|
142
146
|
|
|
143
147
|
## Development
|
|
144
148
|
|
|
145
|
-
Development requires Node 24 LTS and
|
|
149
|
+
Development requires Node 24 LTS and pnpm 11.20.0.
|
|
146
150
|
|
|
147
151
|
```sh
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
pnpm install
|
|
153
|
+
pnpm build
|
|
154
|
+
pnpm test
|
|
155
|
+
pnpm typecheck
|
|
156
|
+
pnpm lint
|
|
153
157
|
```
|
|
154
158
|
|
|
155
159
|
Run the command help after a build:
|
package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.d.ts
RENAMED
|
@@ -8,11 +8,6 @@ export declare const DEFAULT_WINDOW_TOKENS = 200000;
|
|
|
8
8
|
/** The command the landing hands back, because Claude Code cannot move the user (C-2, FR-45). */
|
|
9
9
|
export declare const HANDOVER_COMMAND = "claude --resume";
|
|
10
10
|
export interface ClaudeCodeAdapterDeps {
|
|
11
|
-
/**
|
|
12
|
-
* The repository the import runs in. Claude Code keys a session to a repository, and no
|
|
13
|
-
* argument of the port names one, so the working directory is the signal.
|
|
14
|
-
*/
|
|
15
|
-
cwd: string;
|
|
16
11
|
env: Record<string, string | undefined>;
|
|
17
12
|
homeDir: string;
|
|
18
13
|
}
|
package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.js
RENAMED
|
@@ -15,7 +15,6 @@ export const HANDOVER_COMMAND = "claude --resume";
|
|
|
15
15
|
* passes the real process values.
|
|
16
16
|
*/
|
|
17
17
|
export function createClaudeCodeAdapter(deps = {}) {
|
|
18
|
-
const cwd = deps.cwd ?? process.cwd();
|
|
19
18
|
const env = deps.env ?? process.env;
|
|
20
19
|
// Resolved once: capabilities() is pure, synchronous, and equal on every call.
|
|
21
20
|
const capabilities = Object.freeze({
|
|
@@ -37,8 +36,8 @@ export function createClaudeCodeAdapter(deps = {}) {
|
|
|
37
36
|
loadSession(descriptor) {
|
|
38
37
|
return loadSession(descriptor);
|
|
39
38
|
},
|
|
40
|
-
serialize(session, target, marker) {
|
|
41
|
-
return serialize(session, target, marker,
|
|
39
|
+
serialize(session, target, marker, context) {
|
|
40
|
+
return serialize(session, target, marker, context);
|
|
42
41
|
},
|
|
43
42
|
validate(serialized) {
|
|
44
43
|
return validate(serialized);
|