@hienlh/ppm 0.23.15 → 0.23.17

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 (455) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/CLAUDE.md +1 -0
  3. package/assets/skills/ppm/SKILL.md +1 -1
  4. package/assets/skills/ppm/references/cli-reference.md +4 -4
  5. package/assets/skills/ppm/references/http-api.md +1 -1
  6. package/dist/web/assets/{accounts-settings-section-B5YXy0vd.js → accounts-settings-section-BqsI4Ixj.js} +1 -1
  7. package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.br +0 -0
  8. package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.gz +0 -0
  9. package/dist/web/assets/{agent-session-sheet-Bj42PwCK.js → agent-session-sheet-BmoNB8BG.js} +2 -2
  10. package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.br +0 -0
  11. package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.gz +0 -0
  12. package/dist/web/assets/{agent-session-window-content-LqL6fVPU.js → agent-session-window-content-rlCrYBYv.js} +1 -1
  13. package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.br +0 -0
  14. package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.gz +0 -0
  15. package/dist/web/assets/{ai-resource-editor-jVv2nvAG.js → ai-resource-editor-CUOR9Xtf.js} +1 -1
  16. package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.br +0 -0
  17. package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.gz +0 -0
  18. package/dist/web/assets/{ai-settings-section-C9Q-v8fY.js → ai-settings-section-CNdbcCaI.js} +1 -1
  19. package/dist/web/assets/ai-settings-section-CNdbcCaI.js.br +0 -0
  20. package/dist/web/assets/ai-settings-section-CNdbcCaI.js.gz +0 -0
  21. package/dist/web/assets/{ai-settings-section-CN5BR1ZZ.js → ai-settings-section-aXXTb0dN.js} +1 -1
  22. package/dist/web/assets/{android-tab-CwqiuEZP.js → android-tab-BsuTMKJw.js} +1 -1
  23. package/dist/web/assets/android-tab-BsuTMKJw.js.br +0 -0
  24. package/dist/web/assets/android-tab-BsuTMKJw.js.gz +0 -0
  25. package/dist/web/assets/{appearance-settings-section-D0JIfiRx.js → appearance-settings-section-Dk6d_fTo.js} +1 -1
  26. package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.br +0 -0
  27. package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.gz +0 -0
  28. package/dist/web/assets/{apps-panel-Cz_KJ37M.js → apps-panel-C20ys4Cy.js} +1 -1
  29. package/dist/web/assets/apps-panel-C20ys4Cy.js.br +0 -0
  30. package/dist/web/assets/apps-panel-C20ys4Cy.js.gz +0 -0
  31. package/dist/web/assets/{branch-review-tab-C3QNpsm7.js → branch-review-tab-CcvkQMRA.js} +1 -1
  32. package/dist/web/assets/branch-review-tab-CcvkQMRA.js.br +0 -0
  33. package/dist/web/assets/branch-review-tab-CcvkQMRA.js.gz +0 -0
  34. package/dist/web/assets/{chat-tab-D14CUl0J.js → chat-tab-BAh37UwG.js} +1 -1
  35. package/dist/web/assets/chat-tab-BAh37UwG.js.br +0 -0
  36. package/dist/web/assets/chat-tab-BAh37UwG.js.gz +0 -0
  37. package/dist/web/assets/chat-tab-D-cl4yMo.js +19 -0
  38. package/dist/web/assets/chat-tab-D-cl4yMo.js.br +0 -0
  39. package/dist/web/assets/chat-tab-D-cl4yMo.js.gz +0 -0
  40. package/dist/web/assets/{code-editor-B7gbH4-x.js → code-editor-DIGsPNPS.js} +4 -4
  41. package/dist/web/assets/code-editor-DIGsPNPS.js.br +0 -0
  42. package/dist/web/assets/{code-editor-B7gbH4-x.js.gz → code-editor-DIGsPNPS.js.gz} +0 -0
  43. package/dist/web/assets/{codex-reset-credit-button-DQDtyvnd.js → codex-reset-credit-button-C0a2svAw.js} +1 -1
  44. package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.br +0 -0
  45. package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.gz +0 -0
  46. package/dist/web/assets/{conflict-editor-ktOkrODA.js → conflict-editor-zORSNMk6.js} +1 -1
  47. package/dist/web/assets/conflict-editor-zORSNMk6.js.br +0 -0
  48. package/dist/web/assets/conflict-editor-zORSNMk6.js.gz +0 -0
  49. package/dist/web/assets/{connection-form-tab-CxvExR7T.js → connection-form-tab-BkE7wACA.js} +1 -1
  50. package/dist/web/assets/connection-form-tab-BkE7wACA.js.br +0 -0
  51. package/dist/web/assets/connection-form-tab-BkE7wACA.js.gz +0 -0
  52. package/dist/web/assets/{csv-preview-CBDMTEsF.js → csv-preview-CDUY0I94.js} +1 -1
  53. package/dist/web/assets/csv-preview-CDUY0I94.js.br +0 -0
  54. package/dist/web/assets/csv-preview-CDUY0I94.js.gz +0 -0
  55. package/dist/web/assets/{db-tab-parts-BgVpKbi6.js → db-tab-parts-tgVIgcs5.js} +1 -1
  56. package/dist/web/assets/db-tab-parts-tgVIgcs5.js.br +0 -0
  57. package/dist/web/assets/db-tab-parts-tgVIgcs5.js.gz +0 -0
  58. package/dist/web/assets/{design-settings-section-DPGw61pY.js → design-settings-section-CqFPwhis.js} +1 -1
  59. package/dist/web/assets/design-settings-section-CqFPwhis.js.br +0 -0
  60. package/dist/web/assets/design-settings-section-CqFPwhis.js.gz +0 -0
  61. package/dist/web/assets/{design-tab-BiCqHNl3.js → design-tab-CVTzge3p.js} +1 -1
  62. package/dist/web/assets/design-tab-CVTzge3p.js.br +0 -0
  63. package/dist/web/assets/design-tab-CVTzge3p.js.gz +0 -0
  64. package/dist/web/assets/{designs-sidebar-panel-pcJ2Rx5G.js → designs-sidebar-panel-DKTSE1LS.js} +1 -1
  65. package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.br +0 -0
  66. package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.gz +0 -0
  67. package/dist/web/assets/{diff-viewer-CLAvyqVG.js → diff-viewer-3VDHcDag.js} +1 -1
  68. package/dist/web/assets/diff-viewer-3VDHcDag.js.br +0 -0
  69. package/dist/web/assets/diff-viewer-3VDHcDag.js.gz +0 -0
  70. package/dist/web/assets/{docx-preview-XSkD2IL6.js → docx-preview-FgE_WU6t.js} +1 -1
  71. package/dist/web/assets/docx-preview-FgE_WU6t.js.br +0 -0
  72. package/dist/web/assets/docx-preview-FgE_WU6t.js.gz +0 -0
  73. package/dist/web/assets/{editor-dialog-cQvqVZAR.js → editor-dialog-BhK77FSu.js} +1 -1
  74. package/dist/web/assets/editor-dialog-BhK77FSu.js.br +0 -0
  75. package/dist/web/assets/editor-dialog-BhK77FSu.js.gz +0 -0
  76. package/dist/web/assets/{editor-language-service-6-7mS6_9.js → editor-language-service-BIN7M57r.js} +1 -1
  77. package/dist/web/assets/editor-language-service-BIN7M57r.js.br +4 -0
  78. package/dist/web/assets/editor-language-service-BIN7M57r.js.gz +0 -0
  79. package/dist/web/assets/{explorer-body-BlGDPmNa.js → explorer-body-DNsWiVO3.js} +1 -1
  80. package/dist/web/assets/explorer-body-DNsWiVO3.js.br +0 -0
  81. package/dist/web/assets/explorer-body-DNsWiVO3.js.gz +0 -0
  82. package/dist/web/assets/{explorer-window-content-BLWY8GJ_.js → explorer-window-content-DnOJYhRX.js} +1 -1
  83. package/dist/web/assets/explorer-window-content-DnOJYhRX.js.br +0 -0
  84. package/dist/web/assets/explorer-window-content-DnOJYhRX.js.gz +0 -0
  85. package/dist/web/assets/{extension-manager-section-NSEt5f4z.js → extension-manager-section-CJtRpUUs.js} +1 -1
  86. package/dist/web/assets/extension-manager-section-CJtRpUUs.js.br +0 -0
  87. package/dist/web/assets/extension-manager-section-CJtRpUUs.js.gz +0 -0
  88. package/dist/web/assets/{extension-webview-BkAEBWin.js → extension-webview-Bza7cPL1.js} +1 -1
  89. package/dist/web/assets/extension-webview-Bza7cPL1.js.br +0 -0
  90. package/dist/web/assets/extension-webview-Bza7cPL1.js.gz +0 -0
  91. package/dist/web/assets/{files-settings-section-Bq7liJ_r.js → files-settings-section-8rWMj1Oi.js} +1 -1
  92. package/dist/web/assets/files-settings-section-8rWMj1Oi.js.br +0 -0
  93. package/dist/web/assets/files-settings-section-8rWMj1Oi.js.gz +0 -0
  94. package/dist/web/assets/{general-settings-section-DvHROAMa.js → general-settings-section-joWQEgIn.js} +1 -1
  95. package/dist/web/assets/general-settings-section-joWQEgIn.js.br +0 -0
  96. package/dist/web/assets/general-settings-section-joWQEgIn.js.gz +0 -0
  97. package/dist/web/assets/{git-log-panel-Cu9kK48H.js → git-log-panel-BxYYWEiU.js} +1 -1
  98. package/dist/web/assets/git-log-panel-BxYYWEiU.js.br +0 -0
  99. package/dist/web/assets/git-log-panel-BxYYWEiU.js.gz +0 -0
  100. package/dist/web/assets/{git-review-tab-B_JT649W.js → git-review-tab-Btnvgk1e.js} +1 -1
  101. package/dist/web/assets/git-review-tab-Btnvgk1e.js.br +0 -0
  102. package/dist/web/assets/git-review-tab-Btnvgk1e.js.gz +0 -0
  103. package/dist/web/assets/{glide-data-grid-BlposOph.js → glide-data-grid-lCwaM1Gy.js} +1 -1
  104. package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.br +0 -0
  105. package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.gz +0 -0
  106. package/dist/web/assets/{grid-save-dialog-B0d0qhnN.js → grid-save-dialog-DoEEQ1vM.js} +1 -1
  107. package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.br +0 -0
  108. package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.gz +0 -0
  109. package/dist/web/assets/{group-chat-tab-jirUsGm-.js → group-chat-tab-B7Dwx9uL.js} +1 -1
  110. package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.br +0 -0
  111. package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.gz +0 -0
  112. package/dist/web/assets/{impexp-tab-HJVcOTYJ.js → impexp-tab-BtEDbQSn.js} +1 -1
  113. package/dist/web/assets/impexp-tab-BtEDbQSn.js.br +0 -0
  114. package/dist/web/assets/impexp-tab-BtEDbQSn.js.gz +0 -0
  115. package/dist/web/assets/index-BACBJm4i.css +1 -0
  116. package/dist/web/assets/index-BACBJm4i.css.br +0 -0
  117. package/dist/web/assets/index-BACBJm4i.css.gz +0 -0
  118. package/dist/web/assets/{index-DLB3j_P0.js → index-CPBujJc_.js} +5 -5
  119. package/dist/web/assets/index-CPBujJc_.js.br +0 -0
  120. package/dist/web/assets/index-CPBujJc_.js.gz +0 -0
  121. package/dist/web/assets/{jira-watcher-section-EQvdnETB.js → jira-watcher-section-mnly-maX.js} +1 -1
  122. package/dist/web/assets/{keybindings-store-CEy-Sdcc.js → keybindings-store-BSPTMRiv.js} +1 -1
  123. package/dist/web/assets/{keyboard-shortcuts-section-DN21gB-T.js → keyboard-shortcuts-section-DULhEWPg.js} +1 -1
  124. package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.br +0 -0
  125. package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.gz +0 -0
  126. package/dist/web/assets/{language-servers-section-DOcZ72FJ.js → language-servers-section-CwBJsJ31.js} +2 -2
  127. package/dist/web/assets/language-servers-section-CwBJsJ31.js.br +0 -0
  128. package/dist/web/assets/language-servers-section-CwBJsJ31.js.gz +0 -0
  129. package/dist/web/assets/{logs-app-C7n9GSCn.js → logs-app-DatfI2Up.js} +1 -1
  130. package/dist/web/assets/logs-app-DatfI2Up.js.br +0 -0
  131. package/dist/web/assets/logs-app-DatfI2Up.js.gz +0 -0
  132. package/dist/web/assets/{logs-tab-CSOiexvx.js → logs-tab-an_9ujcz.js} +1 -1
  133. package/dist/web/assets/{logs-window-content-C4Qs6-0q.js → logs-window-content-Usr3JTmE.js} +1 -1
  134. package/dist/web/assets/{lsp-client-DpYmPhXX.js → lsp-client-tCCcXWsR.js} +1 -1
  135. package/dist/web/assets/lsp-client-tCCcXWsR.js.br +0 -0
  136. package/dist/web/assets/lsp-client-tCCcXWsR.js.gz +0 -0
  137. package/dist/web/assets/{markdown-renderer-CtEl6qAt.js → markdown-renderer-D0YUMQLE.js} +1 -1
  138. package/dist/web/assets/markdown-renderer-D0YUMQLE.js.br +0 -0
  139. package/dist/web/assets/markdown-renderer-D0YUMQLE.js.gz +0 -0
  140. package/dist/web/assets/{markdown-renderer-Df3r-CCb.js → markdown-renderer-DdzxNveP.js} +1 -1
  141. package/dist/web/assets/{mobile-explorer-sheet-B-rcKEL9.js → mobile-explorer-sheet-Bo27IRye.js} +1 -1
  142. package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.br +0 -0
  143. package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.gz +0 -0
  144. package/dist/web/assets/{new-design-dialog-DgztQK5R.js → new-design-dialog-DIOCWZW1.js} +1 -1
  145. package/dist/web/assets/new-design-dialog-DIOCWZW1.js.br +0 -0
  146. package/dist/web/assets/new-design-dialog-DIOCWZW1.js.gz +0 -0
  147. package/dist/web/assets/{notification-store-B92dvP_u.js → notification-store-CRPOp-6B.js} +1 -1
  148. package/dist/web/assets/{notifications-settings-section-JiGvaCFx.js → notifications-settings-section-DSSCTkfX.js} +1 -1
  149. package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.br +0 -0
  150. package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.gz +0 -0
  151. package/dist/web/assets/{ppmbot-settings-section-XfrZ8VoC.js → ppmbot-settings-section-BIYSlZu5.js} +1 -1
  152. package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.br +0 -0
  153. package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.gz +0 -0
  154. package/dist/web/assets/{problems-panel-CDzwSJn6.js → problems-panel-CH-00nA7.js} +1 -1
  155. package/dist/web/assets/problems-panel-CH-00nA7.js.br +0 -0
  156. package/dist/web/assets/problems-panel-CH-00nA7.js.gz +0 -0
  157. package/dist/web/assets/{process-table-C_B39GHm.js → process-table-DQO0g5do.js} +1 -1
  158. package/dist/web/assets/process-table-DQO0g5do.js.br +0 -0
  159. package/dist/web/assets/process-table-DQO0g5do.js.gz +0 -0
  160. package/dist/web/assets/{proxy-settings-section-CvaOvYIv.js → proxy-settings-section-Buo3hvQ4.js} +1 -1
  161. package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.br +0 -0
  162. package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.gz +0 -0
  163. package/dist/web/assets/{query-tab-B8aMpAbI.js → query-tab-CU0QVZpj.js} +1 -1
  164. package/dist/web/assets/query-tab-CU0QVZpj.js.br +0 -0
  165. package/dist/web/assets/query-tab-CU0QVZpj.js.gz +0 -0
  166. package/dist/web/assets/{remote-access-settings-section-Bv0eawR4.js → remote-access-settings-section-vlHMJPdY.js} +1 -1
  167. package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.br +0 -0
  168. package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.gz +0 -0
  169. package/dist/web/assets/{remote-desktop-clipboard-notice-BpDakRY0.js → remote-desktop-clipboard-notice-DNqX7d1L.js} +1 -1
  170. package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.br +0 -0
  171. package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.gz +0 -0
  172. package/dist/web/assets/{remote-desktop-mobile-sheet-C5GQ3kzY.js → remote-desktop-mobile-sheet-Dz7tctpc.js} +2 -2
  173. package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.br +0 -0
  174. package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.gz +0 -0
  175. package/dist/web/assets/{remote-desktop-mobile-view-CZb5EMEK.js → remote-desktop-mobile-view-BqhQdShH.js} +1 -1
  176. package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.br +0 -0
  177. package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.gz +0 -0
  178. package/dist/web/assets/{remote-desktop-readiness-gate-CipNtLX5.js → remote-desktop-readiness-gate-rnTq4ZQS.js} +1 -1
  179. package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.br +0 -0
  180. package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.gz +0 -0
  181. package/dist/web/assets/{remote-desktop-window-content-B7OXXvAM.js → remote-desktop-window-content-TqjHt0_5.js} +1 -1
  182. package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.br +0 -0
  183. package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.gz +0 -0
  184. package/dist/web/assets/{rename-object-dialog-B4W6S7Xg.js → rename-object-dialog-D0YpY40E.js} +1 -1
  185. package/dist/web/assets/rename-object-dialog-D0YpY40E.js.br +0 -0
  186. package/dist/web/assets/rename-object-dialog-D0YpY40E.js.gz +0 -0
  187. package/dist/web/assets/{review-code-B4osj0k1.js → review-code-DsF9921h.js} +1 -1
  188. package/dist/web/assets/review-code-DsF9921h.js.br +0 -0
  189. package/dist/web/assets/{review-code-B4osj0k1.js.gz → review-code-DsF9921h.js.gz} +0 -0
  190. package/dist/web/assets/{save-as-dialog-DpXv_f1d.js → save-as-dialog-niU7kVMJ.js} +1 -1
  191. package/dist/web/assets/save-as-dialog-niU7kVMJ.js.br +0 -0
  192. package/dist/web/assets/save-as-dialog-niU7kVMJ.js.gz +0 -0
  193. package/dist/web/assets/{schedules-settings-section-BbaPbc28.js → schedules-settings-section-Heuv2Kj4.js} +1 -1
  194. package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.br +0 -0
  195. package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.gz +0 -0
  196. package/dist/web/assets/{session-review-tab-Aq3FEooH.js → session-review-tab-Dob0FLvA.js} +1 -1
  197. package/dist/web/assets/session-review-tab-Dob0FLvA.js.br +0 -0
  198. package/dist/web/assets/session-review-tab-Dob0FLvA.js.gz +0 -0
  199. package/dist/web/assets/{settings-body-vXbOWchN.js → settings-body-5t6SQbLx.js} +1 -1
  200. package/dist/web/assets/settings-body-5t6SQbLx.js.br +0 -0
  201. package/dist/web/assets/settings-body-5t6SQbLx.js.gz +0 -0
  202. package/dist/web/assets/{settings-rows-DD7Gxmst.js → settings-rows-B0w15zot.js} +1 -1
  203. package/dist/web/assets/settings-rows-B0w15zot.js.br +0 -0
  204. package/dist/web/assets/settings-rows-B0w15zot.js.gz +0 -0
  205. package/dist/web/assets/{settings-section-content-DkUJFop6.js → settings-section-content-D41IJ62x.js} +2 -2
  206. package/dist/web/assets/settings-section-content-D41IJ62x.js.br +0 -0
  207. package/dist/web/assets/settings-section-content-D41IJ62x.js.gz +0 -0
  208. package/dist/web/assets/settings-section-content-DuVO6erO.js +1 -0
  209. package/dist/web/assets/{settings-tab-Cdv9_OIe.js → settings-tab-DGU5FVbO.js} +1 -1
  210. package/dist/web/assets/{settings-window-content-DLa6Ph4u.js → settings-window-content-Da5PY5MZ.js} +1 -1
  211. package/dist/web/assets/{slash-command-picker-lILYDfK3.js → slash-command-picker-DpZsPuNf.js} +1 -1
  212. package/dist/web/assets/slash-command-picker-DpZsPuNf.js.br +0 -0
  213. package/dist/web/assets/slash-command-picker-DpZsPuNf.js.gz +0 -0
  214. package/dist/web/assets/{sql-object-tab-Da42SMK5.js → sql-object-tab-BTS8aHGO.js} +1 -1
  215. package/dist/web/assets/sql-object-tab-BTS8aHGO.js.br +0 -0
  216. package/dist/web/assets/sql-object-tab-BTS8aHGO.js.gz +0 -0
  217. package/dist/web/assets/{sqlite-viewer-V3SKNukY.js → sqlite-viewer-CVo5eqWj.js} +1 -1
  218. package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.br +0 -0
  219. package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.gz +0 -0
  220. package/dist/web/assets/{structure-save-dialog-B635iyPI.js → structure-save-dialog-B9Q-Rhgj.js} +1 -1
  221. package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.br +0 -0
  222. package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.gz +0 -0
  223. package/dist/web/assets/{structure-tab-Co9d8ktU.js → structure-tab-_cQn0KG7.js} +1 -1
  224. package/dist/web/assets/structure-tab-_cQn0KG7.js.br +0 -0
  225. package/dist/web/assets/structure-tab-_cQn0KG7.js.gz +0 -0
  226. package/dist/web/assets/{system-monitor-body-DC0j8RqP.js → system-monitor-body-YS3i1PUs.js} +2 -2
  227. package/dist/web/assets/system-monitor-body-YS3i1PUs.js.br +0 -0
  228. package/dist/web/assets/system-monitor-body-YS3i1PUs.js.gz +0 -0
  229. package/dist/web/assets/{system-monitor-tab-DA8BcdXo.js → system-monitor-tab-D63xmd8U.js} +1 -1
  230. package/dist/web/assets/{system-monitor-window-content-BiuLo8XW.js → system-monitor-window-content-DkCsK8Ed.js} +1 -1
  231. package/dist/web/assets/{tab-host-window-content-Crvt1r5F.js → tab-host-window-content-CrASOMX8.js} +1 -1
  232. package/dist/web/assets/tab-host-window-content-CrASOMX8.js.br +0 -0
  233. package/dist/web/assets/tab-host-window-content-CrASOMX8.js.gz +0 -0
  234. package/dist/web/assets/{table-tab-C2cYw7a0.js → table-tab-JlfqyPZR.js} +1 -1
  235. package/dist/web/assets/table-tab-JlfqyPZR.js.br +0 -0
  236. package/dist/web/assets/table-tab-JlfqyPZR.js.gz +0 -0
  237. package/dist/web/assets/{telegram-bot-token-field-BqNtOo5n.js → telegram-bot-token-field-ctRa2529.js} +1 -1
  238. package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.br +0 -0
  239. package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.gz +0 -0
  240. package/dist/web/assets/{terminal-tab-CrKxibGC.js → terminal-tab-BsXBBru0.js} +1 -1
  241. package/dist/web/assets/terminal-tab-BsXBBru0.js.br +0 -0
  242. package/dist/web/assets/terminal-tab-BsXBBru0.js.gz +0 -0
  243. package/dist/web/assets/{tool-cards-BRto67jM.js → tool-cards-BDzK03U4.js} +3 -3
  244. package/dist/web/assets/tool-cards-BDzK03U4.js.br +0 -0
  245. package/dist/web/assets/tool-cards-BDzK03U4.js.gz +0 -0
  246. package/dist/web/assets/{tools-settings-section-DEvZsrxq.js → tools-settings-section-DCG74pbd.js} +1 -1
  247. package/dist/web/assets/tools-settings-section-DCG74pbd.js.br +0 -0
  248. package/dist/web/assets/tools-settings-section-DCG74pbd.js.gz +0 -0
  249. package/dist/web/assets/{use-inline-blame-CRWJU6Rq.js → use-inline-blame-BOn_m8f-.js} +1 -1
  250. package/dist/web/assets/use-inline-blame-BOn_m8f-.js.br +0 -0
  251. package/dist/web/assets/use-inline-blame-BOn_m8f-.js.gz +0 -0
  252. package/dist/web/assets/{use-lsp-B-otjr-6.js → use-lsp-D144ftsf.js} +1 -1
  253. package/dist/web/assets/use-lsp-D144ftsf.js.br +0 -0
  254. package/dist/web/assets/use-lsp-D144ftsf.js.gz +0 -0
  255. package/dist/web/assets/{use-monaco-theme-BiDXRJ4e.js → use-monaco-theme-ArU1f9T6.js} +1 -1
  256. package/dist/web/assets/{use-process-kill-BW2UW0mZ.js → use-process-kill-BdmXHMFE.js} +1 -1
  257. package/dist/web/assets/use-process-kill-BdmXHMFE.js.br +0 -0
  258. package/dist/web/assets/use-process-kill-BdmXHMFE.js.gz +0 -0
  259. package/dist/web/assets/{use-sql-schema-info-D_Kc2FI7.js → use-sql-schema-info-BQXSMw6p.js} +1 -1
  260. package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.br +0 -0
  261. package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.gz +0 -0
  262. package/dist/web/assets/{use-websocket-n3Ud9vEA.js → use-websocket-rWdrMWa8.js} +1 -1
  263. package/dist/web/assets/{web-preview-tab-doNpegW3.js → web-preview-tab-B2OSrnl9.js} +1 -1
  264. package/dist/web/assets/web-preview-tab-B2OSrnl9.js.br +0 -0
  265. package/dist/web/assets/web-preview-tab-B2OSrnl9.js.gz +0 -0
  266. package/dist/web/index.html +2 -2
  267. package/dist/web/index.html.br +0 -0
  268. package/dist/web/index.html.gz +0 -0
  269. package/dist/web/sw.js +1 -1
  270. package/dist/web/sw.js.br +0 -0
  271. package/dist/web/sw.js.gz +0 -0
  272. package/docs/architecture/ai-chat-and-providers.md +22 -0
  273. package/package.json +1 -1
  274. package/src/providers/claude-agent-sdk.ts +37 -7
  275. package/src/providers/codex-app-server/codex-event-mapper.ts +3 -0
  276. package/src/providers/codex-app-server/codex-provider.ts +3 -21
  277. package/src/providers/codex-app-server/codex-rollout-items.ts +3 -0
  278. package/src/providers/codex-app-server/codex-thread-params.ts +1 -0
  279. package/src/providers/codex-app-server/codex-user-input.ts +41 -0
  280. package/src/server/ws/chat-token-rotation.ts +150 -0
  281. package/src/server/ws/chat.ts +28 -0
  282. package/src/services/account.service.ts +14 -0
  283. package/src/shared/chat-questions.ts +19 -0
  284. package/src/web/components/chat/async-question-card.tsx +24 -0
  285. package/src/web/components/chat/chat-reconnect-banner.tsx +54 -0
  286. package/src/web/components/chat/chat-tab.tsx +13 -15
  287. package/src/web/components/chat/message-events.tsx +6 -0
  288. package/src/web/components/chat/question-card.tsx +8 -10
  289. package/src/web/components/chat/tool-cards.tsx +4 -4
  290. package/src/web/hooks/use-reconnect-indicator.ts +49 -0
  291. package/dist/web/assets/accounts-settings-section-B5YXy0vd.js.br +0 -0
  292. package/dist/web/assets/accounts-settings-section-B5YXy0vd.js.gz +0 -0
  293. package/dist/web/assets/agent-session-sheet-Bj42PwCK.js.br +0 -0
  294. package/dist/web/assets/agent-session-sheet-Bj42PwCK.js.gz +0 -0
  295. package/dist/web/assets/agent-session-window-content-LqL6fVPU.js.br +0 -0
  296. package/dist/web/assets/agent-session-window-content-LqL6fVPU.js.gz +0 -0
  297. package/dist/web/assets/ai-resource-editor-jVv2nvAG.js.br +0 -0
  298. package/dist/web/assets/ai-resource-editor-jVv2nvAG.js.gz +0 -0
  299. package/dist/web/assets/ai-settings-section-C9Q-v8fY.js.br +0 -0
  300. package/dist/web/assets/ai-settings-section-C9Q-v8fY.js.gz +0 -0
  301. package/dist/web/assets/android-tab-CwqiuEZP.js.br +0 -0
  302. package/dist/web/assets/android-tab-CwqiuEZP.js.gz +0 -0
  303. package/dist/web/assets/appearance-settings-section-D0JIfiRx.js.br +0 -0
  304. package/dist/web/assets/appearance-settings-section-D0JIfiRx.js.gz +0 -0
  305. package/dist/web/assets/apps-panel-Cz_KJ37M.js.br +0 -0
  306. package/dist/web/assets/apps-panel-Cz_KJ37M.js.gz +0 -0
  307. package/dist/web/assets/branch-review-tab-C3QNpsm7.js.br +0 -0
  308. package/dist/web/assets/branch-review-tab-C3QNpsm7.js.gz +0 -0
  309. package/dist/web/assets/chat-tab-D14CUl0J.js.br +0 -0
  310. package/dist/web/assets/chat-tab-D14CUl0J.js.gz +0 -0
  311. package/dist/web/assets/chat-tab-D8iAVZKV.js +0 -16
  312. package/dist/web/assets/chat-tab-D8iAVZKV.js.br +0 -0
  313. package/dist/web/assets/chat-tab-D8iAVZKV.js.gz +0 -0
  314. package/dist/web/assets/code-editor-B7gbH4-x.js.br +0 -0
  315. package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js.br +0 -0
  316. package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js.gz +0 -0
  317. package/dist/web/assets/conflict-editor-ktOkrODA.js.br +0 -0
  318. package/dist/web/assets/conflict-editor-ktOkrODA.js.gz +0 -0
  319. package/dist/web/assets/connection-form-tab-CxvExR7T.js.br +0 -0
  320. package/dist/web/assets/connection-form-tab-CxvExR7T.js.gz +0 -0
  321. package/dist/web/assets/csv-preview-CBDMTEsF.js.br +0 -0
  322. package/dist/web/assets/csv-preview-CBDMTEsF.js.gz +0 -0
  323. package/dist/web/assets/db-tab-parts-BgVpKbi6.js.br +0 -0
  324. package/dist/web/assets/db-tab-parts-BgVpKbi6.js.gz +0 -0
  325. package/dist/web/assets/design-settings-section-DPGw61pY.js.br +0 -0
  326. package/dist/web/assets/design-settings-section-DPGw61pY.js.gz +0 -0
  327. package/dist/web/assets/design-tab-BiCqHNl3.js.br +0 -0
  328. package/dist/web/assets/design-tab-BiCqHNl3.js.gz +0 -0
  329. package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js.br +0 -0
  330. package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js.gz +0 -0
  331. package/dist/web/assets/diff-viewer-CLAvyqVG.js.br +0 -0
  332. package/dist/web/assets/diff-viewer-CLAvyqVG.js.gz +0 -0
  333. package/dist/web/assets/docx-preview-XSkD2IL6.js.br +0 -0
  334. package/dist/web/assets/docx-preview-XSkD2IL6.js.gz +0 -0
  335. package/dist/web/assets/editor-dialog-cQvqVZAR.js.br +0 -0
  336. package/dist/web/assets/editor-dialog-cQvqVZAR.js.gz +0 -0
  337. package/dist/web/assets/editor-language-service-6-7mS6_9.js.br +0 -0
  338. package/dist/web/assets/editor-language-service-6-7mS6_9.js.gz +0 -0
  339. package/dist/web/assets/explorer-body-BlGDPmNa.js.br +0 -0
  340. package/dist/web/assets/explorer-body-BlGDPmNa.js.gz +0 -0
  341. package/dist/web/assets/explorer-window-content-BLWY8GJ_.js.br +0 -0
  342. package/dist/web/assets/explorer-window-content-BLWY8GJ_.js.gz +0 -0
  343. package/dist/web/assets/extension-manager-section-NSEt5f4z.js.br +0 -0
  344. package/dist/web/assets/extension-manager-section-NSEt5f4z.js.gz +0 -0
  345. package/dist/web/assets/extension-webview-BkAEBWin.js.br +0 -0
  346. package/dist/web/assets/extension-webview-BkAEBWin.js.gz +0 -0
  347. package/dist/web/assets/files-settings-section-Bq7liJ_r.js.br +0 -0
  348. package/dist/web/assets/files-settings-section-Bq7liJ_r.js.gz +0 -0
  349. package/dist/web/assets/general-settings-section-DvHROAMa.js.br +0 -0
  350. package/dist/web/assets/general-settings-section-DvHROAMa.js.gz +0 -0
  351. package/dist/web/assets/git-log-panel-Cu9kK48H.js.br +0 -0
  352. package/dist/web/assets/git-log-panel-Cu9kK48H.js.gz +0 -0
  353. package/dist/web/assets/git-review-tab-B_JT649W.js.br +0 -0
  354. package/dist/web/assets/git-review-tab-B_JT649W.js.gz +0 -0
  355. package/dist/web/assets/glide-data-grid-BlposOph.js.br +0 -0
  356. package/dist/web/assets/glide-data-grid-BlposOph.js.gz +0 -0
  357. package/dist/web/assets/grid-save-dialog-B0d0qhnN.js.br +0 -0
  358. package/dist/web/assets/grid-save-dialog-B0d0qhnN.js.gz +0 -0
  359. package/dist/web/assets/group-chat-tab-jirUsGm-.js.br +0 -0
  360. package/dist/web/assets/group-chat-tab-jirUsGm-.js.gz +0 -0
  361. package/dist/web/assets/impexp-tab-HJVcOTYJ.js.br +0 -0
  362. package/dist/web/assets/impexp-tab-HJVcOTYJ.js.gz +0 -0
  363. package/dist/web/assets/index-DLB3j_P0.js.br +0 -0
  364. package/dist/web/assets/index-DLB3j_P0.js.gz +0 -0
  365. package/dist/web/assets/index-M3DUzop8.css +0 -1
  366. package/dist/web/assets/index-M3DUzop8.css.br +0 -0
  367. package/dist/web/assets/index-M3DUzop8.css.gz +0 -0
  368. package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js.br +0 -0
  369. package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js.gz +0 -0
  370. package/dist/web/assets/language-servers-section-DOcZ72FJ.js.br +0 -0
  371. package/dist/web/assets/language-servers-section-DOcZ72FJ.js.gz +0 -0
  372. package/dist/web/assets/logs-app-C7n9GSCn.js.br +0 -0
  373. package/dist/web/assets/logs-app-C7n9GSCn.js.gz +0 -0
  374. package/dist/web/assets/lsp-client-DpYmPhXX.js.br +0 -0
  375. package/dist/web/assets/lsp-client-DpYmPhXX.js.gz +0 -0
  376. package/dist/web/assets/markdown-renderer-CtEl6qAt.js.br +0 -0
  377. package/dist/web/assets/markdown-renderer-CtEl6qAt.js.gz +0 -0
  378. package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js.br +0 -0
  379. package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js.gz +0 -0
  380. package/dist/web/assets/new-design-dialog-DgztQK5R.js.br +0 -0
  381. package/dist/web/assets/new-design-dialog-DgztQK5R.js.gz +0 -0
  382. package/dist/web/assets/notifications-settings-section-JiGvaCFx.js.br +0 -0
  383. package/dist/web/assets/notifications-settings-section-JiGvaCFx.js.gz +0 -0
  384. package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js.br +0 -0
  385. package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js.gz +0 -0
  386. package/dist/web/assets/problems-panel-CDzwSJn6.js.br +0 -0
  387. package/dist/web/assets/problems-panel-CDzwSJn6.js.gz +0 -0
  388. package/dist/web/assets/process-table-C_B39GHm.js.br +0 -0
  389. package/dist/web/assets/process-table-C_B39GHm.js.gz +0 -0
  390. package/dist/web/assets/proxy-settings-section-CvaOvYIv.js.br +0 -0
  391. package/dist/web/assets/proxy-settings-section-CvaOvYIv.js.gz +0 -0
  392. package/dist/web/assets/query-tab-B8aMpAbI.js.br +0 -0
  393. package/dist/web/assets/query-tab-B8aMpAbI.js.gz +0 -0
  394. package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js.br +0 -0
  395. package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js.gz +0 -0
  396. package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js.br +0 -0
  397. package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js.gz +0 -0
  398. package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js.br +0 -0
  399. package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js.gz +0 -0
  400. package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js.br +0 -0
  401. package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js.gz +0 -0
  402. package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js.br +0 -0
  403. package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js.gz +0 -0
  404. package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js.br +0 -0
  405. package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js.gz +0 -0
  406. package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js.br +0 -0
  407. package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js.gz +0 -0
  408. package/dist/web/assets/review-code-B4osj0k1.js.br +0 -0
  409. package/dist/web/assets/save-as-dialog-DpXv_f1d.js.br +0 -5
  410. package/dist/web/assets/save-as-dialog-DpXv_f1d.js.gz +0 -0
  411. package/dist/web/assets/schedules-settings-section-BbaPbc28.js.br +0 -0
  412. package/dist/web/assets/schedules-settings-section-BbaPbc28.js.gz +0 -0
  413. package/dist/web/assets/session-review-tab-Aq3FEooH.js.br +0 -0
  414. package/dist/web/assets/session-review-tab-Aq3FEooH.js.gz +0 -0
  415. package/dist/web/assets/settings-body-vXbOWchN.js.br +0 -0
  416. package/dist/web/assets/settings-body-vXbOWchN.js.gz +0 -0
  417. package/dist/web/assets/settings-rows-DD7Gxmst.js.br +0 -0
  418. package/dist/web/assets/settings-rows-DD7Gxmst.js.gz +0 -0
  419. package/dist/web/assets/settings-section-content-CVtvJ6ze.js +0 -1
  420. package/dist/web/assets/settings-section-content-DkUJFop6.js.br +0 -0
  421. package/dist/web/assets/settings-section-content-DkUJFop6.js.gz +0 -0
  422. package/dist/web/assets/slash-command-picker-lILYDfK3.js.br +0 -0
  423. package/dist/web/assets/slash-command-picker-lILYDfK3.js.gz +0 -0
  424. package/dist/web/assets/sql-object-tab-Da42SMK5.js.br +0 -0
  425. package/dist/web/assets/sql-object-tab-Da42SMK5.js.gz +0 -0
  426. package/dist/web/assets/sqlite-viewer-V3SKNukY.js.br +0 -0
  427. package/dist/web/assets/sqlite-viewer-V3SKNukY.js.gz +0 -0
  428. package/dist/web/assets/structure-save-dialog-B635iyPI.js.br +0 -0
  429. package/dist/web/assets/structure-save-dialog-B635iyPI.js.gz +0 -0
  430. package/dist/web/assets/structure-tab-Co9d8ktU.js.br +0 -0
  431. package/dist/web/assets/structure-tab-Co9d8ktU.js.gz +0 -0
  432. package/dist/web/assets/system-monitor-body-DC0j8RqP.js.br +0 -0
  433. package/dist/web/assets/system-monitor-body-DC0j8RqP.js.gz +0 -0
  434. package/dist/web/assets/tab-host-window-content-Crvt1r5F.js.br +0 -0
  435. package/dist/web/assets/tab-host-window-content-Crvt1r5F.js.gz +0 -0
  436. package/dist/web/assets/table-tab-C2cYw7a0.js.br +0 -0
  437. package/dist/web/assets/table-tab-C2cYw7a0.js.gz +0 -0
  438. package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js.br +0 -0
  439. package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js.gz +0 -0
  440. package/dist/web/assets/terminal-tab-CrKxibGC.js.br +0 -0
  441. package/dist/web/assets/terminal-tab-CrKxibGC.js.gz +0 -0
  442. package/dist/web/assets/tool-cards-BRto67jM.js.br +0 -0
  443. package/dist/web/assets/tool-cards-BRto67jM.js.gz +0 -0
  444. package/dist/web/assets/tools-settings-section-DEvZsrxq.js.br +0 -0
  445. package/dist/web/assets/tools-settings-section-DEvZsrxq.js.gz +0 -0
  446. package/dist/web/assets/use-inline-blame-CRWJU6Rq.js.br +0 -0
  447. package/dist/web/assets/use-inline-blame-CRWJU6Rq.js.gz +0 -0
  448. package/dist/web/assets/use-lsp-B-otjr-6.js.br +0 -0
  449. package/dist/web/assets/use-lsp-B-otjr-6.js.gz +0 -0
  450. package/dist/web/assets/use-process-kill-BW2UW0mZ.js.br +0 -0
  451. package/dist/web/assets/use-process-kill-BW2UW0mZ.js.gz +0 -0
  452. package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js.br +0 -0
  453. package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js.gz +0 -0
  454. package/dist/web/assets/web-preview-tab-doNpegW3.js.br +0 -0
  455. package/dist/web/assets/web-preview-tab-doNpegW3.js.gz +0 -0
