@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.
Files changed (444) hide show
  1. package/README.md +14 -16
  2. package/THIRD_PARTY_NOTICES.md +29 -3
  3. package/node_modules/@herbertgao/pi-bark/README.md +39 -3
  4. package/node_modules/@herbertgao/pi-bark/package.json +1 -1
  5. package/node_modules/@herbertgao/pi-bark/src/index.ts +275 -15
  6. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +85 -68
  7. package/node_modules/@herbertgao/pi-cc-extensions/README.md +79 -62
  8. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/preview.webp +0 -0
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +116 -34
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +370 -118
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/core.ts +6 -36
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/agent-summary/index.ts +2 -2
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +31 -33
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/context.ts +330 -360
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/index.ts +56 -108
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/session.ts +97 -15
  17. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/reference/subagent.ts +80 -45
  18. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/flush-docked-bash.ts +36 -0
  19. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer-layout.ts +229 -0
  20. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +521 -0
  21. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/mcp-chip.ts +136 -0
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/startup-header.ts +92 -61
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/working-message.ts +58 -38
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +19 -3
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +1127 -231
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +267 -262
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +38 -48
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/markdown-enhance.ts +8 -2
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +2 -7
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +287 -114
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +15 -6
  32. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/packets.ts +18 -72
  33. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/scroll.ts +61 -26
  34. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +303 -0
  35. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/ansi-utils.ts +25 -57
  36. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-component.ts +125 -0
  37. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-edit-render.ts +227 -0
  38. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +136 -0
  39. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +151 -0
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-inline.ts +324 -0
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-layout.ts +762 -0
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-limits.ts +152 -0
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-palette.ts +410 -0
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-parse.ts +535 -0
  45. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +4 -4
  46. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +21 -3219
  47. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-text.ts +44 -0
  48. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +568 -0
  49. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +103 -48
  50. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +8 -7
  51. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +2 -1
  52. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +171 -196
  53. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/mcp-title.ts +39 -0
  54. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{message-display.ts → tool/message-display.ts} +27 -93
  55. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +429 -0
  56. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +259 -164
  57. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{show-more-hint.ts → tool/show-more-hint.ts} +10 -0
  58. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/transcript-refresh.ts +8 -26
  59. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-color.ts +44 -0
  60. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +77 -0
  61. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/component-tree.ts +34 -0
  62. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/format.ts +28 -0
  63. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +51 -0
  64. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/patch-keys.ts +124 -0
  65. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/sgr-mouse.ts +70 -0
  66. package/node_modules/@herbertgao/pi-cc-extensions/package.json +10 -8
  67. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
  68. package/node_modules/@herbertgao/pi-subagents/package.json +1 -1
  69. package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +3 -2
  70. package/node_modules/@herbertgao/sol-pi/CONTRIBUTING.md +22 -0
  71. package/node_modules/@herbertgao/sol-pi/README.md +36 -17
  72. package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +10 -6
  73. package/node_modules/@herbertgao/sol-pi/agents-install.md +15 -12
  74. package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +24 -8
  75. package/node_modules/@herbertgao/sol-pi/docs/configuration.md +2 -2
  76. package/node_modules/@herbertgao/sol-pi/docs/star-history.md +18 -0
  77. package/node_modules/@herbertgao/sol-pi/package.json +4 -2
  78. package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +1 -1
  79. package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +1 -1
  80. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +23 -4
  81. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +32 -1
  82. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +3 -2
  83. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +1 -1
  84. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +27 -7
  85. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +137 -41
  86. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +1 -0
  87. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +2 -1
  88. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/projection.ts +58 -0
  89. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +28 -6
  90. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +2 -1
  91. package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +15 -2
  92. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
  93. package/node_modules/@pi-plugins/fast-mode/README.md +7 -1
  94. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -1
  95. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +7 -1
  96. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
  97. package/node_modules/@pi-plugins/fast-mode/package.json +5 -5
  98. package/node_modules/pi-antigravity/README.md +3 -0
  99. package/node_modules/pi-antigravity/package.json +8 -8
  100. package/node_modules/pi-antigravity/src/auth/oauth.ts +6 -3
  101. package/node_modules/pi-antigravity/src/index.ts +114 -110
  102. package/node_modules/pi-antigravity/src/stream/stream.ts +1 -1
  103. package/node_modules/pi-antigravity/src/utils/util.ts +18 -1
  104. package/node_modules/pi-multi-account/CHANGELOG.md +20 -0
  105. package/node_modules/pi-multi-account/README.md +46 -8
  106. package/node_modules/pi-multi-account/config-file-transaction.ts +42 -0
  107. package/node_modules/pi-multi-account/index.ts +255 -269
  108. package/node_modules/pi-multi-account/model-pins.ts +36 -0
  109. package/node_modules/pi-multi-account/package.json +9 -7
  110. package/node_modules/pi-multi-account/slot-proxy-auth.ts +12 -2
  111. package/node_modules/pi-multi-account/slot-proxy.ts +27 -5
  112. package/node_modules/pi-web-access/CHANGELOG.md +17 -0
  113. package/node_modules/pi-web-access/README.md +6 -3
  114. package/node_modules/pi-web-access/brave-rate-limit.ts +170 -0
  115. package/node_modules/pi-web-access/brave.ts +28 -11
  116. package/node_modules/pi-web-access/dist/index.js +202 -33
  117. package/node_modules/pi-web-access/gemini-search.ts +2 -5
  118. package/node_modules/pi-web-access/index.ts +13 -7
  119. package/node_modules/pi-web-access/openai-search.ts +24 -10
  120. package/node_modules/pi-web-access/package.json +1 -1
  121. package/node_modules/pi-web-access/summary-review.ts +8 -2
  122. package/node_modules/{@herbertgao/resume-from → resume-from}/README.md +16 -12
  123. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.d.ts +0 -5
  124. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.js +2 -3
  125. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.d.ts +2 -2
  126. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.d.ts +3 -0
  127. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.js +27 -15
  128. package/node_modules/{@herbertgao/resume-from/dist/adapters/codex → resume-from/dist/adapters/claude-code}/redaction.js +16 -3
  129. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.d.ts +2 -4
  130. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.js +1 -1
  131. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.d.ts +2 -4
  132. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.js +1 -2
  133. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/read.d.ts +16 -0
  134. package/node_modules/resume-from/dist/adapters/codex/read.js +723 -0
  135. package/node_modules/{@herbertgao/resume-from/dist/adapters/pi → resume-from/dist/adapters/codex}/redaction.js +16 -3
  136. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.d.ts +44 -4
  137. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.js +88 -4
  138. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.d.ts +2 -2
  139. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.js +2 -2
  140. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.d.ts +5 -1
  141. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.js +10 -6
  142. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.d.ts +2 -2
  143. package/node_modules/{@herbertgao/resume-from/dist/adapters/claude-code → resume-from/dist/adapters/pi}/redaction.js +16 -3
  144. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.d.ts +2 -4
  145. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.js +2 -2
  146. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.d.ts +1 -1
  147. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.js +4 -4
  148. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.js +2 -2
  149. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.d.ts +2 -2
  150. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.js +31 -8
  151. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.d.ts +1 -1
  152. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.js +1 -2
  153. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.d.ts +4 -1
  154. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.js +2 -2
  155. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.d.ts +8 -6
  156. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.d.ts +10 -5
  157. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/finder.d.ts +2 -1
  158. package/node_modules/resume-from/dist/import/discovery/finder.js +269 -0
  159. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.d.ts +3 -3
  160. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.js +3 -3
  161. package/node_modules/resume-from/dist/import/pipeline.d.ts +28 -0
  162. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/pipeline.js +31 -11
  163. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.d.ts +2 -2
  164. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.js +9 -5
  165. package/node_modules/resume-from/dist/import/preview/warnings.d.ts +14 -0
  166. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/warnings.js +26 -20
  167. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.js +12 -2
  168. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.d.ts +9 -3
  169. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.d.ts +4 -4
  170. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.js +7 -4
  171. package/node_modules/resume-from/dist/platform/repo/reader.d.ts +3 -0
  172. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/reader.js +60 -20
  173. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.d.ts +8 -1
  174. package/node_modules/{@herbertgao/resume-from → resume-from}/package.json +19 -32
  175. package/node_modules/{@herbertgao/resume-from → resume-from}/shims/pi/extensions/resume-from.js +2 -2
  176. package/package.json +18 -22
  177. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +0 -101
  178. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.svg +0 -101
  179. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/welcome.webp +0 -0
  180. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/render-utils.ts +0 -5
  181. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +0 -30
  182. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +0 -12
  183. package/node_modules/@herbertgao/resume-from/dist/adapters/codex/read.js +0 -270
  184. package/node_modules/@herbertgao/resume-from/dist/import/discovery/finder.js +0 -129
  185. package/node_modules/@herbertgao/resume-from/dist/import/pipeline.d.ts +0 -17
  186. package/node_modules/@herbertgao/resume-from/dist/import/preview/warnings.d.ts +0 -11
  187. package/node_modules/@herbertgao/resume-from/dist/platform/repo/reader.d.ts +0 -8
  188. package/node_modules/pi-footer/CHANGELOG.md +0 -145
  189. package/node_modules/pi-footer/LICENSE +0 -21
  190. package/node_modules/pi-footer/README.md +0 -354
  191. package/node_modules/pi-footer/package.json +0 -68
  192. package/node_modules/pi-footer/src/cache.ts +0 -106
  193. package/node_modules/pi-footer/src/colors.ts +0 -237
  194. package/node_modules/pi-footer/src/config.ts +0 -202
  195. package/node_modules/pi-footer/src/event-widgets.ts +0 -41
  196. package/node_modules/pi-footer/src/extension-statuses.ts +0 -102
  197. package/node_modules/pi-footer/src/git.ts +0 -135
  198. package/node_modules/pi-footer/src/index.ts +0 -268
  199. package/node_modules/pi-footer/src/metrics.ts +0 -141
  200. package/node_modules/pi-footer/src/presets.ts +0 -383
  201. package/node_modules/pi-footer/src/render.ts +0 -114
  202. package/node_modules/pi-footer/src/separators.ts +0 -52
  203. package/node_modules/pi-footer/src/types.ts +0 -122
  204. package/node_modules/pi-footer/src/ui/color-level-confirm.ts +0 -22
  205. package/node_modules/pi-footer/src/ui/color-options.ts +0 -195
  206. package/node_modules/pi-footer/src/ui/config-lifecycle.ts +0 -61
  207. package/node_modules/pi-footer/src/ui/edit-colors.ts +0 -13
  208. package/node_modules/pi-footer/src/ui/events.ts +0 -35
  209. package/node_modules/pi-footer/src/ui/extension-status-picker.ts +0 -60
  210. package/node_modules/pi-footer/src/ui/extension-statuses.ts +0 -73
  211. package/node_modules/pi-footer/src/ui/fields.ts +0 -252
  212. package/node_modules/pi-footer/src/ui/global-menu.ts +0 -126
  213. package/node_modules/pi-footer/src/ui/helpers.ts +0 -44
  214. package/node_modules/pi-footer/src/ui/layout.ts +0 -17
  215. package/node_modules/pi-footer/src/ui/line-list.ts +0 -19
  216. package/node_modules/pi-footer/src/ui/model.ts +0 -64
  217. package/node_modules/pi-footer/src/ui/navigation.ts +0 -29
  218. package/node_modules/pi-footer/src/ui/option-edit.ts +0 -93
  219. package/node_modules/pi-footer/src/ui/overlay-render.ts +0 -103
  220. package/node_modules/pi-footer/src/ui/screen-context.ts +0 -18
  221. package/node_modules/pi-footer/src/ui/screen-controller.ts +0 -27
  222. package/node_modules/pi-footer/src/ui/screen-render.ts +0 -32
  223. package/node_modules/pi-footer/src/ui/screen-state.ts +0 -20
  224. package/node_modules/pi-footer/src/ui/screen.ts +0 -243
  225. package/node_modules/pi-footer/src/ui/screens/add-widget.ts +0 -92
  226. package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +0 -52
  227. package/node_modules/pi-footer/src/ui/screens/controller.ts +0 -12
  228. package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +0 -68
  229. package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +0 -115
  230. package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +0 -61
  231. package/node_modules/pi-footer/src/ui/screens/global.ts +0 -75
  232. package/node_modules/pi-footer/src/ui/screens/line-list.ts +0 -108
  233. package/node_modules/pi-footer/src/ui/screens/main.ts +0 -99
  234. package/node_modules/pi-footer/src/ui/screens/terminal.ts +0 -121
  235. package/node_modules/pi-footer/src/ui/screens/widget-list.ts +0 -154
  236. package/node_modules/pi-footer/src/ui/terminal-menu.ts +0 -32
  237. package/node_modules/pi-footer/src/ui/theme.ts +0 -48
  238. package/node_modules/pi-footer/src/ui/title-bar.ts +0 -100
  239. package/node_modules/pi-footer/src/ui/widget-actions.ts +0 -76
  240. package/node_modules/pi-footer/src/ui.ts +0 -66
  241. package/node_modules/pi-footer/src/widgets/context.ts +0 -28
  242. package/node_modules/pi-footer/src/widgets/core/active-tools.ts +0 -17
  243. package/node_modules/pi-footer/src/widgets/core/context-window.ts +0 -24
  244. package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +0 -19
  245. package/node_modules/pi-footer/src/widgets/core/cwd.ts +0 -108
  246. package/node_modules/pi-footer/src/widgets/core/event.ts +0 -34
  247. package/node_modules/pi-footer/src/widgets/core/external-status.ts +0 -102
  248. package/node_modules/pi-footer/src/widgets/core/model-provider.ts +0 -20
  249. package/node_modules/pi-footer/src/widgets/core/model.ts +0 -35
  250. package/node_modules/pi-footer/src/widgets/core/provider.ts +0 -17
  251. package/node_modules/pi-footer/src/widgets/core/session-name.ts +0 -17
  252. package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +0 -17
  253. package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +0 -17
  254. package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +0 -17
  255. package/node_modules/pi-footer/src/widgets/git/branch.ts +0 -81
  256. package/node_modules/pi-footer/src/widgets/git/clean.ts +0 -19
  257. package/node_modules/pi-footer/src/widgets/git/deletions.ts +0 -17
  258. package/node_modules/pi-footer/src/widgets/git/diff.ts +0 -38
  259. package/node_modules/pi-footer/src/widgets/git/insertions.ts +0 -17
  260. package/node_modules/pi-footer/src/widgets/git/remote.ts +0 -17
  261. package/node_modules/pi-footer/src/widgets/git/root.ts +0 -17
  262. package/node_modules/pi-footer/src/widgets/git/sha.ts +0 -17
  263. package/node_modules/pi-footer/src/widgets/git/staged.ts +0 -17
  264. package/node_modules/pi-footer/src/widgets/git/status.ts +0 -19
  265. package/node_modules/pi-footer/src/widgets/git/unstaged.ts +0 -17
  266. package/node_modules/pi-footer/src/widgets/git/untracked.ts +0 -17
  267. package/node_modules/pi-footer/src/widgets/instance.ts +0 -118
  268. package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +0 -18
  269. package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +0 -32
  270. package/node_modules/pi-footer/src/widgets/layout/separator.ts +0 -57
  271. package/node_modules/pi-footer/src/widgets/layout/spacer.ts +0 -31
  272. package/node_modules/pi-footer/src/widgets/options.ts +0 -122
  273. package/node_modules/pi-footer/src/widgets/project/runtime.ts +0 -361
  274. package/node_modules/pi-footer/src/widgets/registry.ts +0 -223
  275. package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +0 -17
  276. package/node_modules/pi-footer/src/widgets/session/compactions.ts +0 -17
  277. package/node_modules/pi-footer/src/widgets/session/elapsed.ts +0 -18
  278. package/node_modules/pi-footer/src/widgets/session/last-activity.ts +0 -18
  279. package/node_modules/pi-footer/src/widgets/session/messages.ts +0 -19
  280. package/node_modules/pi-footer/src/widgets/session/session-id.ts +0 -17
  281. package/node_modules/pi-footer/src/widgets/session/session-start.ts +0 -18
  282. package/node_modules/pi-footer/src/widgets/session/tool-results.ts +0 -17
  283. package/node_modules/pi-footer/src/widgets/session/total-messages.ts +0 -19
  284. package/node_modules/pi-footer/src/widgets/session/total-time.ts +0 -18
  285. package/node_modules/pi-footer/src/widgets/session/user-messages.ts +0 -17
  286. package/node_modules/pi-footer/src/widgets/store.ts +0 -26
  287. package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +0 -55
  288. package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +0 -18
  289. package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +0 -18
  290. package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +0 -108
  291. package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +0 -26
  292. package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +0 -29
  293. package/node_modules/pi-footer/src/widgets/tokens/context.ts +0 -29
  294. package/node_modules/pi-footer/src/widgets/tokens/cost.ts +0 -51
  295. package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +0 -25
  296. package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +0 -18
  297. package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +0 -25
  298. package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +0 -18
  299. package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +0 -20
  300. package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +0 -25
  301. package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +0 -18
  302. package/node_modules/pi-footer/src/widgets/types.ts +0 -181
  303. package/node_modules/pi-footer/src/widgets/utils/colors.ts +0 -11
  304. package/node_modules/pi-footer/src/widgets/utils/context.ts +0 -112
  305. package/node_modules/pi-footer/src/widgets/utils/session.ts +0 -19
  306. package/node_modules/pi-footer/src/widgets/utils/token-format.ts +0 -78
  307. /package/node_modules/{@herbertgao/resume-from → resume-from}/LICENSE +0 -0
  308. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.js +0 -0
  309. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.d.ts +0 -0
  310. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.js +0 -0
  311. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.d.ts +0 -0
  312. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.js +0 -0
  313. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.d.ts +0 -0
  314. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.js +0 -0
  315. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.d.ts +0 -0
  316. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.js +0 -0
  317. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/redaction.d.ts +0 -0
  318. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.d.ts +0 -0
  319. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.js +0 -0
  320. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.js +0 -0
  321. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.d.ts +0 -0
  322. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.d.ts +0 -0
  323. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.js +0 -0
  324. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/redaction.d.ts +0 -0
  325. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.d.ts +0 -0
  326. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.js +0 -0
  327. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.js +0 -0
  328. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.d.ts +0 -0
  329. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.js +0 -0
  330. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.d.ts +0 -0
  331. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.js +0 -0
  332. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.d.ts +0 -0
  333. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.js +0 -0
  334. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.d.ts +0 -0
  335. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.js +0 -0
  336. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/redaction.d.ts +0 -0
  337. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.d.ts +0 -0
  338. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.js +0 -0
  339. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.d.ts +0 -0
  340. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.js +0 -0
  341. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.d.ts +0 -0
  342. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.js +0 -0
  343. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.d.ts +0 -0
  344. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.js +0 -0
  345. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.d.ts +0 -0
  346. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.js +0 -0
  347. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.d.ts +0 -0
  348. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.js +0 -0
  349. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.d.ts +0 -0
  350. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.js +0 -0
  351. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.d.ts +0 -0
  352. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.js +0 -0
  353. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.d.ts +0 -0
  354. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.js +0 -0
  355. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.d.ts +0 -0
  356. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.js +0 -0
  357. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.d.ts +0 -0
  358. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.js +0 -0
  359. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.d.ts +0 -0
  360. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.d.ts +0 -0
  361. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.js +0 -0
  362. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.d.ts +0 -0
  363. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.js +0 -0
  364. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.d.ts +0 -0
  365. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.js +0 -0
  366. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.d.ts +0 -0
  367. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.js +0 -0
  368. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.d.ts +0 -0
  369. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.js +0 -0
  370. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.d.ts +0 -0
  371. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.js +0 -0
  372. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.d.ts +0 -0
  373. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.js +0 -0
  374. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.d.ts +0 -0
  375. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.js +0 -0
  376. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.js +0 -0
  377. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.js +0 -0
  378. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.d.ts +0 -0
  379. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.js +0 -0
  380. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.d.ts +0 -0
  381. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.js +0 -0
  382. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.d.ts +0 -0
  383. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.js +0 -0
  384. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.d.ts +0 -0
  385. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.js +0 -0
  386. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.d.ts +0 -0
  387. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.js +0 -0
  388. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.d.ts +0 -0
  389. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.js +0 -0
  390. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.js +0 -0
  391. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.d.ts +0 -0
  392. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.js +0 -0
  393. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.d.ts +0 -0
  394. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.js +0 -0
  395. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.d.ts +0 -0
  396. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.js +0 -0
  397. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.d.ts +0 -0
  398. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.d.ts +0 -0
  399. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.js +0 -0
  400. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.d.ts +0 -0
  401. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.js +0 -0
  402. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.d.ts +0 -0
  403. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.js +0 -0
  404. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.d.ts +0 -0
  405. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.js +0 -0
  406. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.d.ts +0 -0
  407. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.js +0 -0
  408. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.d.ts +0 -0
  409. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.js +0 -0
  410. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.d.ts +0 -0
  411. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.js +0 -0
  412. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.d.ts +0 -0
  413. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.d.ts +0 -0
  414. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.js +0 -0
  415. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.d.ts +0 -0
  416. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.js +0 -0
  417. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.d.ts +0 -0
  418. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.js +0 -0
  419. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.d.ts +0 -0
  420. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.js +0 -0
  421. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.d.ts +0 -0
  422. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.js +0 -0
  423. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.d.ts +0 -0
  424. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.js +0 -0
  425. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.d.ts +0 -0
  426. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.js +0 -0
  427. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.d.ts +0 -0
  428. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.js +0 -0
  429. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.js +0 -0
  430. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.d.ts +0 -0
  431. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.js +0 -0
  432. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.d.ts +0 -0
  433. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.js +0 -0
  434. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.d.ts +0 -0
  435. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.js +0 -0
  436. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.d.ts +0 -0
  437. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.js +0 -0
  438. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.d.ts +0 -0
  439. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.js +0 -0
  440. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.d.ts +0 -0
  441. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.js +0 -0
  442. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.d.ts +0 -0
  443. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.js +0 -0
  444. /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 response = await fetchWithCredentialRedirects(`${apiUrl}?${params.toString()}`, {
11545
- method: "GET",
11546
- headers: {
11547
- "X-Subscription-Token": apiKey,
11548
- "Accept": "application/json",
11549
- "Accept-Encoding": "gzip"
11550
- },
11551
- signal: options.signal ? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal]) : AbortSignal.timeout(SEARCH_TIMEOUT_MS)
11552
- }, ["X-Subscription-Token"]);
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 useCodexEndpoint = provider === "openai-codex" || isCodexJwt(resolved.apiKey);
11800
- if (!hasExplicitResponsesUrl && !useProviderBaseUrl && !useCodexEndpoint && baseUrl !== void 0) {
11801
- let isOfficial = false;
11802
- try {
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 || isOpenAICodexSelected(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, shouldUseOpenAICodexDefault(ctx), ctx);
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 || isOpenAICodexSelected(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?: Pick<ExtensionContext, "model">,
553
+ ctx?: Parameters<typeof isOpenAISubscriptionModelSelected>[0],
550
554
  options?: Pick<PendingCurate, "numResults" | "recencyFilter">,
551
555
  ): SearchProvider {
552
- return resolveProvider(provider, available, options, shouldUseOpenAICodexDefault(ctx), ctx);
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 useCodexEndpoint = provider === "openai-codex" || isCodexJwt(resolved.apiKey);
286
- if (!hasExplicitResponsesUrl && !useProviderBaseUrl && !useCodexEndpoint && baseUrl !== undefined) {
287
- let isOfficial = false;
288
- try {
289
- isOfficial = new URL(baseUrl).toString().replace(/\/+$/u, "") === "https://api.openai.com/v1";
290
- } catch {
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.34.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
- # @herbertgao/resume-from
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
  [![Release](https://github.com/alexei-led/resume-from/actions/workflows/release.yml/badge.svg)](https://github.com/alexei-led/resume-from/actions/workflows/release.yml)
6
4
  [![npm](https://img.shields.io/npm/v/resume-from)](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 target agent must have access to the same working tree.
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:@herbertgao/resume-from
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
- Run the command from the Git repository that owns the source session.
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 Bun.
149
+ Development requires Node 24 LTS and pnpm 11.20.0.
146
150
 
147
151
  ```sh
148
- bun install
149
- bun run build
150
- bun run test
151
- bun run typecheck
152
- bun run lint
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:
@@ -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
  }
@@ -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, { cwd });
39
+ serialize(session, target, marker, context) {
40
+ return serialize(session, target, marker, context);
42
41
  },
43
42
  validate(serialized) {
44
43
  return validate(serialized);