@herbertgao/pi-extensions 2026.9.20 → 2026.10.1

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 (357) hide show
  1. package/README.md +18 -13
  2. package/THIRD_PARTY_NOTICES.md +31 -5
  3. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +1 -1
  4. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +1 -1
  5. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
  6. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +1 -1
  7. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
  8. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/index.js +4 -0
  9. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +43 -3
  10. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +142 -59
  11. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
  12. package/node_modules/@dietrichgebert/ponytail/README.es.md +87 -204
  13. package/node_modules/@dietrichgebert/ponytail/README.ja.md +212 -0
  14. package/node_modules/@dietrichgebert/ponytail/README.ko.md +92 -226
  15. package/node_modules/@dietrichgebert/ponytail/README.md +58 -244
  16. package/node_modules/@dietrichgebert/ponytail/README.zh-CN.md +212 -0
  17. package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +3 -3
  18. package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +4 -4
  19. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +63 -16
  20. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +8 -7
  21. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +46 -23
  22. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +39 -7
  23. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +20 -3
  24. package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +3 -3
  25. package/node_modules/@dietrichgebert/ponytail/package.json +2 -2
  26. package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +47 -17
  27. package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +21 -7
  28. package/node_modules/@dietrichgebert/ponytail/skills/plugin.json +5 -0
  29. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +7 -2
  30. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +1 -1
  31. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +16 -14
  32. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +3 -3
  33. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +12 -7
  34. package/node_modules/@herbertgao/pi-bark/README.md +39 -3
  35. package/node_modules/@herbertgao/pi-bark/package.json +1 -1
  36. package/node_modules/@herbertgao/pi-bark/src/index.ts +275 -15
  37. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +50 -50
  38. package/node_modules/@herbertgao/pi-cc-extensions/README.md +7 -7
  39. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +25 -2
  40. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +24 -1
  41. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +7 -4
  42. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/footer.ts +47 -5
  43. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/shell/mcp-chip.ts +136 -0
  44. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +56 -11
  45. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +36 -4
  46. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +11 -2
  47. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/codemode.ts +303 -0
  48. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-header.ts +1 -1
  49. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-highlight.ts +36 -0
  50. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-presentation.ts +2 -2
  51. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-write-render.ts +2 -2
  52. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/index.ts +88 -34
  53. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/line-width-safety.ts +6 -5
  54. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-execution.ts +1 -1
  55. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +31 -6
  56. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/message-display.ts +3 -3
  57. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/names.ts +3 -0
  58. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/result.ts +173 -36
  59. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/ansi-text.ts +1 -0
  60. package/node_modules/@herbertgao/pi-cc-extensions/package.json +6 -4
  61. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
  62. package/node_modules/@herbertgao/pi-subagents/package.json +1 -1
  63. package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +3 -2
  64. package/node_modules/@herbertgao/sol-pi/CONTRIBUTING.md +22 -0
  65. package/node_modules/@herbertgao/sol-pi/README.md +36 -17
  66. package/node_modules/@herbertgao/sol-pi/THIRD_PARTY_NOTICES.md +10 -6
  67. package/node_modules/@herbertgao/sol-pi/agents-install.md +15 -12
  68. package/node_modules/@herbertgao/sol-pi/docs/compatibility.md +24 -8
  69. package/node_modules/@herbertgao/sol-pi/docs/configuration.md +2 -2
  70. package/node_modules/@herbertgao/sol-pi/docs/star-history.md +18 -0
  71. package/node_modules/@herbertgao/sol-pi/package.json +4 -2
  72. package/node_modules/@herbertgao/sol-pi/scripts/check-sol-pi-config.mjs +1 -1
  73. package/node_modules/@herbertgao/sol-pi/src/sol-pi/config.ts +1 -1
  74. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/file-queue.ts +23 -4
  75. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/index.ts +32 -1
  76. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/action-fusion/then-run.ts +3 -2
  77. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/observation-pack/observation.ts +1 -1
  78. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/economics.ts +27 -7
  79. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/extension.ts +137 -41
  80. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/index.ts +1 -0
  81. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/plan.ts +2 -1
  82. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/projection.ts +58 -0
  83. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/state.ts +28 -6
  84. package/node_modules/@herbertgao/sol-pi/src/sol-pi/extensions/online-context-compact/tools.ts +2 -1
  85. package/node_modules/@herbertgao/sol-pi/src/sol-pi/runtime-paths.ts +15 -2
  86. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +2 -2
  87. package/node_modules/@narumitw/pi-caffeinate/package.json +4 -4
  88. package/node_modules/@pi-plugins/fast-mode/README.md +7 -1
  89. package/node_modules/@pi-plugins/fast-mode/dist/index.d.mts.map +1 -1
  90. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +7 -1
  91. package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
  92. package/node_modules/@pi-plugins/fast-mode/package.json +5 -5
  93. package/node_modules/pi-antigravity/README.md +3 -0
  94. package/node_modules/pi-antigravity/package.json +8 -8
  95. package/node_modules/pi-antigravity/src/auth/oauth.ts +6 -3
  96. package/node_modules/pi-antigravity/src/index.ts +114 -110
  97. package/node_modules/pi-antigravity/src/stream/stream.ts +1 -1
  98. package/node_modules/pi-antigravity/src/utils/util.ts +18 -1
  99. package/node_modules/pi-multi-account/CHANGELOG.md +20 -0
  100. package/node_modules/pi-multi-account/README.md +46 -8
  101. package/node_modules/pi-multi-account/config-file-transaction.ts +42 -0
  102. package/node_modules/pi-multi-account/index.ts +255 -269
  103. package/node_modules/pi-multi-account/model-pins.ts +36 -0
  104. package/node_modules/pi-multi-account/package.json +9 -7
  105. package/node_modules/pi-multi-account/slot-proxy-auth.ts +12 -2
  106. package/node_modules/pi-multi-account/slot-proxy.ts +27 -5
  107. package/node_modules/pi-typesafe/README.md +1 -1
  108. package/node_modules/pi-typesafe/dist/backends.d.ts +15 -5
  109. package/node_modules/pi-typesafe/dist/backends.js +18 -0
  110. package/node_modules/pi-typesafe/dist/client.d.ts +4 -3
  111. package/node_modules/pi-typesafe/dist/client.js +22 -7
  112. package/node_modules/pi-typesafe/dist/index.d.ts +2 -2
  113. package/node_modules/pi-typesafe/dist/index.js +1 -1
  114. package/node_modules/pi-typesafe/dist/usage.d.ts +14 -4
  115. package/node_modules/pi-typesafe/dist/usage.js +147 -42
  116. package/node_modules/pi-typesafe/package.json +1 -1
  117. package/node_modules/pi-web-access/CHANGELOG.md +65 -0
  118. package/node_modules/pi-web-access/README.md +63 -14
  119. package/node_modules/pi-web-access/brave-rate-limit.ts +176 -0
  120. package/node_modules/pi-web-access/brave.ts +28 -11
  121. package/node_modules/pi-web-access/curator-page.ts +5 -1
  122. package/node_modules/pi-web-access/curator-server.ts +2 -0
  123. package/node_modules/pi-web-access/declared-web-links.ts +2 -2
  124. package/node_modules/pi-web-access/degoog.ts +323 -0
  125. package/node_modules/pi-web-access/dist/index.js +3647 -2740
  126. package/node_modules/pi-web-access/dist/mcp-cli.js +27443 -0
  127. package/node_modules/pi-web-access/exa.ts +5 -1
  128. package/node_modules/pi-web-access/extract.ts +41 -3
  129. package/node_modules/pi-web-access/firecrawl.ts +35 -4
  130. package/node_modules/pi-web-access/gemini-search.ts +36 -16
  131. package/node_modules/pi-web-access/gemini-web.ts +14 -9
  132. package/node_modules/pi-web-access/index.ts +164 -1207
  133. package/node_modules/pi-web-access/keenable.ts +221 -0
  134. package/node_modules/pi-web-access/mcp-cli.ts +40 -0
  135. package/node_modules/pi-web-access/mcp-server.ts +81 -0
  136. package/node_modules/pi-web-access/mcp-tool-definitions.ts +117 -0
  137. package/node_modules/pi-web-access/openai-search.ts +58 -11
  138. package/node_modules/pi-web-access/package.json +23 -5
  139. package/node_modules/pi-web-access/perplexity.ts +64 -56
  140. package/node_modules/pi-web-access/summary-review.ts +8 -2
  141. package/node_modules/pi-web-access/tool-arguments.ts +20 -0
  142. package/node_modules/pi-web-access/video-extract.ts +1 -1
  143. package/node_modules/pi-web-access/web-tool-contract.ts +86 -0
  144. package/node_modules/pi-web-access/web-tool-core.ts +1502 -0
  145. package/node_modules/pi-web-access/youtube-extract.ts +2 -5
  146. package/node_modules/{@herbertgao/resume-from → resume-from}/README.md +16 -12
  147. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.d.ts +0 -5
  148. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/adapter.js +2 -3
  149. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.d.ts +2 -2
  150. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.d.ts +3 -0
  151. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/reader.js +27 -15
  152. package/node_modules/{@herbertgao/resume-from/dist/adapters/codex → resume-from/dist/adapters/claude-code}/redaction.js +16 -3
  153. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.d.ts +2 -4
  154. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/writer.js +1 -1
  155. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.d.ts +2 -4
  156. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.js +1 -2
  157. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/read.d.ts +16 -0
  158. package/node_modules/resume-from/dist/adapters/codex/read.js +723 -0
  159. package/node_modules/{@herbertgao/resume-from/dist/adapters/pi → resume-from/dist/adapters/codex}/redaction.js +16 -3
  160. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.d.ts +44 -4
  161. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/rollout.js +88 -4
  162. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.d.ts +2 -2
  163. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/write.js +2 -2
  164. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.d.ts +5 -1
  165. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.js +10 -6
  166. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.d.ts +2 -2
  167. package/node_modules/{@herbertgao/resume-from/dist/adapters/claude-code → resume-from/dist/adapters/pi}/redaction.js +16 -3
  168. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.d.ts +2 -4
  169. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/serialize.js +2 -2
  170. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.d.ts +1 -1
  171. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/render.js +4 -4
  172. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.js +2 -2
  173. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.d.ts +2 -2
  174. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.js +31 -8
  175. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.d.ts +1 -1
  176. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/wiring.js +1 -2
  177. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.d.ts +4 -1
  178. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/confirmation.js +2 -2
  179. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.d.ts +8 -6
  180. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.d.ts +10 -5
  181. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/finder.d.ts +2 -1
  182. package/node_modules/resume-from/dist/import/discovery/finder.js +269 -0
  183. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.d.ts +3 -3
  184. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.js +3 -3
  185. package/node_modules/resume-from/dist/import/pipeline.d.ts +28 -0
  186. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/pipeline.js +31 -11
  187. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.d.ts +2 -2
  188. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/builder.js +9 -5
  189. package/node_modules/resume-from/dist/import/preview/warnings.d.ts +14 -0
  190. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/warnings.js +26 -20
  191. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.js +12 -2
  192. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.d.ts +9 -3
  193. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.d.ts +4 -4
  194. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/git.js +7 -4
  195. package/node_modules/resume-from/dist/platform/repo/reader.d.ts +3 -0
  196. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/reader.js +60 -20
  197. package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.d.ts +8 -1
  198. package/node_modules/{@herbertgao/resume-from → resume-from}/package.json +19 -32
  199. package/node_modules/{@herbertgao/resume-from → resume-from}/shims/pi/extensions/resume-from.js +2 -2
  200. package/package.json +21 -21
  201. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +0 -21
  202. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +0 -62
  203. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
  204. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +0 -115
  205. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +0 -27
  206. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +0 -27
  207. package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
  208. package/node_modules/@dietrichgebert/ponytail/assets/retriever-icon.png +0 -0
  209. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-dark.svg +0 -4
  210. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-light.svg +0 -4
  211. package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
  212. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
  213. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
  214. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
  215. package/node_modules/@herbertgao/resume-from/dist/adapters/codex/read.js +0 -270
  216. package/node_modules/@herbertgao/resume-from/dist/import/discovery/finder.js +0 -129
  217. package/node_modules/@herbertgao/resume-from/dist/import/pipeline.d.ts +0 -17
  218. package/node_modules/@herbertgao/resume-from/dist/import/preview/warnings.d.ts +0 -11
  219. package/node_modules/@herbertgao/resume-from/dist/platform/repo/reader.d.ts +0 -8
  220. /package/node_modules/{@herbertgao/resume-from → resume-from}/LICENSE +0 -0
  221. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/contract.js +0 -0
  222. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.d.ts +0 -0
  223. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/entries.js +0 -0
  224. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.d.ts +0 -0
  225. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/index.js +0 -0
  226. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.d.ts +0 -0
  227. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/layout.js +0 -0
  228. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.d.ts +0 -0
  229. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/readback.js +0 -0
  230. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/redaction.d.ts +0 -0
  231. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.d.ts +0 -0
  232. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/claude-code/validation.js +0 -0
  233. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/contract.js +0 -0
  234. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/index.d.ts +0 -0
  235. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.d.ts +0 -0
  236. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/readback.js +0 -0
  237. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/redaction.d.ts +0 -0
  238. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.d.ts +0 -0
  239. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/codex/validation.js +0 -0
  240. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/contract.js +0 -0
  241. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/adapter.d.ts +0 -0
  242. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/contract.js +0 -0
  243. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.d.ts +0 -0
  244. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/format.js +0 -0
  245. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.d.ts +0 -0
  246. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/index.js +0 -0
  247. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.d.ts +0 -0
  248. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/parse.js +0 -0
  249. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/redaction.d.ts +0 -0
  250. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.d.ts +0 -0
  251. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/adapters/pi/validate.js +0 -0
  252. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.d.ts +0 -0
  253. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/bin.js +0 -0
  254. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.d.ts +0 -0
  255. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/contract.js +0 -0
  256. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.d.ts +0 -0
  257. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/agents.js +0 -0
  258. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.d.ts +0 -0
  259. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/args.js +0 -0
  260. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.d.ts +0 -0
  261. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/contract.js +0 -0
  262. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.d.ts +0 -0
  263. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/index.js +0 -0
  264. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.d.ts +0 -0
  265. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/presentation.js +0 -0
  266. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/cli/runner.d.ts +0 -0
  267. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/contract.js +0 -0
  268. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.d.ts +0 -0
  269. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/entry.js +0 -0
  270. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.d.ts +0 -0
  271. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/index.js +0 -0
  272. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/command.d.ts +0 -0
  273. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.d.ts +0 -0
  274. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/contract.js +0 -0
  275. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.d.ts +0 -0
  276. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/index.js +0 -0
  277. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.d.ts +0 -0
  278. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/picker.js +0 -0
  279. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.d.ts +0 -0
  280. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/presentation.js +0 -0
  281. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.d.ts +0 -0
  282. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/register.js +0 -0
  283. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.d.ts +0 -0
  284. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/pi-extension/ui.js +0 -0
  285. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.d.ts +0 -0
  286. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/profile.js +0 -0
  287. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.d.ts +0 -0
  288. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/host/registry.js +0 -0
  289. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/contract.js +0 -0
  290. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/contract.js +0 -0
  291. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.d.ts +0 -0
  292. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/errors.js +0 -0
  293. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.d.ts +0 -0
  294. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/homes.js +0 -0
  295. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.d.ts +0 -0
  296. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/index.js +0 -0
  297. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.d.ts +0 -0
  298. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/discovery/ordering.js +0 -0
  299. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.d.ts +0 -0
  300. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/errors.js +0 -0
  301. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.d.ts +0 -0
  302. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/index.js +0 -0
  303. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/contract.js +0 -0
  304. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.d.ts +0 -0
  305. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/errors.js +0 -0
  306. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.d.ts +0 -0
  307. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/handover.js +0 -0
  308. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.d.ts +0 -0
  309. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/index.js +0 -0
  310. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/lander.d.ts +0 -0
  311. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.d.ts +0 -0
  312. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/landing/marker.js +0 -0
  313. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.d.ts +0 -0
  314. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/contract.js +0 -0
  315. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.d.ts +0 -0
  316. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/format.js +0 -0
  317. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.d.ts +0 -0
  318. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/preview/index.js +0 -0
  319. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.d.ts +0 -0
  320. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/contract.js +0 -0
  321. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.d.ts +0 -0
  322. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/index.js +0 -0
  323. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.d.ts +0 -0
  324. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/transfer/rules.js +0 -0
  325. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/import/wiring.d.ts +0 -0
  326. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.d.ts +0 -0
  327. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/index.js +0 -0
  328. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.d.ts +0 -0
  329. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/contract.js +0 -0
  330. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.d.ts +0 -0
  331. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/defaults.js +0 -0
  332. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.d.ts +0 -0
  333. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/errors.js +0 -0
  334. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.d.ts +0 -0
  335. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/index.js +0 -0
  336. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.d.ts +0 -0
  337. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/loader.js +0 -0
  338. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.d.ts +0 -0
  339. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/paths.js +0 -0
  340. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.d.ts +0 -0
  341. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/config/validate.js +0 -0
  342. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/contract.js +0 -0
  343. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.d.ts +0 -0
  344. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/repo/index.js +0 -0
  345. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.d.ts +0 -0
  346. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/contract.js +0 -0
  347. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.d.ts +0 -0
  348. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/file-committer.js +0 -0
  349. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.d.ts +0 -0
  350. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/store/index.js +0 -0
  351. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.d.ts +0 -0
  352. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/contract.js +0 -0
  353. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.d.ts +0 -0
  354. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/estimator.js +0 -0
  355. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.d.ts +0 -0
  356. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/platform/tokens/index.js +0 -0
  357. /package/node_modules/{@herbertgao/resume-from → resume-from}/dist/session/contract.js +0 -0
