@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.
- package/CHANGELOG.md +7 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{accounts-settings-section-DhzuFkDO.js → accounts-settings-section-BqsI4Ixj.js} +1 -1
- package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-BqsI4Ixj.js.gz +0 -0
- package/dist/web/assets/{agent-session-sheet-CZAmOwSU.js → agent-session-sheet-BmoNB8BG.js} +2 -2
- package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-BmoNB8BG.js.gz +0 -0
- package/dist/web/assets/{agent-session-window-content-CwokWtJq.js → agent-session-window-content-rlCrYBYv.js} +1 -1
- package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-rlCrYBYv.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-CT1JCaRQ.js → ai-resource-editor-CUOR9Xtf.js} +1 -1
- package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-CUOR9Xtf.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-Ct9-lNqA.js → ai-settings-section-CNdbcCaI.js} +1 -1
- package/dist/web/assets/ai-settings-section-CNdbcCaI.js.br +0 -0
- package/dist/web/assets/ai-settings-section-CNdbcCaI.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-CBlS1FZK.js → ai-settings-section-aXXTb0dN.js} +1 -1
- package/dist/web/assets/{android-tab-CUPQN2M4.js → android-tab-BsuTMKJw.js} +1 -1
- package/dist/web/assets/android-tab-BsuTMKJw.js.br +0 -0
- package/dist/web/assets/android-tab-BsuTMKJw.js.gz +0 -0
- package/dist/web/assets/{appearance-settings-section-DpYcNqXH.js → appearance-settings-section-Dk6d_fTo.js} +1 -1
- package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-Dk6d_fTo.js.gz +0 -0
- package/dist/web/assets/{apps-panel-BqF_CkKy.js → apps-panel-C20ys4Cy.js} +1 -1
- package/dist/web/assets/apps-panel-C20ys4Cy.js.br +0 -0
- package/dist/web/assets/apps-panel-C20ys4Cy.js.gz +0 -0
- package/dist/web/assets/{branch-review-tab-BEZqFSlw.js → branch-review-tab-CcvkQMRA.js} +1 -1
- package/dist/web/assets/branch-review-tab-CcvkQMRA.js.br +0 -0
- package/dist/web/assets/branch-review-tab-CcvkQMRA.js.gz +0 -0
- package/dist/web/assets/{chat-tab-N1B-Yv0P.js → chat-tab-BAh37UwG.js} +1 -1
- package/dist/web/assets/chat-tab-BAh37UwG.js.br +0 -0
- package/dist/web/assets/chat-tab-BAh37UwG.js.gz +0 -0
- package/dist/web/assets/chat-tab-D-cl4yMo.js +19 -0
- package/dist/web/assets/chat-tab-D-cl4yMo.js.br +0 -0
- package/dist/web/assets/chat-tab-D-cl4yMo.js.gz +0 -0
- package/dist/web/assets/{code-editor-d1CXl2WL.js → code-editor-DIGsPNPS.js} +4 -4
- package/dist/web/assets/code-editor-DIGsPNPS.js.br +0 -0
- package/dist/web/assets/code-editor-DIGsPNPS.js.gz +0 -0
- package/dist/web/assets/{codex-reset-credit-button-CwSSBK6P.js → codex-reset-credit-button-C0a2svAw.js} +1 -1
- package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-C0a2svAw.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-BucKz-uE.js → conflict-editor-zORSNMk6.js} +1 -1
- package/dist/web/assets/conflict-editor-zORSNMk6.js.br +0 -0
- package/dist/web/assets/conflict-editor-zORSNMk6.js.gz +0 -0
- package/dist/web/assets/{connection-form-tab-DIc25Bko.js → connection-form-tab-BkE7wACA.js} +1 -1
- package/dist/web/assets/connection-form-tab-BkE7wACA.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BkE7wACA.js.gz +0 -0
- package/dist/web/assets/{csv-preview-CqDaGV5N.js → csv-preview-CDUY0I94.js} +1 -1
- package/dist/web/assets/csv-preview-CDUY0I94.js.br +0 -0
- package/dist/web/assets/csv-preview-CDUY0I94.js.gz +0 -0
- package/dist/web/assets/{db-tab-parts-lp8ROGQB.js → db-tab-parts-tgVIgcs5.js} +1 -1
- package/dist/web/assets/db-tab-parts-tgVIgcs5.js.br +0 -0
- package/dist/web/assets/db-tab-parts-tgVIgcs5.js.gz +0 -0
- package/dist/web/assets/{design-settings-section-DxWEBH1L.js → design-settings-section-CqFPwhis.js} +1 -1
- package/dist/web/assets/design-settings-section-CqFPwhis.js.br +0 -0
- package/dist/web/assets/design-settings-section-CqFPwhis.js.gz +0 -0
- package/dist/web/assets/{design-tab-Cl0CMAUx.js → design-tab-CVTzge3p.js} +1 -1
- package/dist/web/assets/design-tab-CVTzge3p.js.br +0 -0
- package/dist/web/assets/design-tab-CVTzge3p.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-aCr-EGfj.js → designs-sidebar-panel-DKTSE1LS.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-DKTSE1LS.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-XyJgWKwe.js → diff-viewer-3VDHcDag.js} +1 -1
- package/dist/web/assets/diff-viewer-3VDHcDag.js.br +0 -0
- package/dist/web/assets/diff-viewer-3VDHcDag.js.gz +0 -0
- package/dist/web/assets/{docx-preview-KJaj2YGN.js → docx-preview-FgE_WU6t.js} +1 -1
- package/dist/web/assets/docx-preview-FgE_WU6t.js.br +0 -0
- package/dist/web/assets/docx-preview-FgE_WU6t.js.gz +0 -0
- package/dist/web/assets/{editor-dialog-9tW6c9mu.js → editor-dialog-BhK77FSu.js} +1 -1
- package/dist/web/assets/editor-dialog-BhK77FSu.js.br +0 -0
- package/dist/web/assets/editor-dialog-BhK77FSu.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-CkdO9ih8.js → editor-language-service-BIN7M57r.js} +1 -1
- package/dist/web/assets/editor-language-service-BIN7M57r.js.br +4 -0
- package/dist/web/assets/editor-language-service-BIN7M57r.js.gz +0 -0
- package/dist/web/assets/{explorer-body-B8AkNO5o.js → explorer-body-DNsWiVO3.js} +1 -1
- package/dist/web/assets/explorer-body-DNsWiVO3.js.br +0 -0
- package/dist/web/assets/explorer-body-DNsWiVO3.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-D174CXKz.js → explorer-window-content-DnOJYhRX.js} +1 -1
- package/dist/web/assets/explorer-window-content-DnOJYhRX.js.br +0 -0
- package/dist/web/assets/explorer-window-content-DnOJYhRX.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-CQsqXsPF.js → extension-manager-section-CJtRpUUs.js} +1 -1
- package/dist/web/assets/extension-manager-section-CJtRpUUs.js.br +0 -0
- package/dist/web/assets/extension-manager-section-CJtRpUUs.js.gz +0 -0
- package/dist/web/assets/{extension-webview-AfaxC7PL.js → extension-webview-Bza7cPL1.js} +1 -1
- package/dist/web/assets/extension-webview-Bza7cPL1.js.br +0 -0
- package/dist/web/assets/extension-webview-Bza7cPL1.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-CC0aJryq.js → files-settings-section-8rWMj1Oi.js} +1 -1
- package/dist/web/assets/files-settings-section-8rWMj1Oi.js.br +0 -0
- package/dist/web/assets/files-settings-section-8rWMj1Oi.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-DQTr20G_.js → general-settings-section-joWQEgIn.js} +1 -1
- package/dist/web/assets/general-settings-section-joWQEgIn.js.br +0 -0
- package/dist/web/assets/general-settings-section-joWQEgIn.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-CisEJPJz.js → git-log-panel-BxYYWEiU.js} +1 -1
- package/dist/web/assets/git-log-panel-BxYYWEiU.js.br +0 -0
- package/dist/web/assets/git-log-panel-BxYYWEiU.js.gz +0 -0
- package/dist/web/assets/{git-review-tab-DpWEy03w.js → git-review-tab-Btnvgk1e.js} +1 -1
- package/dist/web/assets/git-review-tab-Btnvgk1e.js.br +0 -0
- package/dist/web/assets/git-review-tab-Btnvgk1e.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-hOML-uXP.js → glide-data-grid-lCwaM1Gy.js} +1 -1
- package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.br +0 -0
- package/dist/web/assets/glide-data-grid-lCwaM1Gy.js.gz +0 -0
- package/dist/web/assets/{grid-save-dialog-Bx61akzH.js → grid-save-dialog-DoEEQ1vM.js} +1 -1
- package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-DoEEQ1vM.js.gz +0 -0
- package/dist/web/assets/{group-chat-tab-eQdJHa8d.js → group-chat-tab-B7Dwx9uL.js} +1 -1
- package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.br +0 -0
- package/dist/web/assets/group-chat-tab-B7Dwx9uL.js.gz +0 -0
- package/dist/web/assets/{impexp-tab-BjIDxYTj.js → impexp-tab-BtEDbQSn.js} +1 -1
- package/dist/web/assets/impexp-tab-BtEDbQSn.js.br +0 -0
- package/dist/web/assets/impexp-tab-BtEDbQSn.js.gz +0 -0
- package/dist/web/assets/{index-COwBji1t.js → index-CPBujJc_.js} +5 -5
- package/dist/web/assets/index-CPBujJc_.js.br +0 -0
- package/dist/web/assets/index-CPBujJc_.js.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-dzpmNZA2.js → jira-watcher-section-mnly-maX.js} +1 -1
- package/dist/web/assets/{keybindings-store-DRjk8512.js → keybindings-store-BSPTMRiv.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-BhyalK8A.js → keyboard-shortcuts-section-DULhEWPg.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-DULhEWPg.js.gz +0 -0
- package/dist/web/assets/{language-servers-section-BXLaicUY.js → language-servers-section-CwBJsJ31.js} +2 -2
- package/dist/web/assets/language-servers-section-CwBJsJ31.js.br +0 -0
- package/dist/web/assets/language-servers-section-CwBJsJ31.js.gz +0 -0
- package/dist/web/assets/{logs-app-BnjU6CRy.js → logs-app-DatfI2Up.js} +1 -1
- package/dist/web/assets/logs-app-DatfI2Up.js.br +0 -0
- package/dist/web/assets/logs-app-DatfI2Up.js.gz +0 -0
- package/dist/web/assets/{logs-tab-7uyD7gKW.js → logs-tab-an_9ujcz.js} +1 -1
- package/dist/web/assets/{logs-window-content-B78a6oM2.js → logs-window-content-Usr3JTmE.js} +1 -1
- package/dist/web/assets/{lsp-client-DOHnxEUE.js → lsp-client-tCCcXWsR.js} +1 -1
- package/dist/web/assets/lsp-client-tCCcXWsR.js.br +0 -0
- package/dist/web/assets/lsp-client-tCCcXWsR.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-Dz0ZcxNo.js → markdown-renderer-D0YUMQLE.js} +1 -1
- package/dist/web/assets/markdown-renderer-D0YUMQLE.js.br +0 -0
- package/dist/web/assets/markdown-renderer-D0YUMQLE.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-B_hL6lRL.js → markdown-renderer-DdzxNveP.js} +1 -1
- package/dist/web/assets/{mobile-explorer-sheet-C_3dq99D.js → mobile-explorer-sheet-Bo27IRye.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Bo27IRye.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-CaubNbMT.js → new-design-dialog-DIOCWZW1.js} +1 -1
- package/dist/web/assets/new-design-dialog-DIOCWZW1.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DIOCWZW1.js.gz +0 -0
- package/dist/web/assets/{notification-store-BTk3PZAj.js → notification-store-CRPOp-6B.js} +1 -1
- package/dist/web/assets/{notifications-settings-section-CJJ1l5cL.js → notifications-settings-section-DSSCTkfX.js} +1 -1
- package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-DSSCTkfX.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-BFniAm3D.js → ppmbot-settings-section-BIYSlZu5.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-BIYSlZu5.js.gz +0 -0
- package/dist/web/assets/{problems-panel-CIxaCYJw.js → problems-panel-CH-00nA7.js} +1 -1
- package/dist/web/assets/problems-panel-CH-00nA7.js.br +0 -0
- package/dist/web/assets/problems-panel-CH-00nA7.js.gz +0 -0
- package/dist/web/assets/{process-table-l1fVcESX.js → process-table-DQO0g5do.js} +1 -1
- package/dist/web/assets/process-table-DQO0g5do.js.br +0 -0
- package/dist/web/assets/process-table-DQO0g5do.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-Di5nBuy6.js → proxy-settings-section-Buo3hvQ4.js} +1 -1
- package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Buo3hvQ4.js.gz +0 -0
- package/dist/web/assets/{query-tab-hyKnRZr3.js → query-tab-CU0QVZpj.js} +1 -1
- package/dist/web/assets/query-tab-CU0QVZpj.js.br +0 -0
- package/dist/web/assets/query-tab-CU0QVZpj.js.gz +0 -0
- package/dist/web/assets/{remote-access-settings-section-HpZAP0Al.js → remote-access-settings-section-vlHMJPdY.js} +1 -1
- package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-vlHMJPdY.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-DY7tWgjf.js → remote-desktop-clipboard-notice-DNqX7d1L.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DNqX7d1L.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-CX9mDRle.js → remote-desktop-mobile-sheet-Dz7tctpc.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-Dz7tctpc.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-DNg0EpbV.js → remote-desktop-mobile-view-BqhQdShH.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-BqhQdShH.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-BTTLlVDc.js → remote-desktop-readiness-gate-rnTq4ZQS.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-rnTq4ZQS.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-CqxnhSu0.js → remote-desktop-window-content-TqjHt0_5.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-TqjHt0_5.js.gz +0 -0
- package/dist/web/assets/{rename-object-dialog-CnhMsNbT.js → rename-object-dialog-D0YpY40E.js} +1 -1
- package/dist/web/assets/rename-object-dialog-D0YpY40E.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-D0YpY40E.js.gz +0 -0
- package/dist/web/assets/{review-code-CunYhmcC.js → review-code-DsF9921h.js} +1 -1
- package/dist/web/assets/review-code-DsF9921h.js.br +0 -0
- package/dist/web/assets/review-code-DsF9921h.js.gz +0 -0
- package/dist/web/assets/{save-as-dialog-BtGSwTKZ.js → save-as-dialog-niU7kVMJ.js} +1 -1
- package/dist/web/assets/save-as-dialog-niU7kVMJ.js.br +0 -0
- package/dist/web/assets/save-as-dialog-niU7kVMJ.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-CvlcMyEz.js → schedules-settings-section-Heuv2Kj4.js} +1 -1
- package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-Heuv2Kj4.js.gz +0 -0
- package/dist/web/assets/{session-review-tab-C3HuIPD2.js → session-review-tab-Dob0FLvA.js} +1 -1
- package/dist/web/assets/session-review-tab-Dob0FLvA.js.br +0 -0
- package/dist/web/assets/session-review-tab-Dob0FLvA.js.gz +0 -0
- package/dist/web/assets/{settings-body-DCHEAh2_.js → settings-body-5t6SQbLx.js} +1 -1
- package/dist/web/assets/settings-body-5t6SQbLx.js.br +0 -0
- package/dist/web/assets/settings-body-5t6SQbLx.js.gz +0 -0
- package/dist/web/assets/{settings-rows-D8Y9o1ZD.js → settings-rows-B0w15zot.js} +1 -1
- package/dist/web/assets/settings-rows-B0w15zot.js.br +0 -0
- package/dist/web/assets/settings-rows-B0w15zot.js.gz +0 -0
- package/dist/web/assets/{settings-section-content-Dluhkh-u.js → settings-section-content-D41IJ62x.js} +2 -2
- package/dist/web/assets/settings-section-content-D41IJ62x.js.br +0 -0
- package/dist/web/assets/settings-section-content-D41IJ62x.js.gz +0 -0
- package/dist/web/assets/settings-section-content-DuVO6erO.js +1 -0
- package/dist/web/assets/{settings-tab-Cj1GkYi3.js → settings-tab-DGU5FVbO.js} +1 -1
- package/dist/web/assets/{settings-window-content-1fweMynB.js → settings-window-content-Da5PY5MZ.js} +1 -1
- package/dist/web/assets/{slash-command-picker-BdKd_AiS.js → slash-command-picker-DpZsPuNf.js} +1 -1
- package/dist/web/assets/slash-command-picker-DpZsPuNf.js.br +0 -0
- package/dist/web/assets/slash-command-picker-DpZsPuNf.js.gz +0 -0
- package/dist/web/assets/{sql-object-tab-DkdF_7Jz.js → sql-object-tab-BTS8aHGO.js} +1 -1
- package/dist/web/assets/sql-object-tab-BTS8aHGO.js.br +0 -0
- package/dist/web/assets/sql-object-tab-BTS8aHGO.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-BoQMjJHj.js → sqlite-viewer-CVo5eqWj.js} +1 -1
- package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CVo5eqWj.js.gz +0 -0
- package/dist/web/assets/{structure-save-dialog-DGHxHJ4T.js → structure-save-dialog-B9Q-Rhgj.js} +1 -1
- package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-B9Q-Rhgj.js.gz +0 -0
- package/dist/web/assets/{structure-tab-DuuX1e9c.js → structure-tab-_cQn0KG7.js} +1 -1
- package/dist/web/assets/structure-tab-_cQn0KG7.js.br +0 -0
- package/dist/web/assets/structure-tab-_cQn0KG7.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-CZVoh652.js → system-monitor-body-YS3i1PUs.js} +2 -2
- package/dist/web/assets/system-monitor-body-YS3i1PUs.js.br +0 -0
- package/dist/web/assets/system-monitor-body-YS3i1PUs.js.gz +0 -0
- package/dist/web/assets/{system-monitor-tab-eGta1jpw.js → system-monitor-tab-D63xmd8U.js} +1 -1
- package/dist/web/assets/{system-monitor-window-content-BUG72ffC.js → system-monitor-window-content-DkCsK8Ed.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-BTYuY43x.js → tab-host-window-content-CrASOMX8.js} +1 -1
- package/dist/web/assets/tab-host-window-content-CrASOMX8.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CrASOMX8.js.gz +0 -0
- package/dist/web/assets/{table-tab-BsfgtqFE.js → table-tab-JlfqyPZR.js} +1 -1
- package/dist/web/assets/table-tab-JlfqyPZR.js.br +0 -0
- package/dist/web/assets/table-tab-JlfqyPZR.js.gz +0 -0
- package/dist/web/assets/{telegram-bot-token-field-CA8DEKRL.js → telegram-bot-token-field-ctRa2529.js} +1 -1
- package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-ctRa2529.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-CoT5KIfe.js → terminal-tab-BsXBBru0.js} +1 -1
- package/dist/web/assets/terminal-tab-BsXBBru0.js.br +0 -0
- package/dist/web/assets/terminal-tab-BsXBBru0.js.gz +0 -0
- package/dist/web/assets/{tool-cards-oZ6cptRr.js → tool-cards-BDzK03U4.js} +3 -3
- package/dist/web/assets/tool-cards-BDzK03U4.js.br +0 -0
- package/dist/web/assets/tool-cards-BDzK03U4.js.gz +0 -0
- package/dist/web/assets/{tools-settings-section-CtcD-iTk.js → tools-settings-section-DCG74pbd.js} +1 -1
- package/dist/web/assets/tools-settings-section-DCG74pbd.js.br +0 -0
- package/dist/web/assets/tools-settings-section-DCG74pbd.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-BUuJj1Ru.js → use-inline-blame-BOn_m8f-.js} +1 -1
- package/dist/web/assets/use-inline-blame-BOn_m8f-.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BOn_m8f-.js.gz +0 -0
- package/dist/web/assets/{use-lsp-Bo4z4gLx.js → use-lsp-D144ftsf.js} +1 -1
- package/dist/web/assets/use-lsp-D144ftsf.js.br +0 -0
- package/dist/web/assets/use-lsp-D144ftsf.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-1ANtPWqA.js → use-monaco-theme-ArU1f9T6.js} +1 -1
- package/dist/web/assets/{use-process-kill-CvlXPal4.js → use-process-kill-BdmXHMFE.js} +1 -1
- package/dist/web/assets/use-process-kill-BdmXHMFE.js.br +0 -0
- package/dist/web/assets/use-process-kill-BdmXHMFE.js.gz +0 -0
- package/dist/web/assets/{use-sql-schema-info-DQzUqb7q.js → use-sql-schema-info-BQXSMw6p.js} +1 -1
- package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-BQXSMw6p.js.gz +0 -0
- package/dist/web/assets/{use-websocket-QCAD3F5b.js → use-websocket-rWdrMWa8.js} +1 -1
- package/dist/web/assets/{web-preview-tab-Cp0LuL0T.js → web-preview-tab-B2OSrnl9.js} +1 -1
- package/dist/web/assets/web-preview-tab-B2OSrnl9.js.br +0 -0
- package/dist/web/assets/web-preview-tab-B2OSrnl9.js.gz +0 -0
- package/dist/web/index.html +1 -1
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/docs/architecture/ai-chat-and-providers.md +22 -0
- package/package.json +1 -1
- package/src/providers/codex-app-server/codex-event-mapper.ts +3 -0
- package/src/providers/codex-app-server/codex-provider.ts +3 -21
- package/src/providers/codex-app-server/codex-rollout-items.ts +3 -0
- package/src/providers/codex-app-server/codex-thread-params.ts +1 -0
- package/src/providers/codex-app-server/codex-user-input.ts +41 -0
- package/src/shared/chat-questions.ts +19 -0
- package/src/web/components/chat/async-question-card.tsx +24 -0
- package/src/web/components/chat/chat-tab.tsx +3 -2
- package/src/web/components/chat/message-events.tsx +6 -0
- package/src/web/components/chat/question-card.tsx +8 -10
- package/src/web/components/chat/tool-cards.tsx +4 -4
- package/dist/web/assets/accounts-settings-section-DhzuFkDO.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DhzuFkDO.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-CZAmOwSU.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-CZAmOwSU.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-CwokWtJq.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-CwokWtJq.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-CT1JCaRQ.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-CT1JCaRQ.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-Ct9-lNqA.js.br +0 -0
- package/dist/web/assets/ai-settings-section-Ct9-lNqA.js.gz +0 -0
- package/dist/web/assets/android-tab-CUPQN2M4.js.br +0 -0
- package/dist/web/assets/android-tab-CUPQN2M4.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-DpYcNqXH.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DpYcNqXH.js.gz +0 -0
- package/dist/web/assets/apps-panel-BqF_CkKy.js.br +0 -0
- package/dist/web/assets/apps-panel-BqF_CkKy.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-BEZqFSlw.js.br +0 -0
- package/dist/web/assets/branch-review-tab-BEZqFSlw.js.gz +0 -0
- package/dist/web/assets/chat-tab-N1B-Yv0P.js.br +0 -0
- package/dist/web/assets/chat-tab-N1B-Yv0P.js.gz +0 -0
- package/dist/web/assets/chat-tab-kk-mAF05.js +0 -16
- package/dist/web/assets/chat-tab-kk-mAF05.js.br +0 -0
- package/dist/web/assets/chat-tab-kk-mAF05.js.gz +0 -0
- package/dist/web/assets/code-editor-d1CXl2WL.js.br +0 -0
- package/dist/web/assets/code-editor-d1CXl2WL.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-CwSSBK6P.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CwSSBK6P.js.gz +0 -0
- package/dist/web/assets/conflict-editor-BucKz-uE.js.br +0 -0
- package/dist/web/assets/conflict-editor-BucKz-uE.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-DIc25Bko.js.br +0 -0
- package/dist/web/assets/connection-form-tab-DIc25Bko.js.gz +0 -0
- package/dist/web/assets/csv-preview-CqDaGV5N.js.br +0 -0
- package/dist/web/assets/csv-preview-CqDaGV5N.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-lp8ROGQB.js.br +0 -0
- package/dist/web/assets/db-tab-parts-lp8ROGQB.js.gz +0 -0
- package/dist/web/assets/design-settings-section-DxWEBH1L.js.br +0 -0
- package/dist/web/assets/design-settings-section-DxWEBH1L.js.gz +0 -0
- package/dist/web/assets/design-tab-Cl0CMAUx.js.br +0 -0
- package/dist/web/assets/design-tab-Cl0CMAUx.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-aCr-EGfj.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-aCr-EGfj.js.gz +0 -0
- package/dist/web/assets/diff-viewer-XyJgWKwe.js.br +0 -0
- package/dist/web/assets/diff-viewer-XyJgWKwe.js.gz +0 -0
- package/dist/web/assets/docx-preview-KJaj2YGN.js.br +0 -0
- package/dist/web/assets/docx-preview-KJaj2YGN.js.gz +0 -0
- package/dist/web/assets/editor-dialog-9tW6c9mu.js.br +0 -0
- package/dist/web/assets/editor-dialog-9tW6c9mu.js.gz +0 -0
- package/dist/web/assets/editor-language-service-CkdO9ih8.js.br +0 -0
- package/dist/web/assets/editor-language-service-CkdO9ih8.js.gz +0 -0
- package/dist/web/assets/explorer-body-B8AkNO5o.js.br +0 -0
- package/dist/web/assets/explorer-body-B8AkNO5o.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-D174CXKz.js.br +0 -0
- package/dist/web/assets/explorer-window-content-D174CXKz.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-CQsqXsPF.js.br +0 -0
- package/dist/web/assets/extension-manager-section-CQsqXsPF.js.gz +0 -0
- package/dist/web/assets/extension-webview-AfaxC7PL.js.br +0 -0
- package/dist/web/assets/extension-webview-AfaxC7PL.js.gz +0 -0
- package/dist/web/assets/files-settings-section-CC0aJryq.js.br +0 -0
- package/dist/web/assets/files-settings-section-CC0aJryq.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DQTr20G_.js.br +0 -0
- package/dist/web/assets/general-settings-section-DQTr20G_.js.gz +0 -0
- package/dist/web/assets/git-log-panel-CisEJPJz.js.br +0 -0
- package/dist/web/assets/git-log-panel-CisEJPJz.js.gz +0 -0
- package/dist/web/assets/git-review-tab-DpWEy03w.js.br +0 -0
- package/dist/web/assets/git-review-tab-DpWEy03w.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-hOML-uXP.js.br +0 -0
- package/dist/web/assets/glide-data-grid-hOML-uXP.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-Bx61akzH.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-Bx61akzH.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-eQdJHa8d.js.br +0 -0
- package/dist/web/assets/group-chat-tab-eQdJHa8d.js.gz +0 -0
- package/dist/web/assets/impexp-tab-BjIDxYTj.js.br +0 -0
- package/dist/web/assets/impexp-tab-BjIDxYTj.js.gz +0 -0
- package/dist/web/assets/index-COwBji1t.js.br +0 -0
- package/dist/web/assets/index-COwBji1t.js.gz +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BhyalK8A.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BhyalK8A.js.gz +0 -0
- package/dist/web/assets/language-servers-section-BXLaicUY.js.br +0 -0
- package/dist/web/assets/language-servers-section-BXLaicUY.js.gz +0 -0
- package/dist/web/assets/logs-app-BnjU6CRy.js.br +0 -0
- package/dist/web/assets/logs-app-BnjU6CRy.js.gz +0 -0
- package/dist/web/assets/lsp-client-DOHnxEUE.js.br +0 -0
- package/dist/web/assets/lsp-client-DOHnxEUE.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-Dz0ZcxNo.js.br +0 -0
- package/dist/web/assets/markdown-renderer-Dz0ZcxNo.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-C_3dq99D.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-C_3dq99D.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-CaubNbMT.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CaubNbMT.js.gz +0 -0
- package/dist/web/assets/notifications-settings-section-CJJ1l5cL.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CJJ1l5cL.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-BFniAm3D.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-BFniAm3D.js.gz +0 -0
- package/dist/web/assets/problems-panel-CIxaCYJw.js.br +0 -0
- package/dist/web/assets/problems-panel-CIxaCYJw.js.gz +0 -0
- package/dist/web/assets/process-table-l1fVcESX.js.br +0 -0
- package/dist/web/assets/process-table-l1fVcESX.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-Di5nBuy6.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Di5nBuy6.js.gz +0 -0
- package/dist/web/assets/query-tab-hyKnRZr3.js.br +0 -0
- package/dist/web/assets/query-tab-hyKnRZr3.js.gz +0 -0
- package/dist/web/assets/remote-access-settings-section-HpZAP0Al.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-HpZAP0Al.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DY7tWgjf.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DY7tWgjf.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-CX9mDRle.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-CX9mDRle.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DNg0EpbV.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DNg0EpbV.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BTTLlVDc.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BTTLlVDc.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-CqxnhSu0.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-CqxnhSu0.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-CnhMsNbT.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-CnhMsNbT.js.gz +0 -0
- package/dist/web/assets/review-code-CunYhmcC.js.br +0 -0
- package/dist/web/assets/review-code-CunYhmcC.js.gz +0 -0
- package/dist/web/assets/save-as-dialog-BtGSwTKZ.js.br +0 -0
- package/dist/web/assets/save-as-dialog-BtGSwTKZ.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-CvlcMyEz.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-CvlcMyEz.js.gz +0 -0
- package/dist/web/assets/session-review-tab-C3HuIPD2.js.br +0 -0
- package/dist/web/assets/session-review-tab-C3HuIPD2.js.gz +0 -0
- package/dist/web/assets/settings-body-DCHEAh2_.js.br +0 -0
- package/dist/web/assets/settings-body-DCHEAh2_.js.gz +0 -0
- package/dist/web/assets/settings-rows-D8Y9o1ZD.js.br +0 -0
- package/dist/web/assets/settings-rows-D8Y9o1ZD.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BXPg2H0N.js +0 -1
- package/dist/web/assets/settings-section-content-Dluhkh-u.js.br +0 -0
- package/dist/web/assets/settings-section-content-Dluhkh-u.js.gz +0 -0
- package/dist/web/assets/slash-command-picker-BdKd_AiS.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BdKd_AiS.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DkdF_7Jz.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DkdF_7Jz.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BoQMjJHj.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BoQMjJHj.js.gz +0 -0
- package/dist/web/assets/structure-save-dialog-DGHxHJ4T.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-DGHxHJ4T.js.gz +0 -0
- package/dist/web/assets/structure-tab-DuuX1e9c.js.br +0 -0
- package/dist/web/assets/structure-tab-DuuX1e9c.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-CZVoh652.js.br +0 -0
- package/dist/web/assets/system-monitor-body-CZVoh652.js.gz +0 -0
- package/dist/web/assets/tab-host-window-content-BTYuY43x.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-BTYuY43x.js.gz +0 -0
- package/dist/web/assets/table-tab-BsfgtqFE.js.br +0 -0
- package/dist/web/assets/table-tab-BsfgtqFE.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-CA8DEKRL.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-CA8DEKRL.js.gz +0 -0
- package/dist/web/assets/terminal-tab-CoT5KIfe.js.br +0 -0
- package/dist/web/assets/terminal-tab-CoT5KIfe.js.gz +0 -0
- package/dist/web/assets/tool-cards-oZ6cptRr.js.br +0 -0
- package/dist/web/assets/tool-cards-oZ6cptRr.js.gz +0 -0
- package/dist/web/assets/tools-settings-section-CtcD-iTk.js.br +0 -0
- package/dist/web/assets/tools-settings-section-CtcD-iTk.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-BUuJj1Ru.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BUuJj1Ru.js.gz +0 -0
- package/dist/web/assets/use-lsp-Bo4z4gLx.js.br +0 -0
- package/dist/web/assets/use-lsp-Bo4z4gLx.js.gz +0 -0
- package/dist/web/assets/use-process-kill-CvlXPal4.js.br +0 -0
- package/dist/web/assets/use-process-kill-CvlXPal4.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-DQzUqb7q.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-DQzUqb7q.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-Cp0LuL0T.js.br +0 -0
- 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:
|
|
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
|
|
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
|
))}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|