@hienlh/ppm 0.23.16 → 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 (444) hide show
  1. package/CHANGELOG.md +7 -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-DhzuFkDO.js → accounts-settings-section-BqsI4Ixj.js} +1 -1
  6. package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.br +0 -0
  7. package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.gz +0 -0
  8. package/dist/web/assets/{agent-session-sheet-CZAmOwSU.js → agent-session-sheet-BmoNB8BG.js} +2 -2
  9. package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.br +0 -0
  10. package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.gz +0 -0
  11. package/dist/web/assets/{agent-session-window-content-CwokWtJq.js → agent-session-window-content-rlCrYBYv.js} +1 -1
  12. package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.br +0 -0
  13. package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.gz +0 -0
  14. package/dist/web/assets/{ai-resource-editor-CT1JCaRQ.js → ai-resource-editor-CUOR9Xtf.js} +1 -1
  15. package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.br +0 -0
  16. package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.gz +0 -0
  17. package/dist/web/assets/{ai-settings-section-Ct9-lNqA.js → ai-settings-section-CNdbcCaI.js} +1 -1
  18. package/dist/web/assets/ai-settings-section-CNdbcCaI.js.br +0 -0
  19. package/dist/web/assets/ai-settings-section-CNdbcCaI.js.gz +0 -0
  20. package/dist/web/assets/{ai-settings-section-CBlS1FZK.js → ai-settings-section-aXXTb0dN.js} +1 -1
  21. package/dist/web/assets/{android-tab-CUPQN2M4.js → android-tab-BsuTMKJw.js} +1 -1
  22. package/dist/web/assets/android-tab-BsuTMKJw.js.br +0 -0
  23. package/dist/web/assets/android-tab-BsuTMKJw.js.gz +0 -0
  24. package/dist/web/assets/{appearance-settings-section-DpYcNqXH.js → appearance-settings-section-Dk6d_fTo.js} +1 -1
  25. package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.br +0 -0
  26. package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.gz +0 -0
  27. package/dist/web/assets/{apps-panel-BqF_CkKy.js → apps-panel-C20ys4Cy.js} +1 -1
  28. package/dist/web/assets/apps-panel-C20ys4Cy.js.br +0 -0
  29. package/dist/web/assets/apps-panel-C20ys4Cy.js.gz +0 -0
  30. package/dist/web/assets/{branch-review-tab-BEZqFSlw.js → branch-review-tab-CcvkQMRA.js} +1 -1
  31. package/dist/web/assets/branch-review-tab-CcvkQMRA.js.br +0 -0
  32. package/dist/web/assets/branch-review-tab-CcvkQMRA.js.gz +0 -0
  33. package/dist/web/assets/{chat-tab-N1B-Yv0P.js → chat-tab-BAh37UwG.js} +1 -1
  34. package/dist/web/assets/chat-tab-BAh37UwG.js.br +0 -0
  35. package/dist/web/assets/chat-tab-BAh37UwG.js.gz +0 -0
  36. package/dist/web/assets/chat-tab-D-cl4yMo.js +19 -0
  37. package/dist/web/assets/chat-tab-D-cl4yMo.js.br +0 -0
  38. package/dist/web/assets/chat-tab-D-cl4yMo.js.gz +0 -0
  39. package/dist/web/assets/{code-editor-d1CXl2WL.js → code-editor-DIGsPNPS.js} +4 -4
  40. package/dist/web/assets/code-editor-DIGsPNPS.js.br +0 -0
  41. package/dist/web/assets/code-editor-DIGsPNPS.js.gz +0 -0
  42. package/dist/web/assets/{codex-reset-credit-button-CwSSBK6P.js → codex-reset-credit-button-C0a2svAw.js} +1 -1
  43. package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.br +0 -0
  44. package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.gz +0 -0
  45. package/dist/web/assets/{conflict-editor-BucKz-uE.js → conflict-editor-zORSNMk6.js} +1 -1
  46. package/dist/web/assets/conflict-editor-zORSNMk6.js.br +0 -0
  47. package/dist/web/assets/conflict-editor-zORSNMk6.js.gz +0 -0
  48. package/dist/web/assets/{connection-form-tab-DIc25Bko.js → connection-form-tab-BkE7wACA.js} +1 -1
  49. package/dist/web/assets/connection-form-tab-BkE7wACA.js.br +0 -0
  50. package/dist/web/assets/connection-form-tab-BkE7wACA.js.gz +0 -0
  51. package/dist/web/assets/{csv-preview-CqDaGV5N.js → csv-preview-CDUY0I94.js} +1 -1
  52. package/dist/web/assets/csv-preview-CDUY0I94.js.br +0 -0
  53. package/dist/web/assets/csv-preview-CDUY0I94.js.gz +0 -0
  54. package/dist/web/assets/{db-tab-parts-lp8ROGQB.js → db-tab-parts-tgVIgcs5.js} +1 -1
  55. package/dist/web/assets/db-tab-parts-tgVIgcs5.js.br +0 -0
  56. package/dist/web/assets/db-tab-parts-tgVIgcs5.js.gz +0 -0
  57. package/dist/web/assets/{design-settings-section-DxWEBH1L.js → design-settings-section-CqFPwhis.js} +1 -1
  58. package/dist/web/assets/design-settings-section-CqFPwhis.js.br +0 -0
  59. package/dist/web/assets/design-settings-section-CqFPwhis.js.gz +0 -0
  60. package/dist/web/assets/{design-tab-Cl0CMAUx.js → design-tab-CVTzge3p.js} +1 -1
  61. package/dist/web/assets/design-tab-CVTzge3p.js.br +0 -0
  62. package/dist/web/assets/design-tab-CVTzge3p.js.gz +0 -0
  63. package/dist/web/assets/{designs-sidebar-panel-aCr-EGfj.js → designs-sidebar-panel-DKTSE1LS.js} +1 -1
  64. package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.br +0 -0
  65. package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.gz +0 -0
  66. package/dist/web/assets/{diff-viewer-XyJgWKwe.js → diff-viewer-3VDHcDag.js} +1 -1
  67. package/dist/web/assets/diff-viewer-3VDHcDag.js.br +0 -0
  68. package/dist/web/assets/diff-viewer-3VDHcDag.js.gz +0 -0
  69. package/dist/web/assets/{docx-preview-KJaj2YGN.js → docx-preview-FgE_WU6t.js} +1 -1
  70. package/dist/web/assets/docx-preview-FgE_WU6t.js.br +0 -0
  71. package/dist/web/assets/docx-preview-FgE_WU6t.js.gz +0 -0
  72. package/dist/web/assets/{editor-dialog-9tW6c9mu.js → editor-dialog-BhK77FSu.js} +1 -1
  73. package/dist/web/assets/editor-dialog-BhK77FSu.js.br +0 -0
  74. package/dist/web/assets/editor-dialog-BhK77FSu.js.gz +0 -0
  75. package/dist/web/assets/{editor-language-service-CkdO9ih8.js → editor-language-service-BIN7M57r.js} +1 -1
  76. package/dist/web/assets/editor-language-service-BIN7M57r.js.br +4 -0
  77. package/dist/web/assets/editor-language-service-BIN7M57r.js.gz +0 -0
  78. package/dist/web/assets/{explorer-body-B8AkNO5o.js → explorer-body-DNsWiVO3.js} +1 -1
  79. package/dist/web/assets/explorer-body-DNsWiVO3.js.br +0 -0
  80. package/dist/web/assets/explorer-body-DNsWiVO3.js.gz +0 -0
  81. package/dist/web/assets/{explorer-window-content-D174CXKz.js → explorer-window-content-DnOJYhRX.js} +1 -1
  82. package/dist/web/assets/explorer-window-content-DnOJYhRX.js.br +0 -0
  83. package/dist/web/assets/explorer-window-content-DnOJYhRX.js.gz +0 -0
  84. package/dist/web/assets/{extension-manager-section-CQsqXsPF.js → extension-manager-section-CJtRpUUs.js} +1 -1
  85. package/dist/web/assets/extension-manager-section-CJtRpUUs.js.br +0 -0
  86. package/dist/web/assets/extension-manager-section-CJtRpUUs.js.gz +0 -0
  87. package/dist/web/assets/{extension-webview-AfaxC7PL.js → extension-webview-Bza7cPL1.js} +1 -1
  88. package/dist/web/assets/extension-webview-Bza7cPL1.js.br +0 -0
  89. package/dist/web/assets/extension-webview-Bza7cPL1.js.gz +0 -0
  90. package/dist/web/assets/{files-settings-section-CC0aJryq.js → files-settings-section-8rWMj1Oi.js} +1 -1
  91. package/dist/web/assets/files-settings-section-8rWMj1Oi.js.br +0 -0
  92. package/dist/web/assets/files-settings-section-8rWMj1Oi.js.gz +0 -0
  93. package/dist/web/assets/{general-settings-section-DQTr20G_.js → general-settings-section-joWQEgIn.js} +1 -1
  94. package/dist/web/assets/general-settings-section-joWQEgIn.js.br +0 -0
  95. package/dist/web/assets/general-settings-section-joWQEgIn.js.gz +0 -0
  96. package/dist/web/assets/{git-log-panel-CisEJPJz.js → git-log-panel-BxYYWEiU.js} +1 -1
  97. package/dist/web/assets/git-log-panel-BxYYWEiU.js.br +0 -0
  98. package/dist/web/assets/git-log-panel-BxYYWEiU.js.gz +0 -0
  99. package/dist/web/assets/{git-review-tab-DpWEy03w.js → git-review-tab-Btnvgk1e.js} +1 -1
  100. package/dist/web/assets/git-review-tab-Btnvgk1e.js.br +0 -0
  101. package/dist/web/assets/git-review-tab-Btnvgk1e.js.gz +0 -0
  102. package/dist/web/assets/{glide-data-grid-hOML-uXP.js → glide-data-grid-lCwaM1Gy.js} +1 -1
  103. package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.br +0 -0
  104. package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.gz +0 -0
  105. package/dist/web/assets/{grid-save-dialog-Bx61akzH.js → grid-save-dialog-DoEEQ1vM.js} +1 -1
  106. package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.br +0 -0
  107. package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.gz +0 -0
  108. package/dist/web/assets/{group-chat-tab-eQdJHa8d.js → group-chat-tab-B7Dwx9uL.js} +1 -1
  109. package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.br +0 -0
  110. package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.gz +0 -0
  111. package/dist/web/assets/{impexp-tab-BjIDxYTj.js → impexp-tab-BtEDbQSn.js} +1 -1
  112. package/dist/web/assets/impexp-tab-BtEDbQSn.js.br +0 -0
  113. package/dist/web/assets/impexp-tab-BtEDbQSn.js.gz +0 -0
  114. package/dist/web/assets/{index-COwBji1t.js → index-CPBujJc_.js} +5 -5
  115. package/dist/web/assets/index-CPBujJc_.js.br +0 -0
  116. package/dist/web/assets/index-CPBujJc_.js.gz +0 -0
  117. package/dist/web/assets/{jira-watcher-section-dzpmNZA2.js → jira-watcher-section-mnly-maX.js} +1 -1
  118. package/dist/web/assets/{keybindings-store-DRjk8512.js → keybindings-store-BSPTMRiv.js} +1 -1
  119. package/dist/web/assets/{keyboard-shortcuts-section-BhyalK8A.js → keyboard-shortcuts-section-DULhEWPg.js} +1 -1
  120. package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.br +0 -0
  121. package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.gz +0 -0
  122. package/dist/web/assets/{language-servers-section-BXLaicUY.js → language-servers-section-CwBJsJ31.js} +2 -2
  123. package/dist/web/assets/language-servers-section-CwBJsJ31.js.br +0 -0
  124. package/dist/web/assets/language-servers-section-CwBJsJ31.js.gz +0 -0
  125. package/dist/web/assets/{logs-app-BnjU6CRy.js → logs-app-DatfI2Up.js} +1 -1
  126. package/dist/web/assets/logs-app-DatfI2Up.js.br +0 -0
  127. package/dist/web/assets/logs-app-DatfI2Up.js.gz +0 -0
  128. package/dist/web/assets/{logs-tab-7uyD7gKW.js → logs-tab-an_9ujcz.js} +1 -1
  129. package/dist/web/assets/{logs-window-content-B78a6oM2.js → logs-window-content-Usr3JTmE.js} +1 -1
  130. package/dist/web/assets/{lsp-client-DOHnxEUE.js → lsp-client-tCCcXWsR.js} +1 -1
  131. package/dist/web/assets/lsp-client-tCCcXWsR.js.br +0 -0
  132. package/dist/web/assets/lsp-client-tCCcXWsR.js.gz +0 -0
  133. package/dist/web/assets/{markdown-renderer-Dz0ZcxNo.js → markdown-renderer-D0YUMQLE.js} +1 -1
  134. package/dist/web/assets/markdown-renderer-D0YUMQLE.js.br +0 -0
  135. package/dist/web/assets/markdown-renderer-D0YUMQLE.js.gz +0 -0
  136. package/dist/web/assets/{markdown-renderer-B_hL6lRL.js → markdown-renderer-DdzxNveP.js} +1 -1
  137. package/dist/web/assets/{mobile-explorer-sheet-C_3dq99D.js → mobile-explorer-sheet-Bo27IRye.js} +1 -1
  138. package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.br +0 -0
  139. package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.gz +0 -0
  140. package/dist/web/assets/{new-design-dialog-CaubNbMT.js → new-design-dialog-DIOCWZW1.js} +1 -1
  141. package/dist/web/assets/new-design-dialog-DIOCWZW1.js.br +0 -0
  142. package/dist/web/assets/new-design-dialog-DIOCWZW1.js.gz +0 -0
  143. package/dist/web/assets/{notification-store-BTk3PZAj.js → notification-store-CRPOp-6B.js} +1 -1
  144. package/dist/web/assets/{notifications-settings-section-CJJ1l5cL.js → notifications-settings-section-DSSCTkfX.js} +1 -1
  145. package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.br +0 -0
  146. package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.gz +0 -0
  147. package/dist/web/assets/{ppmbot-settings-section-BFniAm3D.js → ppmbot-settings-section-BIYSlZu5.js} +1 -1
  148. package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.br +0 -0
  149. package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.gz +0 -0
  150. package/dist/web/assets/{problems-panel-CIxaCYJw.js → problems-panel-CH-00nA7.js} +1 -1
  151. package/dist/web/assets/problems-panel-CH-00nA7.js.br +0 -0
  152. package/dist/web/assets/problems-panel-CH-00nA7.js.gz +0 -0
  153. package/dist/web/assets/{process-table-l1fVcESX.js → process-table-DQO0g5do.js} +1 -1
  154. package/dist/web/assets/process-table-DQO0g5do.js.br +0 -0
  155. package/dist/web/assets/process-table-DQO0g5do.js.gz +0 -0
  156. package/dist/web/assets/{proxy-settings-section-Di5nBuy6.js → proxy-settings-section-Buo3hvQ4.js} +1 -1
  157. package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.br +0 -0
  158. package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.gz +0 -0
  159. package/dist/web/assets/{query-tab-hyKnRZr3.js → query-tab-CU0QVZpj.js} +1 -1
  160. package/dist/web/assets/query-tab-CU0QVZpj.js.br +0 -0
  161. package/dist/web/assets/query-tab-CU0QVZpj.js.gz +0 -0
  162. package/dist/web/assets/{remote-access-settings-section-HpZAP0Al.js → remote-access-settings-section-vlHMJPdY.js} +1 -1
  163. package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.br +0 -0
  164. package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.gz +0 -0
  165. package/dist/web/assets/{remote-desktop-clipboard-notice-DY7tWgjf.js → remote-desktop-clipboard-notice-DNqX7d1L.js} +1 -1
  166. package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.br +0 -0
  167. package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.gz +0 -0
  168. package/dist/web/assets/{remote-desktop-mobile-sheet-CX9mDRle.js → remote-desktop-mobile-sheet-Dz7tctpc.js} +2 -2
  169. package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.br +0 -0
  170. package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.gz +0 -0
  171. package/dist/web/assets/{remote-desktop-mobile-view-DNg0EpbV.js → remote-desktop-mobile-view-BqhQdShH.js} +1 -1
  172. package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.br +0 -0
  173. package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.gz +0 -0
  174. package/dist/web/assets/{remote-desktop-readiness-gate-BTTLlVDc.js → remote-desktop-readiness-gate-rnTq4ZQS.js} +1 -1
  175. package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.br +0 -0
  176. package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.gz +0 -0
  177. package/dist/web/assets/{remote-desktop-window-content-CqxnhSu0.js → remote-desktop-window-content-TqjHt0_5.js} +1 -1
  178. package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.br +0 -0
  179. package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.gz +0 -0
  180. package/dist/web/assets/{rename-object-dialog-CnhMsNbT.js → rename-object-dialog-D0YpY40E.js} +1 -1
  181. package/dist/web/assets/rename-object-dialog-D0YpY40E.js.br +0 -0
  182. package/dist/web/assets/rename-object-dialog-D0YpY40E.js.gz +0 -0
  183. package/dist/web/assets/{review-code-CunYhmcC.js → review-code-DsF9921h.js} +1 -1
  184. package/dist/web/assets/review-code-DsF9921h.js.br +0 -0
  185. package/dist/web/assets/review-code-DsF9921h.js.gz +0 -0
  186. package/dist/web/assets/{save-as-dialog-BtGSwTKZ.js → save-as-dialog-niU7kVMJ.js} +1 -1
  187. package/dist/web/assets/save-as-dialog-niU7kVMJ.js.br +0 -0
  188. package/dist/web/assets/save-as-dialog-niU7kVMJ.js.gz +0 -0
  189. package/dist/web/assets/{schedules-settings-section-CvlcMyEz.js → schedules-settings-section-Heuv2Kj4.js} +1 -1
  190. package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.br +0 -0
  191. package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.gz +0 -0
  192. package/dist/web/assets/{session-review-tab-C3HuIPD2.js → session-review-tab-Dob0FLvA.js} +1 -1
  193. package/dist/web/assets/session-review-tab-Dob0FLvA.js.br +0 -0
  194. package/dist/web/assets/session-review-tab-Dob0FLvA.js.gz +0 -0
  195. package/dist/web/assets/{settings-body-DCHEAh2_.js → settings-body-5t6SQbLx.js} +1 -1
  196. package/dist/web/assets/settings-body-5t6SQbLx.js.br +0 -0
  197. package/dist/web/assets/settings-body-5t6SQbLx.js.gz +0 -0
  198. package/dist/web/assets/{settings-rows-D8Y9o1ZD.js → settings-rows-B0w15zot.js} +1 -1
  199. package/dist/web/assets/settings-rows-B0w15zot.js.br +0 -0
  200. package/dist/web/assets/settings-rows-B0w15zot.js.gz +0 -0
  201. package/dist/web/assets/{settings-section-content-Dluhkh-u.js → settings-section-content-D41IJ62x.js} +2 -2
  202. package/dist/web/assets/settings-section-content-D41IJ62x.js.br +0 -0
  203. package/dist/web/assets/settings-section-content-D41IJ62x.js.gz +0 -0
  204. package/dist/web/assets/settings-section-content-DuVO6erO.js +1 -0
  205. package/dist/web/assets/{settings-tab-Cj1GkYi3.js → settings-tab-DGU5FVbO.js} +1 -1
  206. package/dist/web/assets/{settings-window-content-1fweMynB.js → settings-window-content-Da5PY5MZ.js} +1 -1
  207. package/dist/web/assets/{slash-command-picker-BdKd_AiS.js → slash-command-picker-DpZsPuNf.js} +1 -1
  208. package/dist/web/assets/slash-command-picker-DpZsPuNf.js.br +0 -0
  209. package/dist/web/assets/slash-command-picker-DpZsPuNf.js.gz +0 -0
  210. package/dist/web/assets/{sql-object-tab-DkdF_7Jz.js → sql-object-tab-BTS8aHGO.js} +1 -1
  211. package/dist/web/assets/sql-object-tab-BTS8aHGO.js.br +0 -0
  212. package/dist/web/assets/sql-object-tab-BTS8aHGO.js.gz +0 -0
  213. package/dist/web/assets/{sqlite-viewer-BoQMjJHj.js → sqlite-viewer-CVo5eqWj.js} +1 -1
  214. package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.br +0 -0
  215. package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.gz +0 -0
  216. package/dist/web/assets/{structure-save-dialog-DGHxHJ4T.js → structure-save-dialog-B9Q-Rhgj.js} +1 -1
  217. package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.br +0 -0
  218. package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.gz +0 -0
  219. package/dist/web/assets/{structure-tab-DuuX1e9c.js → structure-tab-_cQn0KG7.js} +1 -1
  220. package/dist/web/assets/structure-tab-_cQn0KG7.js.br +0 -0
  221. package/dist/web/assets/structure-tab-_cQn0KG7.js.gz +0 -0
  222. package/dist/web/assets/{system-monitor-body-CZVoh652.js → system-monitor-body-YS3i1PUs.js} +2 -2
  223. package/dist/web/assets/system-monitor-body-YS3i1PUs.js.br +0 -0
  224. package/dist/web/assets/system-monitor-body-YS3i1PUs.js.gz +0 -0
  225. package/dist/web/assets/{system-monitor-tab-eGta1jpw.js → system-monitor-tab-D63xmd8U.js} +1 -1
  226. package/dist/web/assets/{system-monitor-window-content-BUG72ffC.js → system-monitor-window-content-DkCsK8Ed.js} +1 -1
  227. package/dist/web/assets/{tab-host-window-content-BTYuY43x.js → tab-host-window-content-CrASOMX8.js} +1 -1
  228. package/dist/web/assets/tab-host-window-content-CrASOMX8.js.br +0 -0
  229. package/dist/web/assets/tab-host-window-content-CrASOMX8.js.gz +0 -0
  230. package/dist/web/assets/{table-tab-BsfgtqFE.js → table-tab-JlfqyPZR.js} +1 -1
  231. package/dist/web/assets/table-tab-JlfqyPZR.js.br +0 -0
  232. package/dist/web/assets/table-tab-JlfqyPZR.js.gz +0 -0
  233. package/dist/web/assets/{telegram-bot-token-field-CA8DEKRL.js → telegram-bot-token-field-ctRa2529.js} +1 -1
  234. package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.br +0 -0
  235. package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.gz +0 -0
  236. package/dist/web/assets/{terminal-tab-CoT5KIfe.js → terminal-tab-BsXBBru0.js} +1 -1
  237. package/dist/web/assets/terminal-tab-BsXBBru0.js.br +0 -0
  238. package/dist/web/assets/terminal-tab-BsXBBru0.js.gz +0 -0
  239. package/dist/web/assets/{tool-cards-oZ6cptRr.js → tool-cards-BDzK03U4.js} +3 -3
  240. package/dist/web/assets/tool-cards-BDzK03U4.js.br +0 -0
  241. package/dist/web/assets/tool-cards-BDzK03U4.js.gz +0 -0
  242. package/dist/web/assets/{tools-settings-section-CtcD-iTk.js → tools-settings-section-DCG74pbd.js} +1 -1
  243. package/dist/web/assets/tools-settings-section-DCG74pbd.js.br +0 -0
  244. package/dist/web/assets/tools-settings-section-DCG74pbd.js.gz +0 -0
  245. package/dist/web/assets/{use-inline-blame-BUuJj1Ru.js → use-inline-blame-BOn_m8f-.js} +1 -1
  246. package/dist/web/assets/use-inline-blame-BOn_m8f-.js.br +0 -0
  247. package/dist/web/assets/use-inline-blame-BOn_m8f-.js.gz +0 -0
  248. package/dist/web/assets/{use-lsp-Bo4z4gLx.js → use-lsp-D144ftsf.js} +1 -1
  249. package/dist/web/assets/use-lsp-D144ftsf.js.br +0 -0
  250. package/dist/web/assets/use-lsp-D144ftsf.js.gz +0 -0
  251. package/dist/web/assets/{use-monaco-theme-1ANtPWqA.js → use-monaco-theme-ArU1f9T6.js} +1 -1
  252. package/dist/web/assets/{use-process-kill-CvlXPal4.js → use-process-kill-BdmXHMFE.js} +1 -1
  253. package/dist/web/assets/use-process-kill-BdmXHMFE.js.br +0 -0
  254. package/dist/web/assets/use-process-kill-BdmXHMFE.js.gz +0 -0
  255. package/dist/web/assets/{use-sql-schema-info-DQzUqb7q.js → use-sql-schema-info-BQXSMw6p.js} +1 -1
  256. package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.br +0 -0
  257. package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.gz +0 -0
  258. package/dist/web/assets/{use-websocket-QCAD3F5b.js → use-websocket-rWdrMWa8.js} +1 -1
  259. package/dist/web/assets/{web-preview-tab-Cp0LuL0T.js → web-preview-tab-B2OSrnl9.js} +1 -1
  260. package/dist/web/assets/web-preview-tab-B2OSrnl9.js.br +0 -0
  261. package/dist/web/assets/web-preview-tab-B2OSrnl9.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/ai-chat-and-providers.md +22 -0
  269. package/package.json +1 -1
  270. package/src/providers/codex-app-server/codex-event-mapper.ts +3 -0
  271. package/src/providers/codex-app-server/codex-provider.ts +3 -21
  272. package/src/providers/codex-app-server/codex-rollout-items.ts +3 -0
  273. package/src/providers/codex-app-server/codex-thread-params.ts +1 -0
  274. package/src/providers/codex-app-server/codex-user-input.ts +41 -0
  275. package/src/shared/chat-questions.ts +19 -0
  276. package/src/web/components/chat/async-question-card.tsx +24 -0
  277. package/src/web/components/chat/chat-tab.tsx +3 -2
  278. package/src/web/components/chat/message-events.tsx +6 -0
  279. package/src/web/components/chat/question-card.tsx +8 -10
  280. package/src/web/components/chat/tool-cards.tsx +4 -4
  281. package/dist/web/assets/accounts-settings-section-DhzuFkDO.js.br +0 -0
  282. package/dist/web/assets/accounts-settings-section-DhzuFkDO.js.gz +0 -0
  283. package/dist/web/assets/agent-session-sheet-CZAmOwSU.js.br +0 -0
  284. package/dist/web/assets/agent-session-sheet-CZAmOwSU.js.gz +0 -0
  285. package/dist/web/assets/agent-session-window-content-CwokWtJq.js.br +0 -0
  286. package/dist/web/assets/agent-session-window-content-CwokWtJq.js.gz +0 -0
  287. package/dist/web/assets/ai-resource-editor-CT1JCaRQ.js.br +0 -0
  288. package/dist/web/assets/ai-resource-editor-CT1JCaRQ.js.gz +0 -0
  289. package/dist/web/assets/ai-settings-section-Ct9-lNqA.js.br +0 -0
  290. package/dist/web/assets/ai-settings-section-Ct9-lNqA.js.gz +0 -0
  291. package/dist/web/assets/android-tab-CUPQN2M4.js.br +0 -0
  292. package/dist/web/assets/android-tab-CUPQN2M4.js.gz +0 -0
  293. package/dist/web/assets/appearance-settings-section-DpYcNqXH.js.br +0 -0
  294. package/dist/web/assets/appearance-settings-section-DpYcNqXH.js.gz +0 -0
  295. package/dist/web/assets/apps-panel-BqF_CkKy.js.br +0 -0
  296. package/dist/web/assets/apps-panel-BqF_CkKy.js.gz +0 -0
  297. package/dist/web/assets/branch-review-tab-BEZqFSlw.js.br +0 -0
  298. package/dist/web/assets/branch-review-tab-BEZqFSlw.js.gz +0 -0
  299. package/dist/web/assets/chat-tab-N1B-Yv0P.js.br +0 -0
  300. package/dist/web/assets/chat-tab-N1B-Yv0P.js.gz +0 -0
  301. package/dist/web/assets/chat-tab-kk-mAF05.js +0 -16
  302. package/dist/web/assets/chat-tab-kk-mAF05.js.br +0 -0
  303. package/dist/web/assets/chat-tab-kk-mAF05.js.gz +0 -0
  304. package/dist/web/assets/code-editor-d1CXl2WL.js.br +0 -0
  305. package/dist/web/assets/code-editor-d1CXl2WL.js.gz +0 -0
  306. package/dist/web/assets/codex-reset-credit-button-CwSSBK6P.js.br +0 -0
  307. package/dist/web/assets/codex-reset-credit-button-CwSSBK6P.js.gz +0 -0
  308. package/dist/web/assets/conflict-editor-BucKz-uE.js.br +0 -0
  309. package/dist/web/assets/conflict-editor-BucKz-uE.js.gz +0 -0
  310. package/dist/web/assets/connection-form-tab-DIc25Bko.js.br +0 -0
  311. package/dist/web/assets/connection-form-tab-DIc25Bko.js.gz +0 -0
  312. package/dist/web/assets/csv-preview-CqDaGV5N.js.br +0 -0
  313. package/dist/web/assets/csv-preview-CqDaGV5N.js.gz +0 -0
  314. package/dist/web/assets/db-tab-parts-lp8ROGQB.js.br +0 -0
  315. package/dist/web/assets/db-tab-parts-lp8ROGQB.js.gz +0 -0
  316. package/dist/web/assets/design-settings-section-DxWEBH1L.js.br +0 -0
  317. package/dist/web/assets/design-settings-section-DxWEBH1L.js.gz +0 -0
  318. package/dist/web/assets/design-tab-Cl0CMAUx.js.br +0 -0
  319. package/dist/web/assets/design-tab-Cl0CMAUx.js.gz +0 -0
  320. package/dist/web/assets/designs-sidebar-panel-aCr-EGfj.js.br +0 -0
  321. package/dist/web/assets/designs-sidebar-panel-aCr-EGfj.js.gz +0 -0
  322. package/dist/web/assets/diff-viewer-XyJgWKwe.js.br +0 -0
  323. package/dist/web/assets/diff-viewer-XyJgWKwe.js.gz +0 -0
  324. package/dist/web/assets/docx-preview-KJaj2YGN.js.br +0 -0
  325. package/dist/web/assets/docx-preview-KJaj2YGN.js.gz +0 -0
  326. package/dist/web/assets/editor-dialog-9tW6c9mu.js.br +0 -0
  327. package/dist/web/assets/editor-dialog-9tW6c9mu.js.gz +0 -0
  328. package/dist/web/assets/editor-language-service-CkdO9ih8.js.br +0 -0
  329. package/dist/web/assets/editor-language-service-CkdO9ih8.js.gz +0 -0
  330. package/dist/web/assets/explorer-body-B8AkNO5o.js.br +0 -0
  331. package/dist/web/assets/explorer-body-B8AkNO5o.js.gz +0 -0
  332. package/dist/web/assets/explorer-window-content-D174CXKz.js.br +0 -0
  333. package/dist/web/assets/explorer-window-content-D174CXKz.js.gz +0 -0
  334. package/dist/web/assets/extension-manager-section-CQsqXsPF.js.br +0 -0
  335. package/dist/web/assets/extension-manager-section-CQsqXsPF.js.gz +0 -0
  336. package/dist/web/assets/extension-webview-AfaxC7PL.js.br +0 -0
  337. package/dist/web/assets/extension-webview-AfaxC7PL.js.gz +0 -0
  338. package/dist/web/assets/files-settings-section-CC0aJryq.js.br +0 -0
  339. package/dist/web/assets/files-settings-section-CC0aJryq.js.gz +0 -0
  340. package/dist/web/assets/general-settings-section-DQTr20G_.js.br +0 -0
  341. package/dist/web/assets/general-settings-section-DQTr20G_.js.gz +0 -0
  342. package/dist/web/assets/git-log-panel-CisEJPJz.js.br +0 -0
  343. package/dist/web/assets/git-log-panel-CisEJPJz.js.gz +0 -0
  344. package/dist/web/assets/git-review-tab-DpWEy03w.js.br +0 -0
  345. package/dist/web/assets/git-review-tab-DpWEy03w.js.gz +0 -0
  346. package/dist/web/assets/glide-data-grid-hOML-uXP.js.br +0 -0
  347. package/dist/web/assets/glide-data-grid-hOML-uXP.js.gz +0 -0
  348. package/dist/web/assets/grid-save-dialog-Bx61akzH.js.br +0 -0
  349. package/dist/web/assets/grid-save-dialog-Bx61akzH.js.gz +0 -0
  350. package/dist/web/assets/group-chat-tab-eQdJHa8d.js.br +0 -0
  351. package/dist/web/assets/group-chat-tab-eQdJHa8d.js.gz +0 -0
  352. package/dist/web/assets/impexp-tab-BjIDxYTj.js.br +0 -0
  353. package/dist/web/assets/impexp-tab-BjIDxYTj.js.gz +0 -0
  354. package/dist/web/assets/index-COwBji1t.js.br +0 -0
  355. package/dist/web/assets/index-COwBji1t.js.gz +0 -0
  356. package/dist/web/assets/keyboard-shortcuts-section-BhyalK8A.js.br +0 -0
  357. package/dist/web/assets/keyboard-shortcuts-section-BhyalK8A.js.gz +0 -0
  358. package/dist/web/assets/language-servers-section-BXLaicUY.js.br +0 -0
  359. package/dist/web/assets/language-servers-section-BXLaicUY.js.gz +0 -0
  360. package/dist/web/assets/logs-app-BnjU6CRy.js.br +0 -0
  361. package/dist/web/assets/logs-app-BnjU6CRy.js.gz +0 -0
  362. package/dist/web/assets/lsp-client-DOHnxEUE.js.br +0 -0
  363. package/dist/web/assets/lsp-client-DOHnxEUE.js.gz +0 -0
  364. package/dist/web/assets/markdown-renderer-Dz0ZcxNo.js.br +0 -0
  365. package/dist/web/assets/markdown-renderer-Dz0ZcxNo.js.gz +0 -0
  366. package/dist/web/assets/mobile-explorer-sheet-C_3dq99D.js.br +0 -0
  367. package/dist/web/assets/mobile-explorer-sheet-C_3dq99D.js.gz +0 -0
  368. package/dist/web/assets/new-design-dialog-CaubNbMT.js.br +0 -0
  369. package/dist/web/assets/new-design-dialog-CaubNbMT.js.gz +0 -0
  370. package/dist/web/assets/notifications-settings-section-CJJ1l5cL.js.br +0 -0
  371. package/dist/web/assets/notifications-settings-section-CJJ1l5cL.js.gz +0 -0
  372. package/dist/web/assets/ppmbot-settings-section-BFniAm3D.js.br +0 -0
  373. package/dist/web/assets/ppmbot-settings-section-BFniAm3D.js.gz +0 -0
  374. package/dist/web/assets/problems-panel-CIxaCYJw.js.br +0 -0
  375. package/dist/web/assets/problems-panel-CIxaCYJw.js.gz +0 -0
  376. package/dist/web/assets/process-table-l1fVcESX.js.br +0 -0
  377. package/dist/web/assets/process-table-l1fVcESX.js.gz +0 -0
  378. package/dist/web/assets/proxy-settings-section-Di5nBuy6.js.br +0 -0
  379. package/dist/web/assets/proxy-settings-section-Di5nBuy6.js.gz +0 -0
  380. package/dist/web/assets/query-tab-hyKnRZr3.js.br +0 -0
  381. package/dist/web/assets/query-tab-hyKnRZr3.js.gz +0 -0
  382. package/dist/web/assets/remote-access-settings-section-HpZAP0Al.js.br +0 -0
  383. package/dist/web/assets/remote-access-settings-section-HpZAP0Al.js.gz +0 -0
  384. package/dist/web/assets/remote-desktop-clipboard-notice-DY7tWgjf.js.br +0 -0
  385. package/dist/web/assets/remote-desktop-clipboard-notice-DY7tWgjf.js.gz +0 -0
  386. package/dist/web/assets/remote-desktop-mobile-sheet-CX9mDRle.js.br +0 -0
  387. package/dist/web/assets/remote-desktop-mobile-sheet-CX9mDRle.js.gz +0 -0
  388. package/dist/web/assets/remote-desktop-mobile-view-DNg0EpbV.js.br +0 -0
  389. package/dist/web/assets/remote-desktop-mobile-view-DNg0EpbV.js.gz +0 -0
  390. package/dist/web/assets/remote-desktop-readiness-gate-BTTLlVDc.js.br +0 -0
  391. package/dist/web/assets/remote-desktop-readiness-gate-BTTLlVDc.js.gz +0 -0
  392. package/dist/web/assets/remote-desktop-window-content-CqxnhSu0.js.br +0 -0
  393. package/dist/web/assets/remote-desktop-window-content-CqxnhSu0.js.gz +0 -0
  394. package/dist/web/assets/rename-object-dialog-CnhMsNbT.js.br +0 -0
  395. package/dist/web/assets/rename-object-dialog-CnhMsNbT.js.gz +0 -0
  396. package/dist/web/assets/review-code-CunYhmcC.js.br +0 -0
  397. package/dist/web/assets/review-code-CunYhmcC.js.gz +0 -0
  398. package/dist/web/assets/save-as-dialog-BtGSwTKZ.js.br +0 -0
  399. package/dist/web/assets/save-as-dialog-BtGSwTKZ.js.gz +0 -0
  400. package/dist/web/assets/schedules-settings-section-CvlcMyEz.js.br +0 -0
  401. package/dist/web/assets/schedules-settings-section-CvlcMyEz.js.gz +0 -0
  402. package/dist/web/assets/session-review-tab-C3HuIPD2.js.br +0 -0
  403. package/dist/web/assets/session-review-tab-C3HuIPD2.js.gz +0 -0
  404. package/dist/web/assets/settings-body-DCHEAh2_.js.br +0 -0
  405. package/dist/web/assets/settings-body-DCHEAh2_.js.gz +0 -0
  406. package/dist/web/assets/settings-rows-D8Y9o1ZD.js.br +0 -0
  407. package/dist/web/assets/settings-rows-D8Y9o1ZD.js.gz +0 -0
  408. package/dist/web/assets/settings-section-content-BXPg2H0N.js +0 -1
  409. package/dist/web/assets/settings-section-content-Dluhkh-u.js.br +0 -0
  410. package/dist/web/assets/settings-section-content-Dluhkh-u.js.gz +0 -0
  411. package/dist/web/assets/slash-command-picker-BdKd_AiS.js.br +0 -0
  412. package/dist/web/assets/slash-command-picker-BdKd_AiS.js.gz +0 -0
  413. package/dist/web/assets/sql-object-tab-DkdF_7Jz.js.br +0 -0
  414. package/dist/web/assets/sql-object-tab-DkdF_7Jz.js.gz +0 -0
  415. package/dist/web/assets/sqlite-viewer-BoQMjJHj.js.br +0 -0
  416. package/dist/web/assets/sqlite-viewer-BoQMjJHj.js.gz +0 -0
  417. package/dist/web/assets/structure-save-dialog-DGHxHJ4T.js.br +0 -0
  418. package/dist/web/assets/structure-save-dialog-DGHxHJ4T.js.gz +0 -0
  419. package/dist/web/assets/structure-tab-DuuX1e9c.js.br +0 -0
  420. package/dist/web/assets/structure-tab-DuuX1e9c.js.gz +0 -0
  421. package/dist/web/assets/system-monitor-body-CZVoh652.js.br +0 -0
  422. package/dist/web/assets/system-monitor-body-CZVoh652.js.gz +0 -0
  423. package/dist/web/assets/tab-host-window-content-BTYuY43x.js.br +0 -0
  424. package/dist/web/assets/tab-host-window-content-BTYuY43x.js.gz +0 -0
  425. package/dist/web/assets/table-tab-BsfgtqFE.js.br +0 -0
  426. package/dist/web/assets/table-tab-BsfgtqFE.js.gz +0 -0
  427. package/dist/web/assets/telegram-bot-token-field-CA8DEKRL.js.br +0 -0
  428. package/dist/web/assets/telegram-bot-token-field-CA8DEKRL.js.gz +0 -0
  429. package/dist/web/assets/terminal-tab-CoT5KIfe.js.br +0 -0
  430. package/dist/web/assets/terminal-tab-CoT5KIfe.js.gz +0 -0
  431. package/dist/web/assets/tool-cards-oZ6cptRr.js.br +0 -0
  432. package/dist/web/assets/tool-cards-oZ6cptRr.js.gz +0 -0
  433. package/dist/web/assets/tools-settings-section-CtcD-iTk.js.br +0 -0
  434. package/dist/web/assets/tools-settings-section-CtcD-iTk.js.gz +0 -0
  435. package/dist/web/assets/use-inline-blame-BUuJj1Ru.js.br +0 -0
  436. package/dist/web/assets/use-inline-blame-BUuJj1Ru.js.gz +0 -0
  437. package/dist/web/assets/use-lsp-Bo4z4gLx.js.br +0 -0
  438. package/dist/web/assets/use-lsp-Bo4z4gLx.js.gz +0 -0
  439. package/dist/web/assets/use-process-kill-CvlXPal4.js.br +0 -0
  440. package/dist/web/assets/use-process-kill-CvlXPal4.js.gz +0 -0
  441. package/dist/web/assets/use-sql-schema-info-DQzUqb7q.js.br +0 -0
  442. package/dist/web/assets/use-sql-schema-info-DQzUqb7q.js.gz +0 -0
  443. package/dist/web/assets/web-preview-tab-Cp0LuL0T.js.br +0 -0
  444. package/dist/web/assets/web-preview-tab-Cp0LuL0T.js.gz +0 -0
