@herbertgao/pi-extensions 2026.8.2 → 2026.8.4

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 (392) hide show
  1. package/README.md +50 -2
  2. package/examples/pi-footer.json +275 -0
  3. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +6 -8
  4. package/node_modules/@herbertgao/pi-cc-extensions/README.md +5 -7
  5. package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +101 -0
  6. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +1 -17
  7. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +5 -3
  8. package/node_modules/@herbertgao/pi-cc-extensions/extensions/{utils/agent-summary.ts → feature/agent-summary/core.ts} +37 -35
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-summary.ts → agent-summary/index.ts} +2 -6
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference.ts → reference/index.ts} +1 -1
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-autocomplete.ts → reference/subagent.ts} +19 -9
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-startup-header.ts → shell/startup-header.ts} +1 -1
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{working-message.ts → shell/working-message.ts} +5 -2
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +32 -28
  15. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +379 -85
  16. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +727 -0
  17. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +65 -775
  18. package/node_modules/@herbertgao/pi-cc-extensions/extensions/{feature → renderer}/markdown-enhance.ts +35 -31
  19. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-hover.ts → mouse/hover.ts} +5 -5
  20. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-interaction.ts → mouse/interaction.ts} +34 -35
  21. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-layout.ts → mouse/layout.ts} +5 -21
  22. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-packets.ts → mouse/packets.ts} +1 -1
  23. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-scroll.ts → mouse/scroll.ts} +48 -37
  24. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ansi-utils.ts +56 -1
  25. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-renderer.ts +2 -2
  26. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/line-width-safety.ts +1 -1
  27. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +12 -0
  28. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/write-execution.ts +1 -2
  29. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-grouping.ts → tool/grouping.ts} +18 -8
  30. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-result.ts → tool/result.ts} +4 -13
  31. package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +0 -27
  32. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  33. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
  34. package/node_modules/@herbertgao/pi-subagents/package.json +2 -2
  35. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +1 -0
  36. package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +3 -1
  37. package/node_modules/@herbertgao/pi-subagents/src/index.ts +33 -35
  38. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +26 -35
  39. package/node_modules/@herbertgao/pi-subagents/src/prompts.ts +15 -1
  40. package/node_modules/pi-footer/CHANGELOG.md +145 -0
  41. package/node_modules/pi-footer/LICENSE +21 -0
  42. package/node_modules/pi-footer/README.md +354 -0
  43. package/node_modules/pi-footer/package.json +68 -0
  44. package/node_modules/pi-footer/src/cache.ts +106 -0
  45. package/node_modules/pi-footer/src/colors.ts +237 -0
  46. package/node_modules/pi-footer/src/config.ts +202 -0
  47. package/node_modules/pi-footer/src/event-widgets.ts +41 -0
  48. package/node_modules/pi-footer/src/extension-statuses.ts +102 -0
  49. package/node_modules/pi-footer/src/git.ts +135 -0
  50. package/node_modules/pi-footer/src/index.ts +268 -0
  51. package/node_modules/pi-footer/src/metrics.ts +141 -0
  52. package/node_modules/pi-footer/src/presets.ts +383 -0
  53. package/node_modules/pi-footer/src/render.ts +114 -0
  54. package/node_modules/pi-footer/src/separators.ts +52 -0
  55. package/node_modules/pi-footer/src/types.ts +122 -0
  56. package/node_modules/pi-footer/src/ui/color-level-confirm.ts +22 -0
  57. package/node_modules/pi-footer/src/ui/color-options.ts +195 -0
  58. package/node_modules/pi-footer/src/ui/config-lifecycle.ts +61 -0
  59. package/node_modules/pi-footer/src/ui/edit-colors.ts +13 -0
  60. package/node_modules/pi-footer/src/ui/events.ts +35 -0
  61. package/node_modules/pi-footer/src/ui/extension-status-picker.ts +60 -0
  62. package/node_modules/pi-footer/src/ui/extension-statuses.ts +73 -0
  63. package/node_modules/pi-footer/src/ui/fields.ts +252 -0
  64. package/node_modules/pi-footer/src/ui/global-menu.ts +126 -0
  65. package/node_modules/pi-footer/src/ui/helpers.ts +44 -0
  66. package/node_modules/pi-footer/src/ui/layout.ts +17 -0
  67. package/node_modules/pi-footer/src/ui/line-list.ts +19 -0
  68. package/node_modules/pi-footer/src/ui/model.ts +64 -0
  69. package/node_modules/pi-footer/src/ui/navigation.ts +29 -0
  70. package/node_modules/pi-footer/src/ui/option-edit.ts +93 -0
  71. package/node_modules/pi-footer/src/ui/overlay-render.ts +103 -0
  72. package/node_modules/pi-footer/src/ui/screen-context.ts +18 -0
  73. package/node_modules/pi-footer/src/ui/screen-controller.ts +27 -0
  74. package/node_modules/pi-footer/src/ui/screen-render.ts +32 -0
  75. package/node_modules/pi-footer/src/ui/screen-state.ts +20 -0
  76. package/node_modules/pi-footer/src/ui/screen.ts +243 -0
  77. package/node_modules/pi-footer/src/ui/screens/add-widget.ts +92 -0
  78. package/node_modules/pi-footer/src/ui/screens/confirm-exit.ts +52 -0
  79. package/node_modules/pi-footer/src/ui/screens/controller.ts +12 -0
  80. package/node_modules/pi-footer/src/ui/screens/edit-colors.ts +68 -0
  81. package/node_modules/pi-footer/src/ui/screens/edit-widget.ts +115 -0
  82. package/node_modules/pi-footer/src/ui/screens/extension-status-row.ts +61 -0
  83. package/node_modules/pi-footer/src/ui/screens/global.ts +75 -0
  84. package/node_modules/pi-footer/src/ui/screens/line-list.ts +108 -0
  85. package/node_modules/pi-footer/src/ui/screens/main.ts +99 -0
  86. package/node_modules/pi-footer/src/ui/screens/terminal.ts +121 -0
  87. package/node_modules/pi-footer/src/ui/screens/widget-list.ts +154 -0
  88. package/node_modules/pi-footer/src/ui/terminal-menu.ts +32 -0
  89. package/node_modules/pi-footer/src/ui/theme.ts +48 -0
  90. package/node_modules/pi-footer/src/ui/title-bar.ts +100 -0
  91. package/node_modules/pi-footer/src/ui/widget-actions.ts +76 -0
  92. package/node_modules/pi-footer/src/ui.ts +66 -0
  93. package/node_modules/pi-footer/src/widgets/context.ts +28 -0
  94. package/node_modules/pi-footer/src/widgets/core/active-tools.ts +17 -0
  95. package/node_modules/pi-footer/src/widgets/core/context-window.ts +24 -0
  96. package/node_modules/pi-footer/src/widgets/core/cwd-basename.ts +19 -0
  97. package/node_modules/pi-footer/src/widgets/core/cwd.ts +108 -0
  98. package/node_modules/pi-footer/src/widgets/core/event.ts +34 -0
  99. package/node_modules/pi-footer/src/widgets/core/external-status.ts +102 -0
  100. package/node_modules/pi-footer/src/widgets/core/model-provider.ts +20 -0
  101. package/node_modules/pi-footer/src/widgets/core/model.ts +35 -0
  102. package/node_modules/pi-footer/src/widgets/core/provider.ts +17 -0
  103. package/node_modules/pi-footer/src/widgets/core/session-name.ts +17 -0
  104. package/node_modules/pi-footer/src/widgets/core/text-verbosity.ts +17 -0
  105. package/node_modules/pi-footer/src/widgets/core/thinking-level.ts +17 -0
  106. package/node_modules/pi-footer/src/widgets/git/ahead-behind.ts +17 -0
  107. package/node_modules/pi-footer/src/widgets/git/branch.ts +81 -0
  108. package/node_modules/pi-footer/src/widgets/git/clean.ts +19 -0
  109. package/node_modules/pi-footer/src/widgets/git/deletions.ts +17 -0
  110. package/node_modules/pi-footer/src/widgets/git/diff.ts +38 -0
  111. package/node_modules/pi-footer/src/widgets/git/insertions.ts +17 -0
  112. package/node_modules/pi-footer/src/widgets/git/remote.ts +17 -0
  113. package/node_modules/pi-footer/src/widgets/git/root.ts +17 -0
  114. package/node_modules/pi-footer/src/widgets/git/sha.ts +17 -0
  115. package/node_modules/pi-footer/src/widgets/git/staged.ts +17 -0
  116. package/node_modules/pi-footer/src/widgets/git/status.ts +19 -0
  117. package/node_modules/pi-footer/src/widgets/git/unstaged.ts +17 -0
  118. package/node_modules/pi-footer/src/widgets/git/untracked.ts +17 -0
  119. package/node_modules/pi-footer/src/widgets/instance.ts +118 -0
  120. package/node_modules/pi-footer/src/widgets/layout/custom-text.ts +18 -0
  121. package/node_modules/pi-footer/src/widgets/layout/flex-separator.ts +32 -0
  122. package/node_modules/pi-footer/src/widgets/layout/separator.ts +57 -0
  123. package/node_modules/pi-footer/src/widgets/layout/spacer.ts +31 -0
  124. package/node_modules/pi-footer/src/widgets/options.ts +122 -0
  125. package/node_modules/pi-footer/src/widgets/project/runtime.ts +361 -0
  126. package/node_modules/pi-footer/src/widgets/registry.ts +223 -0
  127. package/node_modules/pi-footer/src/widgets/session/assistant-messages.ts +17 -0
  128. package/node_modules/pi-footer/src/widgets/session/compactions.ts +17 -0
  129. package/node_modules/pi-footer/src/widgets/session/elapsed.ts +18 -0
  130. package/node_modules/pi-footer/src/widgets/session/last-activity.ts +18 -0
  131. package/node_modules/pi-footer/src/widgets/session/messages.ts +19 -0
  132. package/node_modules/pi-footer/src/widgets/session/session-id.ts +17 -0
  133. package/node_modules/pi-footer/src/widgets/session/session-start.ts +18 -0
  134. package/node_modules/pi-footer/src/widgets/session/tool-results.ts +17 -0
  135. package/node_modules/pi-footer/src/widgets/session/total-messages.ts +19 -0
  136. package/node_modules/pi-footer/src/widgets/session/total-time.ts +18 -0
  137. package/node_modules/pi-footer/src/widgets/session/user-messages.ts +17 -0
  138. package/node_modules/pi-footer/src/widgets/store.ts +26 -0
  139. package/node_modules/pi-footer/src/widgets/tokens/cache-hit-rate.ts +55 -0
  140. package/node_modules/pi-footer/src/widgets/tokens/cache-read.ts +18 -0
  141. package/node_modules/pi-footer/src/widgets/tokens/cache-write.ts +18 -0
  142. package/node_modules/pi-footer/src/widgets/tokens/context-bar.ts +108 -0
  143. package/node_modules/pi-footer/src/widgets/tokens/context-length.ts +26 -0
  144. package/node_modules/pi-footer/src/widgets/tokens/context-remaining.ts +29 -0
  145. package/node_modules/pi-footer/src/widgets/tokens/context.ts +29 -0
  146. package/node_modules/pi-footer/src/widgets/tokens/cost.ts +51 -0
  147. package/node_modules/pi-footer/src/widgets/tokens/input-speed.ts +25 -0
  148. package/node_modules/pi-footer/src/widgets/tokens/input-tokens.ts +18 -0
  149. package/node_modules/pi-footer/src/widgets/tokens/output-speed.ts +25 -0
  150. package/node_modules/pi-footer/src/widgets/tokens/output-tokens.ts +18 -0
  151. package/node_modules/pi-footer/src/widgets/tokens/tokens.ts +20 -0
  152. package/node_modules/pi-footer/src/widgets/tokens/total-speed.ts +25 -0
  153. package/node_modules/pi-footer/src/widgets/tokens/total-tokens.ts +18 -0
  154. package/node_modules/pi-footer/src/widgets/types.ts +181 -0
  155. package/node_modules/pi-footer/src/widgets/utils/colors.ts +11 -0
  156. package/node_modules/pi-footer/src/widgets/utils/context.ts +112 -0
  157. package/node_modules/pi-footer/src/widgets/utils/session.ts +19 -0
  158. package/node_modules/pi-footer/src/widgets/utils/token-format.ts +78 -0
  159. package/node_modules/pi-mcp-adapter/CHANGELOG.md +19 -0
  160. package/node_modules/pi-mcp-adapter/README.md +19 -4
  161. package/node_modules/pi-mcp-adapter/agent-dir.ts +40 -0
  162. package/node_modules/pi-mcp-adapter/commands.ts +12 -2
  163. package/node_modules/pi-mcp-adapter/direct-tools.ts +6 -8
  164. package/node_modules/pi-mcp-adapter/index.ts +15 -3
  165. package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +87 -4
  166. package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +138 -61
  167. package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +43 -4
  168. package/node_modules/pi-mcp-adapter/oauth.ts +48 -0
  169. package/node_modules/pi-mcp-adapter/package.json +8 -2
  170. package/node_modules/pi-mcp-adapter/proxy-modes.ts +8 -10
  171. package/node_modules/pi-mcp-adapter/tool-registrar.ts +187 -3
  172. package/node_modules/pi-mcp-adapter/types.ts +2 -0
  173. package/node_modules/pi-web-access/CHANGELOG.md +45 -0
  174. package/node_modules/pi-web-access/README.md +104 -29
  175. package/node_modules/pi-web-access/bocha.ts +221 -0
  176. package/node_modules/pi-web-access/curator-page.ts +113 -12
  177. package/node_modules/pi-web-access/curator-server.ts +56 -20
  178. package/node_modules/pi-web-access/datalab-pdf-extract.ts +568 -0
  179. package/node_modules/pi-web-access/duckduckgo.ts +123 -0
  180. package/node_modules/pi-web-access/extract.ts +288 -143
  181. package/node_modules/pi-web-access/feature-config.ts +29 -0
  182. package/node_modules/pi-web-access/gemini-api.ts +4 -0
  183. package/node_modules/pi-web-access/gemini-search.ts +45 -12
  184. package/node_modules/pi-web-access/gemini-web.ts +68 -3
  185. package/node_modules/pi-web-access/index.ts +160 -71
  186. package/node_modules/pi-web-access/jina-search.ts +284 -0
  187. package/node_modules/pi-web-access/kagi.ts +12 -12
  188. package/node_modules/pi-web-access/openai-search.ts +12 -2
  189. package/node_modules/pi-web-access/package.json +4 -3
  190. package/node_modules/pi-web-access/pdf-extract.ts +327 -228
  191. package/node_modules/pi-web-access/storage.ts +440 -2
  192. package/node_modules/pi-web-access/summary-model-scope.ts +1 -1
  193. package/node_modules/pi-web-access/summary-review.ts +4 -2
  194. package/node_modules/pi-web-access/video-extract.ts +10 -8
  195. package/node_modules/pi-web-access/xai-search.ts +12 -2
  196. package/node_modules/pi-web-access/youtube-extract.ts +2 -1
  197. package/node_modules/remote-pi/LICENSE +21 -0
  198. package/node_modules/remote-pi/README.md +675 -0
  199. package/node_modules/remote-pi/dist/actions/handlers.d.ts +122 -0
  200. package/node_modules/remote-pi/dist/actions/handlers.js +160 -0
  201. package/node_modules/remote-pi/dist/actions/handlers.js.map +1 -0
  202. package/node_modules/remote-pi/dist/actions/registry.d.ts +39 -0
  203. package/node_modules/remote-pi/dist/actions/registry.js +58 -0
  204. package/node_modules/remote-pi/dist/actions/registry.js.map +1 -0
  205. package/node_modules/remote-pi/dist/bin/supervisord.d.ts +2 -0
  206. package/node_modules/remote-pi/dist/bin/supervisord.js +86 -0
  207. package/node_modules/remote-pi/dist/bin/supervisord.js.map +1 -0
  208. package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +58 -0
  209. package/node_modules/remote-pi/dist/commands/builtin_mirror.js +71 -0
  210. package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +1 -0
  211. package/node_modules/remote-pi/dist/commands/list_commands.d.ts +60 -0
  212. package/node_modules/remote-pi/dist/commands/list_commands.js +73 -0
  213. package/node_modules/remote-pi/dist/commands/list_commands.js.map +1 -0
  214. package/node_modules/remote-pi/dist/config.d.ts +62 -0
  215. package/node_modules/remote-pi/dist/config.js +115 -0
  216. package/node_modules/remote-pi/dist/config.js.map +1 -0
  217. package/node_modules/remote-pi/dist/daemon/client.d.ts +20 -0
  218. package/node_modules/remote-pi/dist/daemon/client.js +131 -0
  219. package/node_modules/remote-pi/dist/daemon/client.js.map +1 -0
  220. package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +176 -0
  221. package/node_modules/remote-pi/dist/daemon/control_protocol.js +63 -0
  222. package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +1 -0
  223. package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +45 -0
  224. package/node_modules/remote-pi/dist/daemon/cron_log.js +72 -0
  225. package/node_modules/remote-pi/dist/daemon/cron_log.js.map +1 -0
  226. package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +80 -0
  227. package/node_modules/remote-pi/dist/daemon/cron_registry.js +194 -0
  228. package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +1 -0
  229. package/node_modules/remote-pi/dist/daemon/id.d.ts +24 -0
  230. package/node_modules/remote-pi/dist/daemon/id.js +36 -0
  231. package/node_modules/remote-pi/dist/daemon/id.js.map +1 -0
  232. package/node_modules/remote-pi/dist/daemon/install.d.ts +170 -0
  233. package/node_modules/remote-pi/dist/daemon/install.js +547 -0
  234. package/node_modules/remote-pi/dist/daemon/install.js.map +1 -0
  235. package/node_modules/remote-pi/dist/daemon/registry.d.ts +63 -0
  236. package/node_modules/remote-pi/dist/daemon/registry.js +153 -0
  237. package/node_modules/remote-pi/dist/daemon/registry.js.map +1 -0
  238. package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +194 -0
  239. package/node_modules/remote-pi/dist/daemon/rpc_child.js +389 -0
  240. package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +1 -0
  241. package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +93 -0
  242. package/node_modules/remote-pi/dist/daemon/supervisor.js +596 -0
  243. package/node_modules/remote-pi/dist/daemon/supervisor.js.map +1 -0
  244. package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +26 -0
  245. package/node_modules/remote-pi/dist/extension_ui_bridge.js +341 -0
  246. package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +1 -0
  247. package/node_modules/remote-pi/dist/index.d.ts +213 -0
  248. package/node_modules/remote-pi/dist/index.js +4996 -0
  249. package/node_modules/remote-pi/dist/index.js.map +1 -0
  250. package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +10 -0
  251. package/node_modules/remote-pi/dist/mcp/mesh_result.js +42 -0
  252. package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +1 -0
  253. package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +16 -0
  254. package/node_modules/remote-pi/dist/mcp/mesh_server.js +327 -0
  255. package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +1 -0
  256. package/node_modules/remote-pi/dist/mesh/canonical.d.ts +30 -0
  257. package/node_modules/remote-pi/dist/mesh/canonical.js +61 -0
  258. package/node_modules/remote-pi/dist/mesh/canonical.js.map +1 -0
  259. package/node_modules/remote-pi/dist/mesh/client.d.ts +18 -0
  260. package/node_modules/remote-pi/dist/mesh/client.js +125 -0
  261. package/node_modules/remote-pi/dist/mesh/client.js.map +1 -0
  262. package/node_modules/remote-pi/dist/mesh/encoding.d.ts +38 -0
  263. package/node_modules/remote-pi/dist/mesh/encoding.js +216 -0
  264. package/node_modules/remote-pi/dist/mesh/encoding.js.map +1 -0
  265. package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +73 -0
  266. package/node_modules/remote-pi/dist/mesh/self_revoke.js +401 -0
  267. package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +1 -0
  268. package/node_modules/remote-pi/dist/mesh/siblings.d.ts +49 -0
  269. package/node_modules/remote-pi/dist/mesh/siblings.js +159 -0
  270. package/node_modules/remote-pi/dist/mesh/siblings.js.map +1 -0
  271. package/node_modules/remote-pi/dist/mesh/types.d.ts +34 -0
  272. package/node_modules/remote-pi/dist/mesh/types.js +11 -0
  273. package/node_modules/remote-pi/dist/mesh/types.js.map +1 -0
  274. package/node_modules/remote-pi/dist/mesh/verify.d.ts +17 -0
  275. package/node_modules/remote-pi/dist/mesh/verify.js +86 -0
  276. package/node_modules/remote-pi/dist/mesh/verify.js.map +1 -0
  277. package/node_modules/remote-pi/dist/pairing/crypto.d.ts +8 -0
  278. package/node_modules/remote-pi/dist/pairing/crypto.js +22 -0
  279. package/node_modules/remote-pi/dist/pairing/crypto.js.map +1 -0
  280. package/node_modules/remote-pi/dist/pairing/handshake.d.ts +28 -0
  281. package/node_modules/remote-pi/dist/pairing/handshake.js +113 -0
  282. package/node_modules/remote-pi/dist/pairing/handshake.js.map +1 -0
  283. package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +16 -0
  284. package/node_modules/remote-pi/dist/pairing/noise-sha256.js +103 -0
  285. package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +1 -0
  286. package/node_modules/remote-pi/dist/pairing/qr.d.ts +59 -0
  287. package/node_modules/remote-pi/dist/pairing/qr.js +125 -0
  288. package/node_modules/remote-pi/dist/pairing/qr.js.map +1 -0
  289. package/node_modules/remote-pi/dist/pairing/storage.d.ts +120 -0
  290. package/node_modules/remote-pi/dist/pairing/storage.js +604 -0
  291. package/node_modules/remote-pi/dist/pairing/storage.js.map +1 -0
  292. package/node_modules/remote-pi/dist/protocol/codec.d.ts +7 -0
  293. package/node_modules/remote-pi/dist/protocol/codec.js +49 -0
  294. package/node_modules/remote-pi/dist/protocol/codec.js.map +1 -0
  295. package/node_modules/remote-pi/dist/protocol/types.d.ts +393 -0
  296. package/node_modules/remote-pi/dist/protocol/types.js +2 -0
  297. package/node_modules/remote-pi/dist/protocol/types.js.map +1 -0
  298. package/node_modules/remote-pi/dist/rooms.d.ts +29 -0
  299. package/node_modules/remote-pi/dist/rooms.js +57 -0
  300. package/node_modules/remote-pi/dist/rooms.js.map +1 -0
  301. package/node_modules/remote-pi/dist/session/address.d.ts +49 -0
  302. package/node_modules/remote-pi/dist/session/address.js +58 -0
  303. package/node_modules/remote-pi/dist/session/address.js.map +1 -0
  304. package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +55 -0
  305. package/node_modules/remote-pi/dist/session/agent_bridge.js +146 -0
  306. package/node_modules/remote-pi/dist/session/agent_bridge.js.map +1 -0
  307. package/node_modules/remote-pi/dist/session/bridge.d.ts +37 -0
  308. package/node_modules/remote-pi/dist/session/bridge.js +130 -0
  309. package/node_modules/remote-pi/dist/session/bridge.js.map +1 -0
  310. package/node_modules/remote-pi/dist/session/broker.d.ts +189 -0
  311. package/node_modules/remote-pi/dist/session/broker.js +507 -0
  312. package/node_modules/remote-pi/dist/session/broker.js.map +1 -0
  313. package/node_modules/remote-pi/dist/session/broker_remote.d.ts +74 -0
  314. package/node_modules/remote-pi/dist/session/broker_remote.js +583 -0
  315. package/node_modules/remote-pi/dist/session/broker_remote.js.map +1 -0
  316. package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +33 -0
  317. package/node_modules/remote-pi/dist/session/cwd_lock.js +126 -0
  318. package/node_modules/remote-pi/dist/session/cwd_lock.js.map +1 -0
  319. package/node_modules/remote-pi/dist/session/envelope.d.ts +33 -0
  320. package/node_modules/remote-pi/dist/session/envelope.js +117 -0
  321. package/node_modules/remote-pi/dist/session/envelope.js.map +1 -0
  322. package/node_modules/remote-pi/dist/session/global_config.d.ts +33 -0
  323. package/node_modules/remote-pi/dist/session/global_config.js +73 -0
  324. package/node_modules/remote-pi/dist/session/global_config.js.map +1 -0
  325. package/node_modules/remote-pi/dist/session/ipc.d.ts +27 -0
  326. package/node_modules/remote-pi/dist/session/ipc.js +22 -0
  327. package/node_modules/remote-pi/dist/session/ipc.js.map +1 -0
  328. package/node_modules/remote-pi/dist/session/leader_election.d.ts +32 -0
  329. package/node_modules/remote-pi/dist/session/leader_election.js +106 -0
  330. package/node_modules/remote-pi/dist/session/leader_election.js.map +1 -0
  331. package/node_modules/remote-pi/dist/session/local_config.d.ts +55 -0
  332. package/node_modules/remote-pi/dist/session/local_config.js +157 -0
  333. package/node_modules/remote-pi/dist/session/local_config.js.map +1 -0
  334. package/node_modules/remote-pi/dist/session/mesh_message.d.ts +20 -0
  335. package/node_modules/remote-pi/dist/session/mesh_message.js +28 -0
  336. package/node_modules/remote-pi/dist/session/mesh_message.js.map +1 -0
  337. package/node_modules/remote-pi/dist/session/mesh_node.d.ts +116 -0
  338. package/node_modules/remote-pi/dist/session/mesh_node.js +573 -0
  339. package/node_modules/remote-pi/dist/session/mesh_node.js.map +1 -0
  340. package/node_modules/remote-pi/dist/session/peer.d.ts +139 -0
  341. package/node_modules/remote-pi/dist/session/peer.js +451 -0
  342. package/node_modules/remote-pi/dist/session/peer.js.map +1 -0
  343. package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +13 -0
  344. package/node_modules/remote-pi/dist/session/peer_inventory.js +48 -0
  345. package/node_modules/remote-pi/dist/session/peer_inventory.js.map +1 -0
  346. package/node_modules/remote-pi/dist/session/peer_limits.d.ts +9 -0
  347. package/node_modules/remote-pi/dist/session/peer_limits.js +21 -0
  348. package/node_modules/remote-pi/dist/session/peer_limits.js.map +1 -0
  349. package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +39 -0
  350. package/node_modules/remote-pi/dist/session/setup_wizard.js +63 -0
  351. package/node_modules/remote-pi/dist/session/setup_wizard.js.map +1 -0
  352. package/node_modules/remote-pi/dist/session/tool_gate.d.ts +5 -0
  353. package/node_modules/remote-pi/dist/session/tool_gate.js +11 -0
  354. package/node_modules/remote-pi/dist/session/tool_gate.js.map +1 -0
  355. package/node_modules/remote-pi/dist/session/tools.d.ts +24 -0
  356. package/node_modules/remote-pi/dist/session/tools.js +252 -0
  357. package/node_modules/remote-pi/dist/session/tools.js.map +1 -0
  358. package/node_modules/remote-pi/dist/session/wizard.d.ts +13 -0
  359. package/node_modules/remote-pi/dist/session/wizard.js +20 -0
  360. package/node_modules/remote-pi/dist/session/wizard.js.map +1 -0
  361. package/node_modules/remote-pi/dist/settings.d.ts +15 -0
  362. package/node_modules/remote-pi/dist/settings.js +52 -0
  363. package/node_modules/remote-pi/dist/settings.js.map +1 -0
  364. package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +37 -0
  365. package/node_modules/remote-pi/dist/transport/peer_channel.js +98 -0
  366. package/node_modules/remote-pi/dist/transport/peer_channel.js.map +1 -0
  367. package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +29 -0
  368. package/node_modules/remote-pi/dist/transport/pi_forward_client.js +62 -0
  369. package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +1 -0
  370. package/node_modules/remote-pi/dist/transport/relay_client.d.ts +91 -0
  371. package/node_modules/remote-pi/dist/transport/relay_client.js +206 -0
  372. package/node_modules/remote-pi/dist/transport/relay_client.js.map +1 -0
  373. package/node_modules/remote-pi/dist/ui/footer.d.ts +32 -0
  374. package/node_modules/remote-pi/dist/ui/footer.js +34 -0
  375. package/node_modules/remote-pi/dist/ui/footer.js.map +1 -0
  376. package/node_modules/remote-pi/docs/daemon.md +289 -0
  377. package/node_modules/remote-pi/package.json +88 -0
  378. package/node_modules/remote-pi/service-templates/launchd.plist.template +35 -0
  379. package/node_modules/remote-pi/service-templates/systemd.service.template +19 -0
  380. package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +10 -0
  381. package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +38 -0
  382. package/node_modules/remote-pi/skills/agent-network/SKILL.md +310 -0
  383. package/package.json +25 -10
  384. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool-diff/write-display-utils.ts +0 -29
  385. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference-core.ts → reference/session.ts} +0 -0
  386. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-aliases.ts → shell/aliases.ts} +0 -0
  387. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ATTRIBUTION.md +0 -0
  388. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-presentation.ts +0 -0
  389. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/index.ts +0 -0
  390. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/render-utils.ts +0 -0
  391. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/shiki-highlight.ts +0 -0
  392. /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/types.ts +0 -0
