@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,401 @@
1
+ import { createHash } from "node:crypto";
2
+ import { MeshFetchInvalidResponseError, MeshFetchUnavailableError, } from "./client.js";
3
+ import { bytesEqual, decodeEd25519PublicKey, encodeEd25519PublicKey, publicKeyFingerprint, } from "./encoding.js";
4
+ import { buildTopologySnapshot, } from "./siblings.js";
5
+ import { verifyEnvelope } from "./verify.js";
6
+ const DEFAULT_INTERVAL_MS = 60_000;
7
+ function compareAscii(left, right) {
8
+ return left < right ? -1 : left > right ? 1 : 0;
9
+ }
10
+ function rawOwnerFingerprint(rawOwner) {
11
+ let fingerprintInput;
12
+ if (typeof rawOwner === "string") {
13
+ fingerprintInput = rawOwner;
14
+ }
15
+ else {
16
+ try {
17
+ const serialized = JSON.stringify(rawOwner);
18
+ const type = rawOwner === null ? "null" : typeof rawOwner;
19
+ fingerprintInput = `${type}:${serialized ?? ""}`;
20
+ }
21
+ catch {
22
+ fingerprintInput = `${typeof rawOwner}:unserializable`;
23
+ }
24
+ }
25
+ return createHash("sha256")
26
+ .update(fingerprintInput, "utf8")
27
+ .digest("hex")
28
+ .slice(0, 8);
29
+ }
30
+ function topologyEquals(left, right) {
31
+ if (!left)
32
+ return false;
33
+ if (left.self.pcPubkey !== right.self.pcPubkey ||
34
+ left.self.pcLabel !== right.self.pcLabel ||
35
+ left.self.legacyPcLabel !== right.self.legacyPcLabel ||
36
+ left.siblings.length !== right.siblings.length)
37
+ return false;
38
+ return left.siblings.every((identity, index) => {
39
+ const other = right.siblings[index];
40
+ return other !== undefined &&
41
+ identity.pcPubkey === other.pcPubkey &&
42
+ identity.pcLabel === other.pcLabel &&
43
+ identity.legacyPcLabel === other.legacyPcLabel;
44
+ });
45
+ }
46
+ export class SelfRevoke {
47
+ client;
48
+ storage;
49
+ myPubkey;
50
+ intervalMs;
51
+ onRevoke;
52
+ onAuthoritativeOwners;
53
+ onTopologyChanged;
54
+ log;
55
+ /**
56
+ * Accepted anti-rollback floor, deliberately independent from pending I/O.
57
+ * https://github.com/jacobaraujo7/remote_pi/issues/73: this in-memory floor
58
+ * resets on process restart, allowing pre-revocation membership replay.
59
+ */
60
+ lastSeenVersion = new Map();
61
+ pendingRevocations = new Map();
62
+ membershipByOwner = new Map();
63
+ previousTopology = null;
64
+ sweepInFlight = null;
65
+ timer = null;
66
+ /** Invalidates authority held by an async sweep when this producer stops/re-pairs. */
67
+ lifecycleGeneration = 0;
68
+ constructor(opts) {
69
+ this.client = opts.client;
70
+ this.storage = opts.storage;
71
+ this.myPubkey = new Uint8Array(opts.myPubkey);
72
+ encodeEd25519PublicKey(this.myPubkey, "self public key");
73
+ this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
74
+ this.onRevoke = opts.onRevoke;
75
+ this.onAuthoritativeOwners = opts.onAuthoritativeOwners;
76
+ this.onTopologyChanged = opts.onTopologyChanged;
77
+ this.log = opts.log ?? {
78
+ info: (message) => console.info(message),
79
+ warn: (message) => console.warn(message),
80
+ error: (message) => console.error(message),
81
+ };
82
+ }
83
+ start() {
84
+ if (this.timer !== null)
85
+ return;
86
+ void this.checkOnce().catch(() => this.log.error("[mesh] event=self_revoke_sweep_failed"));
87
+ this.timer = setInterval(() => {
88
+ void this.checkOnce().catch(() => this.log.error("[mesh] event=self_revoke_sweep_failed"));
89
+ }, this.intervalMs);
90
+ }
91
+ stop() {
92
+ this.invalidateStorageAuthority();
93
+ if (this.timer !== null) {
94
+ clearInterval(this.timer);
95
+ this.timer = null;
96
+ }
97
+ }
98
+ /** Called before a same-process pairing mutation enters the storage lane. */
99
+ invalidateStorageAuthority() {
100
+ this.lifecycleGeneration += 1;
101
+ }
102
+ /** Schedules one post-mutation authoritative sweep after any stale sweep exits. */
103
+ requestFreshCheck() {
104
+ const prior = this.sweepInFlight;
105
+ if (!prior)
106
+ return this.checkOnce();
107
+ return prior.catch(() => undefined).then(() => this.checkOnce());
108
+ }
109
+ checkOnce() {
110
+ if (this.sweepInFlight)
111
+ return this.sweepInFlight;
112
+ const generation = this.lifecycleGeneration;
113
+ const sweep = this._runSweep(generation).finally(() => {
114
+ if (this.sweepInFlight === sweep)
115
+ this.sweepInFlight = null;
116
+ });
117
+ this.sweepInFlight = sweep;
118
+ return sweep;
119
+ }
120
+ async _runSweep(generation) {
121
+ let snapshot;
122
+ try {
123
+ snapshot = await this.storage.snapshotOwnerPubkeys();
124
+ }
125
+ catch {
126
+ if (!this._hasAuthority(generation))
127
+ return;
128
+ this.log.error("[mesh] event=owner_list_unavailable");
129
+ await this._publishTopology(buildTopologySnapshot(this.myPubkey, this.membershipByOwner.values()), generation);
130
+ return;
131
+ }
132
+ if (!this._hasAuthority(generation))
133
+ return;
134
+ const slots = this._canonicalOwnerSlots(snapshot);
135
+ if (this.onAuthoritativeOwners) {
136
+ if (!this._hasAuthority(generation))
137
+ return;
138
+ try {
139
+ await this.onAuthoritativeOwners(slots.map((slot) => slot.canonicalOwnerPubkey));
140
+ }
141
+ catch {
142
+ if (this._hasAuthority(generation)) {
143
+ this.log.error("[mesh] event=authoritative_owners_callback_failed");
144
+ }
145
+ }
146
+ if (!this._hasAuthority(generation))
147
+ return;
148
+ }
149
+ await this._pruneStateNotIn(slots, generation);
150
+ if (!this._hasAuthority(generation))
151
+ return;
152
+ for (const slot of slots) {
153
+ const staleResponse = await this._checkOwnerSlot(slot, generation);
154
+ if (!this._hasAuthority(generation) || staleResponse)
155
+ return;
156
+ }
157
+ await this._publishTopology(buildTopologySnapshot(this.myPubkey, this.membershipByOwner.values()), generation);
158
+ }
159
+ _hasAuthority(generation) {
160
+ return generation === this.lifecycleGeneration;
161
+ }
162
+ _canonicalOwnerSlots(snapshot) {
163
+ const rawHandlesByCanonical = new Map();
164
+ const bytesByCanonical = new Map();
165
+ for (const record of snapshot) {
166
+ const rawOwner = record.rawOwnerPubkey;
167
+ if (typeof rawOwner !== "string") {
168
+ this.log.warn(`[mesh] event=invalid_owner_record owner_fp=${rawOwnerFingerprint(rawOwner)}`);
169
+ continue;
170
+ }
171
+ try {
172
+ const ownerPk = decodeEd25519PublicKey(rawOwner, "Owner record");
173
+ const canonical = encodeEd25519PublicKey(ownerPk);
174
+ const handles = rawHandlesByCanonical.get(canonical) ?? new Map();
175
+ handles.set(rawOwner, record.token);
176
+ rawHandlesByCanonical.set(canonical, handles);
177
+ if (!bytesByCanonical.has(canonical))
178
+ bytesByCanonical.set(canonical, ownerPk);
179
+ }
180
+ catch {
181
+ this.log.warn(`[mesh] event=invalid_owner_record owner_fp=${rawOwnerFingerprint(rawOwner)}`);
182
+ }
183
+ }
184
+ return [...rawHandlesByCanonical.entries()]
185
+ .sort(([left], [right]) => compareAscii(left, right))
186
+ .map(([canonicalOwnerPubkey, handles]) => {
187
+ const ownerPk = bytesByCanonical.get(canonicalOwnerPubkey);
188
+ return {
189
+ canonicalOwnerPubkey,
190
+ rawOwnerPubkeys: [...handles.entries()]
191
+ .sort(([left], [right]) => compareAscii(left, right))
192
+ .map(([rawOwnerPubkey, token]) => ({ rawOwnerPubkey, token })),
193
+ ownerPk,
194
+ fingerprint: publicKeyFingerprint(ownerPk),
195
+ };
196
+ });
197
+ }
198
+ async _pruneStateNotIn(slots, generation) {
199
+ const currentOwners = new Set(slots.map((slot) => slot.canonicalOwnerPubkey));
200
+ for (const [owner, pending] of [...this.pendingRevocations]) {
201
+ if (currentOwners.has(owner))
202
+ continue;
203
+ for (const rawOwnerPubkey of [...pending.rawOwnerTokens.keys()]) {
204
+ if (!this._hasAuthority(generation))
205
+ return;
206
+ pending.rawOwnerTokens.delete(rawOwnerPubkey);
207
+ await this._invokeRevokeCallback(rawOwnerPubkey, owner, pending.fingerprint, generation);
208
+ if (!this._hasAuthority(generation))
209
+ return;
210
+ }
211
+ if (pending.rawOwnerTokens.size === 0) {
212
+ this.pendingRevocations.delete(owner);
213
+ }
214
+ }
215
+ for (const owner of this.membershipByOwner.keys()) {
216
+ if (!currentOwners.has(owner) && !this.pendingRevocations.has(owner)) {
217
+ this.membershipByOwner.delete(owner);
218
+ }
219
+ }
220
+ for (const owner of this.lastSeenVersion.keys()) {
221
+ if (!currentOwners.has(owner) && !this.pendingRevocations.has(owner)) {
222
+ this.lastSeenVersion.delete(owner);
223
+ }
224
+ }
225
+ }
226
+ async _checkOwnerSlot(slot, generation) {
227
+ const since = this.lastSeenVersion.get(slot.canonicalOwnerPubkey);
228
+ const hash = createHash("sha256").update(slot.ownerPk).digest("hex");
229
+ let envelope;
230
+ try {
231
+ envelope = await this.client.get(hash, since);
232
+ }
233
+ catch (error) {
234
+ if (!this._hasAuthority(generation))
235
+ return false;
236
+ const stale = await this._retryPending(slot, generation);
237
+ if (stale || !this._hasAuthority(generation))
238
+ return stale;
239
+ if (error instanceof MeshFetchUnavailableError) {
240
+ this.log.warn(`[mesh] event=owner_fetch_unavailable owner_fp=${slot.fingerprint}`);
241
+ return false;
242
+ }
243
+ this.membershipByOwner.delete(slot.canonicalOwnerPubkey);
244
+ const event = error instanceof MeshFetchInvalidResponseError ? "owner_fetch_invalid" : "owner_fetch_failed";
245
+ this.log.warn(`[mesh] event=${event} owner_fp=${slot.fingerprint}`);
246
+ return false;
247
+ }
248
+ if (!this._hasAuthority(generation))
249
+ return false;
250
+ if (!envelope)
251
+ return this._retryPending(slot, generation);
252
+ let header;
253
+ try {
254
+ header = await verifyEnvelope(envelope);
255
+ }
256
+ catch {
257
+ if (!this._hasAuthority(generation))
258
+ return false;
259
+ this.membershipByOwner.delete(slot.canonicalOwnerPubkey);
260
+ this.log.warn(`[mesh] event=owner_envelope_invalid owner_fp=${slot.fingerprint}`);
261
+ return this._retryPending(slot, generation);
262
+ }
263
+ if (!this._hasAuthority(generation))
264
+ return false;
265
+ if (!bytesEqual(header.ownerPk, slot.ownerPk)) {
266
+ this.membershipByOwner.delete(slot.canonicalOwnerPubkey);
267
+ this.log.warn(`[mesh] event=owner_slot_mismatch owner_fp=${slot.fingerprint}`);
268
+ return this._retryPending(slot, generation);
269
+ }
270
+ const lastSeen = this.lastSeenVersion.get(slot.canonicalOwnerPubkey);
271
+ if (lastSeen !== undefined && header.version <= lastSeen) {
272
+ this.log.warn(`[mesh] event=owner_rollback owner_fp=${slot.fingerprint} received_version=${header.version} retained_version=${lastSeen}`);
273
+ return this._retryPending(slot, generation);
274
+ }
275
+ const membership = {
276
+ ownerPubkey: encodeEd25519PublicKey(header.ownerPk),
277
+ members: header.members.map((member) => ({
278
+ pcPubkey: member.remoteEpk,
279
+ ...(member.nickname !== undefined ? { nickname: member.nickname } : {}),
280
+ })),
281
+ };
282
+ const selfPubkey = encodeEd25519PublicKey(this.myPubkey);
283
+ const stillMember = membership.members.some((member) => member.pcPubkey === selfPubkey);
284
+ if (!this._hasAuthority(generation))
285
+ return false;
286
+ if (stillMember) {
287
+ // A newer self-including envelope supersedes any older pending revoke.
288
+ this.pendingRevocations.delete(slot.canonicalOwnerPubkey);
289
+ this.lastSeenVersion.set(slot.canonicalOwnerPubkey, header.version);
290
+ this.membershipByOwner.set(slot.canonicalOwnerPubkey, membership);
291
+ return false;
292
+ }
293
+ const previousVersion = this.lastSeenVersion.get(slot.canonicalOwnerPubkey);
294
+ this.lastSeenVersion.set(slot.canonicalOwnerPubkey, header.version);
295
+ this.membershipByOwner.delete(slot.canonicalOwnerPubkey);
296
+ this.pendingRevocations.set(slot.canonicalOwnerPubkey, {
297
+ version: header.version,
298
+ previousVersion,
299
+ fingerprint: slot.fingerprint,
300
+ rawOwnerTokens: new Map(slot.rawOwnerPubkeys.map(({ rawOwnerPubkey, token }) => [rawOwnerPubkey, token])),
301
+ });
302
+ this.log.info(`[mesh] event=self_revoked owner_fp=${slot.fingerprint} received_version=${header.version} since=${since ?? "none"} member_count=${header.members.length}`);
303
+ const stale = await this._retryPending(slot, generation);
304
+ if (stale) {
305
+ // This signed response authorized the old pairing snapshot only. Do not
306
+ // retain its floor, pending work, or topology contribution for a re-pair.
307
+ this.pendingRevocations.delete(slot.canonicalOwnerPubkey);
308
+ if (previousVersion === undefined)
309
+ this.lastSeenVersion.delete(slot.canonicalOwnerPubkey);
310
+ else
311
+ this.lastSeenVersion.set(slot.canonicalOwnerPubkey, previousVersion);
312
+ return true;
313
+ }
314
+ return false;
315
+ }
316
+ /** Returns true only when storage proves the pending snapshot was re-paired. */
317
+ async _retryPending(slot, generation) {
318
+ const pending = this.pendingRevocations.get(slot.canonicalOwnerPubkey);
319
+ if (!pending)
320
+ return false;
321
+ for (const rawOwnerPubkey of [...pending.rawOwnerTokens.keys()]) {
322
+ if (!this._hasAuthority(generation))
323
+ return false;
324
+ let result;
325
+ try {
326
+ const expectedToken = pending.rawOwnerTokens.get(rawOwnerPubkey);
327
+ result = await this.storage.conditionalRemovePeer(rawOwnerPubkey, expectedToken, () => this._hasAuthority(generation));
328
+ }
329
+ catch {
330
+ if (this._hasAuthority(generation)) {
331
+ this.log.error(`[mesh] event=owner_storage_remove_failed owner_fp=${slot.fingerprint}`);
332
+ }
333
+ return false;
334
+ }
335
+ if (!this._hasAuthority(generation))
336
+ return false;
337
+ if (result.outcome === "stale") {
338
+ // The accepted revocation belonged to an old pairing snapshot. Its
339
+ // floor must not suppress a current replacement envelope, but the
340
+ // already-pruned topology stays fail-closed until that envelope wins.
341
+ this.pendingRevocations.delete(slot.canonicalOwnerPubkey);
342
+ if (pending.previousVersion === undefined) {
343
+ this.lastSeenVersion.delete(slot.canonicalOwnerPubkey);
344
+ }
345
+ else {
346
+ this.lastSeenVersion.set(slot.canonicalOwnerPubkey, pending.previousVersion);
347
+ }
348
+ return true;
349
+ }
350
+ if (result.outcome === "no_authority")
351
+ return false;
352
+ // The remaining terminal outcomes are exact local removal or an
353
+ // authoritative strict-read absence, applied fail-closed to this runtime.
354
+ // This intentionally does not claim durable cross-process re-pair provenance.
355
+ pending.rawOwnerTokens.delete(rawOwnerPubkey);
356
+ if (result.outcome === "removed") {
357
+ for (const remainingRawOwner of pending.rawOwnerTokens.keys()) {
358
+ pending.rawOwnerTokens.set(remainingRawOwner, result.nextToken);
359
+ }
360
+ }
361
+ await this._invokeRevokeCallback(rawOwnerPubkey, slot.canonicalOwnerPubkey, pending.fingerprint, generation);
362
+ if (!this._hasAuthority(generation))
363
+ return false;
364
+ }
365
+ if (pending.rawOwnerTokens.size === 0) {
366
+ this.pendingRevocations.delete(slot.canonicalOwnerPubkey);
367
+ }
368
+ return false;
369
+ }
370
+ async _invokeRevokeCallback(rawOwnerPubkey, canonicalOwnerPubkey, fingerprint, generation) {
371
+ if (!this._hasAuthority(generation) || !this.onRevoke)
372
+ return;
373
+ try {
374
+ await this.onRevoke(rawOwnerPubkey, canonicalOwnerPubkey);
375
+ }
376
+ catch {
377
+ if (this._hasAuthority(generation)) {
378
+ this.log.error(`[mesh] event=owner_revoke_callback_failed owner_fp=${fingerprint}`);
379
+ }
380
+ }
381
+ }
382
+ async _publishTopology(next, generation) {
383
+ if (!this._hasAuthority(generation) || topologyEquals(this.previousTopology, next))
384
+ return;
385
+ try {
386
+ if (this.onTopologyChanged) {
387
+ if (!this._hasAuthority(generation))
388
+ return;
389
+ await this.onTopologyChanged(next);
390
+ }
391
+ }
392
+ catch {
393
+ if (this._hasAuthority(generation))
394
+ this.log.error("[mesh] event=topology_callback_failed");
395
+ return;
396
+ }
397
+ if (this._hasAuthority(generation))
398
+ this.previousTopology = next;
399
+ }
400
+ }
401
+ //# sourceMappingURL=self_revoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self_revoke.js","sourceRoot":"","sources":["../../src/mesh/self_revoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { MeshClient } from "./client.js";
2
+ export interface PiRoutingIdentity {
3
+ readonly pcPubkey: string;
4
+ /** Receiver-local display and routing alias. */
5
+ readonly pcLabel: string;
6
+ /** Raw legacy cross-PC wire prefix; distinct from the receiver-local alias. */
7
+ readonly legacyPcLabel: string;
8
+ }
9
+ export interface MeshTopologySnapshot {
10
+ readonly self: PiRoutingIdentity;
11
+ readonly siblings: readonly PiRoutingIdentity[];
12
+ }
13
+ export interface BoundOwnerMembership {
14
+ /** Canonical standard-padded string derived from MeshHeader.ownerPk bytes. */
15
+ readonly ownerPubkey: string;
16
+ readonly members: readonly {
17
+ readonly pcPubkey: string;
18
+ readonly nickname?: string;
19
+ }[];
20
+ }
21
+ /** Legacy mutable shape retained through the Task 4 compatibility window. */
22
+ export interface SiblingPi {
23
+ pcLabel: string;
24
+ pcPubkey: string;
25
+ }
26
+ export interface DiscoverSelfLabelResult {
27
+ selfPcLabel: string;
28
+ }
29
+ export interface DiscoverOptions {
30
+ client: MeshClient;
31
+ ownerEpks: readonly unknown[];
32
+ myPubkey: Uint8Array;
33
+ log?: {
34
+ warn(msg: string): void;
35
+ };
36
+ }
37
+ /**
38
+ * Builds one deterministic direct-co-membership topology for self and siblings.
39
+ * Memberships that do not themselves contain self contribute nothing.
40
+ */
41
+ export declare function buildTopologySnapshot(myPubkey: Uint8Array, memberships: Iterable<BoundOwnerMembership>): MeshTopologySnapshot;
42
+ /** Discovers one bound, direct, canonical topology from raw Owner records. */
43
+ export declare function discoverTopology(opts: DiscoverOptions): Promise<MeshTopologySnapshot>;
44
+ /** Compatibility fallback now follows the routing-alias grammar. */
45
+ export declare function fallbackLabel(pcPubkey: string): string;
46
+ /** Compatibility wrapper over the atomic topology producer. */
47
+ export declare function discoverSelfLabel(opts: DiscoverOptions): Promise<DiscoverSelfLabelResult>;
48
+ /** Compatibility wrapper over the atomic topology producer. */
49
+ export declare function discoverSiblings(opts: DiscoverOptions): Promise<SiblingPi[]>;
@@ -0,0 +1,159 @@
1
+ import { createHash } from "node:crypto";
2
+ import { allocateRoutingAliases, bytesEqual, canonicalizeEd25519PublicKey, decodeEd25519PublicKey, encodeEd25519PublicKey, publicKeyFingerprint, selectRoutingNickname, toBase64UrlNoPad, } from "./encoding.js";
3
+ import { verifyEnvelope } from "./verify.js";
4
+ function compareAscii(left, right) {
5
+ return left < right ? -1 : left > right ? 1 : 0;
6
+ }
7
+ function freezeIdentity(pcPubkey, pcLabel, legacyPcLabel) {
8
+ return Object.freeze({ pcPubkey, pcLabel, legacyPcLabel });
9
+ }
10
+ /**
11
+ * Builds one deterministic direct-co-membership topology for self and siblings.
12
+ * Memberships that do not themselves contain self contribute nothing.
13
+ */
14
+ export function buildTopologySnapshot(myPubkey, memberships) {
15
+ const selfPubkey = encodeEd25519PublicKey(myPubkey, "self public key");
16
+ const nicknamesByKey = new Map([[selfPubkey, []]]);
17
+ for (const membership of memberships) {
18
+ canonicalizeEd25519PublicKey(membership.ownerPubkey, "membership.ownerPubkey");
19
+ const normalizedMembers = membership.members.map((member, index) => {
20
+ if (member.nickname !== undefined &&
21
+ typeof member.nickname !== "string") {
22
+ throw new Error(`mesh: membership.members[${index}].nickname invalid`);
23
+ }
24
+ return {
25
+ pcPubkey: canonicalizeEd25519PublicKey(member.pcPubkey, `membership.members[${index}].pcPubkey`),
26
+ nickname: member.nickname,
27
+ };
28
+ });
29
+ if (!normalizedMembers.some((member) => member.pcPubkey === selfPubkey)) {
30
+ continue;
31
+ }
32
+ for (const member of normalizedMembers) {
33
+ const candidates = nicknamesByKey.get(member.pcPubkey) ?? [];
34
+ if (!nicknamesByKey.has(member.pcPubkey)) {
35
+ nicknamesByKey.set(member.pcPubkey, candidates);
36
+ }
37
+ if (member.nickname)
38
+ candidates.push(member.nickname);
39
+ }
40
+ }
41
+ const selectedNicknames = new Map([...nicknamesByKey.entries()].map(([pcPubkey, candidates]) => [
42
+ pcPubkey,
43
+ selectRoutingNickname(candidates),
44
+ ]));
45
+ const aliases = allocateRoutingAliases([...selectedNicknames.entries()].map(([pcPubkey, nickname]) => ({
46
+ pcPubkey,
47
+ ...(nickname !== undefined ? { nickname } : {}),
48
+ })));
49
+ const selfLabel = aliases.get(selfPubkey);
50
+ if (!selfLabel) {
51
+ throw new Error("mesh: topology self alias invariant failed");
52
+ }
53
+ const siblings = [...aliases.entries()]
54
+ .filter(([pcPubkey]) => pcPubkey !== selfPubkey)
55
+ .sort(([left], [right]) => compareAscii(left, right))
56
+ .map(([pcPubkey, pcLabel]) => freezeIdentity(pcPubkey, pcLabel, selectedNicknames.get(pcPubkey) ?? pcPubkey.slice(0, 8)));
57
+ return Object.freeze({
58
+ self: freezeIdentity(selfPubkey, selfLabel, selectedNicknames.get(selfPubkey) ?? selfPubkey.slice(0, 8)),
59
+ siblings: Object.freeze(siblings),
60
+ });
61
+ }
62
+ function rawOwnerFingerprint(rawOwner) {
63
+ let fingerprintInput;
64
+ if (typeof rawOwner === "string") {
65
+ fingerprintInput = rawOwner;
66
+ }
67
+ else {
68
+ try {
69
+ const serialized = JSON.stringify(rawOwner);
70
+ const type = rawOwner === null ? "null" : typeof rawOwner;
71
+ fingerprintInput = `${type}:${serialized ?? ""}`;
72
+ }
73
+ catch {
74
+ fingerprintInput = `${typeof rawOwner}:unserializable`;
75
+ }
76
+ }
77
+ return createHash("sha256")
78
+ .update(fingerprintInput, "utf8")
79
+ .digest("hex")
80
+ .slice(0, 8);
81
+ }
82
+ function canonicalOwnerSlots(rawOwners, log) {
83
+ const slots = new Map();
84
+ for (const rawOwner of rawOwners) {
85
+ if (typeof rawOwner !== "string") {
86
+ log.warn(`[mesh] event=invalid_owner_record owner_fp=${rawOwnerFingerprint(rawOwner)}`);
87
+ continue;
88
+ }
89
+ try {
90
+ const ownerPk = decodeEd25519PublicKey(rawOwner, "Owner record");
91
+ const canonicalOwnerPubkey = encodeEd25519PublicKey(ownerPk);
92
+ if (!slots.has(canonicalOwnerPubkey)) {
93
+ slots.set(canonicalOwnerPubkey, {
94
+ canonicalOwnerPubkey,
95
+ ownerPk,
96
+ fingerprint: publicKeyFingerprint(ownerPk),
97
+ });
98
+ }
99
+ }
100
+ catch {
101
+ log.warn(`[mesh] event=invalid_owner_record owner_fp=${rawOwnerFingerprint(rawOwner)}`);
102
+ }
103
+ }
104
+ return [...slots.values()].sort((left, right) => compareAscii(left.canonicalOwnerPubkey, right.canonicalOwnerPubkey));
105
+ }
106
+ /** Discovers one bound, direct, canonical topology from raw Owner records. */
107
+ export async function discoverTopology(opts) {
108
+ const log = opts.log ?? { warn: (message) => console.warn(message) };
109
+ const selfPubkey = encodeEd25519PublicKey(opts.myPubkey, "self public key");
110
+ const memberships = [];
111
+ for (const slot of canonicalOwnerSlots(opts.ownerEpks, log)) {
112
+ try {
113
+ const hash = createHash("sha256").update(slot.ownerPk).digest("hex");
114
+ const envelope = await opts.client.get(hash);
115
+ if (!envelope)
116
+ continue;
117
+ const header = await verifyEnvelope(envelope);
118
+ if (!bytesEqual(header.ownerPk, slot.ownerPk)) {
119
+ log.warn(`[mesh] event=owner_slot_mismatch owner_fp=${slot.fingerprint}`);
120
+ continue;
121
+ }
122
+ if (!header.members.some((member) => member.remoteEpk === selfPubkey)) {
123
+ continue;
124
+ }
125
+ memberships.push({
126
+ ownerPubkey: encodeEd25519PublicKey(header.ownerPk),
127
+ members: header.members.map((member) => ({
128
+ pcPubkey: member.remoteEpk,
129
+ ...(member.nickname !== undefined
130
+ ? { nickname: member.nickname }
131
+ : {}),
132
+ })),
133
+ });
134
+ }
135
+ catch {
136
+ log.warn(`[mesh] event=owner_discovery_failed owner_fp=${slot.fingerprint}`);
137
+ }
138
+ }
139
+ return buildTopologySnapshot(opts.myPubkey, memberships);
140
+ }
141
+ /** Compatibility fallback now follows the routing-alias grammar. */
142
+ export function fallbackLabel(pcPubkey) {
143
+ const bytes = decodeEd25519PublicKey(pcPubkey, "pcPubkey");
144
+ return `pc-${toBase64UrlNoPad(bytes).slice(0, 8)}`;
145
+ }
146
+ /** Compatibility wrapper over the atomic topology producer. */
147
+ export async function discoverSelfLabel(opts) {
148
+ const topology = await discoverTopology(opts);
149
+ return { selfPcLabel: topology.self.pcLabel };
150
+ }
151
+ /** Compatibility wrapper over the atomic topology producer. */
152
+ export async function discoverSiblings(opts) {
153
+ const topology = await discoverTopology(opts);
154
+ return topology.siblings.map(({ pcLabel, pcPubkey }) => ({
155
+ pcLabel,
156
+ pcPubkey,
157
+ }));
158
+ }
159
+ //# sourceMappingURL=siblings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siblings.js","sourceRoot":"","sources":["../../src/mesh/siblings.ts"],"names":[],"mappings":"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"}