@@ -51,6 +51,7 @@ import { getOrFetchUsage, registerUsageSource } from "../../services/provider-us
51
51
  import { codexUsageSource } from "./codex-usage-source.ts";
52
52
  import { AMBIENT_ACCOUNT_KEY } from "../../services/provider-usage/usage-source.ts";
53
53
  import { redactTruncate } from "./codex-redact.ts";
54
+ import { buildUserInputResponse, normalizeCodexQuestions } from "./codex-user-input.ts";
54
55
  import { localizeRollout } from "./codex-rollout-transfer.ts";
55
56
  import { getRolloutMessagesAsync } from "./codex-history-async.ts";
56
57
  import {
@@ -62,7 +63,6 @@ import type {
62
63
  ModelListResponse,
63
64
  ServerRequest,
64
65
  JsonRpcNotification,
65
- ToolRequestUserInputResponse,
66
66
  Thread,
67
67
  UserInput,
68
68
  CodexSkill,
@@ -328,24 +328,6 @@ function approvalToolLabel(method: string, params: unknown): string {
328
328
  return String(p.tool ?? "Tool");
329
329
  }
330
330
 
331
- function buildUserInputResponse(questions: unknown, data: unknown): ToolRequestUserInputResponse {
332
- const answers: ToolRequestUserInputResponse["answers"] = {};
333
- if (data && typeof data === "object" && !Array.isArray(data)) {
334
- for (const [k, v] of Object.entries(data as Record<string, unknown>)) {
335
- answers[k] = { answers: Array.isArray(v) ? v.map(String) : [String(v)] };
336
- }
337
- return { answers };
338
- }
339
- const arr = Array.isArray(data) ? data : data != null ? [data] : [];
340
- const qs = Array.isArray(questions) ? questions : [];
341
- qs.forEach((q, i) => {
342
- const qid = (q && typeof q === "object" && ((q as any).id ?? (q as any).questionId)) || String(i);
343
- const a = arr[i];
344
- answers[qid] = { answers: a != null ? [String(a)] : [] };
345
- });
346
- return { answers };
347
- }
348
-
349
331
  /**
350
332
  * Codex provider — implements AIProvider directly (mirrors claude-agent-sdk),
351
333
  * driving `codex app-server` over JSON-RPC. Per-session live subprocess map;
@@ -1160,7 +1142,7 @@ export class CodexAppServerProvider implements AIProvider {
1160
1142
  const ppmReqId = crypto.randomUUID();
1161
1143
  const questions = (req.params as { questions?: unknown })?.questions;
1162
1144
  live.pendingApprovals.set(ppmReqId, { codexId: req.id, method, questions });
1163
- live.channel.push({ type: "approval_request", requestId: ppmReqId, tool: "AskUserQuestion", input: redactTruncate(req.params) });
1145
+ live.channel.push({ type: "approval_request", requestId: ppmReqId, tool: "AskUserQuestion", input: { questions: normalizeCodexQuestions(questions) } });
1164
1146
  return;
1165
1147
  }
1166
1148
  // permissions/* response is a granted-profile, not a decision → decline.
@@ -1174,7 +1156,7 @@ export class CodexAppServerProvider implements AIProvider {
1174
1156
  if (!pending) continue;
1175
1157
  live.pendingApprovals.delete(requestId);
1176
1158
  if (pending.method === "item/tool/requestUserInput") {
1177
- this.respondOnce(live, pending.codexId, buildUserInputResponse(pending.questions, data));
1159
+ this.respondOnce(live, pending.codexId, buildUserInputResponse(pending.questions, approved ? data : undefined));
1178
1160
  } else if (isApprovalMethod(pending.method)) {
1179
1161
  this.respondOnce(live, pending.codexId, decisionFor(pending.method as ApprovalMethod, approved));
1180
1162
  }
@@ -1,5 +1,6 @@
1
1
  import type { ChatEvent } from "../provider.interface.ts";
2
2
  import { redactTruncate } from "./codex-redact.ts";
3
+ import { codexAsyncQuestionEvent } from "./codex-user-input.ts";
3
4
  import { parseSubagentActivity, type SubagentActivity } from "./codex-subagent-thread.ts";
4
5
  import { changeToToolUse, rolloutFileChanges } from "./codex-patch.ts";
5
6
 
@@ -161,6 +162,8 @@ export function mapRolloutItem(item: unknown): RolloutItemMapping {
161
162
  return text ? { kind: "user", text } : { kind: "ignore" };
162
163
  }
163
164
  if (type === "AgentMessage") {
165
+ const question = codexAsyncQuestionEvent(it);
166
+ if (question) return { kind: "events", events: [question] };
164
167
  const text = textFrom(it.content);
165
168
  return text ? { kind: "assistant", text } : { kind: "ignore" };
166
169
  }
@@ -116,6 +116,7 @@ export function dbToolsMcpEnv(access: DbToolsMcpAccess | undefined): Record<stri
116
116
  export function buildThreadParams(input: ThreadParamsInput): CodexThreadParams {
117
117
  const instructions = input.developerInstructions?.trim();
118
118
  const config = {
119
+ "features.default_mode_request_user_input": true,
119
120
  ...(input.configOverrides?.config ?? {}),
120
121
  ...designMcpConfig(input.designMcp),
121
122
  ...tabToolsMcpConfig(input.tabToolsMcp),
@@ -0,0 +1,41 @@
1
+ import type { ChatEvent } from "../provider.interface.ts";
2
+ import { ASYNC_QUESTION_TOOL, type ChatQuestion } from "../../shared/chat-questions.ts";
3
+ import type { ToolRequestUserInputResponse } from "./codex-protocol.ts";
4
+
5
+ export function normalizeCodexQuestions(value: unknown): ChatQuestion[] {
6
+ if (!Array.isArray(value)) return [];
7
+ return value.flatMap((value, index) => {
8
+ if (!value || typeof value !== "object") return [];
9
+ const question = typeof value.question === "string" ? value.question : value.title;
10
+ if (typeof question !== "string" || !question.trim()) return [];
11
+ const options = Array.isArray(value.options) ? value.options.flatMap((option: unknown) => {
12
+ if (typeof option === "string") return [{ label: option }];
13
+ if (!option || typeof option !== "object" || !("label" in option) || typeof option.label !== "string") return [];
14
+ return [{ label: option.label, ...("description" in option && typeof option.description === "string" ? { description: option.description } : {}) }];
15
+ }) : [];
16
+ return [{ id: typeof value.id === "string" ? value.id : String(index), question,
17
+ ...(typeof value.header === "string" ? { header: value.header } : {}), options }];
18
+ });
19
+ }
20
+
21
+ export function codexAsyncQuestionEvent(item: Record<string, unknown>): ChatEvent | null {
22
+ if (item.type !== "agentMessage" && item.type !== "AgentMessage") return null;
23
+ const questions = normalizeCodexQuestions(item.questions);
24
+ if (typeof item.id !== "string" || !questions.length) return null;
25
+ return { type: "tool_use", tool: ASYNC_QUESTION_TOOL, toolUseId: item.id, input: { questions } };
26
+ }
27
+
28
+ export function buildUserInputResponse(questions: unknown, data: unknown): ToolRequestUserInputResponse {
29
+ const answers: ToolRequestUserInputResponse["answers"] = {};
30
+ if (!data || typeof data !== "object") return { answers };
31
+ normalizeCodexQuestions(questions).forEach((question, index) => {
32
+ const id = question.id!;
33
+ const value = Array.isArray(data) ? data[index]
34
+ : Object.hasOwn(data, id) ? (data as Record<string, unknown>)[id]
35
+ : Object.hasOwn(data, question.question) ? (data as Record<string, unknown>)[question.question] : undefined;
36
+ if (value != null) Object.defineProperty(answers, id, {
37
+ value: { answers: Array.isArray(value) ? value.map(String) : [String(value)] }, enumerable: true,
38
+ });
39
+ });
40
+ return { answers };
41
+ }
@@ -0,0 +1,19 @@
1
+ export interface ChatQuestion {
2
+ id?: string;
3
+ question: string;
4
+ header?: string;
5
+ options: { label: string; description?: string }[];
6
+ multiSelect?: boolean;
7
+ }
8
+
9
+ export const ASYNC_QUESTION_TOOL = "RequestUserInput";
10
+
11
+ export function questionReplyPrefix(itemId: string): string {
12
+ return `Answers to Codex question ${encodeURIComponent(itemId)}:\n`;
13
+ }
14
+
15
+ export function formatQuestionReply(itemId: string, questions: ChatQuestion[], answers?: Record<string, string>): string {
16
+ return questionReplyPrefix(itemId) + (answers
17
+ ? questions.map((question) => `${question.question}\n${answers[question.id ?? question.question] ?? ""}`).join("\n\n")
18
+ : "Skipped by the user.");
19
+ }
@@ -0,0 +1,24 @@
1
+ import { createContext, useContext } from "react";
2
+ import type { ChatMessage } from "../../../types/chat";
3
+ import { formatQuestionReply, questionReplyPrefix, type ChatQuestion } from "../../../shared/chat-questions";
4
+ import { QuestionCard } from "./question-card";
5
+
6
+ export const AsyncQuestionContext = createContext<{
7
+ messages: ChatMessage[];
8
+ onSend?: (content: string) => void;
9
+ }>({ messages: [] });
10
+
11
+ export function AsyncQuestionCard({ itemId, questions }: { itemId: string; questions: ChatQuestion[] }) {
12
+ const { messages, onSend } = useContext(AsyncQuestionContext);
13
+ const prefix = questionReplyPrefix(itemId);
14
+ const reply = messages.find((message) => message.role === "user" && message.content.startsWith(prefix));
15
+ if (reply || !onSend) return (
16
+ <div className="rounded-lg border border-border bg-surface p-3 text-sm whitespace-pre-wrap">
17
+ {reply ? reply.content.slice(prefix.length) : questions.map((question) => question.question).join("\n")}
18
+ <div className="mt-2 text-xs text-text-secondary">{reply ? "Response sent" : "Connect to answer this question"}</div>
19
+ </div>
20
+ );
21
+ return <QuestionCard questions={questions} autoFocus={false}
22
+ onSubmit={(answers) => onSend(formatQuestionReply(itemId, questions, answers))}
23
+ onSkip={() => onSend(formatQuestionReply(itemId, questions))} />;
24
+ }
@@ -1,4 +1,5 @@
1
1
  import { useState, useCallback, useRef, useEffect, useMemo } from "react";
2
+ import { AsyncQuestionContext } from "./async-question-card";
2
3
  import { Loader2, Upload, X } from "@/lib/icons";
3
4
  import { toast } from "sonner";
4
5
  import { api, projectUrl } from "@/lib/api-client";
@@ -1315,7 +1316,7 @@ function ChatTabContent({ metadata, tabId, onNewSession, onFork, historyFilter }
1315
1316
  <span>Starting conversation...</span>
1316
1317
  </div>
1317
1318
  </div>
1318
- ) : <SessionChangesContext.Provider value={sessionChangesValue}><MessageList
1319
+ ) : <AsyncQuestionContext.Provider value={{ messages: renderedMessages, onSend: isConnected ? (content) => sendMessage(content, { permissionMode }) : undefined }}><SessionChangesContext.Provider value={sessionChangesValue}><MessageList
1319
1320
  messages={renderedMessages}
1320
1321
  onExpandCompact={expandCompact}
1321
1322
  isCompactExpanded={isCompactExpanded}
@@ -1346,7 +1347,7 @@ function ChatTabContent({ metadata, tabId, onNewSession, onFork, historyFilter }
1346
1347
  onDismissMessage={dismissMessage}
1347
1348
  onClearErrors={clearErrors}
1348
1349
  bashPartialOutput={bashPartialOutput}
1349
- /></SessionChangesContext.Provider>}
1350
+ /></SessionChangesContext.Provider></AsyncQuestionContext.Provider>}
1350
1351
 
1351
1352
  {/* Agents still working — pinned here so it is the last thing under the conversation */}
1352
1353
  <RunningAgentsBar
@@ -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
  ))}