@hienlh/ppm 0.23.17 → 0.23.19

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 (437) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/cli-reference.md +4 -4
  4. package/assets/skills/ppm/references/http-api.md +1 -1
  5. package/dist/web/assets/{accounts-settings-section-BqsI4Ixj.js → accounts-settings-section-BTga1zwH.js} +1 -1
  6. package/dist/web/assets/accounts-settings-section-BTga1zwH.js.br +0 -0
  7. package/dist/web/assets/accounts-settings-section-BTga1zwH.js.gz +0 -0
  8. package/dist/web/assets/{agent-session-sheet-BmoNB8BG.js → agent-session-sheet-Q3kasbrZ.js} +2 -2
  9. package/dist/web/assets/agent-session-sheet-Q3kasbrZ.js.br +0 -0
  10. package/dist/web/assets/agent-session-sheet-Q3kasbrZ.js.gz +0 -0
  11. package/dist/web/assets/{agent-session-window-content-rlCrYBYv.js → agent-session-window-content-UNuEprIK.js} +1 -1
  12. package/dist/web/assets/agent-session-window-content-UNuEprIK.js.br +0 -0
  13. package/dist/web/assets/agent-session-window-content-UNuEprIK.js.gz +0 -0
  14. package/dist/web/assets/{ai-resource-editor-CUOR9Xtf.js → ai-resource-editor-BEwA6Do0.js} +1 -1
  15. package/dist/web/assets/ai-resource-editor-BEwA6Do0.js.br +0 -0
  16. package/dist/web/assets/ai-resource-editor-BEwA6Do0.js.gz +0 -0
  17. package/dist/web/assets/{ai-settings-section-CNdbcCaI.js → ai-settings-section-DVKJPM0n.js} +1 -1
  18. package/dist/web/assets/ai-settings-section-DVKJPM0n.js.br +0 -0
  19. package/dist/web/assets/ai-settings-section-DVKJPM0n.js.gz +0 -0
  20. package/dist/web/assets/{ai-settings-section-aXXTb0dN.js → ai-settings-section-DlfY5lFT.js} +1 -1
  21. package/dist/web/assets/{android-tab-BsuTMKJw.js → android-tab-BNa6R9fV.js} +1 -1
  22. package/dist/web/assets/android-tab-BNa6R9fV.js.br +0 -0
  23. package/dist/web/assets/android-tab-BNa6R9fV.js.gz +0 -0
  24. package/dist/web/assets/{appearance-settings-section-Dk6d_fTo.js → appearance-settings-section-CjWFwWNn.js} +1 -1
  25. package/dist/web/assets/appearance-settings-section-CjWFwWNn.js.br +0 -0
  26. package/dist/web/assets/appearance-settings-section-CjWFwWNn.js.gz +0 -0
  27. package/dist/web/assets/{apps-panel-C20ys4Cy.js → apps-panel-D4xjeMN9.js} +1 -1
  28. package/dist/web/assets/apps-panel-D4xjeMN9.js.br +0 -0
  29. package/dist/web/assets/apps-panel-D4xjeMN9.js.gz +0 -0
  30. package/dist/web/assets/{branch-review-tab-CcvkQMRA.js → branch-review-tab-BCW5294d.js} +1 -1
  31. package/dist/web/assets/branch-review-tab-BCW5294d.js.br +0 -0
  32. package/dist/web/assets/branch-review-tab-BCW5294d.js.gz +0 -0
  33. package/dist/web/assets/{chat-tab-BAh37UwG.js → chat-tab-BG0M1D3d.js} +1 -1
  34. package/dist/web/assets/chat-tab-BG0M1D3d.js.br +3 -0
  35. package/dist/web/assets/chat-tab-BG0M1D3d.js.gz +0 -0
  36. package/dist/web/assets/{chat-tab-D-cl4yMo.js → chat-tab-DsW93LTL.js} +3 -3
  37. package/dist/web/assets/chat-tab-DsW93LTL.js.br +0 -0
  38. package/dist/web/assets/chat-tab-DsW93LTL.js.gz +0 -0
  39. package/dist/web/assets/{code-editor-DIGsPNPS.js → code-editor-AxLIpK-b.js} +4 -4
  40. package/dist/web/assets/code-editor-AxLIpK-b.js.br +0 -0
  41. package/dist/web/assets/code-editor-AxLIpK-b.js.gz +0 -0
  42. package/dist/web/assets/{codex-reset-credit-button-C0a2svAw.js → codex-reset-credit-button-BnRmkBZu.js} +1 -1
  43. package/dist/web/assets/codex-reset-credit-button-BnRmkBZu.js.br +0 -0
  44. package/dist/web/assets/{codex-reset-credit-button-C0a2svAw.js.gz → codex-reset-credit-button-BnRmkBZu.js.gz} +0 -0
  45. package/dist/web/assets/{conflict-editor-zORSNMk6.js → conflict-editor-BwuNUPAK.js} +1 -1
  46. package/dist/web/assets/conflict-editor-BwuNUPAK.js.br +0 -0
  47. package/dist/web/assets/conflict-editor-BwuNUPAK.js.gz +0 -0
  48. package/dist/web/assets/{connection-form-tab-BkE7wACA.js → connection-form-tab-CM2o80eB.js} +1 -1
  49. package/dist/web/assets/connection-form-tab-CM2o80eB.js.br +0 -0
  50. package/dist/web/assets/connection-form-tab-CM2o80eB.js.gz +0 -0
  51. package/dist/web/assets/{csv-preview-CDUY0I94.js → csv-preview-C7ErHm4U.js} +1 -1
  52. package/dist/web/assets/csv-preview-C7ErHm4U.js.br +0 -0
  53. package/dist/web/assets/csv-preview-C7ErHm4U.js.gz +0 -0
  54. package/dist/web/assets/{db-tab-parts-tgVIgcs5.js → db-tab-parts-C8jbkfxO.js} +1 -1
  55. package/dist/web/assets/db-tab-parts-C8jbkfxO.js.br +0 -0
  56. package/dist/web/assets/db-tab-parts-C8jbkfxO.js.gz +0 -0
  57. package/dist/web/assets/{design-settings-section-CqFPwhis.js → design-settings-section-BcGEY4Zf.js} +1 -1
  58. package/dist/web/assets/design-settings-section-BcGEY4Zf.js.br +0 -0
  59. package/dist/web/assets/design-settings-section-BcGEY4Zf.js.gz +0 -0
  60. package/dist/web/assets/{design-tab-CVTzge3p.js → design-tab-BGPYNFvy.js} +1 -1
  61. package/dist/web/assets/design-tab-BGPYNFvy.js.br +0 -0
  62. package/dist/web/assets/design-tab-BGPYNFvy.js.gz +0 -0
  63. package/dist/web/assets/{designs-sidebar-panel-DKTSE1LS.js → designs-sidebar-panel-BgMj7xRm.js} +1 -1
  64. package/dist/web/assets/designs-sidebar-panel-BgMj7xRm.js.br +0 -0
  65. package/dist/web/assets/designs-sidebar-panel-BgMj7xRm.js.gz +0 -0
  66. package/dist/web/assets/{diff-viewer-3VDHcDag.js → diff-viewer-BKJkesHk.js} +1 -1
  67. package/dist/web/assets/diff-viewer-BKJkesHk.js.br +0 -0
  68. package/dist/web/assets/diff-viewer-BKJkesHk.js.gz +0 -0
  69. package/dist/web/assets/{docx-preview-FgE_WU6t.js → docx-preview-DD5oD_nL.js} +1 -1
  70. package/dist/web/assets/docx-preview-DD5oD_nL.js.br +0 -0
  71. package/dist/web/assets/docx-preview-DD5oD_nL.js.gz +0 -0
  72. package/dist/web/assets/{editor-dialog-BhK77FSu.js → editor-dialog--07lKJxl.js} +1 -1
  73. package/dist/web/assets/editor-dialog--07lKJxl.js.br +0 -0
  74. package/dist/web/assets/editor-dialog--07lKJxl.js.gz +0 -0
  75. package/dist/web/assets/{editor-language-service-BIN7M57r.js → editor-language-service-51xjO5d3.js} +1 -1
  76. package/dist/web/assets/editor-language-service-51xjO5d3.js.br +0 -0
  77. package/dist/web/assets/editor-language-service-51xjO5d3.js.gz +0 -0
  78. package/dist/web/assets/{explorer-body-DNsWiVO3.js → explorer-body-BXK5SjJQ.js} +1 -1
  79. package/dist/web/assets/explorer-body-BXK5SjJQ.js.br +0 -0
  80. package/dist/web/assets/explorer-body-BXK5SjJQ.js.gz +0 -0
  81. package/dist/web/assets/{explorer-window-content-DnOJYhRX.js → explorer-window-content-DKXcCmuX.js} +1 -1
  82. package/dist/web/assets/explorer-window-content-DKXcCmuX.js.br +0 -0
  83. package/dist/web/assets/explorer-window-content-DKXcCmuX.js.gz +0 -0
  84. package/dist/web/assets/{extension-manager-section-CJtRpUUs.js → extension-manager-section-CTpQP6te.js} +1 -1
  85. package/dist/web/assets/extension-manager-section-CTpQP6te.js.br +0 -0
  86. package/dist/web/assets/extension-manager-section-CTpQP6te.js.gz +0 -0
  87. package/dist/web/assets/{extension-webview-Bza7cPL1.js → extension-webview-COT-yLrM.js} +1 -1
  88. package/dist/web/assets/extension-webview-COT-yLrM.js.br +0 -0
  89. package/dist/web/assets/extension-webview-COT-yLrM.js.gz +0 -0
  90. package/dist/web/assets/{files-settings-section-8rWMj1Oi.js → files-settings-section-CgVR0fqi.js} +1 -1
  91. package/dist/web/assets/files-settings-section-CgVR0fqi.js.br +0 -0
  92. package/dist/web/assets/files-settings-section-CgVR0fqi.js.gz +0 -0
  93. package/dist/web/assets/{general-settings-section-joWQEgIn.js → general-settings-section-BEMIbE4Y.js} +1 -1
  94. package/dist/web/assets/general-settings-section-BEMIbE4Y.js.br +0 -0
  95. package/dist/web/assets/general-settings-section-BEMIbE4Y.js.gz +0 -0
  96. package/dist/web/assets/{git-log-panel-BxYYWEiU.js → git-log-panel-Cp2174iI.js} +1 -1
  97. package/dist/web/assets/git-log-panel-Cp2174iI.js.br +0 -0
  98. package/dist/web/assets/git-log-panel-Cp2174iI.js.gz +0 -0
  99. package/dist/web/assets/{git-review-tab-Btnvgk1e.js → git-review-tab-CpMJ0qDi.js} +1 -1
  100. package/dist/web/assets/git-review-tab-CpMJ0qDi.js.br +0 -0
  101. package/dist/web/assets/git-review-tab-CpMJ0qDi.js.gz +0 -0
  102. package/dist/web/assets/{glide-data-grid-lCwaM1Gy.js → glide-data-grid-BAhwWUhO.js} +1 -1
  103. package/dist/web/assets/glide-data-grid-BAhwWUhO.js.br +0 -0
  104. package/dist/web/assets/glide-data-grid-BAhwWUhO.js.gz +0 -0
  105. package/dist/web/assets/{grid-save-dialog-DoEEQ1vM.js → grid-save-dialog-DmJhaWOl.js} +1 -1
  106. package/dist/web/assets/grid-save-dialog-DmJhaWOl.js.br +0 -0
  107. package/dist/web/assets/grid-save-dialog-DmJhaWOl.js.gz +0 -0
  108. package/dist/web/assets/{group-chat-tab-B7Dwx9uL.js → group-chat-tab-Bq7-Yegf.js} +1 -1
  109. package/dist/web/assets/group-chat-tab-Bq7-Yegf.js.br +0 -0
  110. package/dist/web/assets/group-chat-tab-Bq7-Yegf.js.gz +0 -0
  111. package/dist/web/assets/{impexp-tab-BtEDbQSn.js → impexp-tab-COx3Cvs7.js} +1 -1
  112. package/dist/web/assets/impexp-tab-COx3Cvs7.js.br +0 -0
  113. package/dist/web/assets/impexp-tab-COx3Cvs7.js.gz +0 -0
  114. package/dist/web/assets/{index-CPBujJc_.js → index-BGk8EFQb.js} +5 -5
  115. package/dist/web/assets/index-BGk8EFQb.js.br +0 -0
  116. package/dist/web/assets/index-BGk8EFQb.js.gz +0 -0
  117. package/dist/web/assets/{jira-watcher-section-mnly-maX.js → jira-watcher-section-BEPbsi62.js} +1 -1
  118. package/dist/web/assets/{keybindings-store-BSPTMRiv.js → keybindings-store-DzcSIJUF.js} +1 -1
  119. package/dist/web/assets/{keyboard-shortcuts-section-DULhEWPg.js → keyboard-shortcuts-section-Bqg7AZiZ.js} +1 -1
  120. package/dist/web/assets/keyboard-shortcuts-section-Bqg7AZiZ.js.br +0 -0
  121. package/dist/web/assets/keyboard-shortcuts-section-Bqg7AZiZ.js.gz +0 -0
  122. package/dist/web/assets/{language-servers-section-CwBJsJ31.js → language-servers-section-CJ47DSIA.js} +2 -2
  123. package/dist/web/assets/language-servers-section-CJ47DSIA.js.br +0 -0
  124. package/dist/web/assets/language-servers-section-CJ47DSIA.js.gz +0 -0
  125. package/dist/web/assets/{logs-app-DatfI2Up.js → logs-app-BK-n-y_K.js} +1 -1
  126. package/dist/web/assets/logs-app-BK-n-y_K.js.br +0 -0
  127. package/dist/web/assets/logs-app-BK-n-y_K.js.gz +0 -0
  128. package/dist/web/assets/{logs-tab-an_9ujcz.js → logs-tab-B84EZJ1b.js} +1 -1
  129. package/dist/web/assets/{logs-window-content-Usr3JTmE.js → logs-window-content-B1uN_3pN.js} +1 -1
  130. package/dist/web/assets/{lsp-client-tCCcXWsR.js → lsp-client-DHSaAyJW.js} +1 -1
  131. package/dist/web/assets/lsp-client-DHSaAyJW.js.br +0 -0
  132. package/dist/web/assets/lsp-client-DHSaAyJW.js.gz +0 -0
  133. package/dist/web/assets/{markdown-renderer-DdzxNveP.js → markdown-renderer-BjDQUqT-.js} +1 -1
  134. package/dist/web/assets/{markdown-renderer-D0YUMQLE.js → markdown-renderer-CpxdNG0f.js} +1 -1
  135. package/dist/web/assets/markdown-renderer-CpxdNG0f.js.br +0 -0
  136. package/dist/web/assets/markdown-renderer-CpxdNG0f.js.gz +0 -0
  137. package/dist/web/assets/{mobile-explorer-sheet-Bo27IRye.js → mobile-explorer-sheet-BBwXGmXA.js} +1 -1
  138. package/dist/web/assets/mobile-explorer-sheet-BBwXGmXA.js.br +0 -0
  139. package/dist/web/assets/mobile-explorer-sheet-BBwXGmXA.js.gz +0 -0
  140. package/dist/web/assets/{new-design-dialog-DIOCWZW1.js → new-design-dialog-B_ZOvGhR.js} +1 -1
  141. package/dist/web/assets/new-design-dialog-B_ZOvGhR.js.br +0 -0
  142. package/dist/web/assets/new-design-dialog-B_ZOvGhR.js.gz +0 -0
  143. package/dist/web/assets/{notification-store-CRPOp-6B.js → notification-store-HuMqfadD.js} +1 -1
  144. package/dist/web/assets/{notifications-settings-section-DSSCTkfX.js → notifications-settings-section-D7fIVFHe.js} +1 -1
  145. package/dist/web/assets/notifications-settings-section-D7fIVFHe.js.br +0 -0
  146. package/dist/web/assets/notifications-settings-section-D7fIVFHe.js.gz +0 -0
  147. package/dist/web/assets/{ppmbot-settings-section-BIYSlZu5.js → ppmbot-settings-section-JDvyI-gZ.js} +1 -1
  148. package/dist/web/assets/ppmbot-settings-section-JDvyI-gZ.js.br +0 -0
  149. package/dist/web/assets/ppmbot-settings-section-JDvyI-gZ.js.gz +0 -0
  150. package/dist/web/assets/{problems-panel-CH-00nA7.js → problems-panel-Bsv_L6T2.js} +1 -1
  151. package/dist/web/assets/problems-panel-Bsv_L6T2.js.br +0 -0
  152. package/dist/web/assets/problems-panel-Bsv_L6T2.js.gz +0 -0
  153. package/dist/web/assets/{process-table-DQO0g5do.js → process-table-3kZyWOJx.js} +1 -1
  154. package/dist/web/assets/process-table-3kZyWOJx.js.br +0 -0
  155. package/dist/web/assets/process-table-3kZyWOJx.js.gz +0 -0
  156. package/dist/web/assets/{proxy-settings-section-Buo3hvQ4.js → proxy-settings-section-CYcmIp7W.js} +1 -1
  157. package/dist/web/assets/proxy-settings-section-CYcmIp7W.js.br +0 -0
  158. package/dist/web/assets/proxy-settings-section-CYcmIp7W.js.gz +0 -0
  159. package/dist/web/assets/{query-tab-CU0QVZpj.js → query-tab-CjrWnQUl.js} +1 -1
  160. package/dist/web/assets/query-tab-CjrWnQUl.js.br +0 -0
  161. package/dist/web/assets/query-tab-CjrWnQUl.js.gz +0 -0
  162. package/dist/web/assets/{remote-access-settings-section-vlHMJPdY.js → remote-access-settings-section-iQkakiVx.js} +1 -1
  163. package/dist/web/assets/remote-access-settings-section-iQkakiVx.js.br +0 -0
  164. package/dist/web/assets/remote-access-settings-section-iQkakiVx.js.gz +0 -0
  165. package/dist/web/assets/{remote-desktop-clipboard-notice-DNqX7d1L.js → remote-desktop-clipboard-notice-CFLnb7ML.js} +1 -1
  166. package/dist/web/assets/remote-desktop-clipboard-notice-CFLnb7ML.js.br +0 -0
  167. package/dist/web/assets/remote-desktop-clipboard-notice-CFLnb7ML.js.gz +0 -0
  168. package/dist/web/assets/{remote-desktop-mobile-sheet-Dz7tctpc.js → remote-desktop-mobile-sheet-C_-_-Nkz.js} +2 -2
  169. package/dist/web/assets/remote-desktop-mobile-sheet-C_-_-Nkz.js.br +0 -0
  170. package/dist/web/assets/remote-desktop-mobile-sheet-C_-_-Nkz.js.gz +0 -0
  171. package/dist/web/assets/{remote-desktop-mobile-view-BqhQdShH.js → remote-desktop-mobile-view-BnHSrind.js} +1 -1
  172. package/dist/web/assets/remote-desktop-mobile-view-BnHSrind.js.br +0 -0
  173. package/dist/web/assets/remote-desktop-mobile-view-BnHSrind.js.gz +0 -0
  174. package/dist/web/assets/{remote-desktop-readiness-gate-rnTq4ZQS.js → remote-desktop-readiness-gate-BGHJ7Sv6.js} +1 -1
  175. package/dist/web/assets/remote-desktop-readiness-gate-BGHJ7Sv6.js.br +0 -0
  176. package/dist/web/assets/remote-desktop-readiness-gate-BGHJ7Sv6.js.gz +0 -0
  177. package/dist/web/assets/{remote-desktop-window-content-TqjHt0_5.js → remote-desktop-window-content-BBm1YwM8.js} +1 -1
  178. package/dist/web/assets/remote-desktop-window-content-BBm1YwM8.js.br +0 -0
  179. package/dist/web/assets/remote-desktop-window-content-BBm1YwM8.js.gz +0 -0
  180. package/dist/web/assets/{rename-object-dialog-D0YpY40E.js → rename-object-dialog-BLnF9xyn.js} +1 -1
  181. package/dist/web/assets/rename-object-dialog-BLnF9xyn.js.br +0 -0
  182. package/dist/web/assets/rename-object-dialog-BLnF9xyn.js.gz +0 -0
  183. package/dist/web/assets/{review-code-DsF9921h.js → review-code-DG7sCIzr.js} +1 -1
  184. package/dist/web/assets/review-code-DG7sCIzr.js.br +0 -0
  185. package/dist/web/assets/review-code-DG7sCIzr.js.gz +0 -0
  186. package/dist/web/assets/{save-as-dialog-niU7kVMJ.js → save-as-dialog-KW7cErWh.js} +1 -1
  187. package/dist/web/assets/save-as-dialog-KW7cErWh.js.br +0 -0
  188. package/dist/web/assets/save-as-dialog-KW7cErWh.js.gz +0 -0
  189. package/dist/web/assets/{schedules-settings-section-Heuv2Kj4.js → schedules-settings-section-B4AV4ORv.js} +1 -1
  190. package/dist/web/assets/schedules-settings-section-B4AV4ORv.js.br +0 -0
  191. package/dist/web/assets/schedules-settings-section-B4AV4ORv.js.gz +0 -0
  192. package/dist/web/assets/{session-review-tab-Dob0FLvA.js → session-review-tab-C5nPyBzo.js} +1 -1
  193. package/dist/web/assets/session-review-tab-C5nPyBzo.js.br +0 -0
  194. package/dist/web/assets/session-review-tab-C5nPyBzo.js.gz +0 -0
  195. package/dist/web/assets/{settings-body-5t6SQbLx.js → settings-body-xWSmRXUD.js} +1 -1
  196. package/dist/web/assets/settings-body-xWSmRXUD.js.br +0 -0
  197. package/dist/web/assets/settings-body-xWSmRXUD.js.gz +0 -0
  198. package/dist/web/assets/{settings-rows-B0w15zot.js → settings-rows-ChKBHk07.js} +1 -1
  199. package/dist/web/assets/settings-rows-ChKBHk07.js.br +0 -0
  200. package/dist/web/assets/settings-rows-ChKBHk07.js.gz +0 -0
  201. package/dist/web/assets/settings-section-content-BOh2jaWV.js +1 -0
  202. package/dist/web/assets/{settings-section-content-D41IJ62x.js → settings-section-content-DdVdyPVX.js} +2 -2
  203. package/dist/web/assets/settings-section-content-DdVdyPVX.js.br +0 -0
  204. package/dist/web/assets/settings-section-content-DdVdyPVX.js.gz +0 -0
  205. package/dist/web/assets/{settings-tab-DGU5FVbO.js → settings-tab-CzaBBNoj.js} +1 -1
  206. package/dist/web/assets/{settings-window-content-Da5PY5MZ.js → settings-window-content-DAvWSu_O.js} +1 -1
  207. package/dist/web/assets/{slash-command-picker-DpZsPuNf.js → slash-command-picker-Cn2Fdz2p.js} +1 -1
  208. package/dist/web/assets/slash-command-picker-Cn2Fdz2p.js.br +0 -0
  209. package/dist/web/assets/slash-command-picker-Cn2Fdz2p.js.gz +0 -0
  210. package/dist/web/assets/{sql-object-tab-BTS8aHGO.js → sql-object-tab-_mPRCvD9.js} +1 -1
  211. package/dist/web/assets/sql-object-tab-_mPRCvD9.js.br +0 -0
  212. package/dist/web/assets/sql-object-tab-_mPRCvD9.js.gz +0 -0
  213. package/dist/web/assets/{sqlite-viewer-CVo5eqWj.js → sqlite-viewer-B8VZt-mA.js} +1 -1
  214. package/dist/web/assets/sqlite-viewer-B8VZt-mA.js.br +0 -0
  215. package/dist/web/assets/sqlite-viewer-B8VZt-mA.js.gz +0 -0
  216. package/dist/web/assets/{structure-save-dialog-B9Q-Rhgj.js → structure-save-dialog-Lcst7kAl.js} +1 -1
  217. package/dist/web/assets/structure-save-dialog-Lcst7kAl.js.br +0 -0
  218. package/dist/web/assets/structure-save-dialog-Lcst7kAl.js.gz +0 -0
  219. package/dist/web/assets/{structure-tab-_cQn0KG7.js → structure-tab-ljJCzxUe.js} +1 -1
  220. package/dist/web/assets/structure-tab-ljJCzxUe.js.br +0 -0
  221. package/dist/web/assets/structure-tab-ljJCzxUe.js.gz +0 -0
  222. package/dist/web/assets/{system-monitor-body-YS3i1PUs.js → system-monitor-body-CTi5xUZz.js} +2 -2
  223. package/dist/web/assets/system-monitor-body-CTi5xUZz.js.br +0 -0
  224. package/dist/web/assets/system-monitor-body-CTi5xUZz.js.gz +0 -0
  225. package/dist/web/assets/{system-monitor-tab-D63xmd8U.js → system-monitor-tab-DeL2YoXO.js} +1 -1
  226. package/dist/web/assets/{system-monitor-window-content-DkCsK8Ed.js → system-monitor-window-content-DK-rQIZh.js} +1 -1
  227. package/dist/web/assets/{tab-host-window-content-CrASOMX8.js → tab-host-window-content-CG0vPTc_.js} +1 -1
  228. package/dist/web/assets/tab-host-window-content-CG0vPTc_.js.br +0 -0
  229. package/dist/web/assets/tab-host-window-content-CG0vPTc_.js.gz +0 -0
  230. package/dist/web/assets/{table-tab-JlfqyPZR.js → table-tab-CTZ3nCWV.js} +1 -1
  231. package/dist/web/assets/table-tab-CTZ3nCWV.js.br +0 -0
  232. package/dist/web/assets/table-tab-CTZ3nCWV.js.gz +0 -0
  233. package/dist/web/assets/{telegram-bot-token-field-ctRa2529.js → telegram-bot-token-field-DF7zq7_h.js} +1 -1
  234. package/dist/web/assets/telegram-bot-token-field-DF7zq7_h.js.br +0 -0
  235. package/dist/web/assets/telegram-bot-token-field-DF7zq7_h.js.gz +0 -0
  236. package/dist/web/assets/{terminal-tab-BsXBBru0.js → terminal-tab-B_jECWTH.js} +1 -1
  237. package/dist/web/assets/terminal-tab-B_jECWTH.js.br +0 -0
  238. package/dist/web/assets/terminal-tab-B_jECWTH.js.gz +0 -0
  239. package/dist/web/assets/{tool-cards-BDzK03U4.js → tool-cards-CsD_VXcG.js} +2 -2
  240. package/dist/web/assets/tool-cards-CsD_VXcG.js.br +0 -0
  241. package/dist/web/assets/tool-cards-CsD_VXcG.js.gz +0 -0
  242. package/dist/web/assets/{tools-settings-section-DCG74pbd.js → tools-settings-section-DbBr0Hnr.js} +1 -1
  243. package/dist/web/assets/tools-settings-section-DbBr0Hnr.js.br +0 -0
  244. package/dist/web/assets/tools-settings-section-DbBr0Hnr.js.gz +0 -0
  245. package/dist/web/assets/{use-inline-blame-BOn_m8f-.js → use-inline-blame-BA2mrMxT.js} +1 -1
  246. package/dist/web/assets/use-inline-blame-BA2mrMxT.js.br +0 -0
  247. package/dist/web/assets/use-inline-blame-BA2mrMxT.js.gz +0 -0
  248. package/dist/web/assets/{use-lsp-D144ftsf.js → use-lsp-ChbrzwvS.js} +1 -1
  249. package/dist/web/assets/use-lsp-ChbrzwvS.js.br +0 -0
  250. package/dist/web/assets/use-lsp-ChbrzwvS.js.gz +0 -0
  251. package/dist/web/assets/{use-monaco-theme-ArU1f9T6.js → use-monaco-theme-C3_wfz5J.js} +1 -1
  252. package/dist/web/assets/{use-process-kill-BdmXHMFE.js → use-process-kill-C-YetnGd.js} +1 -1
  253. package/dist/web/assets/use-process-kill-C-YetnGd.js.br +0 -0
  254. package/dist/web/assets/use-process-kill-C-YetnGd.js.gz +0 -0
  255. package/dist/web/assets/{use-sql-schema-info-BQXSMw6p.js → use-sql-schema-info-pKwLD9wk.js} +1 -1
  256. package/dist/web/assets/use-sql-schema-info-pKwLD9wk.js.br +0 -0
  257. package/dist/web/assets/use-sql-schema-info-pKwLD9wk.js.gz +0 -0
  258. package/dist/web/assets/{use-websocket-rWdrMWa8.js → use-websocket-BFnUq0-x.js} +1 -1
  259. package/dist/web/assets/web-preview-tab-DGLPuZYM.js +1 -0
  260. package/dist/web/assets/web-preview-tab-DGLPuZYM.js.br +0 -0
  261. package/dist/web/assets/web-preview-tab-DGLPuZYM.js.gz +0 -0
  262. package/dist/web/index.html +1 -1
  263. package/dist/web/index.html.br +0 -0
  264. package/dist/web/index.html.gz +0 -0
  265. package/dist/web/sw.js +1 -1
  266. package/dist/web/sw.js.br +0 -0
  267. package/dist/web/sw.js.gz +0 -0
  268. package/docs/architecture/workspace-and-ui.md +11 -0
  269. package/package.json +1 -1
  270. package/src/services/port-forward/forward-hop.ts +20 -5
  271. package/src/services/port-forward/preview-navigation.ts +45 -0
  272. package/src/web/components/floating-window/floating-window.tsx +7 -1
  273. package/src/web/components/floating-window/use-window-body-element.ts +12 -5
  274. package/src/web/components/web-preview/web-preview-tab.tsx +38 -5
  275. package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.br +0 -0
  276. package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.gz +0 -0
  277. package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.br +0 -0
  278. package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.gz +0 -0
  279. package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.br +0 -0
  280. package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.gz +0 -0
  281. package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.br +0 -0
  282. package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.gz +0 -0
  283. package/dist/web/assets/ai-settings-section-CNdbcCaI.js.br +0 -0
  284. package/dist/web/assets/ai-settings-section-CNdbcCaI.js.gz +0 -0
  285. package/dist/web/assets/android-tab-BsuTMKJw.js.br +0 -0
  286. package/dist/web/assets/android-tab-BsuTMKJw.js.gz +0 -0
  287. package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.br +0 -0
  288. package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.gz +0 -0
  289. package/dist/web/assets/apps-panel-C20ys4Cy.js.br +0 -0
  290. package/dist/web/assets/apps-panel-C20ys4Cy.js.gz +0 -0
  291. package/dist/web/assets/branch-review-tab-CcvkQMRA.js.br +0 -0
  292. package/dist/web/assets/branch-review-tab-CcvkQMRA.js.gz +0 -0
  293. package/dist/web/assets/chat-tab-BAh37UwG.js.br +0 -0
  294. package/dist/web/assets/chat-tab-BAh37UwG.js.gz +0 -0
  295. package/dist/web/assets/chat-tab-D-cl4yMo.js.br +0 -0
  296. package/dist/web/assets/chat-tab-D-cl4yMo.js.gz +0 -0
  297. package/dist/web/assets/code-editor-DIGsPNPS.js.br +0 -0
  298. package/dist/web/assets/code-editor-DIGsPNPS.js.gz +0 -0
  299. package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.br +0 -0
  300. package/dist/web/assets/conflict-editor-zORSNMk6.js.br +0 -0
  301. package/dist/web/assets/conflict-editor-zORSNMk6.js.gz +0 -0
  302. package/dist/web/assets/connection-form-tab-BkE7wACA.js.br +0 -0
  303. package/dist/web/assets/connection-form-tab-BkE7wACA.js.gz +0 -0
  304. package/dist/web/assets/csv-preview-CDUY0I94.js.br +0 -0
  305. package/dist/web/assets/csv-preview-CDUY0I94.js.gz +0 -0
  306. package/dist/web/assets/db-tab-parts-tgVIgcs5.js.br +0 -0
  307. package/dist/web/assets/db-tab-parts-tgVIgcs5.js.gz +0 -0
  308. package/dist/web/assets/design-settings-section-CqFPwhis.js.br +0 -0
  309. package/dist/web/assets/design-settings-section-CqFPwhis.js.gz +0 -0
  310. package/dist/web/assets/design-tab-CVTzge3p.js.br +0 -0
  311. package/dist/web/assets/design-tab-CVTzge3p.js.gz +0 -0
  312. package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.br +0 -0
  313. package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.gz +0 -0
  314. package/dist/web/assets/diff-viewer-3VDHcDag.js.br +0 -0
  315. package/dist/web/assets/diff-viewer-3VDHcDag.js.gz +0 -0
  316. package/dist/web/assets/docx-preview-FgE_WU6t.js.br +0 -0
  317. package/dist/web/assets/docx-preview-FgE_WU6t.js.gz +0 -0
  318. package/dist/web/assets/editor-dialog-BhK77FSu.js.br +0 -0
  319. package/dist/web/assets/editor-dialog-BhK77FSu.js.gz +0 -0
  320. package/dist/web/assets/editor-language-service-BIN7M57r.js.br +0 -4
  321. package/dist/web/assets/editor-language-service-BIN7M57r.js.gz +0 -0
  322. package/dist/web/assets/explorer-body-DNsWiVO3.js.br +0 -0
  323. package/dist/web/assets/explorer-body-DNsWiVO3.js.gz +0 -0
  324. package/dist/web/assets/explorer-window-content-DnOJYhRX.js.br +0 -0
  325. package/dist/web/assets/explorer-window-content-DnOJYhRX.js.gz +0 -0
  326. package/dist/web/assets/extension-manager-section-CJtRpUUs.js.br +0 -0
  327. package/dist/web/assets/extension-manager-section-CJtRpUUs.js.gz +0 -0
  328. package/dist/web/assets/extension-webview-Bza7cPL1.js.br +0 -0
  329. package/dist/web/assets/extension-webview-Bza7cPL1.js.gz +0 -0
  330. package/dist/web/assets/files-settings-section-8rWMj1Oi.js.br +0 -0
  331. package/dist/web/assets/files-settings-section-8rWMj1Oi.js.gz +0 -0
  332. package/dist/web/assets/general-settings-section-joWQEgIn.js.br +0 -0
  333. package/dist/web/assets/general-settings-section-joWQEgIn.js.gz +0 -0
  334. package/dist/web/assets/git-log-panel-BxYYWEiU.js.br +0 -0
  335. package/dist/web/assets/git-log-panel-BxYYWEiU.js.gz +0 -0
  336. package/dist/web/assets/git-review-tab-Btnvgk1e.js.br +0 -0
  337. package/dist/web/assets/git-review-tab-Btnvgk1e.js.gz +0 -0
  338. package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.br +0 -0
  339. package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.gz +0 -0
  340. package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.br +0 -0
  341. package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.gz +0 -0
  342. package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.br +0 -0
  343. package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.gz +0 -0
  344. package/dist/web/assets/impexp-tab-BtEDbQSn.js.br +0 -0
  345. package/dist/web/assets/impexp-tab-BtEDbQSn.js.gz +0 -0
  346. package/dist/web/assets/index-CPBujJc_.js.br +0 -0
  347. package/dist/web/assets/index-CPBujJc_.js.gz +0 -0
  348. package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.br +0 -0
  349. package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.gz +0 -0
  350. package/dist/web/assets/language-servers-section-CwBJsJ31.js.br +0 -0
  351. package/dist/web/assets/language-servers-section-CwBJsJ31.js.gz +0 -0
  352. package/dist/web/assets/logs-app-DatfI2Up.js.br +0 -0
  353. package/dist/web/assets/logs-app-DatfI2Up.js.gz +0 -0
  354. package/dist/web/assets/lsp-client-tCCcXWsR.js.br +0 -0
  355. package/dist/web/assets/lsp-client-tCCcXWsR.js.gz +0 -0
  356. package/dist/web/assets/markdown-renderer-D0YUMQLE.js.br +0 -0
  357. package/dist/web/assets/markdown-renderer-D0YUMQLE.js.gz +0 -0
  358. package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.br +0 -0
  359. package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.gz +0 -0
  360. package/dist/web/assets/new-design-dialog-DIOCWZW1.js.br +0 -0
  361. package/dist/web/assets/new-design-dialog-DIOCWZW1.js.gz +0 -0
  362. package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.br +0 -0
  363. package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.gz +0 -0
  364. package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.br +0 -0
  365. package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.gz +0 -0
  366. package/dist/web/assets/problems-panel-CH-00nA7.js.br +0 -0
  367. package/dist/web/assets/problems-panel-CH-00nA7.js.gz +0 -0
  368. package/dist/web/assets/process-table-DQO0g5do.js.br +0 -0
  369. package/dist/web/assets/process-table-DQO0g5do.js.gz +0 -0
  370. package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.br +0 -0
  371. package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.gz +0 -0
  372. package/dist/web/assets/query-tab-CU0QVZpj.js.br +0 -0
  373. package/dist/web/assets/query-tab-CU0QVZpj.js.gz +0 -0
  374. package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.br +0 -0
  375. package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.gz +0 -0
  376. package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.br +0 -0
  377. package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.gz +0 -0
  378. package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.br +0 -0
  379. package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.gz +0 -0
  380. package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.br +0 -0
  381. package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.gz +0 -0
  382. package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.br +0 -0
  383. package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.gz +0 -0
  384. package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.br +0 -0
  385. package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.gz +0 -0
  386. package/dist/web/assets/rename-object-dialog-D0YpY40E.js.br +0 -0
  387. package/dist/web/assets/rename-object-dialog-D0YpY40E.js.gz +0 -0
  388. package/dist/web/assets/review-code-DsF9921h.js.br +0 -0
  389. package/dist/web/assets/review-code-DsF9921h.js.gz +0 -0
  390. package/dist/web/assets/save-as-dialog-niU7kVMJ.js.br +0 -0
  391. package/dist/web/assets/save-as-dialog-niU7kVMJ.js.gz +0 -0
  392. package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.br +0 -0
  393. package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.gz +0 -0
  394. package/dist/web/assets/session-review-tab-Dob0FLvA.js.br +0 -0
  395. package/dist/web/assets/session-review-tab-Dob0FLvA.js.gz +0 -0
  396. package/dist/web/assets/settings-body-5t6SQbLx.js.br +0 -0
  397. package/dist/web/assets/settings-body-5t6SQbLx.js.gz +0 -0
  398. package/dist/web/assets/settings-rows-B0w15zot.js.br +0 -0
  399. package/dist/web/assets/settings-rows-B0w15zot.js.gz +0 -0
  400. package/dist/web/assets/settings-section-content-D41IJ62x.js.br +0 -0
  401. package/dist/web/assets/settings-section-content-D41IJ62x.js.gz +0 -0
  402. package/dist/web/assets/settings-section-content-DuVO6erO.js +0 -1
  403. package/dist/web/assets/slash-command-picker-DpZsPuNf.js.br +0 -0
  404. package/dist/web/assets/slash-command-picker-DpZsPuNf.js.gz +0 -0
  405. package/dist/web/assets/sql-object-tab-BTS8aHGO.js.br +0 -0
  406. package/dist/web/assets/sql-object-tab-BTS8aHGO.js.gz +0 -0
  407. package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.br +0 -0
  408. package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.gz +0 -0
  409. package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.br +0 -0
  410. package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.gz +0 -0
  411. package/dist/web/assets/structure-tab-_cQn0KG7.js.br +0 -0
  412. package/dist/web/assets/structure-tab-_cQn0KG7.js.gz +0 -0
  413. package/dist/web/assets/system-monitor-body-YS3i1PUs.js.br +0 -0
  414. package/dist/web/assets/system-monitor-body-YS3i1PUs.js.gz +0 -0
  415. package/dist/web/assets/tab-host-window-content-CrASOMX8.js.br +0 -0
  416. package/dist/web/assets/tab-host-window-content-CrASOMX8.js.gz +0 -0
  417. package/dist/web/assets/table-tab-JlfqyPZR.js.br +0 -0
  418. package/dist/web/assets/table-tab-JlfqyPZR.js.gz +0 -0
  419. package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.br +0 -0
  420. package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.gz +0 -0
  421. package/dist/web/assets/terminal-tab-BsXBBru0.js.br +0 -0
  422. package/dist/web/assets/terminal-tab-BsXBBru0.js.gz +0 -0
  423. package/dist/web/assets/tool-cards-BDzK03U4.js.br +0 -0
  424. package/dist/web/assets/tool-cards-BDzK03U4.js.gz +0 -0
  425. package/dist/web/assets/tools-settings-section-DCG74pbd.js.br +0 -0
  426. package/dist/web/assets/tools-settings-section-DCG74pbd.js.gz +0 -0
  427. package/dist/web/assets/use-inline-blame-BOn_m8f-.js.br +0 -0
  428. package/dist/web/assets/use-inline-blame-BOn_m8f-.js.gz +0 -0
  429. package/dist/web/assets/use-lsp-D144ftsf.js.br +0 -0
  430. package/dist/web/assets/use-lsp-D144ftsf.js.gz +0 -0
  431. package/dist/web/assets/use-process-kill-BdmXHMFE.js.br +0 -0
  432. package/dist/web/assets/use-process-kill-BdmXHMFE.js.gz +0 -0
  433. package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.br +0 -0
  434. package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.gz +0 -0
  435. package/dist/web/assets/web-preview-tab-B2OSrnl9.js +0 -1
  436. package/dist/web/assets/web-preview-tab-B2OSrnl9.js.br +0 -0
  437. package/dist/web/assets/web-preview-tab-B2OSrnl9.js.gz +0 -0