@@ -6,9 +6,9 @@ import {
6
6
  visibleWidth,
7
7
  type Component,
8
8
  } from "@earendil-works/pi-tui";
9
- import { TOOL_LOADING_INTERVAL_MS, toolLoadingIcon } from "../utils/tool-loading-icon.ts";
10
- import { sanitizeToolResultText } from "../utils/tool-result-sanitize.ts";
11
- import { showMoreHintText } from "./show-more-hint.ts";
9
+ import { TOOL_LOADING_INTERVAL_MS, toolLoadingIcon } from "../../utils/tool-loading-icon.ts";
10
+ import { sanitizeToolResultText } from "../../utils/tool-result-sanitize.ts";
11
+ import { showMoreHintText } from "../show-more-hint.ts";
12
12
 
13
13
  const PATCH_KEY = Symbol.for("pi.ccstyle.tool-grouping-patch");
14
14
  const PARENT_KEY = Symbol.for("pi.ccstyle.tool-grouping-parent");
@@ -101,7 +101,7 @@ function stripLeadingStatusIcon(line: string): string {
101
101
  );
102
102
  }
103
103
 
104
- function stripBackgroundAnsi(line: string): string {
104
+ export function stripBackgroundAnsi(line: string): string {
105
105
  return line.replace(/\x1b\[(?:4[0-9]|10[0-7]|48(?:(?:;|:)[0-9]+)+|49)m/g, "");
106
106
  }
107
107
 
@@ -126,15 +126,25 @@ function stripLeadingSpaces(line: string, count: number): string {
126
126
  return ansi + line.slice(offset);
127
127
  }
128
128
 
129
- function paddedBackgroundRow(theme: any, slot: string, content: string, width: number): string {
129
+ /** 生成一行铺满 width slot 背景行;bgAnsiOverride 可替换背景 ANSI(用于提亮等)。 */
130
+ export function paddedBackgroundRow(
131
+ theme: any,
132
+ slot: string,
133
+ content: string,
134
+ width: number,
135
+ bgAnsiOverride?: string,
136
+ ): string {
130
137
  const innerWidth = Math.max(0, width - 2);
131
138
  const clipped = truncateToWidth(stripBackgroundAnsi(content), innerWidth, "");
132
139
  const row = ` ${clipped}${" ".repeat(Math.max(0, innerWidth - visibleWidth(clipped)))} `;
133
- if (typeof theme?.bg !== "function") return row;
134
140
  const bgAnsi =
135
- theme.getBgAnsi?.(slot) ?? theme.bg(slot, "").match(/^\x1b\[[0-?]*[ -/]*[@-~]/)?.[0] ?? "";
141
+ bgAnsiOverride ||
142
+ (typeof theme?.bg === "function"
143
+ ? theme.getBgAnsi?.(slot) || theme.bg(slot, "").match(/^\x1b\[[0-?]*[ -/]*[@-~]/)?.[0] || ""
144
+ : "");
136
145
  const stable = bgAnsi ? row.replace(/\x1b\[(?:0)?m/g, (reset) => reset + bgAnsi) : row;
137
- return theme.bg(slot, stable);
146
+ if (!bgAnsi) return typeof theme?.bg === "function" ? theme.bg(slot, stable) : row;
147
+ return `${bgAnsi}${stable}\x1b[49m`;
138
148
  }
139
149
 
140
150
  function oneLine(value: unknown, max = 96): string {
@@ -1,9 +1,9 @@
1
1
  import { Text, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
2
2
  import { inspect } from "node:util";
3
- import { config } from "../config/config.ts";
4
- import { showMoreHintText } from "./show-more-hint.ts";
5
- import { TOOL_LOADING_INTERVAL_MS, toolLoadingIcon } from "../utils/tool-loading-icon.ts";
6
- import { sanitizeToolResultText } from "../utils/tool-result-sanitize.ts";
3
+ import { config } from "../../config/config.ts";
4
+ import { showMoreHintText } from "../show-more-hint.ts";
5
+ import { TOOL_LOADING_INTERVAL_MS, toolLoadingIcon } from "../../utils/tool-loading-icon.ts";
6
+ import { sanitizeToolResultText } from "../../utils/tool-result-sanitize.ts";
7
7
 
8
8
  const TOOL_VIEWPORT_WIDTH_RATIO = 0.8;
9
9
 
@@ -677,15 +677,6 @@ export function renderExpandedToolResult(
677
677
  return new Text(theme.fg(color, renderCollapsedToolResult("Done")), 0, 0);
678
678
  }
679
679
 
680
- export function formatExpandHint(lineCount: number): string {
681
- return ` (${lineCount} more line${lineCount === 1 ? "" : "s"} / click)`;
682
- }
683
-
684
- function expandHint(theme: any, lineCount: number, hovered = false): string {
685
- // Keep interaction guidance neutral; it should not inherit success/error
686
- // coloring from the tool result surrounding it.
687
- return theme.fg(hovered ? "text" : "muted", formatExpandHint(lineCount));
688
- }
689
680
  const toolViewMarker = (id: number, section: ToolIoSection) =>
690
681
  `_cc:v${id}:${section === "input" ? "i" : "o"}`;
691
682
 
@@ -1,7 +1,3 @@
1
- // fullscreen 模式探测:官方 fullscreen TUI(TuiAltScreen)由官方独占布局,
2
- // 插件渲染层应让位。检测方式是瞬时 setWidget 拿 tui 实例检查 mode。
3
- const PROBE_KEY = "cc-fullscreen-probe";
4
-
5
1
  /**
6
2
  * 官方 0.84+ 的 tui 引用是惰性 Proxy(createInteractiveTuiReference):
7
3
  * 函数属性每次 get 都返回新包装,执行时才解析到当前实现。
@@ -13,26 +9,3 @@ export function isLazyProxyTui(tui: any): boolean {
13
9
  const probe = tui.requestRender;
14
10
  return typeof probe === "function" && probe !== tui.requestRender;
15
11
  }
16
-
17
- /**
18
- * 探测当前会话的 TUI 是否运行在官方 fullscreen 模式。
19
- * 无 setWidget 的环境(测试 mock)视为 regular。
20
- */
21
- export function isFullscreenUi(ctx: { ui?: any }): boolean {
22
- if (typeof ctx?.ui?.setWidget !== "function") return false;
23
- let fullscreen = false;
24
- try {
25
- ctx.ui.setWidget(PROBE_KEY, (tui: any) => {
26
- fullscreen = tui?.mode === "fullscreen";
27
- return { render: () => 0, invalidate() {} };
28
- });
29
- } catch {
30
- // 探测失败按 regular 处理,避免误伤
31
- }
32
- try {
33
- ctx.ui.setWidget(PROBE_KEY, undefined);
34
- } catch {
35
- // 忽略
36
- }
37
- return fullscreen;
38
- }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herbertgao/pi-cc-extensions",
3
- "version": "0.8.52",
3
+ "version": "0.8.53",
4
4
  "license": "MIT",
5
5
  "description": "A Pi productivity suite with Claude Code-style UI, context inspection, and agent/session references",
6
6
  "type": "module",
@@ -69,8 +69,8 @@
69
69
  },
70
70
  "x-upstream": {
71
71
  "package": "pi-cc-extensions",
72
- "version": "0.8.53",
72
+ "version": "0.8.54",
73
73
  "repository": "https://github.com/minuque/pi-cc-extensions",
74
- "commit": "a7aaf6d4136af44a1ef7ac4993d5754fe084c921"
74
+ "commit": "8372ecaff7f079ab4452db47328c3238620a4885"
75
75
  }
76
76
  }
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#27](https://github.com/HerbertGao/pi-extensions/pull/27) [`32bb76c`](https://github.com/HerbertGao/pi-extensions/commit/32bb76c117971de27db9c2b521d19df3ba9ea322) Thanks [@HerbertGao](https://github.com/HerbertGao)! - Keep worktree-isolated agents inside their copy, preserve real Agent tool startup errors, and render unknown or failed Agent results without misleading completion status.
8
+
3
9
  ## 0.15.2
4
10
 
5
11
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herbertgao/pi-subagents",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "description": "Claude Code-style autonomous subagents for Pi, with HerbertGao-maintained UI extensions.",
5
5
  "keywords": [
6
6
  "agent",
@@ -66,6 +66,6 @@
66
66
  "package": "@tintinweb/pi-subagents",
67
67
  "version": "0.15.0",
68
68
  "repository": "https://github.com/tintinweb/pi-subagents",
69
- "commit": "140324c"
69
+ "commit": "c83dd82"
70
70
  }
71
71
  }
@@ -321,6 +321,7 @@ export class AgentManager {
321
321
  // stay undefined otherwise so plain worktree runs keep resolving config
322
322
  // (incl. relative extension paths and memory) inside the worktree copy.
323
323
  cwd: worktreeCwd ?? customCwd,
324
+ worktreeBase: worktreeCwd ? baseCwd : undefined,
324
325
  configCwd:
325
326
  options.configCwd ?? (customCwd !== undefined ? ctx.cwd : undefined),
326
327
  signal: record.abortController!.signal,
@@ -414,6 +414,8 @@ export interface RunOptions {
414
414
  thinkingLevel?: ThinkingLevel
415
415
  /** Override working directory (e.g. for worktree isolation). */
416
416
  cwd?: string
417
+ /** Original checkout path when cwd is an isolated worktree copy. */
418
+ worktreeBase?: string
417
419
  /**
418
420
  * Where .pi config is discovered (project extensions, skills, pi settings,
419
421
  * agent memory). Default: same as the working directory. The manager sets
@@ -602,7 +604,7 @@ export async function runAgent(
602
604
  const parentSystemPrompt = ctx.getSystemPrompt()
603
605
 
604
606
  // Build prompt extras (memory, skill preloading)
605
- const extras: PromptExtras = {}
607
+ const extras: PromptExtras = { worktreeBase: options.worktreeBase }
606
608
 
607
609
  // Resolve extensions/skills: isolated overrides to false
608
610
  const extensions = options.isolated ? false : config.extensions
@@ -1241,12 +1241,12 @@ Terse command-style prompts produce shallow, generic work.
1241
1241
  )
1242
1242
  },
1243
1243
 
1244
- renderResult(result, { expanded, isPartial }, theme) {
1244
+ renderResult(result, { expanded, isPartial }, theme, renderContext) {
1245
+ const resultText =
1246
+ result.content[0]?.type === "text" ? result.content[0].text : ""
1245
1247
  const details = result.details as AgentDetails | undefined
1246
- if (!details) {
1247
- const text =
1248
- result.content[0]?.type === "text" ? result.content[0].text : ""
1249
- return new Text(text, 0, 0)
1248
+ if (renderContext?.isError || !details?.status) {
1249
+ return new Text(resultText, 0, 0)
1250
1250
  }
1251
1251
 
1252
1252
  // Helper: build "haiku · thinking: high · ↻5≤30 · 3 tool uses · 33.8k tokens" stats string
@@ -1301,8 +1301,6 @@ Terse command-style prompts produce shallow, generic work.
1301
1301
  line += " " + theme.fg("dim", "·") + " " + theme.fg("dim", duration)
1302
1302
 
1303
1303
  if (expanded) {
1304
- const resultText =
1305
- result.content[0]?.type === "text" ? result.content[0].text : ""
1306
1304
  if (resultText) {
1307
1305
  const lines = resultText.split("\n").slice(0, 50)
1308
1306
  for (const l of lines) {
@@ -1332,6 +1330,10 @@ Terse command-style prompts produce shallow, generic work.
1332
1330
  return new Text(line, 0, 0)
1333
1331
  }
1334
1332
 
1333
+ if (details.status !== "error" && details.status !== "aborted") {
1334
+ return new Text(resultText, 0, 0)
1335
+ }
1336
+
1335
1337
  // ---- Error / Aborted (hard max_turns) ----
1336
1338
  const s = stats(details)
1337
1339
  let line = theme.fg("error", "✗") + (s ? " " + s : "")
@@ -1598,23 +1600,22 @@ Terse command-style prompts produce shallow, generic work.
1598
1600
  }
1599
1601
  }
1600
1602
 
1601
- try {
1602
- id = manager.spawn(pi, ctx, subagentType, params.prompt, {
1603
- description: params.description,
1604
- model,
1605
- maxTurns: effectiveMaxTurns,
1606
- isolated,
1607
- inheritContext,
1608
- thinkingLevel: thinking,
1609
- isBackground: true,
1610
- isolation,
1611
- invocation: agentInvocation,
1612
- rootSessionId: ctx.sessionManager.getSessionId(),
1613
- ...bgCallbacks,
1614
- })
1615
- } catch (err) {
1616
- return textResult(err instanceof Error ? err.message : String(err))
1617
- }
1603
+ // A throw here means the agent never started. Let it out: Pi marks a
1604
+ // tool call failed only when execute throws, while a returned message
1605
+ // reads to the model as a subagent that ran and reported this.
1606
+ id = manager.spawn(pi, ctx, subagentType, params.prompt, {
1607
+ description: params.description,
1608
+ model,
1609
+ maxTurns: effectiveMaxTurns,
1610
+ isolated,
1611
+ inheritContext,
1612
+ thinkingLevel: thinking,
1613
+ isBackground: true,
1614
+ isolation,
1615
+ invocation: agentInvocation,
1616
+ rootSessionId: ctx.sessionManager.getSessionId(),
1617
+ ...bgCallbacks,
1618
+ })
1618
1619
 
1619
1620
  // Set output file + join mode synchronously after spawn, before the
1620
1621
  // event loop yields — onSessionCreated is async so this is safe.
@@ -1774,18 +1775,15 @@ Terse command-style prompts produce shallow, generic work.
1774
1775
  },
1775
1776
  )
1776
1777
  record = fgResult.record
1777
- } catch (err) {
1778
+ } finally {
1779
+ // A startup throw propagates as a failed tool call without leaving
1780
+ // the spinner running or a finished agent in the widget.
1778
1781
  clearInterval(spinnerInterval)
1779
- return textResult(err instanceof Error ? err.message : String(err))
1780
- }
1781
-
1782
- clearInterval(spinnerInterval)
1783
-
1784
- // Clean up foreground agent from widget
1785
- if (fgId) {
1786
- agentActivity.delete(fgId)
1787
- widget.markFinished(fgId)
1788
- fleet.onAgentFinished(fgId)
1782
+ if (fgId) {
1783
+ agentActivity.delete(fgId)
1784
+ widget.markFinished(fgId)
1785
+ fleet.onAgentFinished(fgId)
1786
+ }
1789
1787
  }
1790
1788
 
1791
1789
  // Get final token count
@@ -399,47 +399,38 @@ export function createNestedSubagentTools(
399
399
  // one earlier would silently give a grandchild the wrong worktree base, the
400
400
  // wrong conversation under inherit_context, and the wrong inherited model.
401
401
  //
402
- // spawn() throws on strict worktree-isolation failure and cwd validation
403
- // report it as a tool error, like the top-level Agent tool does, instead of
404
- // letting it escape into the child's turn.
405
- try {
406
- if (invocation.runInBackground) {
407
- const id = context.manager.spawn(
408
- context.pi,
409
- ctx,
410
- resolvedType,
411
- params.prompt,
412
- {
413
- ...options,
414
- isBackground: true,
415
- },
416
- )
417
- // Synchronous, before the event loop yields — onSessionCreated fires
418
- // asynchronously inside runAgent, so the file is attached in time.
419
- attachTranscript(id)
420
- return textResult(
421
- `Nested agent started in background. Agent ID: ${id}`,
422
- )
423
- }
424
-
425
- const { record } = await context.manager.spawnAndWait(
402
+ // Startup throws mean no child ran. Let them propagate so Pi marks the
403
+ // nested Agent tool call failed instead of presenting the message as a
404
+ // successful child result.
405
+ if (invocation.runInBackground) {
406
+ const id = context.manager.spawn(
426
407
  context.pi,
427
408
  ctx,
428
409
  resolvedType,
429
410
  params.prompt,
430
- { ...options, signal },
431
- attachTranscript,
432
- )
433
- return textResult(
434
- formatRecord(record, "inline"),
435
- record.status === "error",
436
- )
437
- } catch (err) {
438
- return textResult(
439
- err instanceof Error ? err.message : String(err),
440
- true,
411
+ {
412
+ ...options,
413
+ isBackground: true,
414
+ },
441
415
  )
416
+ // Synchronous, before the event loop yields — onSessionCreated fires
417
+ // asynchronously inside runAgent, so the file is attached in time.
418
+ attachTranscript(id)
419
+ return textResult(`Nested agent started in background. Agent ID: ${id}`)
442
420
  }
421
+
422
+ const { record } = await context.manager.spawnAndWait(
423
+ context.pi,
424
+ ctx,
425
+ resolvedType,
426
+ params.prompt,
427
+ { ...options, signal },
428
+ attachTranscript,
429
+ )
430
+ return textResult(
431
+ formatRecord(record, "inline"),
432
+ record.status === "error",
433
+ )
443
434
  },
444
435
  })
445
436
 
@@ -10,6 +10,8 @@ export interface PromptExtras {
10
10
  memoryBlock?: string
11
11
  /** Preloaded skill contents to inject. */
12
12
  skillBlocks?: { name: string; content: string }[]
13
+ /** Original checkout path when cwd is an isolated worktree copy. */
14
+ worktreeBase?: string
13
15
  }
14
16
 
15
17
  /**
@@ -55,6 +57,12 @@ Platform: ${env.platform}`
55
57
  }
56
58
  const extrasSuffix =
57
59
  extraSections.length > 0 ? "\n\n" + extraSections.join("\n") : ""
60
+ const worktreeSection = extras?.worktreeBase
61
+ ? `\n\n<worktree_isolation>
62
+ Your working directory is an isolated git worktree copy of ${extras.worktreeBase}.
63
+ Work only inside it — never in ${extras.worktreeBase}, even if other instructions name that path as your working directory.
64
+ </worktree_isolation>`
65
+ : ""
58
66
 
59
67
  if (config.promptMode === "append") {
60
68
  const identity = parentSystemPrompt || genericBase
@@ -88,6 +96,7 @@ You are operating as a sub-agent invoked to handle a specific task.
88
96
  "\n\n" +
89
97
  activeAgentTag +
90
98
  envBlock +
99
+ worktreeSection +
91
100
  customSection +
92
101
  extrasSuffix
93
102
  )
@@ -100,7 +109,12 @@ You have been invoked to handle a specific task autonomously.
100
109
  ${envBlock}`
101
110
 
102
111
  return (
103
- activeAgentTag + replaceHeader + "\n\n" + config.systemPrompt + extrasSuffix
112
+ activeAgentTag +
113
+ replaceHeader +
114
+ worktreeSection +
115
+ "\n\n" +
116
+ config.systemPrompt +
117
+ extrasSuffix
104
118
  )
105
119
  }
106
120
 
@@ -0,0 +1,145 @@
1
+ # Changelog
2
+
3
+ ## [0.5.1](https://github.com/wobondar/pi-footer/compare/v0.5.0...v0.5.1) (2026-08-02)
4
+
5
+
6
+ ### Dependencies
7
+
8
+ * **deps-dev:** bump oxfmt from 0.59.0 to 0.60.0 ([#59](https://github.com/wobondar/pi-footer/issues/59)) ([0efe7d7](https://github.com/wobondar/pi-footer/commit/0efe7d7ab686ddbe1e5c0999522e91d9fe6f85c0))
9
+ * **deps-dev:** bump oxfmt from 0.60.0 to 0.61.0 ([#65](https://github.com/wobondar/pi-footer/issues/65)) ([a97e9c5](https://github.com/wobondar/pi-footer/commit/a97e9c59d242aa163880f1deb4c92e077a45003e))
10
+ * **deps-dev:** bump oxlint from 1.74.0 to 1.75.0 ([#61](https://github.com/wobondar/pi-footer/issues/61)) ([ad8721b](https://github.com/wobondar/pi-footer/commit/ad8721b2d55a38037457730dfa19e8ea1d164474))
11
+ * **deps-dev:** bump oxlint from 1.75.0 to 1.76.0 ([#64](https://github.com/wobondar/pi-footer/issues/64)) ([9fa9d68](https://github.com/wobondar/pi-footer/commit/9fa9d68b1f98c16ba3589815e5fc0a398baedcfd))
12
+ * **deps-dev:** bump oxlint-tsgolint from 0.25.0 to 7.0.2001 ([#60](https://github.com/wobondar/pi-footer/issues/60)) ([893f562](https://github.com/wobondar/pi-footer/commit/893f5629eef911285dda7d2c90e3dca59ed5f9a8))
13
+ * **deps-dev:** bump postcss from 8.5.17 to 8.5.23 ([#62](https://github.com/wobondar/pi-footer/issues/62)) ([a1cc8dd](https://github.com/wobondar/pi-footer/commit/a1cc8dd9719f55d46db35af8520de219fc49bc3c))
14
+ * **deps-dev:** bump typescript from 6.0.3 to 7.0.2 ([#50](https://github.com/wobondar/pi-footer/issues/50)) ([d4f6dff](https://github.com/wobondar/pi-footer/commit/d4f6dff394bb3f77c7c4abd488ab0bd6783678d7))
15
+ * **deps:** bump @earendil-works/pi-coding-agent from 0.80.3 to 0.83.0 ([#67](https://github.com/wobondar/pi-footer/issues/67)) ([126d938](https://github.com/wobondar/pi-footer/commit/126d938e9c211caee59d16c39abe5a8cd53d22a7))
16
+ * **deps:** bump chalk from 5.6.2 to 6.0.0 ([#63](https://github.com/wobondar/pi-footer/issues/63)) ([fe399b8](https://github.com/wobondar/pi-footer/commit/fe399b86d97b48bc6f391345ddc77b5419033efb))
17
+
18
+ ## [0.5.0](https://github.com/wobondar/pi-footer/compare/v0.4.2...v0.5.0) (2026-07-23)
19
+
20
+
21
+ ### Features
22
+
23
+ * add cache hit rate widget ([#57](https://github.com/wobondar/pi-footer/issues/57)) ([edce7d2](https://github.com/wobondar/pi-footer/commit/edce7d29f0ae48ddde4ff9cf3247f0a6dbd82676))
24
+
25
+
26
+ ### Dependencies
27
+
28
+ * **deps-dev:** bump @vitest/coverage-v8 from 4.1.9 to 4.1.10 ([#48](https://github.com/wobondar/pi-footer/issues/48)) ([66236c0](https://github.com/wobondar/pi-footer/commit/66236c04ac8c13da532bc38878751d64a10881a7))
29
+ * **deps-dev:** bump oxfmt from 0.57.0 to 0.58.0 ([#49](https://github.com/wobondar/pi-footer/issues/49)) ([d0d0ebb](https://github.com/wobondar/pi-footer/commit/d0d0ebbcd5540275fb3d9580004419393588599e))
30
+ * **deps-dev:** bump oxfmt from 0.58.0 to 0.59.0 ([#55](https://github.com/wobondar/pi-footer/issues/55)) ([71bc5cf](https://github.com/wobondar/pi-footer/commit/71bc5cf53955fa4f077b0593d966bc95fb27b971))
31
+ * **deps-dev:** bump oxlint from 1.72.0 to 1.73.0 ([#52](https://github.com/wobondar/pi-footer/issues/52)) ([5ce5632](https://github.com/wobondar/pi-footer/commit/5ce56329002c7854e4c527e38c095bfd0232c29e))
32
+ * **deps-dev:** bump oxlint from 1.73.0 to 1.74.0 ([#54](https://github.com/wobondar/pi-footer/issues/54)) ([6ccfccd](https://github.com/wobondar/pi-footer/commit/6ccfccd6272fdb1f8dbf405c88de04832d24f6e0))
33
+ * **deps-dev:** bump oxlint-tsgolint from 0.24.0 to 0.25.0 ([#56](https://github.com/wobondar/pi-footer/issues/56)) ([a138fc8](https://github.com/wobondar/pi-footer/commit/a138fc8e794c649134a6bbae1c85d32abf6898be))
34
+ * **deps-dev:** bump vitest from 4.1.9 to 4.1.10 ([#51](https://github.com/wobondar/pi-footer/issues/51)) ([6408e67](https://github.com/wobondar/pi-footer/commit/6408e6769cc07cc8f33661eba24583330be87ab9))
35
+ * **deps:** bump actions/setup-node from 6 to 7 ([#53](https://github.com/wobondar/pi-footer/issues/53)) ([bee2dfb](https://github.com/wobondar/pi-footer/commit/bee2dfbbd97ade2f3266503fb7db70e1dbdebaf8))
36
+
37
+ ## [0.4.2](https://github.com/wobondar/pi-footer/compare/v0.4.1...v0.4.2) (2026-07-01)
38
+
39
+
40
+ ### Dependencies
41
+
42
+ * **deps-dev:** bump @types/node from 25.9.1 to 26.0.0 ([#39](https://github.com/wobondar/pi-footer/issues/39)) ([fc53522](https://github.com/wobondar/pi-footer/commit/fc53522b3fa0a528b201bd8baa0e8d6039cde11c))
43
+ * **deps-dev:** bump @types/node from 26.0.0 to 26.1.0 ([#42](https://github.com/wobondar/pi-footer/issues/42)) ([1ef23c8](https://github.com/wobondar/pi-footer/commit/1ef23c849166e5fc0163d4bd5541f29890a8a0fc))
44
+ * **deps-dev:** bump @vitest/coverage-v8 from 4.1.8 to 4.1.9 ([#41](https://github.com/wobondar/pi-footer/issues/41)) ([d660601](https://github.com/wobondar/pi-footer/commit/d660601e3d83ca0c0074d6b170d131ed62c73a48))
45
+ * **deps-dev:** bump oxfmt from 0.53.0 to 0.54.0 ([#32](https://github.com/wobondar/pi-footer/issues/32)) ([89d4bdb](https://github.com/wobondar/pi-footer/commit/89d4bdbfa21965843f9b6e18953963b0bf5d33d6))
46
+ * **deps-dev:** bump oxfmt from 0.54.0 to 0.55.0 ([#37](https://github.com/wobondar/pi-footer/issues/37)) ([5aaa074](https://github.com/wobondar/pi-footer/commit/5aaa0746608a88e6393c44c30ddcf289d27eedfe))
47
+ * **deps-dev:** bump oxfmt from 0.55.0 to 0.57.0 ([#45](https://github.com/wobondar/pi-footer/issues/45)) ([d4733d5](https://github.com/wobondar/pi-footer/commit/d4733d5e3533ac7d05509fd523af9052ac04bc40))
48
+ * **deps-dev:** bump oxlint from 1.68.0 to 1.69.0 ([#33](https://github.com/wobondar/pi-footer/issues/33)) ([f31d05f](https://github.com/wobondar/pi-footer/commit/f31d05f50c663328b483e3e05286ed9739c833de))
49
+ * **deps-dev:** bump oxlint from 1.69.0 to 1.70.0 ([#40](https://github.com/wobondar/pi-footer/issues/40)) ([405b880](https://github.com/wobondar/pi-footer/commit/405b880960684e5021cc3ea85de1396ad28d9c3b))
50
+ * **deps-dev:** bump oxlint from 1.70.0 to 1.72.0 ([#43](https://github.com/wobondar/pi-footer/issues/43)) ([6ef9cc5](https://github.com/wobondar/pi-footer/commit/6ef9cc5894b82406abbc8f4e6ad91f4607f15714))
51
+ * **deps-dev:** bump oxlint-tsgolint from 0.23.0 to 0.24.0 ([#44](https://github.com/wobondar/pi-footer/issues/44)) ([a75ad99](https://github.com/wobondar/pi-footer/commit/a75ad998f87f46ea2e624fcf698a202c0eb82a3d))
52
+ * **deps-dev:** bump vitest from 4.1.8 to 4.1.9 ([#38](https://github.com/wobondar/pi-footer/issues/38)) ([c47b551](https://github.com/wobondar/pi-footer/commit/c47b551f99bd50765537ab122f7b48576c05123a))
53
+ * **deps:** bump @earendil-works/pi-coding-agent and related pkgs to 0.80.3 ([#46](https://github.com/wobondar/pi-footer/issues/46)) ([62f4aef](https://github.com/wobondar/pi-footer/commit/62f4aefead342afec04b3150979039c7cf0e98e8))
54
+ * **deps:** bump @earendil-works/pi-coding-agent from 0.74.0 to 0.79.8 ([#35](https://github.com/wobondar/pi-footer/issues/35)) ([e8ac663](https://github.com/wobondar/pi-footer/commit/e8ac663bad29ad9195dce2da8189d6e61b8e1e9d))
55
+ * **deps:** bump actions/checkout from 6 to 7 ([#36](https://github.com/wobondar/pi-footer/issues/36)) ([3aad8f4](https://github.com/wobondar/pi-footer/commit/3aad8f40598c4ba6cdbc79155f7f3d7f26f84323))
56
+
57
+ ## [0.4.1](https://github.com/wobondar/pi-footer/compare/v0.4.0...v0.4.1) (2026-06-11)
58
+
59
+
60
+ ### Bug Fixes
61
+
62
+ * **ci:** merge smoke jobs, add PR trigger with trimmed matrix ([#31](https://github.com/wobondar/pi-footer/issues/31)) ([e1911a2](https://github.com/wobondar/pi-footer/commit/e1911a286aae2e913fa54a6ec8efc20de5a6a208))
63
+ * refactor widget context and simplify clone settings ([#30](https://github.com/wobondar/pi-footer/issues/30)) ([6ce2973](https://github.com/wobondar/pi-footer/commit/6ce2973dbbc0294ddfec5cac0bd9a468c942c09f))
64
+
65
+
66
+ ### Dependencies
67
+
68
+ * **deps-dev:** bump @vitest/coverage-v8 from 4.1.7 to 4.1.8 ([#25](https://github.com/wobondar/pi-footer/issues/25)) ([61fb783](https://github.com/wobondar/pi-footer/commit/61fb783d42fd3552db818864548bcfc506263e8b))
69
+ * **deps-dev:** bump oxfmt from 0.52.0 to 0.53.0 ([#24](https://github.com/wobondar/pi-footer/issues/24)) ([9b36f14](https://github.com/wobondar/pi-footer/commit/9b36f148ad5b7d6261a92c59721853e404c15493))
70
+ * **deps-dev:** bump oxlint from 1.67.0 to 1.68.0 ([#26](https://github.com/wobondar/pi-footer/issues/26)) ([0817eb9](https://github.com/wobondar/pi-footer/commit/0817eb9d8fb80c87fba726fa372135c5ba568875))
71
+ * **deps-dev:** bump vitest from 4.1.7 to 4.1.8 ([#27](https://github.com/wobondar/pi-footer/issues/27)) ([ea1d50c](https://github.com/wobondar/pi-footer/commit/ea1d50c64e7710333240d1a9cf182a17e312c032))
72
+
73
+ ## [0.4.0](https://github.com/wobondar/pi-footer/compare/v0.3.0...v0.4.0) (2026-06-04)
74
+
75
+
76
+ ### Features
77
+
78
+ * widget containers and modular widget registry ([#23](https://github.com/wobondar/pi-footer/issues/23)) ([8f9e4bb](https://github.com/wobondar/pi-footer/commit/8f9e4bb66b75a2c70621390d1bddcf1a0bbc1edc))
79
+
80
+
81
+ ### Bug Fixes
82
+
83
+ * enable manual triggering of release workflow ([0c1f8d8](https://github.com/wobondar/pi-footer/commit/0c1f8d84e41f4224a6e0dc131ab665610dd489ca))
84
+
85
+
86
+ ### Dependencies
87
+
88
+ * **deps-dev:** bump @types/node from 25.6.2 to 25.8.0 ([#9](https://github.com/wobondar/pi-footer/issues/9)) ([aed1f36](https://github.com/wobondar/pi-footer/commit/aed1f36746ee78d05500a6266ffb67a943cbbf1c))
89
+ * **deps-dev:** bump @types/node from 25.8.0 to 25.9.1 ([#12](https://github.com/wobondar/pi-footer/issues/12)) ([935a1f4](https://github.com/wobondar/pi-footer/commit/935a1f4f2f630c29ab662ea12a0a5c14d1e3460a))
90
+ * **deps-dev:** bump @vitest/coverage-v8 from 4.1.5 to 4.1.6 ([#10](https://github.com/wobondar/pi-footer/issues/10)) ([38f988c](https://github.com/wobondar/pi-footer/commit/38f988c476dc41116f5880c5d6a64fdb82c19258))
91
+ * **deps-dev:** bump @vitest/coverage-v8 from 4.1.6 to 4.1.7 ([#17](https://github.com/wobondar/pi-footer/issues/17)) ([55cb502](https://github.com/wobondar/pi-footer/commit/55cb5023a084fb42bebce5bb48399e51ac246a46))
92
+ * **deps-dev:** bump oxfmt from 0.48.0 to 0.50.0 ([#7](https://github.com/wobondar/pi-footer/issues/7)) ([e0f7d89](https://github.com/wobondar/pi-footer/commit/e0f7d89b9bee8dd3b5a7a935b9e9dc1e4e55cfb1))
93
+ * **deps-dev:** bump oxfmt from 0.50.0 to 0.51.0 ([#13](https://github.com/wobondar/pi-footer/issues/13)) ([1de1845](https://github.com/wobondar/pi-footer/commit/1de184546fa60af0ee03477d02f0f1ce2be59d80))
94
+ * **deps-dev:** bump oxfmt from 0.51.0 to 0.52.0 ([#21](https://github.com/wobondar/pi-footer/issues/21)) ([9fa53f2](https://github.com/wobondar/pi-footer/commit/9fa53f28403f5f85b84714e7411c77a55ae17f02))
95
+ * **deps-dev:** bump oxlint from 1.63.0 to 1.65.0 ([#8](https://github.com/wobondar/pi-footer/issues/8)) ([e3d6c2e](https://github.com/wobondar/pi-footer/commit/e3d6c2ef81dea916edf09191b6ac369992bc1179))
96
+ * **deps-dev:** bump oxlint from 1.65.0 to 1.66.0 ([#16](https://github.com/wobondar/pi-footer/issues/16)) ([1dc7296](https://github.com/wobondar/pi-footer/commit/1dc72966836b5c64d9e7913eac16514a8fa12bde))
97
+ * **deps-dev:** bump oxlint from 1.66.0 to 1.67.0 ([#22](https://github.com/wobondar/pi-footer/issues/22)) ([5910539](https://github.com/wobondar/pi-footer/commit/5910539484e313455b982d7b0df82a1096ba6838))
98
+ * **deps-dev:** bump oxlint-tsgolint from 0.22.1 to 0.23.0 ([#14](https://github.com/wobondar/pi-footer/issues/14)) ([0178315](https://github.com/wobondar/pi-footer/commit/0178315dac50583b92d2da17524428292dc4f12f))
99
+ * **deps-dev:** bump vitest from 4.1.6 to 4.1.7 ([#15](https://github.com/wobondar/pi-footer/issues/15)) ([f06570a](https://github.com/wobondar/pi-footer/commit/f06570a17ee4acd59bbe3530bb7510cedc4685b0))
100
+ * **deps:** bump protobufjs from 7.5.7 to 7.6.1 ([#18](https://github.com/wobondar/pi-footer/issues/18)) ([cbd496b](https://github.com/wobondar/pi-footer/commit/cbd496b7a61e9fcfc888ad97bf591d6c187297ca))
101
+ * **deps:** bump ws from 8.20.0 to 8.21.0 ([#19](https://github.com/wobondar/pi-footer/issues/19)) ([3ff5247](https://github.com/wobondar/pi-footer/commit/3ff52474e84a54aa3823a7d0be162e4993426f52))
102
+
103
+ ## [0.3.0](https://github.com/wobondar/pi-footer/compare/v0.2.1...v0.3.0) (2026-05-10)
104
+
105
+
106
+ ### Features
107
+
108
+ * enhance git info caching ([3963e69](https://github.com/wobondar/pi-footer/commit/3963e69286f95514df212acae69470d4d9fea00a))
109
+
110
+ ## [0.2.1](https://github.com/wobondar/pi-footer/compare/v0.2.0...v0.2.1) (2026-05-10)
111
+
112
+
113
+ ### Bug Fixes
114
+
115
+ * update image links to use raw GitHub URLs ([804c8c2](https://github.com/wobondar/pi-footer/commit/804c8c2a91224604dd4177eb6b9ea0e9ff9b0af7))
116
+
117
+ ## [0.2.0](https://github.com/wobondar/pi-footer/compare/v0.1.0...v0.2.0) (2026-05-10)
118
+
119
+
120
+ ### Features
121
+
122
+ * rebrand to pi-footer due to npm similarity with existing package ([cceba8c](https://github.com/wobondar/pi-footer/commit/cceba8ce838d7f4fc4b2653d5bfeea4f39eb19f2))
123
+
124
+
125
+ ### Bug Fixes
126
+
127
+ * enable npm publish with provenance ([39e3709](https://github.com/wobondar/pi-footer/commit/39e3709c769a7911b4c1fb0ea79759e67e55b29c))
128
+
129
+ ## [0.1.0](https://github.com/wobondar/pi-footer/compare/v0.0.1...v0.1.0) (2026-05-09)
130
+
131
+
132
+ ### Features
133
+
134
+ * initial extension ([8998c7b](https://github.com/wobondar/pi-footer/commit/8998c7b44dc6b91b069a46a265d2e5466f3d41fe))
135
+
136
+
137
+ ### Bug Fixes
138
+
139
+ * embed video ([02f0668](https://github.com/wobondar/pi-footer/commit/02f0668bb75eed7a343454c277e83d92b65533f9))
140
+ * replace video embed with tag ([e79d2c4](https://github.com/wobondar/pi-footer/commit/e79d2c45b80be96321d5ecd2de67e7d14e0f16fc))
141
+
142
+
143
+ ### Dependencies
144
+
145
+ * **deps-dev:** bump oxfmt from 0.47.0 to 0.48.0 ([#2](https://github.com/wobondar/pi-footer/issues/2)) ([d82e354](https://github.com/wobondar/pi-footer/commit/d82e3548ee6a839867ec066fd3dc4088da436769))
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wobondar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.