@@ -12,6 +12,8 @@ import type { SessionPhase } from "../../../types/api";
12
12
  import type { BashPartialEntry } from "../../hooks/use-chat";
13
13
  import { ToolCard } from "./tool-cards";
14
14
  import { MarkdownContent } from "./message-markdown";
15
+ import { AsyncQuestionCard } from "./async-question-card";
16
+ import { ASYNC_QUESTION_TOOL, type ChatQuestion } from "../../../shared/chat-questions";
15
17
 
16
18
  /**
17
19
  * Renders events in order — consecutive text events merged into one bubble,
@@ -163,6 +165,10 @@ export function InterleavedEvents({ events, isStreaming, projectName, bashPartia
163
165
  </div>
164
166
  );
165
167
  }
168
+ if (group.tool.type === "tool_use" && group.tool.tool === ASYNC_QUESTION_TOOL && !group.tool.parentToolUseId) {
169
+ const input = group.tool.input as { questions: ChatQuestion[] };
170
+ return <AsyncQuestionCard key={group.tool.toolUseId} itemId={group.tool.toolUseId!} questions={input.questions} />;
171
+ }
166
172
  return <ToolCard key={`tool-${i}`} tool={group.tool} result={group.result} completed={group.completed} projectName={projectName} bashPartialOutput={bashPartialOutput} />;
167
173
  })}
168
174
  </>
@@ -1,4 +1,5 @@
1
1
  import { useState, useCallback, useMemo, useEffect, useRef } from "react";
2
+ import type { ChatQuestion } from "../../../shared/chat-questions";
2
3
 
3
4
  /* ── Types ── */
