@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
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Plan/28 Wave B Slice 1 — `list_commands` handler.
3
+ *
4
+ * Builds the catalog the app's slash-command picker renders. Sources:
5
+ *
6
+ * 1. **Builtins**: from `BUILTIN_SLASH_COMMANDS_MIRROR` (manual mirror of
7
+ * the Pi SDK's hardcoded list — see `builtin_mirror.ts` for why).
8
+ * 2. **Extension / prompt / skill**: from `pi.getCommands()` at runtime,
9
+ * so anything our extension (or future plugins) register shows up
10
+ * automatically.
11
+ *
12
+ * Invokability of extension-registered commands is `true` by default — the
13
+ * pi-extension owns its own command handlers and the Wave B Slice 2
14
+ * dispatcher will call them directly via a local registry. Prompt and
15
+ * skill commands stay `false` until we wire dispatch for them.
16
+ */
17
+ import type { SlashCommandInfo } from "@mariozechner/pi-coding-agent";
18
+ import type { ClientMessage, ServerMessage, WireCommand } from "../protocol/types.js";
19
+ import { findBuiltin } from "./builtin_mirror.js";
20
+ /**
21
+ * Minimal channel surface the handler needs to reply to the requesting
22
+ * owner. `PlainPeerChannel` satisfies it; tests can pass a fake.
23
+ */
24
+ export interface CommandReplySender {
25
+ send(msg: ServerMessage): void;
26
+ }
27
+ /**
28
+ * Subset of `ExtensionAPI` used by `handleListCommands`. Narrowing the
29
+ * signature lets us instantiate fakes in tests without rebuilding the
30
+ * whole `ExtensionAPI` surface.
31
+ */
32
+ export interface CommandSourcePi {
33
+ getCommands(): SlashCommandInfo[];
34
+ }
35
+ type ListCommandsMsg = Extract<ClientMessage, {
36
+ type: "list_commands";
37
+ }>;
38
+ /**
39
+ * Build the wire catalog and send the reply. Pure modulo I/O on `sender`.
40
+ *
41
+ * Implementation notes:
42
+ * - Builtins come first so the app's default ordering keeps the most
43
+ * familiar names (`/compact`, `/model`) near the top of the picker.
44
+ * The app may re-sort; this is only a default.
45
+ * - Skills returned by `pi.getCommands()` are already prefixed with
46
+ * `skill:` in their `name` (per the SDK's runtime — see
47
+ * `agent-session.js`'s `_bindExtensionCore`). We forward verbatim.
48
+ * - If a mirror entry's name collides with a registered command of a
49
+ * different source (extension overriding a builtin), the registered
50
+ * one wins — we strip the duplicate builtin from the output. This
51
+ * matches the TUI's actual dispatch order.
52
+ */
53
+ export declare function handleListCommands(pi: CommandSourcePi, sender: CommandReplySender, msg: ListCommandsMsg): void;
54
+ /**
55
+ * Convert a `SlashCommandInfo` from the SDK into the wire schema.
56
+ * Visible so the dispatcher (Wave B Slice 2) can reuse the source/
57
+ * invokability decisions without redoing them.
58
+ */
59
+ export declare function sdkCommandToWire(c: SlashCommandInfo): WireCommand;
60
+ export { findBuiltin };
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Plan/28 Wave B Slice 1 — `list_commands` handler.
3
+ *
4
+ * Builds the catalog the app's slash-command picker renders. Sources:
5
+ *
6
+ * 1. **Builtins**: from `BUILTIN_SLASH_COMMANDS_MIRROR` (manual mirror of
7
+ * the Pi SDK's hardcoded list — see `builtin_mirror.ts` for why).
8
+ * 2. **Extension / prompt / skill**: from `pi.getCommands()` at runtime,
9
+ * so anything our extension (or future plugins) register shows up
10
+ * automatically.
11
+ *
12
+ * Invokability of extension-registered commands is `true` by default — the
13
+ * pi-extension owns its own command handlers and the Wave B Slice 2
14
+ * dispatcher will call them directly via a local registry. Prompt and
15
+ * skill commands stay `false` until we wire dispatch for them.
16
+ */
17
+ import { BUILTIN_SLASH_COMMANDS_MIRROR, builtinToWire, findBuiltin, } from "./builtin_mirror.js";
18
+ /**
19
+ * Build the wire catalog and send the reply. Pure modulo I/O on `sender`.
20
+ *
21
+ * Implementation notes:
22
+ * - Builtins come first so the app's default ordering keeps the most
23
+ * familiar names (`/compact`, `/model`) near the top of the picker.
24
+ * The app may re-sort; this is only a default.
25
+ * - Skills returned by `pi.getCommands()` are already prefixed with
26
+ * `skill:` in their `name` (per the SDK's runtime — see
27
+ * `agent-session.js`'s `_bindExtensionCore`). We forward verbatim.
28
+ * - If a mirror entry's name collides with a registered command of a
29
+ * different source (extension overriding a builtin), the registered
30
+ * one wins — we strip the duplicate builtin from the output. This
31
+ * matches the TUI's actual dispatch order.
32
+ */
33
+ export function handleListCommands(pi, sender, msg) {
34
+ const registered = pi.getCommands();
35
+ const registeredNames = new Set(registered.map((c) => c.name));
36
+ const builtinWire = BUILTIN_SLASH_COMMANDS_MIRROR
37
+ .filter((b) => !registeredNames.has(b.name))
38
+ .map(builtinToWire);
39
+ const registeredWire = registered.map((c) => sdkCommandToWire(c));
40
+ const commands = [...builtinWire, ...registeredWire];
41
+ sender.send({
42
+ type: "commands_list",
43
+ in_reply_to: msg.id,
44
+ commands,
45
+ });
46
+ }
47
+ /**
48
+ * Convert a `SlashCommandInfo` from the SDK into the wire schema.
49
+ * Visible so the dispatcher (Wave B Slice 2) can reuse the source/
50
+ * invokability decisions without redoing them.
51
+ */
52
+ export function sdkCommandToWire(c) {
53
+ const source = c.source; // "extension" | "prompt" | "skill"
54
+ // Extension commands are dispatched via our own local registry in
55
+ // Slice 2, so they're invokable today. Prompt templates and skills
56
+ // don't have a public invocation API yet — surface them as hints.
57
+ const invokable = source === "extension";
58
+ return {
59
+ name: c.name,
60
+ description: c.description,
61
+ source,
62
+ invokable,
63
+ // The SDK doesn't expose a `takesArgs` flag on `SlashCommandInfo`.
64
+ // Be permissive: assume any registered command may take args, so the
65
+ // app keeps the input editable after the chip. Builtins use the
66
+ // explicit per-name flag from the mirror.
67
+ takes_args: true,
68
+ };
69
+ }
70
+ // Re-export for callers that want builtin lookup without importing both
71
+ // modules. Keeps the public surface of "commands" small.
72
+ export { findBuiltin };
73
+ //# sourceMappingURL=list_commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_commands.js","sourceRoot":"","sources":["../../src/commands/list_commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EACL,6BAA6B,EAC7B,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAqB7B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAmB,EACnB,MAA0B,EAC1B,GAAoB;IAEpB,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAEpC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAkB,6BAA6B;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC3C,GAAG,CAAC,aAAa,CAAC,CAAC;IAEtB,MAAM,cAAc,GAAkB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACzD,gBAAgB,CAAC,CAAC,CAAC,CACpB,CAAC;IAEF,MAAM,QAAQ,GAAkB,CAAC,GAAG,WAAW,EAAE,GAAG,cAAc,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,GAAG,CAAC,EAAE;QACnB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAmB;IAClD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAE,mCAAmC;IAC7D,kEAAkE;IAClE,mEAAmE;IACnE,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAM,KAAK,WAAW,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,MAAM;QACN,SAAS;QACT,mEAAmE;QACnE,qEAAqE;QACrE,gEAAgE;QAChE,0CAA0C;QAC1C,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Default community relay. Stored in canonical http(s):// form — conversion
3
+ * to ws(s):// happens at the transport layer (see `toWebSocketUrl`). The
4
+ * community relay's reverse proxy maps `:443 → :3000` (the WS port), so the
5
+ * URL has no explicit port and the WebSocket upgrade rides on the same TLS
6
+ * connection as the HTTPS endpoints used by the mesh client.
7
+ */
8
+ export declare const kDefaultRelayUrl = "https://relay-rp1.jacobmoura.work";
9
+ export type RemotePiConfig = {
10
+ relay?: string;
11
+ };
12
+ export declare function loadConfig(): RemotePiConfig;
13
+ export declare function saveConfig(patch: Partial<RemotePiConfig>): void;
14
+ export type RelayResolution = {
15
+ url: string;
16
+ source: "env" | "config" | "default";
17
+ };
18
+ /**
19
+ * Resolves the effective relay URL in **canonical http(s):// form**.
20
+ *
21
+ * Precedence:
22
+ * 1. `REMOTE_PI_RELAY` env var (ops/CI escape hatch)
23
+ * 2. `~/.pi/remote/config.json` `relay` field (set via /remote-pi set-relay)
24
+ * 3. `kDefaultRelayUrl` (community default)
25
+ *
26
+ * Any ws(s):// values found (legacy configs or env overrides) are coerced
27
+ * to http(s):// defensively — the canonical form across the codebase is
28
+ * http(s)://, and the transport layer converts to ws(s):// at WS-open time.
29
+ */
30
+ export declare function resolveRelayUrl(): RelayResolution;
31
+ /**
32
+ * Strict validator for **user-provided** relay URLs (via `/remote-pi
33
+ * set-relay` or `/remote-pi relay url`).
34
+ *
35
+ * Only accepts `http://` and `https://`. `ws://`/`wss://` are deliberately
36
+ * **rejected** — the canonical form stored in config is http(s):// and the
37
+ * extension converts to ws(s):// internally when opening the WebSocket.
38
+ * Forcing a single scheme at the user boundary avoids two-form drift.
39
+ */
40
+ export declare function isValidRelayUrl(url: string): boolean;
41
+ /**
42
+ * Returns true if the URL uses ws:// or wss:// scheme — for emitting a
43
+ * targeted error message when the user pastes a WebSocket URL by mistake.
44
+ */
45
+ export declare function isWebSocketScheme(url: string): boolean;
46
+ /**
47
+ * Converts an http(s):// URL to the corresponding ws(s):// form. Used by
48
+ * the transport layer right before opening the WebSocket — config storage
49
+ * and the mesh HTTP client both stay on http(s)://.
50
+ *
51
+ * https://host → wss://host
52
+ * http://host → ws://host
53
+ * ws(s)://host → pass-through (defensive — env overrides or legacy
54
+ * configs may still carry ws(s)://)
55
+ */
56
+ export declare function toWebSocketUrl(url: string): string;
57
+ /**
58
+ * Inverse of `toWebSocketUrl`. Used by `resolveRelayUrl` to coerce any
59
+ * ws(s):// values back to canonical http(s):// before returning them to
60
+ * the rest of the codebase.
61
+ */
62
+ export declare function toHttpUrl(url: string): string;
@@ -0,0 +1,115 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ const CONFIG_DIR = path.join(os.homedir(), ".pi", "remote");
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
6
+ /**
7
+ * Default community relay. Stored in canonical http(s):// form — conversion
8
+ * to ws(s):// happens at the transport layer (see `toWebSocketUrl`). The
9
+ * community relay's reverse proxy maps `:443 → :3000` (the WS port), so the
10
+ * URL has no explicit port and the WebSocket upgrade rides on the same TLS
11
+ * connection as the HTTPS endpoints used by the mesh client.
12
+ */
13
+ export const kDefaultRelayUrl = "https://relay-rp1.jacobmoura.work";
14
+ export function loadConfig() {
15
+ try {
16
+ const raw = fs.readFileSync(CONFIG_FILE, "utf8");
17
+ const parsed = JSON.parse(raw);
18
+ if (!parsed || typeof parsed !== "object")
19
+ return {};
20
+ return parsed;
21
+ }
22
+ catch {
23
+ return {};
24
+ }
25
+ }
26
+ export function saveConfig(patch) {
27
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
28
+ const current = loadConfig();
29
+ const next = { ...current, ...patch };
30
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(next, null, 2));
31
+ }
32
+ /**
33
+ * Resolves the effective relay URL in **canonical http(s):// form**.
34
+ *
35
+ * Precedence:
36
+ * 1. `REMOTE_PI_RELAY` env var (ops/CI escape hatch)
37
+ * 2. `~/.pi/remote/config.json` `relay` field (set via /remote-pi set-relay)
38
+ * 3. `kDefaultRelayUrl` (community default)
39
+ *
40
+ * Any ws(s):// values found (legacy configs or env overrides) are coerced
41
+ * to http(s):// defensively — the canonical form across the codebase is
42
+ * http(s)://, and the transport layer converts to ws(s):// at WS-open time.
43
+ */
44
+ export function resolveRelayUrl() {
45
+ const env = process.env["REMOTE_PI_RELAY"];
46
+ if (env && env.length > 0)
47
+ return { url: toHttpUrl(env), source: "env" };
48
+ const cfg = loadConfig();
49
+ if (cfg.relay && cfg.relay.length > 0)
50
+ return { url: toHttpUrl(cfg.relay), source: "config" };
51
+ return { url: toHttpUrl(kDefaultRelayUrl), source: "default" };
52
+ }
53
+ /**
54
+ * Strict validator for **user-provided** relay URLs (via `/remote-pi
55
+ * set-relay` or `/remote-pi relay url`).
56
+ *
57
+ * Only accepts `http://` and `https://`. `ws://`/`wss://` are deliberately
58
+ * **rejected** — the canonical form stored in config is http(s):// and the
59
+ * extension converts to ws(s):// internally when opening the WebSocket.
60
+ * Forcing a single scheme at the user boundary avoids two-form drift.
61
+ */
62
+ export function isValidRelayUrl(url) {
63
+ if (!url)
64
+ return false;
65
+ const lower = url.toLowerCase();
66
+ if (!lower.startsWith("http://") && !lower.startsWith("https://"))
67
+ return false;
68
+ try {
69
+ new URL(url);
70
+ return true;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ /**
77
+ * Returns true if the URL uses ws:// or wss:// scheme — for emitting a
78
+ * targeted error message when the user pastes a WebSocket URL by mistake.
79
+ */
80
+ export function isWebSocketScheme(url) {
81
+ const lower = url.toLowerCase();
82
+ return lower.startsWith("ws://") || lower.startsWith("wss://");
83
+ }
84
+ /**
85
+ * Converts an http(s):// URL to the corresponding ws(s):// form. Used by
86
+ * the transport layer right before opening the WebSocket — config storage
87
+ * and the mesh HTTP client both stay on http(s)://.
88
+ *
89
+ * https://host → wss://host
90
+ * http://host → ws://host
91
+ * ws(s)://host → pass-through (defensive — env overrides or legacy
92
+ * configs may still carry ws(s)://)
93
+ */
94
+ export function toWebSocketUrl(url) {
95
+ const lower = url.toLowerCase();
96
+ if (lower.startsWith("https://"))
97
+ return "wss://" + url.slice("https://".length);
98
+ if (lower.startsWith("http://"))
99
+ return "ws://" + url.slice("http://".length);
100
+ return url;
101
+ }
102
+ /**
103
+ * Inverse of `toWebSocketUrl`. Used by `resolveRelayUrl` to coerce any
104
+ * ws(s):// values back to canonical http(s):// before returning them to
105
+ * the rest of the codebase.
106
+ */
107
+ export function toHttpUrl(url) {
108
+ const lower = url.toLowerCase();
109
+ if (lower.startsWith("wss://"))
110
+ return "https://" + url.slice("wss://".length);
111
+ if (lower.startsWith("ws://"))
112
+ return "http://" + url.slice("ws://".length);
113
+ return url;
114
+ }
115
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ControlReplyFor, type ControlRequest } from "./control_protocol.js";
2
+ export declare class SupervisorOfflineError extends Error {
3
+ readonly sockPath: string;
4
+ constructor(sockPath: string);
5
+ }
6
+ /**
7
+ * Sends a single request and returns the typed reply data.
8
+ *
9
+ * Throws:
10
+ * - `SupervisorOfflineError` when the supervisor isn't reachable.
11
+ * - `Error` from `parseReply` when the reply line is malformed.
12
+ * - The supervisor's own error string when `ok: false`.
13
+ */
14
+ export declare function callSupervisor<Op extends ControlRequest["op"]>(req: Extract<ControlRequest, {
15
+ op: Op;
16
+ }>): Promise<ControlReplyFor<Op>>;
17
+ /** Returns true when the supervisor is reachable. Used by `/remote-pi
18
+ * daemons` to decide whether to query runtime state or fall back to
19
+ * registry-only listing. */
20
+ export declare function supervisorOnline(): Promise<boolean>;
@@ -0,0 +1,131 @@
1
+ import { existsSync } from "node:fs";
2
+ import { createConnection } from "node:net";
3
+ import { encodeRequest, parseReply, } from "./control_protocol.js";
4
+ import { getSupervisorSockPath } from "./supervisor.js";
5
+ import { usesNamedPipe } from "../session/ipc.js";
6
+ /**
7
+ * Tiny client for the `remote-pi` CLI to call the supervisor over the
8
+ * `~/.pi/remote/supervisor.sock` UDS.
9
+ *
10
+ * Each call opens a fresh connection, sends one request line, reads one
11
+ * reply line, closes. No connection pooling — the CLI is short-lived,
12
+ * latency is dominated by the socket round-trip (<1ms).
13
+ *
14
+ * `SupervisorOfflineError` is the common error: thrown when the socket
15
+ * file is missing OR the connect fails (no listener). The CLI handler
16
+ * formats it as a friendly "Run `remote-pi install` first" message.
17
+ */
18
+ const CONNECT_TIMEOUT_MS = 1000;
19
+ const REPLY_TIMEOUT_MS = 5000;
20
+ export class SupervisorOfflineError extends Error {
21
+ sockPath;
22
+ constructor(sockPath) {
23
+ super(`Supervisor is not running. UDS not responding at ${sockPath}.\n` +
24
+ "Run `remote-pi install` to set it up, or start it manually with `pi-supervisord`.");
25
+ this.sockPath = sockPath;
26
+ this.name = "SupervisorOfflineError";
27
+ }
28
+ }
29
+ /**
30
+ * Sends a single request and returns the typed reply data.
31
+ *
32
+ * Throws:
33
+ * - `SupervisorOfflineError` when the supervisor isn't reachable.
34
+ * - `Error` from `parseReply` when the reply line is malformed.
35
+ * - The supervisor's own error string when `ok: false`.
36
+ */
37
+ export async function callSupervisor(req) {
38
+ const sockPath = getSupervisorSockPath();
39
+ // POSIX fast-fail on a missing socket file. Windows pipes have no file —
40
+ // skip the check and let `_connect` fail fast if the pipe isn't there.
41
+ if (!usesNamedPipe() && !existsSync(sockPath))
42
+ throw new SupervisorOfflineError(sockPath);
43
+ const sock = await _connect(sockPath);
44
+ try {
45
+ sock.write(encodeRequest(req));
46
+ const line = await _readLine(sock);
47
+ const reply = parseReply(line);
48
+ if (!reply.ok)
49
+ throw new Error(reply.error);
50
+ return reply.data;
51
+ }
52
+ finally {
53
+ sock.destroy();
54
+ }
55
+ }
56
+ /** Returns true when the supervisor is reachable. Used by `/remote-pi
57
+ * daemons` to decide whether to query runtime state or fall back to
58
+ * registry-only listing. */
59
+ export async function supervisorOnline() {
60
+ const sockPath = getSupervisorSockPath();
61
+ if (!usesNamedPipe() && !existsSync(sockPath))
62
+ return false;
63
+ try {
64
+ const sock = await _connect(sockPath);
65
+ sock.destroy();
66
+ return true;
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ // ── internals ───────────────────────────────────────────────────────────────
73
+ function _connect(sockPath) {
74
+ return new Promise((resolve, reject) => {
75
+ const sock = createConnection({ path: sockPath });
76
+ let settled = false;
77
+ const timer = setTimeout(() => {
78
+ if (settled)
79
+ return;
80
+ settled = true;
81
+ sock.destroy();
82
+ reject(new SupervisorOfflineError(sockPath));
83
+ }, CONNECT_TIMEOUT_MS);
84
+ sock.once("connect", () => {
85
+ if (settled)
86
+ return;
87
+ settled = true;
88
+ clearTimeout(timer);
89
+ sock.setEncoding("utf8");
90
+ resolve(sock);
91
+ });
92
+ sock.once("error", () => {
93
+ if (settled)
94
+ return;
95
+ settled = true;
96
+ clearTimeout(timer);
97
+ reject(new SupervisorOfflineError(sockPath));
98
+ });
99
+ });
100
+ }
101
+ function _readLine(sock) {
102
+ return new Promise((resolve, reject) => {
103
+ let buf = "";
104
+ const timer = setTimeout(() => {
105
+ reject(new Error("supervisor reply timeout"));
106
+ sock.destroy();
107
+ }, REPLY_TIMEOUT_MS);
108
+ sock.on("data", (chunk) => {
109
+ buf += chunk;
110
+ const nl = buf.indexOf("\n");
111
+ if (nl >= 0) {
112
+ clearTimeout(timer);
113
+ resolve(buf.slice(0, nl));
114
+ }
115
+ });
116
+ sock.on("end", () => {
117
+ clearTimeout(timer);
118
+ const nl = buf.indexOf("\n");
119
+ if (nl >= 0)
120
+ return resolve(buf.slice(0, nl));
121
+ if (buf.length > 0)
122
+ return resolve(buf);
123
+ reject(new Error("supervisor closed connection without replying"));
124
+ });
125
+ sock.on("error", (err) => {
126
+ clearTimeout(timer);
127
+ reject(err);
128
+ });
129
+ });
130
+ }
131
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * CLI ↔ supervisor IPC contract for `~/.pi/remote/supervisor.sock`.
3
+ *
4
+ * Framing: one JSON object per line, newline-terminated. The CLI sends a
5
+ * single `ControlRequest`, the supervisor sends a single `ControlReply`,
6
+ * both close the connection. No multiplexing, no streaming — each command
7
+ * is a short round-trip.
8
+ *
9
+ * Plan/26 W2. The Pi RPC protocol (`pi --mode rpc`) used by the daemon
10
+ * children themselves is a separate contract — see
11
+ * `node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts`.
12
+ * This file is strictly the supervisor's own control plane.
13
+ */
14
+ import type { CronJob } from "./cron_registry.js";
15
+ import type { CronLogEntry } from "./cron_log.js";
16
+ /** Per-daemon runtime state observable through the supervisor. */
17
+ export type DaemonState = "running" | "stopped" | "starting" | "crashed";
18
+ export interface DaemonInfo {
19
+ id: string;
20
+ cwd: string;
21
+ name: string;
22
+ state: DaemonState;
23
+ pid?: number;
24
+ uptime_s?: number;
25
+ restart_count?: number;
26
+ }
27
+ /** Requests sent CLI → supervisor. */
28
+ export type ControlRequest = {
29
+ op: "list";
30
+ } | {
31
+ op: "status";
32
+ } | {
33
+ op: "start_all";
34
+ } | {
35
+ op: "start";
36
+ id: string;
37
+ } | {
38
+ op: "stop_all";
39
+ } | {
40
+ op: "stop";
41
+ id: string;
42
+ } | {
43
+ op: "restart_all";
44
+ } | {
45
+ op: "restart";
46
+ id: string;
47
+ } | {
48
+ op: "send";
49
+ id: string;
50
+ text: string;
51
+ } | {
52
+ op: "register";
53
+ cwd: string;
54
+ } | {
55
+ op: "unregister";
56
+ id: string;
57
+ } | {
58
+ op: "cron_add";
59
+ daemon_id: string;
60
+ schedule: string;
61
+ prompt: string;
62
+ tz?: string;
63
+ skip_if_busy?: boolean;
64
+ wake?: boolean;
65
+ catchup?: boolean;
66
+ } | {
67
+ op: "cron_list";
68
+ } | {
69
+ op: "cron_remove";
70
+ job_id: string;
71
+ } | {
72
+ op: "cron_enable";
73
+ job_id: string;
74
+ enabled: boolean;
75
+ } | {
76
+ op: "cron_run";
77
+ job_id: string;
78
+ } | {
79
+ op: "cron_log";
80
+ job_id?: string;
81
+ tail?: number;
82
+ };
83
+ /** Replies sent supervisor → CLI. Tagged by `ok` boolean. */
84
+ export type ControlReply<T = unknown> = {
85
+ ok: true;
86
+ data?: T;
87
+ } | {
88
+ ok: false;
89
+ error: string;
90
+ };
91
+ /**
92
+ * Response shapes per op. Keep in sync with the supervisor handlers in
93
+ * `daemon/supervisor.ts`. Used for typed client calls.
94
+ */
95
+ export interface ControlReplyShapes {
96
+ list: {
97
+ daemons: DaemonInfo[];
98
+ };
99
+ status: {
100
+ daemons: DaemonInfo[];
101
+ };
102
+ start_all: {
103
+ started: string[];
104
+ already_running: string[];
105
+ };
106
+ start: {
107
+ id: string;
108
+ state: DaemonState;
109
+ started: boolean;
110
+ };
111
+ stop_all: {
112
+ stopped: string[];
113
+ already_stopped: string[];
114
+ };
115
+ stop: {
116
+ id: string;
117
+ state: DaemonState;
118
+ stopped: boolean;
119
+ };
120
+ restart_all: {
121
+ restarted: string[];
122
+ };
123
+ restart: {
124
+ id: string;
125
+ state: DaemonState;
126
+ restarted: boolean;
127
+ };
128
+ send: {
129
+ id: string;
130
+ delivered: boolean;
131
+ };
132
+ register: {
133
+ id: string;
134
+ cwd: string;
135
+ };
136
+ unregister: {
137
+ removed: boolean;
138
+ cwd?: string;
139
+ };
140
+ cron_add: {
141
+ job: CronJobView;
142
+ };
143
+ cron_list: {
144
+ jobs: CronJobView[];
145
+ };
146
+ cron_remove: {
147
+ removed: boolean;
148
+ };
149
+ cron_enable: {
150
+ job_id: string;
151
+ enabled: boolean;
152
+ updated: boolean;
153
+ };
154
+ cron_run: {
155
+ job_id: string;
156
+ result: string;
157
+ };
158
+ cron_log: {
159
+ entries: CronLogEntry[];
160
+ };
161
+ }
162
+ /** A cron job plus its computed `next_run` (ISO), for `cron list`. */
163
+ export type CronJobView = CronJob & {
164
+ next_run?: string | null;
165
+ };
166
+ /** Convenience for typed `Client.request<...>("op")` calls. */
167
+ export type ControlReplyFor<Op extends ControlRequest["op"]> = Op extends keyof ControlReplyShapes ? ControlReplyShapes[Op] : never;
168
+ export declare function encodeRequest(req: ControlRequest): string;
169
+ export declare function encodeReply<T>(reply: ControlReply<T>): string;
170
+ /**
171
+ * Parses a single JSON line into a request. Throws on malformed input —
172
+ * the supervisor catches and replies `{ok:false, error}` so the client
173
+ * gets a clean error rather than an unframed disconnect.
174
+ */
175
+ export declare function parseRequest(line: string): ControlRequest;
176
+ export declare function parseReply(line: string): ControlReply<unknown>;