@@ -1,6 +1,8 @@
1
1
  // The Internal Design, as code: this module builds its four stages and nothing else builds
2
2
  // them. Everything the stages need arrives from src/host/ — this module constructs no adapter,
3
3
  // no committer, no estimator and no configuration.
4
+ import { realpath } from "node:fs/promises";
5
+ import { isAbsolute } from "node:path";
4
6
  import { createSessionFinder } from "./discovery/index.js";
5
7
  import { createSessionLander } from "./landing/index.js";
6
8
  import { createPipelineFromStages } from "./pipeline.js";
@@ -9,10 +11,18 @@ import { createTransferRules } from "./transfer/index.js";
9
11
  /** The four stages, wired. Internal: a host builds a pipeline, never a stage. */
10
12
  export function buildStages(deps) {
11
13
  return {
12
- finder: createSessionFinder({ adapters: deps.adapters, config: deps.config }),
14
+ checkCancellation: () => deps.repo.checkCancellation(),
15
+ finder: createSessionFinder({ adapters: deps.adapters, config: deps.config, repo: deps.repo }),
13
16
  rules: createTransferRules(),
14
17
  // Per request: the preview reads the repository the request names (FR-13, FR-37).
15
- previewFor: (repoRoot) => createPreviewBuilder(deps.repo, repoRoot),
18
+ async destinationFor(cwd) {
19
+ if (!isAbsolute(cwd))
20
+ throw new Error("The destination cwd must be absolute.");
21
+ const canonicalCwd = await realpath(cwd);
22
+ const identity = await deps.repo.identify(canonicalCwd);
23
+ return { cwd, canonicalCwd, identity };
24
+ },
25
+ previewFor: ({ cwd, canonicalCwd, identity }, descriptor) => createPreviewBuilder(deps.repo, cwd, canonicalCwd, identity, descriptor.repoPaths),
16
26
  lander: createSessionLander(deps.handoverCommand === undefined ? {} : { handoverCommand: deps.handoverCommand }),
17
27
  adapters: deps.adapters,
18
28
  config: deps.config,
@@ -1,8 +1,12 @@
1
1
  /** The repository the command runs in (FR-13). */
2
2
  export interface RepoIdentity {
3
- /** Absolute path of the repository root, or null when the directory is not in a repository. */
3
+ /** Canonical checkout root, or null when unresolved or bare (not an import destination). */
4
4
  root: string | null;
5
- /** Current HEAD commit, or null when the repository has no commit yet. */
5
+ /** Canonical Git common directory shared by linked worktrees, or null when unresolved. */
6
+ commonDir: string | null;
7
+ /** True only for a resolved bare repository; its linked working trees report false. */
8
+ isBare: boolean;
9
+ /** Current HEAD commit, or null when unresolved or the repository has no commit yet. */
6
10
  head: string | null;
7
11
  branch: string | null;
8
12
  }
@@ -24,7 +28,9 @@ export interface RepoReaderOptions {
24
28
  }
25
29
  /** Reads git state. It never writes to the repository. */
26
30
  export interface RepoReader {
31
+ /** Throws AbortError with the signal reason as cause when cancelled; performs no I/O. */
32
+ checkCancellation(): void;
27
33
  identify(cwd: string): Promise<RepoIdentity>;
28
34
  /** Compares HEAD with a commit of a source session (FR-37). */
29
- distanceFrom(sourceCommit: string): Promise<CommitDistance>;
35
+ distanceFrom(cwd: string, sourceCommit: string): Promise<CommitDistance>;
30
36
  }
@@ -1,6 +1,6 @@
1
1
  import type { RepoReaderOptions } from "./contract.js";
2
2
  export interface GitResult {
3
- /** True when git exited 0. A non-zero exit is an answer ("no such revision"), not a failure. */
3
+ /** True when git exited 0. A completed nonzero exit leaves the requested fact unresolved. */
4
4
  ok: boolean;
5
5
  stdout: string;
6
6
  stderr: string;
@@ -8,9 +8,9 @@ export interface GitResult {
8
8
  /**
9
9
  * Runs a read-only git command in `cwd`.
10
10
  *
11
- * Rejects only when git could not be run at all — a missing binary, a signal. An exit code is
12
- * reported in `ok`, because the callers of this module treat "not a repository", "no commits yet"
13
- * and "unknown revision" as facts to report rather than errors to raise.
11
+ * Rejects operational failures, including spawn failures, timeout and cancellation. A completed
12
+ * nonzero exit is reported in `ok`: callers leave the requested fact unresolved without trying
13
+ * to classify localized stderr (which need not mean the directory is outside Git).
14
14
  */
15
15
  export declare function runGit(cwd: string, args: readonly string[], options?: RepoReaderOptions): Promise<GitResult>;
16
16
  interface NormalizedOptions {
@@ -8,9 +8,9 @@ const DEFAULT_GIT_TIMEOUT_MS = 10_000;
8
8
  /**
9
9
  * Runs a read-only git command in `cwd`.
10
10
  *
11
- * Rejects only when git could not be run at all — a missing binary, a signal. An exit code is
12
- * reported in `ok`, because the callers of this module treat "not a repository", "no commits yet"
13
- * and "unknown revision" as facts to report rather than errors to raise.
11
+ * Rejects operational failures, including spawn failures, timeout and cancellation. A completed
12
+ * nonzero exit is reported in `ok`: callers leave the requested fact unresolved without trying
13
+ * to classify localized stderr (which need not mean the directory is outside Git).
14
14
  */
15
15
  export function runGit(cwd, args, options = {}) {
16
16
  const processOptions = normalizeGitOptions(options);
@@ -49,7 +49,9 @@ export function normalizeGitOptions(options) {
49
49
  }
50
50
  function processError(cwd, options, cause) {
51
51
  if (options.signal?.aborted === true || cause.name === "AbortError") {
52
- return new Error(`git command aborted while reading ${cwd}`, { cause });
52
+ const error = new Error(`git command aborted while reading ${cwd}`, { cause });
53
+ error.name = "AbortError";
54
+ return error;
53
55
  }
54
56
  if (cause.killed === true && cause.signal !== undefined) {
55
57
  return new Error(`git command timed out after ${options.timeoutMs} ms while reading ${cwd}`, {
@@ -68,6 +70,7 @@ function gitEnv() {
68
70
  // These would override `-C` and point git at a repository other than the one being asked about,
69
71
  // for example when the tool runs inside a git hook.
70
72
  delete env.GIT_DIR;
73
+ delete env.GIT_COMMON_DIR;
71
74
  delete env.GIT_WORK_TREE;
72
75
  delete env.GIT_INDEX_FILE;
73
76
  return env;
@@ -0,0 +1,3 @@
1
+ import type { RepoReader, RepoReaderOptions } from "./contract.js";
2
+ /** A reader with process controls only; every lookup names its directory explicitly. */
3
+ export declare function createRepoReader(options?: RepoReaderOptions): RepoReader;
@@ -5,38 +5,76 @@ import { normalizeGitOptions, runGit } from "./git.js";
5
5
  function unknownDistance() {
6
6
  return { known: false, ahead: 0, behind: 0 };
7
7
  }
8
- function noRepository() {
9
- return { root: null, head: null, branch: null };
8
+ function unresolvedIdentity() {
9
+ return { root: null, commonDir: null, isBare: false, head: null, branch: null };
10
10
  }
11
11
  /**
12
12
  * Longer than any revision git can resolve: a full commit is 40 characters, a tag or a ref
13
13
  * expression a few more. A longer string is a mistake or an attack, and is not sent to git.
14
14
  */
15
15
  const MAX_REVISION_LENGTH = 256;
16
- /**
17
- * A reader bound to one working directory.
18
- *
19
- * `identify` takes the directory to look at; `distanceFrom` compares against the HEAD of `cwd`,
20
- * which is the repository the command is running in.
21
- */
22
- export function createRepoReader(cwd = process.cwd(), options = {}) {
16
+ /** A reader with process controls only; every lookup names its directory explicitly. */
17
+ export function createRepoReader(options = {}) {
23
18
  const processOptions = normalizeGitOptions(options);
24
19
  const git = (directory, args) => runGit(directory, args, processOptions);
20
+ const checkCancellation = () => {
21
+ if (processOptions.signal?.aborted) {
22
+ const error = new Error("Repository read aborted", { cause: processOptions.signal.reason });
23
+ error.name = "AbortError";
24
+ throw error;
25
+ }
26
+ };
25
27
  return {
26
- identify: (directory) => identify(directory, git),
27
- distanceFrom: (sourceCommit) => distanceFrom(cwd, sourceCommit, git),
28
+ checkCancellation,
29
+ identify: async (directory) => {
30
+ checkCancellation();
31
+ const identity = await identify(directory, git);
32
+ checkCancellation();
33
+ return identity;
34
+ },
35
+ distanceFrom: async (cwd, sourceCommit) => {
36
+ checkCancellation();
37
+ const distance = await distanceFrom(cwd, sourceCommit, git);
38
+ checkCancellation();
39
+ return distance;
40
+ },
28
41
  };
29
42
  }
43
+ /** Git terminates path records with LF; all preceding whitespace belongs to the path. */
44
+ function pathOutput(stdout) {
45
+ return stdout.endsWith("\n") ? stdout.slice(0, -1) : stdout;
46
+ }
30
47
  async function identify(directory, git) {
31
- const dir = resolve(directory);
32
- const toplevel = await git(dir, ["rev-parse", "--show-toplevel"]);
33
- if (!toplevel.ok)
34
- return noRepository();
35
- const root = await resolveFully(toplevel.stdout.trim());
36
- if (root === null)
37
- return noRepository();
48
+ // Resolve the input itself: a missing worktree must never inherit its parent's identity.
49
+ const dir = await resolveFully(resolve(directory));
50
+ if (dir === null)
51
+ return unresolvedIdentity();
52
+ const common = await git(dir, ["rev-parse", "--git-common-dir"]);
53
+ const commonPath = pathOutput(common.stdout);
54
+ if (!common.ok || commonPath === "")
55
+ return unresolvedIdentity();
56
+ const commonDir = await resolveFully(resolve(dir, commonPath));
57
+ if (commonDir === null)
58
+ return unresolvedIdentity();
59
+ const bare = await git(dir, ["rev-parse", "--is-bare-repository"]);
60
+ if (!bare.ok)
61
+ return unresolvedIdentity();
62
+ const isBare = bare.stdout.trim() === "true";
63
+ // Bare repositories have a shared identity but no checkout usable as an import destination.
64
+ let root = null;
65
+ if (!isBare) {
66
+ const toplevel = await git(dir, ["rev-parse", "--show-toplevel"]);
67
+ const checkoutPath = pathOutput(toplevel.stdout);
68
+ if (!toplevel.ok || checkoutPath === "")
69
+ return unresolvedIdentity();
70
+ root = await resolveFully(resolve(dir, checkoutPath));
71
+ if (root === null)
72
+ return unresolvedIdentity();
73
+ }
38
74
  return {
39
75
  root,
76
+ commonDir,
77
+ isBare,
40
78
  head: await commitOf(dir, "HEAD", git),
41
79
  branch: await branch(dir, git),
42
80
  };
@@ -124,7 +162,9 @@ async function resolveFully(directory) {
124
162
  try {
125
163
  return await realpath(directory);
126
164
  }
127
- catch {
128
- return null;
165
+ catch (error) {
166
+ if (error.code === "ENOENT")
167
+ return null;
168
+ throw error;
129
169
  }
130
170
  }
@@ -21,8 +21,15 @@ export interface SessionDescriptor {
21
21
  updatedAt: string;
22
22
  /** Turns the source holds, before any rule of section D or E runs. */
23
23
  turnCount: number;
24
- /** Absolute path of the repository the session ran in, or null when unknown (FR-13). */
24
+ /** First recorded candidate: repoPaths[0] ?? null, even when that path no longer exists (FR-13). */
25
25
  repoPath: string | null;
26
+ /** Distinct absolute recorded directories, ordered by first appearance in the active conversation. */
27
+ repoPaths: string[];
28
+ /**
29
+ * Absolute directory of the session’s earliest non-sidechain record, when the format records one.
30
+ * Discovery matches it as a last resort, so a session that started here is still listed here.
31
+ */
32
+ startDirectory: string | null;
26
33
  /** Absolute path of the source file. Lets the user select by path (FR-12). */
27
34
  filePath: string;
28
35
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "@herbertgao/resume-from",
3
- "version": "0.2.4",
2
+ "name": "resume-from",
3
+ "version": "0.4.1",
4
4
  "description": "Continue a coding session in a different agent, or a different profile.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -10,11 +10,8 @@
10
10
  "codex"
11
11
  ],
12
12
  "type": "module",
13
+ "packageManager": "pnpm@11.20.0",
13
14
  "license": "MIT",
14
- "author": "Herbert Gao",
15
- "contributors": [
16
- "Alexei Led"
17
- ],
18
15
  "engines": {
19
16
  "node": ">=24"
20
17
  },
@@ -34,36 +31,34 @@
34
31
  },
35
32
  "files": [
36
33
  "dist",
37
- "shims/pi",
38
- "README.md",
39
- "LICENSE"
34
+ "shims/pi"
40
35
  ],
41
36
  "scripts": {
42
37
  "build": "node scripts/clean-dist.mjs && tsc -p tsconfig.build.json",
43
38
  "typecheck": "tsc --noEmit",
44
39
  "test": "vitest run",
45
40
  "test:watch": "vitest",
46
- "format": "biome format --write .",
47
- "format:check": "biome format .",
48
41
  "lint": "biome check . && eslint . --cache --cache-strategy content",
49
42
  "lint:fix": "biome check --write .",
43
+ "packages:stage": "npm run build && node scripts/release/stage-npm-packages.mjs",
44
+ "packages:check": "npm run packages:stage && node scripts/release/check-npm-packages.mjs",
50
45
  "pack:dry": "npm pack --dry-run",
51
- "prepack": "npm run build",
52
- "postpack": "node scripts/clean-dist.mjs"
46
+ "prepack": "npm run build"
53
47
  },
54
48
  "devDependencies": {
55
- "@biomejs/biome": "2.5.7",
49
+ "@biomejs/biome": "2.5.14",
50
+ "@earendil-works/pi-tui": "^1.0.2",
56
51
  "@eslint/js": "^10.0.1",
57
- "@types/node": "^24.13.3",
58
- "esbuild": "0.28.1",
59
- "eslint": "^10.8.0",
60
- "globals": "^17.9.0",
52
+ "@types/node": "^24.19.0",
53
+ "esbuild": "0.28.2",
54
+ "eslint": "^10.11.0",
55
+ "globals": "^17.12.0",
61
56
  "typescript": "^7.0.2",
62
57
  "typescript-compiler-api": "npm:typescript@6.0.3",
63
- "vitest": "^4.1.10"
58
+ "vitest": "^5.0.3"
64
59
  },
65
60
  "dependencies": {
66
- "gpt-tokenizer": "^3.4.0"
61
+ "gpt-tokenizer": "^4.0.0"
67
62
  },
68
63
  "peerDependencies": {
69
64
  "@earendil-works/pi-tui": "*"
@@ -76,21 +71,13 @@
76
71
  },
77
72
  "repository": {
78
73
  "type": "git",
79
- "url": "git+https://github.com/HerbertGao/pi-extensions.git",
80
- "directory": "packages/resume-from"
74
+ "url": "git+https://github.com/alexei-led/resume-from.git"
81
75
  },
82
- "homepage": "https://github.com/HerbertGao/pi-extensions/tree/master/packages/resume-from#readme",
76
+ "homepage": "https://github.com/alexei-led/resume-from#readme",
83
77
  "bugs": {
84
- "url": "https://github.com/HerbertGao/pi-extensions/issues"
78
+ "url": "https://github.com/alexei-led/resume-from/issues"
85
79
  },
86
80
  "publishConfig": {
87
- "access": "public",
88
- "provenance": true
89
- },
90
- "x-upstream": {
91
- "package": "resume-from",
92
- "version": "0.2.0",
93
- "repository": "https://github.com/alexei-led/resume-from",
94
- "commit": "e1dad0dd4ae5fb6a5a50b905dd4359a29fd0910e"
81
+ "access": "public"
95
82
  }
96
83
  }
@@ -1,8 +1,8 @@
1
1
  import { homedir } from "node:os";
2
2
  import { isAbsolute, join, resolve } from "node:path";
3
3
  import { truncateToWidth } from "@earendil-works/pi-tui";
4
- import { activatePiExtension } from "@herbertgao/resume-from";
5
- import { formatRow, safeLines, safeText } from "@herbertgao/resume-from/pi-extension";
4
+ import { activatePiExtension } from "resume-from";
5
+ import { formatRow, safeLines, safeText } from "resume-from/pi-extension";
6
6
 
7
7
  const COMMAND_NAME = "resume-from";
8
8
  const DESCRIPTION =
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herbertgao/pi-extensions",
3
- "version": "2026.9.20",
3
+ "version": "2026.10.1",
4
4
  "description": "Aggregate installer for HerbertGao-maintained Pi extensions.",
5
5
  "keywords": [
6
6
  "extensions",
@@ -36,23 +36,22 @@
36
36
  "dependencies": {
37
37
  "@ast-grep/cli": "^0.45.0",
38
38
  "@ast-grep/napi": "^0.45.0",
39
- "@bufbuild/protobuf": "^2.14.0",
40
- "@dietrichgebert/ponytail": "4.10.0",
41
- "@herbertgao/pi-bark": "0.1.4",
42
- "@herbertgao/pi-cc-extensions": "0.10.0",
43
- "@herbertgao/pi-subagents": "0.18.4",
44
- "@herbertgao/resume-from": "0.2.4",
45
- "@herbertgao/sol-pi": "0.3.4",
46
- "@juicesharp/rpiv-ask-user-question": "2.11.0",
47
- "@juicesharp/rpiv-config": "^2.11.0",
39
+ "@bufbuild/protobuf": "^2.15.0",
40
+ "@dietrichgebert/ponytail": "4.13.0",
41
+ "@herbertgao/pi-bark": "0.2.0",
42
+ "@herbertgao/pi-cc-extensions": "0.11.0",
43
+ "@herbertgao/pi-subagents": "0.18.5",
44
+ "@herbertgao/sol-pi": "0.4.0",
45
+ "@juicesharp/rpiv-ask-user-question": "2.12.0",
46
+ "@juicesharp/rpiv-config": "^2.12.0",
48
47
  "@modelcontextprotocol/sdk": "^1.29.0",
49
48
  "@mozilla/readability": "^0.6.0",
50
49
  "@napi-rs/keyring": "^2.1.0",
51
50
  "@narumitw/pi-btw": "0.61.1",
52
- "@narumitw/pi-caffeinate": "0.49.8",
51
+ "@narumitw/pi-caffeinate": "0.49.9",
53
52
  "@narumitw/pi-tui-kit": "^0.64.0",
54
53
  "@noble/ed25519": "^3.1.0",
55
- "@pi-plugins/fast-mode": "0.1.12",
54
+ "@pi-plugins/fast-mode": "0.1.13",
56
55
  "@shikijs/cli": "^4.0.2",
57
56
  "@tifan/pi-copy-response": "0.2.7",
58
57
  "@tifan/pi-handoff": "2.2.2",
@@ -63,9 +62,9 @@
63
62
  "@tifan/pi-rename": "0.6.0",
64
63
  "@typesafe-ai/sdk": "0.6.0",
65
64
  "croner": "^10.0.1",
66
- "dbus-native": "^0.15.2",
65
+ "dbus-native": "^0.16.0",
67
66
  "defuddle": "0.19.3",
68
- "gpt-tokenizer": "^3.4.0",
67
+ "gpt-tokenizer": "^4.0.0",
69
68
  "grok-mermaid": "0.2.3",
70
69
  "jiti": "^2.7.0",
71
70
  "js-yaml": "^5.2.2",
@@ -73,18 +72,19 @@
73
72
  "minimatch": "^10.2.6",
74
73
  "nanoid": "^5.0.0",
75
74
  "p-limit": "^6.1.0",
76
- "pi-antigravity": "0.8.1",
75
+ "pi-antigravity": "0.9.0",
77
76
  "pi-jev-auto-mode": "0.5.0",
78
77
  "pi-lens": "4.3.0",
79
- "pi-multi-account": "1.23.2",
78
+ "pi-multi-account": "1.24.0",
80
79
  "pi-next-cue": "1.0.7",
81
- "pi-typesafe": "0.8.1",
82
- "pi-web-access": "0.34.0",
80
+ "pi-typesafe": "0.9.1",
81
+ "pi-web-access": "0.37.0",
83
82
  "pidusage": "^4.0.1",
84
83
  "promise.try": "^2.0.1",
85
84
  "proper-lockfile": "4.1.2",
86
85
  "qrcode-terminal": "^0.12.0",
87
86
  "remote-pi": "0.7.0",
87
+ "resume-from": "0.4.1",
88
88
  "turndown": "^7.2.0",
89
89
  "unbash": "4.0.10",
90
90
  "undici": "^8.11.2",
@@ -109,7 +109,6 @@
109
109
  "@herbertgao/pi-bark",
110
110
  "@herbertgao/pi-cc-extensions",
111
111
  "@herbertgao/pi-subagents",
112
- "@herbertgao/resume-from",
113
112
  "@herbertgao/sol-pi",
114
113
  "@juicesharp/rpiv-ask-user-question",
115
114
  "@narumitw/pi-btw",
@@ -130,7 +129,8 @@
130
129
  "pi-next-cue",
131
130
  "pi-typesafe",
132
131
  "pi-web-access",
133
- "remote-pi"
132
+ "remote-pi",
133
+ "resume-from"
134
134
  ],
135
135
  "engines": {
136
136
  "node": ">=24"
@@ -141,7 +141,7 @@
141
141
  "./node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts",
142
142
  "./node_modules/@herbertgao/sol-pi/src/sol-pi/index.ts",
143
143
  "./node_modules/@tifan/pi-copy-response/src/index.ts",
144
- "./node_modules/@herbertgao/resume-from/shims/pi/extensions/resume-from.js",
144
+ "./node_modules/resume-from/shims/pi/extensions/resume-from.js",
145
145
  "./node_modules/@tifan/pi-handoff/src/index.ts",
146
146
  "./node_modules/@tifan/pi-handoff/src/session-query.ts",
147
147
  "./node_modules/@tifan/pi-inline-skills/src/index.ts",
@@ -1,21 +0,0 @@
1
- <svg viewBox="0 0 860 336" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
2
- <title>Median lines of code per arm across three models</title>
3
- <text x="20" y="26" font-size="15" font-weight="600" fill="#8b949e">Median lines of code. 10 runs per cell. Lower is leaner.</text>
4
- <text x="20" y="45" font-size="12" fill="#8b949e" opacity="0.85">Ponytail writes 80-94% less code, costs 42-75% less, and runs 3-6x faster than a no-skill agent.</text>
5
- <rect x="20" y="58" width="12" height="12" rx="2" fill="#8b949e"/><text x="38" y="69" font-size="13" fill="#8b949e">baseline (no skill)</text>
6
- <rect x="190" y="58" width="12" height="12" rx="2" fill="#d9822b"/><text x="208" y="69" font-size="13" fill="#8b949e">caveman</text>
7
- <rect x="300" y="58" width="12" height="12" rx="2" fill="#2da44e"/><text x="318" y="69" font-size="13" fill="#8b949e">ponytail</text>
8
- <text x="112" y="119" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Haiku</text>
9
- <rect x="120" y="92" width="508" height="14" rx="2" fill="#8b949e"/><text x="634" y="103" font-size="11" fill="#8b949e">518</text>
10
- <rect x="120" y="110" width="114" height="14" rx="2" fill="#d9822b"/><text x="240" y="121" font-size="11" fill="#d9822b">116</text>
11
- <rect x="120" y="128" width="38" height="14" rx="2" fill="#2da44e"/><text x="164" y="139" font-size="11" fill="#2da44e" font-weight="600">39</text>
12
- <text x="112" y="193" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Sonnet</text>
13
- <rect x="120" y="166" width="680" height="14" rx="2" fill="#8b949e"/><text x="806" y="177" font-size="11" fill="#8b949e">693</text>
14
- <rect x="120" y="184" width="118" height="14" rx="2" fill="#d9822b"/><text x="244" y="195" font-size="11" fill="#d9822b">120</text>
15
- <rect x="120" y="202" width="43" height="14" rx="2" fill="#2da44e"/><text x="169" y="213" font-size="11" fill="#2da44e" font-weight="600">44</text>
16
- <text x="112" y="267" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Opus</text>
17
- <rect x="120" y="240" width="251" height="14" rx="2" fill="#8b949e"/><text x="377" y="251" font-size="11" fill="#8b949e">256</text>
18
- <rect x="120" y="258" width="66" height="14" rx="2" fill="#d9822b"/><text x="192" y="269" font-size="11" fill="#d9822b">67</text>
19
- <rect x="120" y="276" width="50" height="14" rx="2" fill="#2da44e"/><text x="176" y="287" font-size="11" fill="#2da44e" font-weight="600">51</text>
20
- <text x="120" y="324" font-size="11" fill="#8b949e" opacity="0.8">Median of 10 runs/cell, default temperature. 5 tasks (email, debounce, CSV sum, countdown, rate-limit), same model per group. Reproduce: npx promptfoo eval -c benchmarks/promptfooconfig.yaml</text>
21
- </svg>
@@ -1,62 +0,0 @@
1
- <svg viewBox="0 0 860 488" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
2
- <title>Each arm vs the no-skill baseline across every metric, plus safety, Claude Code on Haiku 4.5</title>
3
- <text x="430" y="24" font-size="15" font-weight="600" fill="#8b949e" text-anchor="middle">Every metric vs the no-skill baseline (Claude Code, Haiku 4.5, 12 tasks)</text>
4
-
5
- <rect x="212" y="38" width="12" height="12" rx="2" fill="#8b949e"/><text x="229" y="48" font-size="12" fill="#8b949e">baseline</text>
6
- <rect x="300" y="38" width="12" height="12" rx="2" fill="#d9822b"/><text x="317" y="48" font-size="12" fill="#8b949e">caveman</text>
7
- <rect x="392" y="38" width="12" height="12" rx="2" fill="#2da44e"/><text x="409" y="48" font-size="12" fill="#8b949e">ponytail</text>
8
- <rect x="478" y="38" width="12" height="12" rx="2" fill="#8957e5"/><text x="495" y="48" font-size="12" fill="#8b949e">yagni-oneliner</text>
9
-
10
- <text x="32" y="248" font-size="12" fill="#8b949e" text-anchor="middle" transform="rotate(-90 32 248)">% of baseline (lower is leaner)</text>
11
- <line x1="85" y1="360" x2="815" y2="360" stroke="#8b949e" stroke-opacity="0.55"/>
12
- <line x1="85" y1="305" x2="815" y2="305" stroke="#8b949e" stroke-opacity="0.16"/>
13
- <line x1="85" y1="250" x2="815" y2="250" stroke="#8b949e" stroke-opacity="0.16"/>
14
- <line x1="85" y1="195" x2="815" y2="195" stroke="#8b949e" stroke-opacity="0.16"/>
15
- <line x1="85" y1="140" x2="815" y2="140" stroke="#8b949e" stroke-opacity="0.45" stroke-dasharray="4 4"/>
16
- <text x="78" y="364" font-size="11" fill="#8b949e" text-anchor="end">0%</text>
17
- <text x="78" y="309" font-size="11" fill="#8b949e" text-anchor="end">25%</text>
18
- <text x="78" y="254" font-size="11" fill="#8b949e" text-anchor="end">50%</text>
19
- <text x="78" y="199" font-size="11" fill="#8b949e" text-anchor="end">75%</text>
20
- <text x="78" y="144" font-size="11" fill="#8b949e" text-anchor="end">100%</text>
21
-
22
- <!-- LOC -->
23
- <rect x="108" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="123" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
24
- <rect x="146" y="184" width="30" height="176" rx="2" fill="#d9822b"/><text x="161" y="179" font-size="10" fill="#d9822b" text-anchor="middle">80%</text>
25
- <rect x="184" y="259" width="30" height="101" rx="2" fill="#2da44e"/><text x="199" y="254" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">46%</text>
26
- <rect x="222" y="213" width="30" height="147" rx="2" fill="#8957e5"/><text x="237" y="208" font-size="10" fill="#8957e5" text-anchor="middle">67%</text>
27
- <text x="180" y="380" font-size="13" fill="#8b949e" text-anchor="middle">LOC</text>
28
- <text x="180" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 191</text>
29
-
30
- <!-- tokens -->
31
- <rect x="288" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="303" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
32
- <rect x="326" y="125" width="30" height="235" rx="2" fill="#d9822b"/><text x="341" y="120" font-size="10" fill="#d9822b" text-anchor="middle">107%</text>
33
- <rect x="364" y="188" width="30" height="172" rx="2" fill="#2da44e"/><text x="379" y="183" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">78%</text>
34
- <rect x="402" y="171" width="30" height="189" rx="2" fill="#8957e5"/><text x="417" y="166" font-size="10" fill="#8957e5" text-anchor="middle">86%</text>
35
- <text x="360" y="380" font-size="13" fill="#8b949e" text-anchor="middle">tokens</text>
36
- <text x="360" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 349k</text>
37
-
38
- <!-- cost -->
39
- <rect x="468" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="483" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
40
- <rect x="506" y="136" width="30" height="224" rx="2" fill="#d9822b"/><text x="521" y="131" font-size="10" fill="#d9822b" text-anchor="middle">102%</text>
41
- <rect x="544" y="184" width="30" height="176" rx="2" fill="#2da44e"/><text x="559" y="179" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">80%</text>
42
- <rect x="582" y="188" width="30" height="172" rx="2" fill="#8957e5"/><text x="597" y="183" font-size="10" fill="#8957e5" text-anchor="middle">78%</text>
43
- <text x="540" y="380" font-size="13" fill="#8b949e" text-anchor="middle">cost</text>
44
- <text x="540" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base $0.10</text>
45
-
46
- <!-- time -->
47
- <rect x="648" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="663" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
48
- <rect x="686" y="136" width="30" height="224" rx="2" fill="#d9822b"/><text x="701" y="131" font-size="10" fill="#d9822b" text-anchor="middle">102%</text>
49
- <rect x="724" y="199" width="30" height="161" rx="2" fill="#2da44e"/><text x="739" y="194" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">73%</text>
50
- <rect x="762" y="206" width="30" height="154" rx="2" fill="#8957e5"/><text x="777" y="201" font-size="10" fill="#8957e5" text-anchor="middle">70%</text>
51
- <text x="720" y="380" font-size="13" fill="#8b949e" text-anchor="middle">time</text>
52
- <text x="720" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 69s</text>
53
-
54
- <text x="20" y="418" font-size="11" fill="#8b949e" opacity="0.8">Each bar = that arm's mean as a % of the no-skill baseline (the gray 100% bars). Lower is leaner / cheaper / faster; caveman rises above 100% on tokens, cost and time. n=4.</text>
55
-
56
- <line x1="20" y1="438" x2="815" y2="438" stroke="#8b949e" stroke-opacity="0.25"/>
57
- <text x="20" y="460" font-size="11" fill="#8b949e" opacity="0.9">Safety, separate 6-task adversarial tier (path-traversal, SQLi, token forgery, malformed input, rate-limit). Higher is safer:</text>
58
- <text x="90" y="478" font-size="12" fill="#8b949e">baseline 100%</text>
59
- <text x="230" y="478" font-size="12" fill="#d9822b">caveman 100%</text>
60
- <text x="370" y="478" font-size="12" font-weight="600" fill="#2da44e">ponytail 100%</text>
61
- <text x="510" y="478" font-size="12" fill="#8957e5">yagni-oneliner <tspan fill="#cf222e" font-weight="600">95%</tspan> (dropped a guard once)</text>
62
- </svg>