@@ -25,7 +25,14 @@ export interface WindowBodyElement {
25
25
 
26
26
  export function useWindowBodyElement(
27
27
  windowId: string,
28
- rootRef: RefObject<HTMLElement | null>,
28
+ /**
29
+ * A React-owned element, rendered after every other child of the frame, that the body is
30
+ * appended into. Appending to the frame itself put the body where React does not know it
31
+ * is: a titlebar mounted again later (the skin resolving to another OS once the host's
32
+ * platform arrives) is inserted before its next React sibling, and a maximized or snapped
33
+ * window has none — so it went in after the body and drew at the bottom of the window.
34
+ */
35
+ hostRef: RefObject<HTMLElement | null>,
29
36
  minimized: boolean,
30
37
  ): WindowBodyElement {
31
38
  const pip = useWindowPip(windowId);
@@ -44,9 +51,9 @@ export function useWindowBodyElement(
44
51
  // while the content below is still mounted, and a tab-host body's deferred re-dock still
45
52
  // gets to run afterwards on a subtree that is back in the main document.
46
53
  useLayoutEffect(() => {
47
- const root = rootRef.current;
48
- if (!root) return;
49
- root.append(body);
54
+ const host = hostRef.current;
55
+ if (!host) return;
56
+ host.append(body);
50
57
  publishWindowSlot(windowId, body);
51
58
  return () => {
52
59
  const handle = windowPip(windowId);
@@ -54,7 +61,7 @@ export function useWindowBodyElement(
54
61
  publishWindowSlot(windowId, null);
55
62
  body.remove();
56
63
  };
57
- }, [body, rootRef, windowId]);
64
+ }, [body, hostRef, windowId]);
58
65
 
59
66
  // Minimising hides the body via CSS rather than unmounting it — content owns per-window
60
67
  // state (explorer history, selection, filter) that a remount would wipe. Never while PiP
@@ -1,9 +1,10 @@
1
- import { useEffect, useState } from "react";
1
+ import { useEffect, useRef, useState } from "react";
2
2
  import { toast } from "sonner";
3
3
  import { Check, Copy, ExternalLink, Globe, Lock, RotateCw } from "@/lib/icons";
4
4
  import { tunnelsApi } from "@/lib/api-tunnels";
5
5
  import { copyToClipboard } from "@/lib/clipboard";
6
6
  import { safePreviewUrl } from "@/lib/web-preview-url";
7
+ import { usePanelStore } from "@/stores/panel-store";
7
8
 
8
9
  const actionClass =
9
10
  "flex items-center justify-center shrink-0 rounded min-h-11 min-w-11 md:min-h-7 md:min-w-7 text-muted-foreground hover:text-foreground hover:bg-muted";
@@ -28,14 +29,45 @@ function allowFramingHere(): Promise<void> {
28
29
  * A dev server on the host, forwarded and shown in a tab. The toolbar sits at the bottom
29
30
  * below `md`, in the thumb zone, as a phone browser's address bar does.
30
31
  */
31
- export function WebPreviewTab({ metadata }: { metadata?: Record<string, unknown> }) {
32
- const url = safePreviewUrl(metadata?.url, window.location.origin);
32
+ export function WebPreviewTab({ metadata, tabId }: { metadata?: Record<string, unknown>; tabId?: string }) {
33
+ const requestedUrl = safePreviewUrl(metadata?.url, window.location.origin);
34
+ const savedUrl = safePreviewUrl(metadata?.currentUrl, window.location.origin);
35
+ const initialUrl = savedUrl && requestedUrl && new URL(savedUrl).origin === new URL(requestedUrl).origin ? savedUrl : requestedUrl;
36
+ const [url, setUrl] = useState(initialUrl);
37
+ const [src, setSrc] = useState(initialUrl);
38
+ const iframe = useRef<HTMLIFrameElement>(null);
39
+ const command = `${requestedUrl}:${String(metadata?.aiOpenAt ?? "")}`;
40
+ const lastCommand = useRef(command);
33
41
  // `local` is the AI's open_url on the host's own browser: no forward, so only this machine reaches it.
34
42
  const isPrivate = metadata?.via === "tailscale" || metadata?.via === "local";
35
43
  const [reloadKey, setReloadKey] = useState(0);
36
44
  const [copied, setCopied] = useState(false);
37
45
  const [framingAsked, setFramingAsked] = useState(false);
38
46
 
47
+ useEffect(() => {
48
+ if (lastCommand.current === command) return;
49
+ lastCommand.current = command;
50
+ setUrl(requestedUrl);
51
+ setSrc(requestedUrl);
52
+ }, [command, requestedUrl]);
53
+
54
+ useEffect(() => {
55
+ const receive = (event: MessageEvent) => {
56
+ if (!requestedUrl || !iframe.current?.contentWindow || event.source !== iframe.current.contentWindow
57
+ || event.origin !== new URL(requestedUrl).origin || event.data?.ppm !== "web-preview-navigation") return;
58
+ const next = safePreviewUrl(event.data.url, window.location.origin);
59
+ if (!next || new URL(next).origin !== event.origin) return;
60
+ setUrl(next);
61
+ if (tabId) {
62
+ const store = usePanelStore.getState();
63
+ const tab = Object.values(store.panels).flatMap((panel) => panel.tabs).find((item) => item.id === tabId);
64
+ if (tab && tab.metadata?.currentUrl !== next) store.updateTab(tabId, { metadata: { ...tab.metadata, currentUrl: next } });
65
+ }
66
+ };
67
+ window.addEventListener("message", receive);
68
+ return () => window.removeEventListener("message", receive);
69
+ }, [requestedUrl, tabId]);
70
+
39
71
  useEffect(() => {
40
72
  let live = true;
41
73
  void allowFramingHere().then(() => { if (live) setFramingAsked(true); });
@@ -64,7 +96,7 @@ export function WebPreviewTab({ metadata }: { metadata?: Record<string, unknown>
64
96
  {isPrivate ? <Lock className="size-3.5" /> : <Globe className="size-3.5" />}
65
97
  </span>
66
98
  <span className="flex-1 min-w-0 truncate text-xs text-muted-foreground select-all">{url}</span>
67
- <button type="button" onClick={() => void allowFramingHere().then(() => setReloadKey((k) => k + 1))} title="Reload" aria-label="Reload" className={actionClass}>
99
+ <button type="button" onClick={() => void allowFramingHere().then(() => { setSrc(url); setReloadKey((k) => k + 1); })} title="Reload" aria-label="Reload" className={actionClass}>
68
100
  <RotateCw className="size-4" />
69
101
  </button>
70
102
  <button type="button" onClick={copy} title="Copy URL" aria-label="Copy URL" className={actionClass}>
@@ -78,10 +110,11 @@ export function WebPreviewTab({ metadata }: { metadata?: Record<string, unknown>
78
110
  own cookies and storage; without allow-top-navigation it cannot navigate PPM away. */}
79
111
  {framingAsked ? (
80
112
  <iframe
113
+ ref={iframe}
81
114
  // The AI's open_url sets aiOpenAt on every call: a page it opens again reloads.
82
115
  key={`${reloadKey}:${String(metadata?.aiOpenAt ?? "")}`}
83
116
  title={`Preview of ${url}`}
84
- src={url}
117
+ src={src ?? undefined}
85
118
  sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-modals allow-downloads"
86
119
  allow="clipboard-read; clipboard-write; fullscreen"
87
120
  referrerPolicy="no-referrer"
@@ -1,4 +0,0 @@
1
- ? U� ��aSf��؎9!?^d�,C�����~�= �a&w�
2
- sݭC�)�j�|����B�(��
3
- Ev������QZQ�W��DJ��� 6��_� �<��J�mR�?��3cMi��4�N���P̞����4ђy��ݞ#-S��ҫ~3�&H�E������Ӹz�i�ASU&B��{����E�
4
- �N�
@@ -1 +0,0 @@
1
- import"./vendor-markdown-C-P1aR4p.js";import"./icons-BwyIKaTT.js";import{r as e}from"./settings-section-content-D41IJ62x.js";export{e as preloadSettingsSections};
@@ -1 +0,0 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{A as r,Cn as i,Gt as a,_r as o,gt as s,ut as c}from"./icons-BwyIKaTT.js";import{k as l}from"./api-client-xQDlhUTu.js";import{r as u}from"./clipboard-D-VCry-F.js";import{Dn as d,wn as f}from"./index-CPBujJc_.js";var p=e(t(),1),m=n(),h=`flex items-center justify-center shrink-0 rounded min-h-11 min-w-11 md:min-h-7 md:min-w-7 text-muted-foreground hover:text-foreground hover:bg-muted`,g=3e3;function _(){return Promise.race([f.allowFraming(window.location.origin).then(()=>void 0,()=>void 0),new Promise(e=>setTimeout(e,g))])}function v({metadata:e}){let t=d(e?.url,window.location.origin),n=e?.via===`tailscale`||e?.via===`local`,[f,g]=(0,p.useState)(0),[v,y]=(0,p.useState)(!1),[b,x]=(0,p.useState)(!1);if((0,p.useEffect)(()=>{let e=!0;return _().then(()=>{e&&x(!0)}),()=>{e=!1}},[]),!t)return(0,m.jsx)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:`This preview has no address PPM can show.`});let S=()=>{u(t).then(e=>{if(!e){l.error(`Failed to copy URL`);return}y(!0),setTimeout(()=>y(!1),2e3)})};return(0,m.jsxs)(`div`,{className:`flex h-full w-full flex-col-reverse md:flex-col bg-background`,children:[(0,m.jsxs)(`div`,{role:`toolbar`,"aria-label":`Web preview`,className:`flex items-center gap-2 md:gap-1 shrink-0 h-12 md:h-8 px-2 border-t md:border-t-0 md:border-b border-border`,children:[(0,m.jsx)(`span`,{className:`flex items-center justify-center shrink-0 size-7 text-muted-foreground`,title:e?.via===`local`?`Private: only this machine can open this address`:n?`Private: only devices in your tailnet can open this address`:`Public: anyone with this link can open it`,children:n?(0,m.jsx)(i,{className:`size-3.5`}):(0,m.jsx)(a,{className:`size-3.5`})}),(0,m.jsx)(`span`,{className:`flex-1 min-w-0 truncate text-xs text-muted-foreground select-all`,children:t}),(0,m.jsx)(`button`,{type:`button`,onClick:()=>void _().then(()=>g(e=>e+1)),title:`Reload`,"aria-label":`Reload`,className:h,children:(0,m.jsx)(o,{className:`size-4`})}),(0,m.jsx)(`button`,{type:`button`,onClick:S,title:`Copy URL`,"aria-label":`Copy URL`,className:h,children:v?(0,m.jsx)(r,{className:`size-4 text-success`}):(0,m.jsx)(c,{className:`size-4`})}),(0,m.jsx)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,title:`Open in browser`,"aria-label":`Open in browser`,className:h,children:(0,m.jsx)(s,{className:`size-4`})})]}),b?(0,m.jsx)(`iframe`,{title:`Preview of ${t}`,src:t,sandbox:`allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-modals allow-downloads`,allow:`clipboard-read; clipboard-write; fullscreen`,referrerPolicy:`no-referrer`,className:`flex-1 min-h-0 w-full border-0 bg-white`},`${f}:${String(e?.aiOpenAt??``)}`):(0,m.jsx)(`div`,{className:`flex-1 min-h-0 w-full bg-white`})]})}export{v as WebPreviewTab};