4
5
  export interface QuestionOption {
@@ -6,17 +7,13 @@ export interface QuestionOption {
6
7
  description?: string;
7
8
  }
8
9
 
9
- export interface Question {
10
- question: string;
11
- header?: string;
12
- options: QuestionOption[];
13
- multiSelect?: boolean;
14
- }
10
+ export type Question = ChatQuestion;
15
11
 
16
12
  interface QuestionCardProps {
17
13
  questions: Question[];
18
14
  onSubmit: (answers: Record<string, string>) => void;
19
15
  onSkip: () => void;
16
+ autoFocus?: boolean;
20
17
  }
21
18
 
22
19
  /* ── Hook: form state ── */
@@ -81,6 +78,7 @@ function useQuestionKeyboard(config: {
81
78
  onSubmit: () => void;
82
79
  customInputRef: React.RefObject<HTMLInputElement | null>;
83
80
  enabled: boolean;
81
+ autoFocus: boolean;
84
82
  }) {
85
83
  const [focusedOption, setFocusedOption] = useState(0);
86
84
  const containerRef = useRef<HTMLDivElement>(null);
@@ -139,7 +137,7 @@ function useQuestionKeyboard(config: {
139
137
  // Same reason: asking the main document whether focus is already inside the card answers
140
138
  // "no" for a card living in another document, and this effect re-runs on every render —
141
139
  // which would yank focus out of the custom input after each keystroke.
142
- if (!el.contains(el.ownerDocument.activeElement)) el.focus();
140
+ if (config.autoFocus && !el.contains(el.ownerDocument.activeElement)) el.focus();
143
141
  }
144
142
  return () => { el?.removeEventListener("keydown", handleKeyDown); };
145
143
  }, [config, focusedOption]);
@@ -148,7 +146,7 @@ function useQuestionKeyboard(config: {
148
146
  }
149
147
 
150
148
  /* ── Component ── */
151
- export function QuestionCard({ questions, onSubmit, onSkip }: QuestionCardProps) {
149
+ export function QuestionCard({ questions, onSubmit, onSkip, autoFocus = true }: QuestionCardProps) {
152
150
  const customInputRef = useRef<HTMLInputElement>(null);
153
151
  const form = useQuestionForm(questions);
154
152
  const currentQ = questions[form.activeTab];
@@ -158,7 +156,7 @@ export function QuestionCard({ questions, onSubmit, onSkip }: QuestionCardProps)
158
156
  const handleSubmit = useCallback(() => {
159
157
  if (!form.allAnswered) return;
160
158
  const result: Record<string, string> = {};
161
- questions.forEach((q, i) => { result[q.question] = form.getFinalAnswer(i); });
159
+ questions.forEach((q, i) => { result[q.id ?? q.question] = form.getFinalAnswer(i); });
162
160
  onSubmit(result);
163
161
  }, [form.allAnswered, form.getFinalAnswer, questions, onSubmit]);
164
162
 
@@ -182,7 +180,7 @@ export function QuestionCard({ questions, onSubmit, onSkip }: QuestionCardProps)
182
180
  allAnswered: form.allAnswered, hasAnswer: form.hasAnswer,
183
181
  onSelectOption: handleSelectOption,
184
182
  goToNextTab: form.goToNextTab, goToPrevTab: form.goToPrevTab,
185
- onSubmit: handleSubmit, customInputRef, enabled: true,
183
+ onSubmit: handleSubmit, customInputRef, enabled: true, autoFocus,
186
184
  });
187
185
 
188
186
  const selectWithFocus = useCallback(
@@ -626,7 +626,7 @@ function ToolDetails({
626
626
  </div>
627
627
  );
628
628
  case "AskUserQuestion": {
629
- const qs = (input.questions as Array<{ question: string; header?: string; options: Array<{ label: string; description?: string }>; multiSelect?: boolean }>) ?? [];
629
+ const qs = (input.questions as Array<{ id?: string; question: string; header?: string; options: Array<{ label: string; description?: string }>; multiSelect?: boolean }>) ?? [];
630
630
  const answers = (input.answers as Record<string, string>) ?? {};
631
631
  return (
632
632
  <div className="space-y-2">
@@ -635,7 +635,7 @@ function ToolDetails({
635
635
  <p className="text-text-primary font-medium">{q.header ? `${q.header}: ` : ""}{q.question}</p>
636
636
  <div className="flex flex-wrap gap-1">
637
637
  {q.options.map((opt, oi) => {
638
- const answer = answers[q.question] ?? "";
638
+ const answer = answers[q.id ?? q.question] ?? answers[q.question] ?? "";
639
639
  const isSelected = answer.split(", ").includes(opt.label);
640
640
  return (
641
641
  <span key={oi} className={`inline-block rounded px-1.5 py-0.5 text-xs border ${
@@ -646,8 +646,8 @@ function ToolDetails({
646
646
  );
647
647
  })}
648
648
  </div>
649
- {answers[q.question] && (
650
- <p className="text-foreground text-xs">Answer: {answers[q.question]}</p>
649
+ {(answers[q.id ?? q.question] ?? answers[q.question]) && (
650
+ <p className="text-foreground text-xs">Answer: {answers[q.id ?? q.question] ?? answers[q.question]}</p>
651
651
  )}
652
652
  </div>
653
653
  ))}
@@ -0,0 +1,49 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+
3
+ /** What the chat shows while its socket is being re-established. */
4
+ export type ReconnectStage = "hidden" | "reconnecting" | "lost";
5
+
6
+ /** A reconnect that lands within this window is never shown — returning to the app should not flash. */
7
+ export const RECONNECT_SHOW_DELAY_MS = 800;
8
+ /** Past this the connection is reported lost and a retry is offered. */
9
+ export const RECONNECT_LOST_AFTER_MS = 8_000;
10
+
11
+ /**
12
+ * Turns a raw `isReconnecting` flag into what is worth telling the user.
13
+ *
14
+ * A phone browser closes the socket of every page it sends to the background, so a
15
+ * reconnect follows almost every return to PPM and usually finishes in well under a
16
+ * second. Both timers restart whenever the page becomes visible again: timers frozen
17
+ * while the page was hidden fire as soon as it resumes, which would otherwise report
18
+ * a connection that started reconnecting a moment ago as lost.
19
+ */
20
+ export function useReconnectIndicator(
21
+ isReconnecting: boolean,
22
+ showDelayMs = RECONNECT_SHOW_DELAY_MS,
23
+ lostAfterMs = RECONNECT_LOST_AFTER_MS,
24
+ ): { stage: ReconnectStage; restart: () => void } {
25
+ const [stage, setStage] = useState<ReconnectStage>("hidden");
26
+ const [epoch, setEpoch] = useState(0);
27
+ const restart = useCallback(() => setEpoch((n) => n + 1), []);
28
+
29
+ useEffect(() => {
30
+ const onVisibility = () => {
31
+ if (document.visibilityState === "visible") restart();
32
+ };
33
+ document.addEventListener("visibilitychange", onVisibility);
34
+ return () => document.removeEventListener("visibilitychange", onVisibility);
35
+ }, [restart]);
36
+
37
+ useEffect(() => {
38
+ setStage("hidden");
39
+ if (!isReconnecting) return;
40
+ const show = setTimeout(() => setStage("reconnecting"), showDelayMs);
41
+ const lost = setTimeout(() => setStage("lost"), lostAfterMs);
42
+ return () => {
43
+ clearTimeout(show);
44
+ clearTimeout(lost);
45
+ };
46
+ }, [isReconnecting, showDelayMs, lostAfterMs, epoch]);
47
+
48
+ return { stage, restart };
49
+ }