@astralyn/pi 0.87.5 → 0.87.6

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 (173) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/bundle/chunks/{chunk-EWLAVDVN.js → chunk-4W4Q2H6W.js} +55 -54
  3. package/dist/bundle/chunks/{chunk-APQ4ACY3.js → chunk-IORR2FW4.js} +1 -1
  4. package/dist/bundle/chunks/{virtual-modules-W3OGMIX7.js → virtual-modules-KUEIEAZN.js} +1 -1
  5. package/dist/bundle/cli.js +1 -1
  6. package/dist/bundle/index.js +1 -1
  7. package/dist/bundle/rpc-entry.js +1 -1
  8. package/dist/core/agent-session.d.ts +8 -24
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +54 -109
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/background/session.d.ts +11 -7
  13. package/dist/core/background/session.d.ts.map +1 -1
  14. package/dist/core/background/session.js +42 -16
  15. package/dist/core/background/session.js.map +1 -1
  16. package/dist/core/context-snapshot.d.ts +17 -4
  17. package/dist/core/context-snapshot.d.ts.map +1 -1
  18. package/dist/core/context-snapshot.js +48 -50
  19. package/dist/core/context-snapshot.js.map +1 -1
  20. package/dist/core/extensions/distribution-api.d.ts +0 -7
  21. package/dist/core/extensions/distribution-api.d.ts.map +1 -1
  22. package/dist/core/extensions/distribution-api.js +6 -6
  23. package/dist/core/extensions/distribution-api.js.map +1 -1
  24. package/dist/core/extensions/index.d.ts +1 -1
  25. package/dist/core/extensions/index.d.ts.map +1 -1
  26. package/dist/core/extensions/index.js +1 -1
  27. package/dist/core/extensions/index.js.map +1 -1
  28. package/dist/core/extensions/loader.d.ts +1 -1
  29. package/dist/core/extensions/loader.d.ts.map +1 -1
  30. package/dist/core/extensions/loader.js +3 -2
  31. package/dist/core/extensions/loader.js.map +1 -1
  32. package/dist/core/extensions/types.d.ts +1 -5
  33. package/dist/core/extensions/types.d.ts.map +1 -1
  34. package/dist/core/extensions/types.js +1 -1
  35. package/dist/core/extensions/types.js.map +1 -1
  36. package/dist/core/keybindings.d.ts +10 -0
  37. package/dist/core/keybindings.d.ts.map +1 -1
  38. package/dist/core/keybindings.js +3 -0
  39. package/dist/core/keybindings.js.map +1 -1
  40. package/dist/core/sdk.d.ts.map +1 -1
  41. package/dist/core/sdk.js +59 -7
  42. package/dist/core/sdk.js.map +1 -1
  43. package/dist/core/tools/bash.d.ts +1 -3
  44. package/dist/core/tools/bash.d.ts.map +1 -1
  45. package/dist/core/tools/bash.js.map +1 -1
  46. package/dist/core/tools/find.d.ts.map +1 -1
  47. package/dist/core/tools/find.js +0 -1
  48. package/dist/core/tools/find.js.map +1 -1
  49. package/dist/core/tools/grep.d.ts.map +1 -1
  50. package/dist/core/tools/grep.js +0 -1
  51. package/dist/core/tools/grep.js.map +1 -1
  52. package/dist/core/tools/ls.d.ts.map +1 -1
  53. package/dist/core/tools/ls.js +0 -1
  54. package/dist/core/tools/ls.js.map +1 -1
  55. package/dist/core/tools/read.d.ts.map +1 -1
  56. package/dist/core/tools/read.js +0 -1
  57. package/dist/core/tools/read.js.map +1 -1
  58. package/dist/core/tools/render-utils.d.ts +0 -7
  59. package/dist/core/tools/render-utils.d.ts.map +1 -1
  60. package/dist/core/tools/render-utils.js +0 -11
  61. package/dist/core/tools/render-utils.js.map +1 -1
  62. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  63. package/dist/core/tools/renderers/bash.js +59 -5
  64. package/dist/core/tools/renderers/bash.js.map +1 -1
  65. package/dist/core/tools/renderers/edit.d.ts.map +1 -1
  66. package/dist/core/tools/renderers/edit.js +4 -22
  67. package/dist/core/tools/renderers/edit.js.map +1 -1
  68. package/dist/core/tools/renderers/find.d.ts.map +1 -1
  69. package/dist/core/tools/renderers/find.js +7 -6
  70. package/dist/core/tools/renderers/find.js.map +1 -1
  71. package/dist/core/tools/renderers/grep.d.ts.map +1 -1
  72. package/dist/core/tools/renderers/grep.js +8 -7
  73. package/dist/core/tools/renderers/grep.js.map +1 -1
  74. package/dist/core/tools/renderers/ls.d.ts.map +1 -1
  75. package/dist/core/tools/renderers/ls.js +3 -2
  76. package/dist/core/tools/renderers/ls.js.map +1 -1
  77. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  78. package/dist/core/tools/renderers/read.js +7 -12
  79. package/dist/core/tools/renderers/read.js.map +1 -1
  80. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  81. package/dist/core/tools/renderers/write.js +3 -2
  82. package/dist/core/tools/renderers/write.js.map +1 -1
  83. package/dist/core/tools/tool-definition-wrapper.d.ts +2 -6
  84. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  85. package/dist/core/tools/tool-definition-wrapper.js +0 -2
  86. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  87. package/dist/extensions/background/completion-render.d.ts.map +1 -1
  88. package/dist/extensions/background/completion-render.js +3 -4
  89. package/dist/extensions/background/completion-render.js.map +1 -1
  90. package/dist/extensions/background/constants.d.ts +2 -0
  91. package/dist/extensions/background/constants.d.ts.map +1 -1
  92. package/dist/extensions/background/constants.js +2 -0
  93. package/dist/extensions/background/constants.js.map +1 -1
  94. package/dist/extensions/background/index.d.ts.map +1 -1
  95. package/dist/extensions/background/index.js +31 -5
  96. package/dist/extensions/background/index.js.map +1 -1
  97. package/dist/extensions/question/detail-pane.d.ts +12 -0
  98. package/dist/extensions/question/detail-pane.d.ts.map +1 -0
  99. package/dist/extensions/question/detail-pane.js +42 -0
  100. package/dist/extensions/question/detail-pane.js.map +1 -0
  101. package/dist/extensions/question/dialog.d.ts.map +1 -1
  102. package/dist/extensions/question/dialog.js +175 -105
  103. package/dist/extensions/question/dialog.js.map +1 -1
  104. package/dist/extensions/question/option-window.d.ts +26 -0
  105. package/dist/extensions/question/option-window.d.ts.map +1 -0
  106. package/dist/extensions/question/option-window.js +53 -0
  107. package/dist/extensions/question/option-window.js.map +1 -0
  108. package/dist/extensions/question/render-cache.d.ts +4 -4
  109. package/dist/extensions/question/render-cache.d.ts.map +1 -1
  110. package/dist/extensions/question/render-cache.js +10 -11
  111. package/dist/extensions/question/render-cache.js.map +1 -1
  112. package/dist/extensions/todo/index.d.ts.map +1 -1
  113. package/dist/extensions/todo/index.js +12 -8
  114. package/dist/extensions/todo/index.js.map +1 -1
  115. package/dist/extensions/todo/view.d.ts +3 -3
  116. package/dist/extensions/todo/view.d.ts.map +1 -1
  117. package/dist/extensions/todo/view.js +7 -6
  118. package/dist/extensions/todo/view.js.map +1 -1
  119. package/dist/modes/interactive/components/index.d.ts +1 -1
  120. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/index.js +1 -1
  122. package/dist/modes/interactive/components/index.js.map +1 -1
  123. package/dist/modes/interactive/components/status-marker.d.ts +2 -2
  124. package/dist/modes/interactive/components/status-marker.js +2 -2
  125. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  126. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  127. package/dist/modes/interactive/interactive-mode.js +7 -10
  128. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  129. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  130. package/dist/modes/interactive/theme/theme.js +2 -3
  131. package/dist/modes/interactive/theme/theme.js.map +1 -1
  132. package/dist/modes/interactive/tool-view/chat.d.ts +20 -0
  133. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -0
  134. package/dist/modes/interactive/tool-view/chat.js +46 -0
  135. package/dist/modes/interactive/tool-view/chat.js.map +1 -0
  136. package/dist/modes/interactive/tool-view/fallback.d.ts +14 -0
  137. package/dist/modes/interactive/tool-view/fallback.d.ts.map +1 -0
  138. package/dist/modes/interactive/tool-view/fallback.js +52 -0
  139. package/dist/modes/interactive/tool-view/fallback.js.map +1 -0
  140. package/dist/modes/interactive/tool-view/style.d.ts +63 -0
  141. package/dist/modes/interactive/tool-view/style.d.ts.map +1 -0
  142. package/dist/modes/interactive/tool-view/style.js +83 -0
  143. package/dist/modes/interactive/tool-view/style.js.map +1 -0
  144. package/dist/modes/interactive/{components → tool-view}/tool-execution.d.ts +17 -24
  145. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -0
  146. package/dist/modes/interactive/{components → tool-view}/tool-execution.js +42 -116
  147. package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -0
  148. package/docs/bundled/README.md +1 -1
  149. package/docs/bundled/extensions/background.md +1 -1
  150. package/docs/bundled/extensions/question.md +6 -5
  151. package/docs/bundled/tool-presentation.md +41 -31
  152. package/docs/extensions.md +1 -4
  153. package/docs/keybindings.md +11 -0
  154. package/npm-shrinkwrap.json +2 -2
  155. package/package.json +1 -1
  156. package/dist/core/model-stream-options.d.ts +0 -6
  157. package/dist/core/model-stream-options.d.ts.map +0 -1
  158. package/dist/core/model-stream-options.js +0 -20
  159. package/dist/core/model-stream-options.js.map +0 -1
  160. package/dist/modes/interactive/components/tool-chrome.d.ts +0 -28
  161. package/dist/modes/interactive/components/tool-chrome.d.ts.map +0 -1
  162. package/dist/modes/interactive/components/tool-chrome.js +0 -84
  163. package/dist/modes/interactive/components/tool-chrome.js.map +0 -1
  164. package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  165. package/dist/modes/interactive/components/tool-execution.js.map +0 -1
  166. package/dist/modes/interactive/components/tool-group.d.ts +0 -17
  167. package/dist/modes/interactive/components/tool-group.d.ts.map +0 -1
  168. package/dist/modes/interactive/components/tool-group.js +0 -78
  169. package/dist/modes/interactive/components/tool-group.js.map +0 -1
  170. package/dist/modes/interactive/tool-chat.d.ts +0 -21
  171. package/dist/modes/interactive/tool-chat.d.ts.map +0 -1
  172. package/dist/modes/interactive/tool-chat.js +0 -58
  173. package/dist/modes/interactive/tool-chat.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAoB,QAAQ,EAAY,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAErH,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAc,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACN,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,cAAc,GACd,MAAM,YAAY,CAAC;AAKpB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAQ/B,SAAS,qBAAqB,CAC7B,KAAe,EACf,KAAa,EACb,YAAoB,EACpB,KAAY,EACZ,UAA4D,EAAE;IAE9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACrE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;IAChG,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO;QACN,KAAK,EAAE;YACN,KAAK;YACL,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;YACpD,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC;YACzC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;YAClE,IAAI;SACJ;QACD,KAAK;QACL,QAAQ;KACR,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAqB,EAAE,MAAoB;IAC/E,OAAO,CAAC,GAAQ,EAAE,KAAY,EAAE,WAA+B,EAAE,IAAoC,EAAE,EAAE;QACxG,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,IAAI,GAAe,UAAU,CAAC;QAClC,IAAI,SAAoB,CAAC;QACzB,IAAI,UAA8B,CAAC;QACnC,IAAI,aAAgE,CAAC;QACrE,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,qBAAqB,GAAG,CAAC,CAAC;QAC9B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACvD,MAAM,iBAAiB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEhF,MAAM,WAAW,GAAgB;YAChC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzC,UAAU,EAAE;gBACX,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;aACtC;SACD,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,UAAsB,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAG,CAAC,UAAsB,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7F,MAAM,SAAS,GAAG,CAAC,UAAsB,EAAE,MAAc,EAAE,EAAE;YAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,CAAC,CAAC;QACF,kGAAkG;QAClG,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,CAAC,CAAC;QACF,MAAM,cAAc,GAAG,CAAC,QAAsB,EAAE,MAAc,EAAE,EAAE;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,CAAC,GAAG,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5E,SAAS,MAAM,CAAC,MAAoB;YACnC,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QACnG,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,CAAC;;YAC1B,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,SAAS,OAAO;YACf,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,GAAG,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC;QAED,SAAS,eAAe;YACvB,MAAM,CAAC,OAAO,GAAG,aAAa,IAAI,SAAS,KAAK,SAAS,CAAC;QAC3D,CAAC;QAED,SAAS,aAAa,CAAC,KAAa;YACnC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAChE,IAAI,GAAG,UAAU,CAAC;YAClB,SAAS,GAAG,SAAS,CAAC;YACtB,UAAU,GAAG,SAAS,CAAC;YACvB,kBAAkB,GAAG,CAAC,CAAC;YACvB,qBAAqB,GAAG,CAAC,CAAC;YAC1B,aAAa,GAAG,SAAS,CAAC;YAC1B,aAAa,GAAG,KAAK,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnB,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACX,CAAC;QAED,SAAS,YAAY;YACpB,YAAY,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC;QACpC,CAAC;QAED,SAAS,aAAa;YACrB,OAAO,cAAc,EAAE,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;QAED,SAAS,UAAU;YAClB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,YAAY,EAAE,CAAC,OAAO,GAAG,qDAAqD,CAAC;gBAC/E,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,GAAG,QAAQ,CAAC;YAChB,SAAS,GAAG,SAAS,CAAC;YACtB,UAAU,GAAG,SAAS,CAAC;YACvB,kBAAkB,GAAG,CAAC,CAAC;YACvB,qBAAqB,GAAG,CAAC,CAAC;YAC1B,aAAa,GAAG,KAAK,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnB,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACX,CAAC;QAED,SAAS,kBAAkB;YAC1B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC9D,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC5E,OAAO;YACR,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,EAAE,CAAC;gBACb,OAAO;YACR,CAAC;YACD,aAAa,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,SAAS,gBAAgB;YACxB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,SAAS,GAAG,QAAQ,CAAC;YACrB,UAAU,GAAG,SAAS,CAAC;YACvB,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACrG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,IAAI,cAAc,IAAI,EAAE,CAAC,CAAC;YACjE,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACX,CAAC;QAED,SAAS,kBAAkB,CAAC,MAAsB;YACjD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,KAAK,CAAC,YAAY,GAAG;gBACpB,aAAa,EAAE,UAAU;gBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM,CAAC,KAAK;gBACpB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC;YACF,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,SAAS,eAAe;YACvB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxC,gBAAgB,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,IAAI,QAAQ,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1E,KAAK,CAAC,OAAO,GAAG,0CAA0C,CAAC;gBAC3D,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC3B,aAAa,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YACD,SAAS,GAAG,OAAO,CAAC;YACpB,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5D,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACX,CAAC;QAED,SAAS,YAAY,CAAC,MAAqB;YAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,IAAI,YAAY,EAAE,CAAC,YAAY,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpD,kBAAkB,EAAE,CAAC;oBACrB,OAAO;gBACR,CAAC;gBACD,gBAAgB,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC3B,kBAAkB,EAAE,CAAC;QACtB,CAAC;QAED,SAAS,WAAW;YACnB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,OAAO,GAAG,4EAA4E,CAAC;gBAC7F,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC1B,kBAAkB,EAAE,CAAC;QACtB,CAAC;QAED,SAAS,iBAAiB,CAAC,MAAqB;YAC/C,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;oBACxB,KAAK,CAAC,YAAY,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;oBAC3D,YAAY,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACP,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;oBACzC,KAAK,CAAC,OAAO,GAAG,MAAM;wBACrB,CAAC,CAAC,SAAS,MAAM,2BAA2B;wBAC5C,CAAC,CAAC,gDAAgD,CAAC;gBACrD,CAAC;gBACD,OAAO;YACR,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;gBAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;gBAC3F,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACjD,YAAY,EAAE,CAAC;QAChB,CAAC;QAED,SAAS,YAAY;YACpB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,YAAY,EAAE,CAAC,OAAO,GAAG,yCAAyC,CAAC;gBACnE,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,CAAC,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC;gBACpD,KAAK,CAAC,OAAO,GAAG,uCAAuC,eAAe,CAAC,aAAa,cAAc,CAAC;gBACnG,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC3B,IAAI,UAAU,EAAE,CAAC;oBAChB,IAAI,OAAO;wBAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;;wBACrD,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC7C,CAAC;gBACD,SAAS,GAAG,SAAS,CAAC;gBACtB,UAAU,GAAG,SAAS,CAAC;gBACvB,aAAa,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnB,eAAe,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YAED,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,SAAS,GAAG,SAAS,CAAC;oBACtB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnB,eAAe,EAAE,CAAC;oBAClB,OAAO,EAAE,CAAC;oBACV,OAAO;gBACR,CAAC;gBACD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC1B,KAAK,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACvD,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC5C,SAAS,GAAG,SAAS,CAAC;oBACtB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnB,eAAe,EAAE,CAAC;oBAClB,OAAO,EAAE,CAAC;oBACV,OAAO;gBACR,CAAC;gBACD,KAAK,CAAC,YAAY,GAAG;oBACpB,aAAa,EAAE,UAAU;oBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO;iBACf,CAAC;gBACF,SAAS,GAAG,SAAS,CAAC;gBACtB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnB,eAAe,EAAE,CAAC;gBAClB,kBAAkB,EAAE,CAAC;YACtB,CAAC;QACF,CAAC,CAAC;QAEF,SAAS,iBAAiB,CAAC,IAAY;YACtC,IAAI,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;gBACvC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,oBAAoB,CAAC,CAAC;gBAC5E,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBACzC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,GAAG,oBAAoB,CAAC,CAAC;gBAChG,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,uBAAuB,CAAC,EAAE,CAAC;gBAC/C,aAAa,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACpC,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBAC5C,YAAY,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;gBAC3C,aAAa,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;QAED,SAAS,mBAAmB,CAAC,IAAY;YACxC,IAAI,SAAS,EAAE,CAAC;gBACf,IAAI,UAAU,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;oBAC3C,IAAI,SAAS,KAAK,OAAO,IAAI,aAAa,EAAE,CAAC;wBAC5C,YAAY,EAAE,CAAC,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC;oBACnD,CAAC;oBACD,SAAS,GAAG,SAAS,CAAC;oBACtB,UAAU,GAAG,SAAS,CAAC;oBACvB,aAAa,GAAG,SAAS,CAAC;oBAC1B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnB,eAAe,EAAE,CAAC;oBAClB,OAAO,EAAE,CAAC;oBACV,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YAED,IAAI,UAAU,CAAC,IAAI,EAAE,uBAAuB,CAAC,EAAE,CAAC;gBAC/C,IAAI,UAAU,GAAG,CAAC;oBAAE,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBAClD,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAE,CAAC;gBAChD,IAAI,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;qBAChE,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,SAAS;oBAAE,UAAU,EAAE,CAAC;gBAC7D,OAAO;YACR,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;YACjC,IAAI,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;gBACvC,IAAI,aAAa,EAAE,CAAC;oBACnB,aAAa,GAAG,KAAK,CAAC;oBACtB,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;oBAClC,KAAK,CAAC,WAAW,EAAE,CAAC;gBACrB,CAAC;gBACD,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBACzC,IAAI,aAAa;oBAAE,OAAO;gBAC1B,IAAI,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,WAAW,EAAE,CAAC;;oBAC3D,aAAa,GAAG,IAAI,CAAC;gBAC1B,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,aAAa;oBAAE,eAAe,EAAE,CAAC;gBACtC,OAAO;YACR,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;gBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,MAAM,EAAE,CAAC;oBACZ,aAAa,GAAG,KAAK,CAAC;oBACtB,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC1B,YAAY,EAAE,CAAC;oBACf,IAAI,eAAe,EAAE,CAAC,WAAW,EAAE,CAAC;wBACnC,iBAAiB,CAAC,MAAM,CAAC,CAAC;wBAC1B,OAAO,EAAE,CAAC;oBACX,CAAC;yBAAM,CAAC;wBACP,YAAY,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;gBACF,CAAC;gBACD,OAAO;YACR,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBACnB,IAAI,UAAU,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;oBAC5C,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;oBACvF,OAAO;gBACR,CAAC;gBACD,IAAI,UAAU,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC9E,CAAC;gBACD,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,QAAQ,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBACjE,IAAI,MAAM;oBAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBACtC,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YAED,IAAI,UAAU,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBAC5C,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC1B,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;wBACrD,gBAAgB,EAAE,CAAC;wBACnB,OAAO;oBACR,CAAC;oBACD,WAAW,EAAE,CAAC;gBACf,CAAC;qBAAM,IAAI,MAAM;oBAAE,YAAY,CAAC,MAAM,CAAC,CAAC;gBACxC,OAAO;YACR,CAAC;YAED,IAAI,UAAU,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9E,CAAC;QACF,CAAC;QAED,SAAS,WAAW,CAAC,IAAY;YAChC,IAAI,IAAI,KAAK,QAAQ;gBAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;;gBAC1C,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,SAAS,MAAM,CAAC,KAAa;YAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAED,SAAS,UAAU,CAAC,WAAmB,EAAE,KAAe;YACvD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG;gBACZ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC1C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;oBAC3F,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;wBACjD,OAAO,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC/E,CAAC;oBACD,OAAO,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACxD,CAAC,CAAC;gBACF,IAAI,KAAK,QAAQ;oBAChB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;oBACxD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC;aACpF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QAED,SAAS,YAAY,CAAC,WAAmB,EAAE,KAAa,EAAE,YAAoB;YAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC;YAC9F,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE;gBAC1D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;gBACjD,OAAO;oBACN,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;oBAC9B,KAAK,CAAC,EAAE,CACP,KAAK,EACL,eAAe,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,QAAQ,uBAAuB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAC3F;iBACD,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;QAED,6FAA6F;QAC7F,SAAS,WAAW,CAAC,MAAqB,EAAE,OAAgB,EAAE,eAAwB;YACrF,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,eAAe;gBAAE,OAAO,KAAK,CAAC;YAC9D,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;QAED,SAAS,YAAY,CAAC,WAAmB,EAAE,KAAe;YACzD,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;gBACxD,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,EACnE,WAAW,EACX,KAAK,CACL,CAAC;gBACF,MAAM,QAAQ,GACb,MAAM,CAAC,IAAI,KAAK,OAAO;oBACtB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;oBAC/C,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC;gBACpC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;gBAC1E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;oBACvC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;gBACxG,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YACD,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CACP,KAAK,EACL,SAAS,CACR,SAAS,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EACzC,SAAS,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,EACpD,cAAc,CAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAC9D,CACD,EACD,WAAW,EACX,KAAK,CACL,CAAC;QACH,CAAC;QAED,SAAS,OAAO,CAAC,KAAa,EAAE,YAAoB;YACnD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YAC3C,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAE/B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvB,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE;oBAC/E,cAAc,EAAE,kBAAkB;iBAClC,CAAC,CAAC;gBACH,qBAAqB,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAC1C,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC;gBACpC,OAAO,QAAQ,CAAC,KAAK,CAAC;YACvB,CAAC;YAED,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC;YAC9C,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,cAAc,CACb,GAAG,EACH,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAChF,WAAW,EACX,KAAK,CACL,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAC3B,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,IAAI,iBAAqC,CAAC;YAC1C,MAAM,UAAU,GACf,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7G,MAAM,qBAAqB,GAAG,UAAU,IAAI,WAAW,IAAI,EAAE,CAAC;YAC9D,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAEpG,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC9B,MAAM,OAAO,GAAG,CAAC,aAAa,IAAI,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC;gBAC9D,MAAM,OAAO,GACZ,OAAO;oBACP,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;wBACzE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC;gBACtE,MAAM,cAAc,GACnB,CAAC,OAAO;oBACR,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;wBACvB,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,KAAK,QAAQ;wBACvC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChG,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3D,MAAM,IAAI,GACT,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxG,MAAM,UAAU,GACf,MAAM,CAAC,IAAI,KAAK,OAAO;oBACtB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI;wBAC1B,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBACjF,CAAC,CAAC,SAAS,CAAC;gBACd,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACjF,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,KAAK,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;gBAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClF,IAAI,OAAO;oBAAE,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC;gBACrD,cAAc,CAAC,GAAG,UAAU,IAAI,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;gBAC3F,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACpD,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;gBAC1F,CAAC;gBACD,IAAI,OAAO;oBAAE,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC;YACpD,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACf,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,UAAU,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC9F,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;gBACtE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC3F,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC;YACzC,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,CAAC,CAAC;gBACd,MAAM,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,GAAG,CAAC;gBACjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC3C,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzF,MAAM,OAAO,GAAG,WAAW;oBAC1B,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC;oBACrD,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;gBACrC,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;gBACzF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBAChE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClF,MAAM,KAAK,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,IAAI,UAAU,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAC3C,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzF,IAAI,WAAW,EAAE,CAAC;wBACjB,WAAW,CAAC,MAAM,CACjB,gBAAgB,EAChB,CAAC,EACD,EAAE,EACF,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,EACrC,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CACvD,CAAC;oBACH,CAAC;gBACF,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAC5B,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;YAC9B,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACjE,cAAc,CACb,GAAG,UAAU,GAAG,EAChB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC9D,WAAW,EACX,KAAK,CACL,CAAC;YACF,IAAI,WAA+B,CAAC;YACpC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3B,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAC7E,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC3B,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,EACpG,WAAW,EACX,KAAK,CACL,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC;gBACzD,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,EAC5F,WAAW,EACX,KAAK,CACL,CAAC;YACH,CAAC;iBAAM,IAAI,aAAa,EAAE,CAAC;gBAC1B,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CACP,KAAK,EACL,SAAS,CACR,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC1C,SAAS,CAAC,eAAe,EAAE,mBAAmB,CAAC,EAC/C,SAAS,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CACxC,CACD,EACD,WAAW,EACX,KAAK,CACL,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACpB,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CACP,KAAK,EACL,SAAS,CACR,GAAG,UAAU,SAAS,EACtB,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,EAC9C,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC,EAC1C,SAAS,CAAC,oBAAoB,EAAE,UAAU,CAAC,EAC3C,cAAc,CAAC,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,EAAE,WAAW,CAAC,EAChF,SAAS,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CACxC,CACD,EACD,WAAW,EACX,KAAK,CACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,cAAc,CACb,GAAG,EACH,KAAK,CAAC,EAAE,CACP,KAAK,EACL,SAAS,CACR,GAAG,UAAU,SAAS,EACtB,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC,EAC1C,SAAS,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EACzC,cAAc,CAAC,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,EAAE,WAAW,CAAC,EAChF,SAAS,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CACxC,CACD,EACD,WAAW,EACX,KAAK,CACL,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YAC3C,IAAI,UAAU,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;YAC1D,IAAI,iBAAiB,KAAK,SAAS;gBAAE,UAAU,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;iBACrF,IAAI,WAAW,KAAK,SAAS;gBAAE,UAAU,GAAG,WAAW,CAAC;iBACxD,IAAI,aAAa;gBAAE,UAAU,GAAG,QAAQ,CAAC;YAC9C,OAAO,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC;QAC7F,CAAC;QAED,OAAO;YACN,IAAI,OAAO;gBACV,OAAO,aAAa,CAAC;YACtB,CAAC;YACD,IAAI,OAAO,CAAC,KAAc;gBACzB,aAAa,GAAG,KAAK,CAAC;gBACtB,eAAe,EAAE,CAAC;YACnB,CAAC;YACD,MAAM;YACN,UAAU,EAAE,GAAG,EAAE;gBAChB,KAAK,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,WAAW;YACX,OAAO;gBACN,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;SACD,CAAC;IACH,CAAC,CAAC;AACH,CAAC","sourcesContent":["import \"./keybindings.ts\";\nimport { Editor, type EditorTheme, Markdown, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { Keybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel as configuredKeyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ruleBorder, wrapWithPrefix } from \"./dialog-primitives.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { PreviewLinesCache, WidthCachedRender } from \"./render-cache.ts\";\nimport {\n\tdisplayOptions,\n\tfirstUnanswered,\n\thasAnswer,\n\thasMultiAnswer,\n\tnewQuestionState,\n\torderedAnswers,\n} from \"./state.ts\";\nimport type { DialogResult, DisplayOption, InputMode, Question, QuestionAnswer, QuestionOption } from \"./types.ts\";\n\ntype DialogView = \"question\" | \"review\";\n\nconst PREVIEW_MAX_LINES = 16;\n/**\n * Estimated non-preview rows in the stacked (narrow) layout: top/bottom rules,\n * tab strip + blank, question line + blank, up to 5 option rows with\n * descriptions, the \"Chat about this\" row, warning slot, and the hint line.\n * Reserved so the preview clamps short of the terminal height.\n */\nconst PREVIEW_CHROME_ROWS = 18;\nconst VIEWPORT_SCROLL_STEP = 4;\n\ninterface VerticalViewport {\n\tlines: string[];\n\tstart: number;\n\tmaxStart: number;\n}\n\nfunction applyVerticalViewport(\n\tlines: string[],\n\twidth: number,\n\tterminalRows: number,\n\ttheme: Theme,\n\toptions: { anchorLine?: number; preferredStart?: number } = {},\n): VerticalViewport {\n\tconst maxRows = Math.max(1, Math.floor(terminalRows));\n\tif (lines.length <= maxRows) return { lines, start: 0, maxStart: 0 };\n\tif (maxRows < 5) {\n\t\tconst anchor = Math.max(0, Math.min(lines.length - 1, options.anchorLine ?? 0));\n\t\tconst start = Math.max(0, Math.min(lines.length - maxRows, anchor - Math.floor(maxRows / 2)));\n\t\treturn { lines: lines.slice(start, start + maxRows), start, maxStart: lines.length - maxRows };\n\t}\n\n\tconst first = lines[0] ?? \"\";\n\tconst last = lines[lines.length - 1] ?? \"\";\n\tconst body = lines.slice(1, -1);\n\tconst contentRows = maxRows - 4;\n\tconst maxStart = Math.max(0, body.length - contentRows);\n\tconst anchorInBody = Math.max(0, Math.min(body.length - 1, (options.anchorLine ?? 1) - 1));\n\tconst requestedStart = options.preferredStart ?? Math.max(0, anchorInBody - Math.floor(contentRows / 2));\n\tconst start = Math.max(0, Math.min(maxStart, requestedStart));\n\tconst bottomHidden = Math.max(0, body.length - start - contentRows);\n\tconst indicator = (text: string) => theme.fg(\"dim\", truncateToWidth(text, Math.max(1, width)));\n\treturn {\n\t\tlines: [\n\t\t\tfirst,\n\t\t\tstart > 0 ? indicator(`↑ ${start} rows hidden`) : \"\",\n\t\t\t...body.slice(start, start + contentRows),\n\t\t\tbottomHidden > 0 ? indicator(`↓ ${bottomHidden} rows hidden`) : \"\",\n\t\t\tlast,\n\t\t],\n\t\tstart,\n\t\tmaxStart,\n\t};\n}\n\nexport function createQuestionDialog(questions: Question[], signal?: AbortSignal) {\n\treturn (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: DialogResult) => void) => {\n\t\tlet currentIdx = 0;\n\t\tlet view: DialogView = \"question\";\n\t\tlet inputMode: InputMode;\n\t\tlet noteTarget: string | undefined;\n\t\tlet notesSnapshot: { prior: QuestionAnswer | undefined } | undefined;\n\t\tlet reviewScrollOffset = 0;\n\t\tlet reviewMaxScrollOffset = 0;\n\t\tlet dialogFocused = false;\n\t\tlet footerFocused = false;\n\t\tlet finished = false;\n\t\tconst cache = new WidthCachedRender();\n\t\tconst previewCache = new PreviewLinesCache();\n\t\tconst states = questions.map(() => newQuestionState());\n\t\tconst optionsByQuestion = questions.map((question) => displayOptions(question));\n\n\t\tconst editorTheme: EditorTheme = {\n\t\t\tborderColor: (s) => theme.fg(\"accent\", s),\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\tselectedText: (t) => theme.fg(\"accent\", t),\n\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t},\n\t\t};\n\t\tconst editor = new Editor(tui, editorTheme);\n\n\t\tconst currentQuestion = () => questions[currentIdx];\n\t\tconst currentState = () => states[currentIdx];\n\t\tconst currentOptions = () => optionsByQuestion[currentIdx];\n\t\tconst keyMatches = (data: string, keybinding: Keybinding) => keybindings.matches(data, keybinding);\n\t\tconst keyLabel = (keybinding: Keybinding) => configuredKeyLabel(keybinding, { keybindings });\n\t\tconst keyAction = (keybinding: Keybinding, action: string) => {\n\t\t\tconst label = keyLabel(keybinding);\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\t// Editor reads the global TUI manager internally, while dialog controls use the injected manager.\n\t\tconst editorSubmitAction = (action: string) => {\n\t\t\tconst label = configuredKeyLabel(\"tui.input.submit\");\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\tconst keyGroupAction = (bindings: Keybinding[], action: string) => {\n\t\t\tconst labels = bindings.map(keyLabel).filter(Boolean).join(\"/\");\n\t\t\treturn labels ? `${labels} ${action}` : \"\";\n\t\t};\n\t\tconst joinHints = (...hints: string[]) => hints.filter(Boolean).join(\" • \");\n\n\t\tfunction finish(result: DialogResult): void {\n\t\t\tif (finished) return;\n\t\t\tfinished = true;\n\t\t\tdone(result);\n\t\t}\n\n\t\tconst onAbort = () => finish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\tif (signal?.aborted) onAbort();\n\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tfunction refresh(): void {\n\t\t\tcache.invalidate();\n\t\t\ttui.requestRender();\n\t\t}\n\n\t\tfunction syncEditorFocus(): void {\n\t\t\teditor.focused = dialogFocused && inputMode !== undefined;\n\t\t}\n\n\t\tfunction setCurrentIdx(index: number): void {\n\t\t\tcurrentIdx = Math.max(0, Math.min(questions.length - 1, index));\n\t\t\tview = \"question\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tnotesSnapshot = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction clearWarning(): void {\n\t\t\tcurrentState().warning = undefined;\n\t\t}\n\n\t\tfunction focusedOption(): DisplayOption | undefined {\n\t\t\treturn currentOptions()[currentState().optionIndex];\n\t\t}\n\n\t\tfunction showReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before reviewing your answers.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tview = \"review\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction advanceAfterAnswer(): void {\n\t\t\tif (questions.length === 1 && !currentQuestion().multiSelect) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing === undefined) {\n\t\t\t\tshowReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentIdx(missing);\n\t\t}\n\n\t\tfunction beginCustomInput(): void {\n\t\t\tconst state = currentState();\n\t\t\tinputMode = \"custom\";\n\t\t\tnoteTarget = undefined;\n\t\t\tconst existingSingle = state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined;\n\t\t\teditor.setText(state.customAnswer?.text ?? existingSingle ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction selectSingleOption(option: QuestionOption): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tstate.singleAnswer = {\n\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\tquestion: question.question,\n\t\t\t\theader: question.header,\n\t\t\t\tkind: \"option\",\n\t\t\t\tanswer: option.label,\n\t\t\t\t...(option.preview ? { preview: option.preview } : {}),\n\t\t\t};\n\t\t\tstate.warning = undefined;\n\t\t}\n\n\t\tfunction beginNotesInput(): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst option = focusedOption();\n\t\t\tif (!option || option.kind === \"other\") {\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (question.multiSelect && !state.multiSelected.has(option.optionIndex)) {\n\t\t\t\tstate.warning = \"Select the option first, then add notes.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!question.multiSelect) {\n\t\t\t\tnotesSnapshot = { prior: state.singleAnswer };\n\t\t\t\tselectSingleOption(option);\n\t\t\t}\n\t\t\tinputMode = \"notes\";\n\t\t\tnoteTarget = option.label;\n\t\t\teditor.setText(state.notesByOption.get(option.label) ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction recordSingle(option: DisplayOption): void {\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (currentState().singleAnswer?.kind === \"custom\") {\n\t\t\t\t\tadvanceAfterAnswer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselectSingleOption(option);\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction recordMulti(): void {\n\t\t\tconst state = currentState();\n\t\t\tif (!hasMultiAnswer(state)) {\n\t\t\t\tstate.warning = \"Select at least one option, type a custom answer, or cancel the questions.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstate.warning = undefined;\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction toggleMultiOption(option: DisplayOption): void {\n\t\t\tconst state = currentState();\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (state.customAnswer) {\n\t\t\t\t\tstate.customAnswer.selected = !state.customAnswer.selected;\n\t\t\t\t\tclearWarning();\n\t\t\t\t} else {\n\t\t\t\t\tconst tabKey = keyLabel(\"tui.input.tab\");\n\t\t\t\t\tstate.warning = tabKey\n\t\t\t\t\t\t? `Press ${tabKey} to type a custom answer.`\n\t\t\t\t\t\t: \"Choose Type something to type a custom answer.\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.multiSelected.has(option.optionIndex)) state.multiSelected.delete(option.optionIndex);\n\t\t\telse state.multiSelected.add(option.optionIndex);\n\t\t\tclearWarning();\n\t\t}\n\n\t\tfunction finishReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before submitting.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t}\n\n\t\teditor.onSubmit = (value) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tif (trimmed.length > QUESTION_LIMITS.userTextChars) {\n\t\t\t\tstate.warning = `Keep notes and custom answers under ${QUESTION_LIMITS.userTextChars} characters.`;\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\tif (noteTarget) {\n\t\t\t\t\tif (trimmed) state.notesByOption.set(noteTarget, trimmed);\n\t\t\t\t\telse state.notesByOption.delete(noteTarget);\n\t\t\t\t}\n\t\t\t\tinputMode = undefined;\n\t\t\t\tnoteTarget = undefined;\n\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (inputMode === \"custom\") {\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tstate.customAnswer = { text: trimmed, selected: true };\n\t\t\t\t\tstate.optionIndex = question.options.length;\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstate.singleAnswer = {\n\t\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\t\tquestion: question.question,\n\t\t\t\t\theader: question.header,\n\t\t\t\t\tkind: \"custom\",\n\t\t\t\t\tanswer: trimmed,\n\t\t\t\t};\n\t\t\t\tinputMode = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\tadvanceAfterAnswer();\n\t\t\t}\n\t\t};\n\n\t\tfunction handleReviewInput(data: string): void {\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\treviewScrollOffset = Math.max(0, reviewScrollOffset - VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\treviewScrollOffset = Math.min(reviewMaxScrollOffset, reviewScrollOffset + VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tfinishReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleQuestionInput(data: string): void {\n\t\t\tif (inputMode) {\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tif (inputMode === \"notes\" && notesSnapshot) {\n\t\t\t\t\t\tcurrentState().singleAnswer = notesSnapshot.prior;\n\t\t\t\t\t}\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\tnoteTarget = undefined;\n\t\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.handleInput(data);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tif (currentIdx > 0) setCurrentIdx(currentIdx - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorRight\")) {\n\t\t\t\tif (currentIdx < questions.length - 1) setCurrentIdx(currentIdx + 1);\n\t\t\t\telse if (firstUnanswered(states) === undefined) showReview();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = options.length - 1;\n\t\t\t\t} else if (state.optionIndex > 0) {\n\t\t\t\t\tstate.optionIndex--;\n\t\t\t\t}\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\tif (footerFocused) return;\n\t\t\t\tif (state.optionIndex < options.length - 1) state.optionIndex++;\n\t\t\t\telse footerFocused = true;\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.input.tab\")) {\n\t\t\t\tif (!footerFocused) beginNotesInput();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.length === 1 && data >= \"1\" && data <= \"9\") {\n\t\t\t\tconst index = data.charCodeAt(0) - 49;\n\t\t\t\tconst target = options[index];\n\t\t\t\tif (target) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = index;\n\t\t\t\t\tclearWarning();\n\t\t\t\t\tif (currentQuestion().multiSelect) {\n\t\t\t\t\t\ttoggleMultiOption(target);\n\t\t\t\t\t\trefresh();\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecordSingle(target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (footerFocused) {\n\t\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"needs_clarification\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst option = options[state.optionIndex];\n\t\t\tif (question.multiSelect && keyMatches(data, \"app.list.toggle\")) {\n\t\t\t\tif (option) toggleMultiOption(option);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tif (option?.kind === \"other\" && !state.customAnswer) {\n\t\t\t\t\t\tbeginCustomInput();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecordMulti();\n\t\t\t\t} else if (option) recordSingle(option);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t}\n\t\t}\n\n\t\tfunction handleInput(data: string): void {\n\t\t\tif (view === \"review\") handleReviewInput(data);\n\t\t\telse handleQuestionInput(data);\n\t\t}\n\n\t\tfunction render(width: number): string[] {\n\t\t\treturn cache.get(width, tui.terminal.rows, compute);\n\t\t}\n\n\t\tfunction renderTabs(renderWidth: number, lines: string[]): void {\n\t\t\tif (questions.length < 2) return;\n\t\t\tconst tabCount = questions.length + 1;\n\t\t\tconst headerWidth = Math.max(4, Math.floor((renderWidth - tabCount * 5) / tabCount));\n\t\t\tconst tabs = [\n\t\t\t\t...questions.map((question, index) => {\n\t\t\t\t\tconst answered = hasAnswer(states[index]);\n\t\t\t\t\tconst label = ` ${answered ? \"■\" : \"□\"} ${truncateToWidth(question.header, headerWidth)} `;\n\t\t\t\t\tif (view === \"question\" && index === currentIdx) {\n\t\t\t\t\t\treturn theme.bg(\"selectedBg\", theme.fg(answered ? \"success\" : \"text\", label));\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(answered ? \"success\" : \"muted\", label);\n\t\t\t\t}),\n\t\t\t\tview === \"review\"\n\t\t\t\t\t? theme.bg(\"selectedBg\", theme.fg(\"text\", \" ✓ Submit \"))\n\t\t\t\t\t: theme.fg(firstUnanswered(states) === undefined ? \"success\" : \"dim\", \" ✓ Submit \"),\n\t\t\t].join(\" \");\n\t\t\twrapWithPrefix(\" \", tabs, renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tfunction previewLines(previewText: string, width: number, terminalRows: number): string[] {\n\t\t\tconst maxLines = Math.max(4, Math.min(PREVIEW_MAX_LINES, terminalRows - PREVIEW_CHROME_ROWS));\n\t\t\treturn previewCache.get(previewText, width, maxLines, () => {\n\t\t\t\tconst markdown = new Markdown(previewText, 1, 0, getMarkdownTheme());\n\t\t\t\tconst rendered = markdown.render(Math.max(1, width));\n\t\t\t\tif (rendered.length <= maxLines) return rendered;\n\t\t\t\treturn [\n\t\t\t\t\t...rendered.slice(0, maxLines),\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(`… ${rendered.length - maxLines} preview lines hidden`, Math.max(1, width)),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t\t}\n\n\t\t/** Multi-select checkbox marker; the other row shows no box until a custom answer exists. */\n\t\tfunction multiMarker(option: DisplayOption, checked: boolean, hasCustomAnswer: boolean): string {\n\t\t\tif (option.kind === \"other\" && !hasCustomAnswer) return \" \";\n\t\t\treturn checked ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t}\n\n\t\tfunction renderReview(renderWidth: number, lines: string[]): void {\n\t\t\twrapWithPrefix(\" \", theme.fg(\"accent\", \"Review answers\"), renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t\tfor (const answer of orderedAnswers(questions, states)) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"text\", `${answer.questionIndex + 1}. ${answer.question}`),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t\tconst response =\n\t\t\t\t\tanswer.kind === \"multi\"\n\t\t\t\t\t\t? (answer.selected?.join(\", \") ?? \"(no input)\")\n\t\t\t\t\t\t: (answer.answer ?? \"(no input)\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"success\", response), renderWidth, lines);\n\t\t\t\tfor (const note of answer.notes ?? []) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", `Note for ${note.option}: ${note.text}`), renderWidth, lines);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"dim\",\n\t\t\t\t\tjoinHints(\n\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"submit\"),\n\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"edit last question\"),\n\t\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"scroll\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t}\n\n\t\tfunction compute(width: number, terminalRows: number): string[] {\n\t\t\tconst lines: string[] = [];\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\trenderTabs(renderWidth, lines);\n\n\t\t\tif (view === \"review\") {\n\t\t\t\trenderReview(renderWidth, lines);\n\t\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\t\tconst viewport = applyVerticalViewport(lines, renderWidth, terminalRows, theme, {\n\t\t\t\t\tpreferredStart: reviewScrollOffset,\n\t\t\t\t});\n\t\t\t\treviewMaxScrollOffset = viewport.maxStart;\n\t\t\t\treviewScrollOffset = viewport.start;\n\t\t\t\treturn viewport.lines;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tconst isMulti = question.multiSelect === true;\n\t\t\tconst digitRange = `1-${Math.min(9, options.length)}`;\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\t`${theme.fg(\"accent\", question.header)} ${theme.fg(\"text\", question.question)}`,\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tlines.push(\"\");\n\n\t\t\tconst optionLines: string[] = [];\n\t\t\tlet focusedOptionStart = 0;\n\t\t\tlet focusedOptionEnd = 0;\n\t\t\tlet inputAnchorOffset: number | undefined;\n\t\t\tconst hasPreview =\n\t\t\t\tinputMode === undefined && !isMulti && options.some((option) => option.kind === \"option\" && option.preview);\n\t\t\tconst showPreviewSideBySide = hasPreview && renderWidth >= 60;\n\t\t\tconst listWidth = showPreviewSideBySide ? Math.max(20, Math.floor(renderWidth * 0.4)) : renderWidth;\n\n\t\t\tfor (let index = 0; index < options.length; index++) {\n\t\t\t\tconst option = options[index];\n\t\t\t\tconst focused = !footerFocused && index === state.optionIndex;\n\t\t\t\tconst checked =\n\t\t\t\t\tisMulti &&\n\t\t\t\t\t((option.kind === \"option\" && state.multiSelected.has(option.optionIndex)) ||\n\t\t\t\t\t\t(option.kind === \"other\" && state.customAnswer?.selected === true));\n\t\t\t\tconst selectedSingle =\n\t\t\t\t\t!isMulti &&\n\t\t\t\t\t(option.kind === \"other\"\n\t\t\t\t\t\t? state.singleAnswer?.kind === \"custom\"\n\t\t\t\t\t\t: state.singleAnswer?.answer === option.label);\n\t\t\t\tconst marker = isMulti ? multiMarker(option, checked, state.customAnswer !== undefined) : \" \";\n\t\t\t\tconst focusArrow = focused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\t\tconst note =\n\t\t\t\t\toption.kind === \"option\" && state.notesByOption.has(option.label) ? theme.fg(\"success\", \" +note\") : \"\";\n\t\t\t\tconst customText =\n\t\t\t\t\toption.kind === \"other\"\n\t\t\t\t\t\t? (state.customAnswer?.text ??\n\t\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined))\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst labelText = customText ? `${option.label} ✎ ${customText}` : option.label;\n\t\t\t\tconst label = `${index + 1}. ${labelText}${selectedSingle ? \" ✓\" : \"\"}${note}`;\n\t\t\t\tconst color = focused ? \"accent\" : selectedSingle || checked ? \"success\" : \"text\";\n\t\t\t\tif (focused) focusedOptionStart = optionLines.length;\n\t\t\t\twrapWithPrefix(`${focusArrow} ${marker} `, theme.fg(color, label), listWidth, optionLines);\n\t\t\t\tif (option.kind === \"option\" && option.description) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", option.description), listWidth, optionLines);\n\t\t\t\t}\n\t\t\t\tif (focused) focusedOptionEnd = optionLines.length;\n\t\t\t}\n\n\t\t\tif (inputMode) {\n\t\t\t\toptionLines.push(\"\");\n\t\t\t\tconst label = inputMode === \"notes\" ? `Notes for ${noteTarget ?? \"option\"}:` : \"Your answer:\";\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", label), listWidth, optionLines);\n\t\t\t\tfor (const line of editor.render(Math.max(1, listWidth - 2))) optionLines.push(` ${line}`);\n\t\t\t\tinputAnchorOffset = Math.max(0, optionLines.length - 1);\n\t\t\t}\n\n\t\t\tconst optionListStartLine = lines.length;\n\t\t\tif (showPreviewSideBySide) {\n\t\t\t\tconst gap = 2;\n\t\t\t\tconst rightWidth = renderWidth - listWidth - gap;\n\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\tconst preview = previewText\n\t\t\t\t\t? previewLines(previewText, rightWidth, terminalRows)\n\t\t\t\t\t: [theme.fg(\"dim\", \"(no preview)\")];\n\t\t\t\tconst rightLines = [...Array.from({ length: focusedOptionStart }, () => \"\"), ...preview];\n\t\t\t\tconst maxRows = Math.max(optionLines.length, rightLines.length);\n\t\t\t\tconst pad = \" \".repeat(gap);\n\t\t\t\tfor (let row = 0; row < maxRows; row++) {\n\t\t\t\t\tconst left = row < optionLines.length ? optionLines[row] : \"\";\n\t\t\t\t\tconst leftPadded = left + \" \".repeat(Math.max(0, listWidth - visibleWidth(left)));\n\t\t\t\t\tconst right = row < rightLines.length ? rightLines[row] : \"\";\n\t\t\t\t\tlines.push(`${leftPadded}${pad}${right}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (hasPreview) {\n\t\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\t\tif (previewText) {\n\t\t\t\t\t\toptionLines.splice(\n\t\t\t\t\t\t\tfocusedOptionEnd,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\truleBorder(theme, renderWidth, \"dim\"),\n\t\t\t\t\t\t\t...previewLines(previewText, renderWidth, terminalRows),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlines.push(...optionLines);\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst chatLine = lines.length;\n\t\t\tconst chatPrefix = footerFocused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\twrapWithPrefix(\n\t\t\t\t`${chatPrefix} `,\n\t\t\t\ttheme.fg(footerFocused ? \"accent\" : \"text\", \"Chat about this\"),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tlet warningLine: number | undefined;\n\t\t\tif (state.warning) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\twarningLine = lines.length;\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"warning\", state.warning), renderWidth, lines);\n\t\t\t}\n\t\t\tlines.push(\"\");\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(\"save notes\"), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (inputMode === \"custom\") {\n\t\t\t\tconst hint = isMulti ? \"save custom answer\" : \"continue\";\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(hint), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (footerFocused) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"discuss\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.up\", \"return to options\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (isMulti) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} toggle`,\n\t\t\t\t\t\t\tkeyAction(\"app.list.toggle\", \"toggle focused\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"continue\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} select`,\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"select\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\tlet anchorLine = optionListStartLine + focusedOptionStart;\n\t\t\tif (inputAnchorOffset !== undefined) anchorLine = optionListStartLine + inputAnchorOffset;\n\t\t\telse if (warningLine !== undefined) anchorLine = warningLine;\n\t\t\telse if (footerFocused) anchorLine = chatLine;\n\t\t\treturn applyVerticalViewport(lines, renderWidth, terminalRows, theme, { anchorLine }).lines;\n\t\t}\n\n\t\treturn {\n\t\t\tget focused() {\n\t\t\t\treturn dialogFocused;\n\t\t\t},\n\t\t\tset focused(value: boolean) {\n\t\t\t\tdialogFocused = value;\n\t\t\t\tsyncEditorFocus();\n\t\t\t},\n\t\t\trender,\n\t\t\tinvalidate: () => {\n\t\t\t\tcache.invalidate();\n\t\t\t},\n\t\t\thandleInput,\n\t\t\tdispose() {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./keybindings.ts\";\nimport {\n\tCURSOR_MARKER,\n\tEditor,\n\ttype EditorTheme,\n\tMarkdown,\n\ttype TUI,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { Keybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel as configuredKeyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { DetailPane } from \"./detail-pane.ts\";\nimport { ruleBorder, wrapWithPrefix } from \"./dialog-primitives.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { moreOptionsHint, type WindowItem, windowItems } from \"./option-window.ts\";\nimport { PreviewLinesCache, WidthCachedRender } from \"./render-cache.ts\";\nimport {\n\tdisplayOptions,\n\tfirstUnanswered,\n\thasAnswer,\n\thasMultiAnswer,\n\tnewQuestionState,\n\torderedAnswers,\n} from \"./state.ts\";\nimport type { DialogResult, DisplayOption, InputMode, Question, QuestionAnswer, QuestionOption } from \"./types.ts\";\n\ntype DialogView = \"question\" | \"review\";\n\n/**\n * The dialog replaces the editor in the bottom dock, and the dock grows with its\n * content. Capping the dialog at half the terminal keeps the transcript (often the\n * assistant reply the question refers to) readable while the dialog is open.\n */\nconst DIALOG_MAX_FRACTION = 0.5;\nconst DIALOG_MIN_ROWS = 16;\nconst VIEWPORT_SCROLL_STEP = 4;\n\ninterface VerticalViewport {\n\tlines: string[];\n\tstart: number;\n\tmaxStart: number;\n}\n\nfunction dialogRowBudget(terminalRows: number): number {\n\tconst rows = Math.max(1, Math.floor(terminalRows));\n\treturn Math.min(rows, Math.max(DIALOG_MIN_ROWS, Math.floor(rows * DIALOG_MAX_FRACTION)));\n}\n\n/** Clamp `lines` to `maxRows` between the first and last line, scrolling around the anchor. */\nfunction applyVerticalViewport(\n\tlines: string[],\n\twidth: number,\n\tmaxRows: number,\n\ttheme: Theme,\n\toptions: { anchorLine?: number; preferredStart?: number } = {},\n): VerticalViewport {\n\tif (lines.length <= maxRows) return { lines, start: 0, maxStart: 0 };\n\tif (maxRows < 5) {\n\t\tconst anchor = Math.max(0, Math.min(lines.length - 1, options.anchorLine ?? 0));\n\t\tconst start = Math.max(0, Math.min(lines.length - maxRows, anchor - Math.floor(maxRows / 2)));\n\t\treturn { lines: lines.slice(start, start + maxRows), start, maxStart: lines.length - maxRows };\n\t}\n\n\tconst first = lines[0] ?? \"\";\n\tconst last = lines[lines.length - 1] ?? \"\";\n\tconst body = lines.slice(1, -1);\n\tconst contentRows = maxRows - 4;\n\tconst maxStart = Math.max(0, body.length - contentRows);\n\tconst anchorInBody = Math.max(0, Math.min(body.length - 1, (options.anchorLine ?? 1) - 1));\n\tconst requestedStart = options.preferredStart ?? Math.max(0, anchorInBody - Math.floor(contentRows / 2));\n\tconst start = Math.max(0, Math.min(maxStart, requestedStart));\n\tconst bottomHidden = Math.max(0, body.length - start - contentRows);\n\tconst indicator = (text: string) => theme.fg(\"dim\", truncateToWidth(text, Math.max(1, width)));\n\treturn {\n\t\tlines: [\n\t\t\tfirst,\n\t\t\tstart > 0 ? indicator(`↑ ${start} rows hidden`) : \"\",\n\t\t\t...body.slice(start, start + contentRows),\n\t\t\tbottomHidden > 0 ? indicator(`↓ ${bottomHidden} rows hidden`) : \"\",\n\t\t\tlast,\n\t\t],\n\t\tstart,\n\t\tmaxStart,\n\t};\n}\n\nexport function createQuestionDialog(questions: Question[], signal?: AbortSignal) {\n\treturn (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: DialogResult) => void) => {\n\t\tlet currentIdx = 0;\n\t\tlet view: DialogView = \"question\";\n\t\tlet inputMode: InputMode;\n\t\tlet noteTarget: string | undefined;\n\t\tlet notesSnapshot: { prior: QuestionAnswer | undefined } | undefined;\n\t\tlet reviewScrollOffset = 0;\n\t\tlet reviewMaxScrollOffset = 0;\n\t\tlet dialogFocused = false;\n\t\tlet footerFocused = false;\n\t\tlet finished = false;\n\t\tconst cache = new WidthCachedRender();\n\t\tconst previewCache = new PreviewLinesCache();\n\t\tconst details = new DetailPane();\n\t\tconst states = questions.map(() => newQuestionState());\n\t\tconst optionsByQuestion = questions.map((question) => displayOptions(question));\n\n\t\tconst editorTheme: EditorTheme = {\n\t\t\tborderColor: (s) => theme.fg(\"accent\", s),\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\tselectedText: (t) => theme.fg(\"accent\", t),\n\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t},\n\t\t};\n\t\tconst editor = new Editor(tui, editorTheme);\n\n\t\tconst currentQuestion = () => questions[currentIdx];\n\t\tconst currentState = () => states[currentIdx];\n\t\tconst currentOptions = () => optionsByQuestion[currentIdx];\n\t\tconst keyMatches = (data: string, keybinding: Keybinding) => keybindings.matches(data, keybinding);\n\t\tconst keyLabel = (keybinding: Keybinding) => configuredKeyLabel(keybinding, { keybindings });\n\t\tconst keyAction = (keybinding: Keybinding, action: string) => {\n\t\t\tconst label = keyLabel(keybinding);\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\t// Editor reads the global TUI manager internally, while dialog controls use the injected manager.\n\t\tconst editorSubmitAction = (action: string) => {\n\t\t\tconst label = configuredKeyLabel(\"tui.input.submit\");\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\tconst keyGroupAction = (bindings: Keybinding[], action: string) => {\n\t\t\tconst labels = bindings.map(keyLabel).filter(Boolean).join(\"/\");\n\t\t\treturn labels ? `${labels} ${action}` : \"\";\n\t\t};\n\t\tconst joinHints = (...hints: string[]) => hints.filter(Boolean).join(\" • \");\n\n\t\tfunction finish(result: DialogResult): void {\n\t\t\tif (finished) return;\n\t\t\tfinished = true;\n\t\t\tdone(result);\n\t\t}\n\n\t\tconst onAbort = () => finish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\tif (signal?.aborted) onAbort();\n\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tfunction refresh(): void {\n\t\t\tcache.invalidate();\n\t\t\ttui.requestRender();\n\t\t}\n\n\t\tfunction syncEditorFocus(): void {\n\t\t\teditor.focused = dialogFocused && inputMode !== undefined;\n\t\t}\n\n\t\tfunction setCurrentIdx(index: number): void {\n\t\t\tdetails.reset();\n\t\t\tcurrentIdx = Math.max(0, Math.min(questions.length - 1, index));\n\t\t\tview = \"question\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tnotesSnapshot = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction clearWarning(): void {\n\t\t\tcurrentState().warning = undefined;\n\t\t}\n\n\t\tfunction focusedOption(): DisplayOption | undefined {\n\t\t\treturn currentOptions()[currentState().optionIndex];\n\t\t}\n\n\t\tfunction showReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before reviewing your answers.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tview = \"review\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\treviewScrollOffset = 0;\n\t\t\treviewMaxScrollOffset = 0;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction advanceAfterAnswer(): void {\n\t\t\tif (questions.length === 1 && !currentQuestion().multiSelect) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing === undefined) {\n\t\t\t\tshowReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentIdx(missing);\n\t\t}\n\n\t\tfunction beginCustomInput(): void {\n\t\t\tdetails.reset();\n\t\t\tconst state = currentState();\n\t\t\tinputMode = \"custom\";\n\t\t\tnoteTarget = undefined;\n\t\t\tconst existingSingle = state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined;\n\t\t\teditor.setText(state.customAnswer?.text ?? existingSingle ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction selectSingleOption(option: QuestionOption): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tstate.singleAnswer = {\n\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\tquestion: question.question,\n\t\t\t\theader: question.header,\n\t\t\t\tkind: \"option\",\n\t\t\t\tanswer: option.label,\n\t\t\t\t...(option.preview ? { preview: option.preview } : {}),\n\t\t\t};\n\t\t\tstate.warning = undefined;\n\t\t}\n\n\t\tfunction beginNotesInput(): void {\n\t\t\tdetails.reset();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst option = focusedOption();\n\t\t\tif (!option || option.kind === \"other\") {\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (question.multiSelect && !state.multiSelected.has(option.optionIndex)) {\n\t\t\t\tstate.warning = \"Select the option first, then add notes.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!question.multiSelect) {\n\t\t\t\tnotesSnapshot = { prior: state.singleAnswer };\n\t\t\t\tselectSingleOption(option);\n\t\t\t}\n\t\t\tinputMode = \"notes\";\n\t\t\tnoteTarget = option.label;\n\t\t\teditor.setText(state.notesByOption.get(option.label) ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction recordSingle(option: DisplayOption): void {\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (currentState().singleAnswer?.kind === \"custom\") {\n\t\t\t\t\tadvanceAfterAnswer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselectSingleOption(option);\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction recordMulti(): void {\n\t\t\tconst state = currentState();\n\t\t\tif (!hasMultiAnswer(state)) {\n\t\t\t\tstate.warning = \"Select at least one option, type a custom answer, or cancel the questions.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstate.warning = undefined;\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction toggleMultiOption(option: DisplayOption): void {\n\t\t\tconst state = currentState();\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (state.customAnswer) {\n\t\t\t\t\tstate.customAnswer.selected = !state.customAnswer.selected;\n\t\t\t\t\tclearWarning();\n\t\t\t\t} else {\n\t\t\t\t\tconst tabKey = keyLabel(\"tui.input.tab\");\n\t\t\t\t\tstate.warning = tabKey\n\t\t\t\t\t\t? `Press ${tabKey} to type a custom answer.`\n\t\t\t\t\t\t: \"Choose Type something to type a custom answer.\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.multiSelected.has(option.optionIndex)) state.multiSelected.delete(option.optionIndex);\n\t\t\telse state.multiSelected.add(option.optionIndex);\n\t\t\tclearWarning();\n\t\t}\n\n\t\tfunction finishReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before submitting.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t}\n\n\t\teditor.onSubmit = (value) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tif (trimmed.length > QUESTION_LIMITS.userTextChars) {\n\t\t\t\tstate.warning = `Keep notes and custom answers under ${QUESTION_LIMITS.userTextChars} characters.`;\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\tif (noteTarget) {\n\t\t\t\t\tif (trimmed) state.notesByOption.set(noteTarget, trimmed);\n\t\t\t\t\telse state.notesByOption.delete(noteTarget);\n\t\t\t\t}\n\t\t\t\tinputMode = undefined;\n\t\t\t\tnoteTarget = undefined;\n\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (inputMode === \"custom\") {\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tstate.customAnswer = { text: trimmed, selected: true };\n\t\t\t\t\tstate.optionIndex = question.options.length;\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstate.singleAnswer = {\n\t\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\t\tquestion: question.question,\n\t\t\t\t\theader: question.header,\n\t\t\t\t\tkind: \"custom\",\n\t\t\t\t\tanswer: trimmed,\n\t\t\t\t};\n\t\t\t\tinputMode = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\tadvanceAfterAnswer();\n\t\t\t}\n\t\t};\n\n\t\tfunction handleReviewInput(data: string): void {\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\treviewScrollOffset = Math.max(0, reviewScrollOffset - VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\treviewScrollOffset = Math.min(reviewMaxScrollOffset, reviewScrollOffset + VIEWPORT_SCROLL_STEP);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tfinishReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleQuestionInput(data: string): void {\n\t\t\tif (inputMode) {\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tif (inputMode === \"notes\" && notesSnapshot) {\n\t\t\t\t\t\tcurrentState().singleAnswer = notesSnapshot.prior;\n\t\t\t\t\t}\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\tnoteTarget = undefined;\n\t\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.handleInput(data);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tif (currentIdx > 0) setCurrentIdx(currentIdx - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"app.question.pageUp\") || keyMatches(data, \"app.question.pageDown\")) {\n\t\t\t\t// Resolve the current pane's height even if another key arrived before a redraw.\n\t\t\t\trender(tui.terminal.columns);\n\t\t\t\tdetails.page(keyMatches(data, \"app.question.pageUp\") ? -1 : 1);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorRight\")) {\n\t\t\t\tif (currentIdx < questions.length - 1) setCurrentIdx(currentIdx + 1);\n\t\t\t\telse if (firstUnanswered(states) === undefined) showReview();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = options.length - 1;\n\t\t\t\t} else if (state.optionIndex > 0) {\n\t\t\t\t\tstate.optionIndex--;\n\t\t\t\t}\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\tif (footerFocused) return;\n\t\t\t\tif (state.optionIndex < options.length - 1) state.optionIndex++;\n\t\t\t\telse footerFocused = true;\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.input.tab\")) {\n\t\t\t\tif (!footerFocused) beginNotesInput();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.length === 1 && data >= \"1\" && data <= \"9\") {\n\t\t\t\tconst index = data.charCodeAt(0) - 49;\n\t\t\t\tconst target = options[index];\n\t\t\t\tif (target) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = index;\n\t\t\t\t\tclearWarning();\n\t\t\t\t\tif (currentQuestion().multiSelect) {\n\t\t\t\t\t\ttoggleMultiOption(target);\n\t\t\t\t\t\trefresh();\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecordSingle(target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (footerFocused) {\n\t\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"needs_clarification\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst option = options[state.optionIndex];\n\t\t\tif (question.multiSelect && keyMatches(data, \"app.list.toggle\")) {\n\t\t\t\tif (option) toggleMultiOption(option);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tif (option?.kind === \"other\" && !state.customAnswer) {\n\t\t\t\t\t\tbeginCustomInput();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecordMulti();\n\t\t\t\t} else if (option) recordSingle(option);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t}\n\t\t}\n\n\t\tfunction handleInput(data: string): void {\n\t\t\tif (view === \"review\") handleReviewInput(data);\n\t\t\telse handleQuestionInput(data);\n\t\t}\n\n\t\tfunction render(width: number): string[] {\n\t\t\treturn cache.get(width, tui.terminal.rows, compute);\n\t\t}\n\n\t\tfunction renderTabs(renderWidth: number, lines: string[]): void {\n\t\t\tif (questions.length < 2) return;\n\t\t\tconst tabCount = questions.length + 1;\n\t\t\tconst headerWidth = Math.max(4, Math.floor((renderWidth - tabCount * 5) / tabCount));\n\t\t\tconst tabs = [\n\t\t\t\t...questions.map((question, index) => {\n\t\t\t\t\tconst answered = hasAnswer(states[index]);\n\t\t\t\t\tconst label = ` ${answered ? \"■\" : \"□\"} ${truncateToWidth(question.header, headerWidth)} `;\n\t\t\t\t\tif (view === \"question\" && index === currentIdx) {\n\t\t\t\t\t\treturn theme.bg(\"selectedBg\", theme.fg(answered ? \"success\" : \"text\", label));\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(answered ? \"success\" : \"muted\", label);\n\t\t\t\t}),\n\t\t\t\tview === \"review\"\n\t\t\t\t\t? theme.bg(\"selectedBg\", theme.fg(\"text\", \" ✓ Submit \"))\n\t\t\t\t\t: theme.fg(firstUnanswered(states) === undefined ? \"success\" : \"dim\", \" ✓ Submit \"),\n\t\t\t].join(\" \");\n\t\t\twrapWithPrefix(\" \", tabs, renderWidth, lines);\n\t\t}\n\n\t\tfunction previewLines(previewText: string, width: number): string[] {\n\t\t\treturn previewCache.get(previewText, width, () =>\n\t\t\t\tnew Markdown(previewText, 1, 0, getMarkdownTheme()).render(Math.max(1, width)),\n\t\t\t);\n\t\t}\n\n\t\t/** Multi-select checkbox marker; the other row shows no box until a custom answer exists. */\n\t\tfunction multiMarker(option: DisplayOption, checked: boolean, hasCustomAnswer: boolean): string {\n\t\t\tif (option.kind === \"other\" && !hasCustomAnswer) return \" \";\n\t\t\treturn checked ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t}\n\n\t\tfunction renderReview(renderWidth: number, lines: string[]): void {\n\t\t\twrapWithPrefix(\" \", theme.fg(\"accent\", \"Review answers\"), renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t\tfor (const answer of orderedAnswers(questions, states)) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"text\", `${answer.questionIndex + 1}. ${answer.question}`),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t\tconst response =\n\t\t\t\t\tanswer.kind === \"multi\"\n\t\t\t\t\t\t? (answer.selected?.join(\", \") ?? \"(no input)\")\n\t\t\t\t\t\t: (answer.answer ?? \"(no input)\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"success\", response), renderWidth, lines);\n\t\t\t\tfor (const note of answer.notes ?? []) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", `Note for ${note.option}: ${note.text}`), renderWidth, lines);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"dim\",\n\t\t\t\t\tjoinHints(\n\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"submit\"),\n\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"edit last question\"),\n\t\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"scroll\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t}\n\n\t\t/** Chat row, warning, and key hints: always visible below the scrolling option area. */\n\t\tfunction renderQuestionFooter(renderWidth: number, digitRange: string): string[] {\n\t\t\tconst state = currentState();\n\t\t\tconst isMulti = currentQuestion().multiSelect === true;\n\t\t\tconst lines: string[] = [];\n\t\t\tconst chatPrefix = footerFocused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\twrapWithPrefix(\n\t\t\t\t`${chatPrefix} `,\n\t\t\t\ttheme.fg(footerFocused ? \"accent\" : \"text\", \"Chat about this\"),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tif (state.warning) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"warning\", state.warning), renderWidth, lines);\n\t\t\t}\n\t\t\tlet hints: string;\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\thints = joinHints(editorSubmitAction(\"save notes\"), keyAction(\"tui.select.cancel\", \"back\"));\n\t\t\t} else if (inputMode === \"custom\") {\n\t\t\t\thints = joinHints(\n\t\t\t\t\teditorSubmitAction(isMulti ? \"save custom answer\" : \"continue\"),\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"back\"),\n\t\t\t\t);\n\t\t\t} else if (footerFocused) {\n\t\t\t\thints = joinHints(\n\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"discuss\"),\n\t\t\t\t\tkeyAction(\"tui.select.up\", \"return to options\"),\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t);\n\t\t\t} else if (isMulti) {\n\t\t\t\thints = joinHints(\n\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"navigate\"),\n\t\t\t\t\t`${digitRange} toggle`,\n\t\t\t\t\tkeyAction(\"app.list.toggle\", \"toggle focused\"),\n\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"continue\"),\n\t\t\t\t\tquestions.length > 1\n\t\t\t\t\t\t? keyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\")\n\t\t\t\t\t\t: \"\",\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\thints = joinHints(\n\t\t\t\t\tkeyGroupAction([\"tui.select.up\", \"tui.select.down\"], \"navigate\"),\n\t\t\t\t\t`${digitRange} select`,\n\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"select\"),\n\t\t\t\t\tquestions.length > 1\n\t\t\t\t\t\t? keyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\")\n\t\t\t\t\t\t: \"\",\n\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Wrap between actions, so a key stays beside the action it performs.\n\t\t\tlet hintLine = \"\";\n\t\t\tfor (const hint of hints.split(\" • \")) {\n\t\t\t\tconst joined = hintLine ? `${hintLine} • ${hint}` : hint;\n\t\t\t\tif (hintLine && visibleWidth(joined) > renderWidth - 1) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"dim\", hintLine), renderWidth, lines);\n\t\t\t\t\thintLine = hint;\n\t\t\t\t} else hintLine = joined;\n\t\t\t}\n\t\t\tif (hintLine) wrapWithPrefix(\" \", theme.fg(\"dim\", hintLine), renderWidth, lines);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\treturn lines;\n\t\t}\n\n\t\t/**\n\t\t * Show whole items from `optionLines` in `rows` rows around `focus`, with\n\t\t * \"more options\" hints on the sides that have hidden items. `focusRow` is the\n\t\t * row of the focused item's first line.\n\t\t */\n\t\tfunction windowOptionLines(\n\t\t\toptionLines: string[],\n\t\t\titems: WindowItem[],\n\t\t\tfocus: number,\n\t\t\trows: number,\n\t\t\twidth: number,\n\t\t): { rows: string[]; focusRow: number } {\n\t\t\tconst window = windowItems(items, focus, rows);\n\t\t\tconst rowsBefore = (count: number) => items.slice(0, count).reduce((sum, item) => sum + item.height, 0);\n\t\t\tconst from = rowsBefore(window.first);\n\t\t\tconst block = optionLines.slice(from, rowsBefore(window.last + 1));\n\t\t\tconst visible = applyVerticalViewport(block, width, window.contentRows, theme, {\n\t\t\t\tanchorLine: Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tblock.findIndex((line) => line.includes(CURSOR_MARKER)),\n\t\t\t\t),\n\t\t\t}).lines;\n\t\t\tif (!window.showAbove && !window.showBelow) return { rows: visible, focusRow: rowsBefore(focus) - from };\n\t\t\tconst hint = (direction: \"up\" | \"down\", count: number) =>\n\t\t\t\ttheme.fg(\"dim\", ` ${truncateToWidth(moreOptionsHint(direction, count), Math.max(1, width - 1))}`);\n\t\t\tconst spare = Array.from({ length: Math.max(0, window.contentRows - visible.length) }, () => \"\");\n\t\t\treturn {\n\t\t\t\trows: [\n\t\t\t\t\t...(window.showAbove ? [hint(\"up\", window.hiddenAbove)] : []),\n\t\t\t\t\t...visible,\n\t\t\t\t\t...(window.showBelow ? [hint(\"down\", window.hiddenBelow)] : []),\n\t\t\t\t\t...spare,\n\t\t\t\t],\n\t\t\t\tfocusRow: (window.showAbove ? 1 : 0) + rowsBefore(focus) - from,\n\t\t\t};\n\t\t}\n\n\t\tfunction compute(width: number, terminalRows: number): string[] {\n\t\t\tconst lines: string[] = [];\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tconst maxRows = dialogRowBudget(terminalRows);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\trenderTabs(renderWidth, lines);\n\n\t\t\tif (view === \"review\") {\n\t\t\t\trenderReview(renderWidth, lines);\n\t\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\t\tconst viewport = applyVerticalViewport(lines, renderWidth, maxRows, theme, {\n\t\t\t\t\tpreferredStart: reviewScrollOffset,\n\t\t\t\t});\n\t\t\t\treviewMaxScrollOffset = viewport.maxStart;\n\t\t\t\treviewScrollOffset = viewport.start;\n\t\t\t\treturn viewport.lines;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tconst isMulti = question.multiSelect === true;\n\t\t\twrapWithPrefix(\" \", theme.fg(\"text\", question.question), renderWidth, lines);\n\n\t\t\t// The pinned head and footer leave one bounded area for choices and reading.\n\t\t\tconst footerLines = renderQuestionFooter(renderWidth, `1-${Math.min(9, options.length)}`);\n\t\t\tconst areaRows = Math.max(1, maxRows - lines.length - footerLines.length);\n\t\t\tconst sideBySide = !inputMode && renderWidth >= 72;\n\t\t\t// Measure every authored label, reserving the six-column prefix and a checkmark.\n\t\t\t// Saved answers and focus changes must not move the divider or reflow the preview.\n\t\t\tconst listWidth = sideBySide\n\t\t\t\t? Math.min(\n\t\t\t\t\t\tMath.floor((renderWidth - 3) / 2),\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\t24,\n\t\t\t\t\t\t\t...options.map(\n\t\t\t\t\t\t\t\t(option, index) => 6 + visibleWidth(`${index + 1}. ${option.label.replace(/\\s+/gu, \" \")}`) + 2,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t: renderWidth;\n\t\t\tconst detailWidth = sideBySide ? renderWidth - listWidth - 3 : renderWidth;\n\n\t\t\tconst optionLines: string[] = [];\n\t\t\tconst items: WindowItem[] = [];\n\t\t\tlet focusItem = footerFocused ? options.length - 1 : state.optionIndex;\n\t\t\tfor (let index = 0; index < options.length; index++) {\n\t\t\t\tconst option = options[index];\n\t\t\t\tconst focused = !footerFocused && index === state.optionIndex;\n\t\t\t\tconst checked =\n\t\t\t\t\tisMulti &&\n\t\t\t\t\t((option.kind === \"option\" && state.multiSelected.has(option.optionIndex)) ||\n\t\t\t\t\t\t(option.kind === \"other\" && state.customAnswer?.selected === true));\n\t\t\t\tconst selectedSingle =\n\t\t\t\t\t!isMulti &&\n\t\t\t\t\t(option.kind === \"other\"\n\t\t\t\t\t\t? state.singleAnswer?.kind === \"custom\"\n\t\t\t\t\t\t: state.singleAnswer?.answer === option.label);\n\t\t\t\tconst marker = isMulti ? multiMarker(option, checked, state.customAnswer !== undefined) : \" \";\n\t\t\t\tconst focusArrow = focused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\t\tconst note =\n\t\t\t\t\toption.kind === \"option\" && state.notesByOption.has(option.label) ? theme.fg(\"success\", \" +note\") : \"\";\n\t\t\t\tconst customText =\n\t\t\t\t\toption.kind === \"other\"\n\t\t\t\t\t\t? (state.customAnswer?.text ??\n\t\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined))\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst labelText = (customText ? `${option.label} ✎ ${customText}` : option.label).replace(/\\s+/gu, \" \");\n\t\t\t\tconst label = `${index + 1}. ${labelText}${selectedSingle ? \" ✓\" : \"\"}${note}`;\n\t\t\t\tconst color = focused ? \"accent\" : selectedSingle || checked ? \"success\" : \"text\";\n\t\t\t\tconst row = truncateToWidth(`${focusArrow} ${marker} ${theme.fg(color, label)}`, listWidth);\n\t\t\t\toptionLines.push(\n\t\t\t\t\tfocused ? theme.bg(\"selectedBg\", row + \" \".repeat(Math.max(0, listWidth - visibleWidth(row)))) : row,\n\t\t\t\t);\n\t\t\t\titems.push({ height: 1, countsAsOption: true });\n\t\t\t}\n\n\t\t\tif (inputMode) {\n\t\t\t\tconst start = optionLines.length;\n\t\t\t\tconst label = inputMode === \"notes\" ? `Notes for ${noteTarget ?? \"option\"}:` : \"Your answer:\";\n\t\t\t\toptionLines.push(theme.fg(\"muted\", truncateToWidth(` ${label}`, listWidth)));\n\t\t\t\tfor (const line of editor.render(Math.max(1, listWidth - 2))) optionLines.push(` ${line}`);\n\t\t\t\titems.push({ height: optionLines.length - start, countsAsOption: false });\n\t\t\t\tfocusItem = items.length - 1;\n\t\t\t}\n\n\t\t\tconst regionStart = lines.length;\n\t\t\tlet focusRow: number;\n\t\t\tif (inputMode) {\n\t\t\t\tconst windowed = windowOptionLines(optionLines, items, focusItem, areaRows, renderWidth);\n\t\t\t\tfocusRow = windowed.focusRow;\n\t\t\t\tlines.push(...windowed.rows);\n\t\t\t} else {\n\t\t\t\tconst option = options[state.optionIndex];\n\t\t\t\tconst content: string[] = [];\n\t\t\t\tconst hasPreview = !footerFocused && !isMulti && option.kind === \"option\" && Boolean(option.preview);\n\t\t\t\tconst title = footerFocused ? \"Chat about this\" : `${hasPreview ? \"Preview\" : \"Details\"} · ${option.label}`;\n\t\t\t\t// The compact list may elide a long label; its full text stays readable here.\n\t\t\t\tif (\n\t\t\t\t\t!footerFocused &&\n\t\t\t\t\tvisibleWidth(`${state.optionIndex + 1}. ${option.label.replace(/\\s+/gu, \" \")}`) > listWidth - 6\n\t\t\t\t) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"text\", option.label), detailWidth, content);\n\t\t\t\t}\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\t\" \",\n\t\t\t\t\t\ttheme.fg(\"muted\", \"Discuss this question before choosing an answer.\"),\n\t\t\t\t\t\tdetailWidth,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t);\n\t\t\t\t} else if (option.kind === \"option\") {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", option.description), detailWidth, content);\n\t\t\t\t\tconst note = state.notesByOption.get(option.label);\n\t\t\t\t\tif (note) wrapWithPrefix(\" \", theme.fg(\"success\", `Note: ${note}`), detailWidth, content);\n\t\t\t\t\tif (hasPreview && option.preview) content.push(\"\", ...previewLines(option.preview, detailWidth));\n\t\t\t\t} else {\n\t\t\t\t\tconst custom =\n\t\t\t\t\t\tstate.customAnswer?.text ??\n\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined);\n\t\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\t\" \",\n\t\t\t\t\t\ttheme.fg(\"muted\", custom || \"Write your own answer instead of choosing an option.\"),\n\t\t\t\t\t\tdetailWidth,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// On narrow screens reserve reading space first, then show as many compact\n\t\t\t\t// choices as fit. The focused choice always remains in the list window.\n\t\t\t\tconst optionRows = sideBySide ? areaRows : Math.max(1, Math.min(options.length, areaRows - 4));\n\t\t\t\tconst detailRows = sideBySide ? areaRows : Math.max(1, areaRows - optionRows);\n\t\t\t\tconst left = windowOptionLines(optionLines, items, focusItem, optionRows, listWidth);\n\t\t\t\tconst right = details.render(\n\t\t\t\t\t`${currentIdx}:${state.optionIndex}:${footerFocused}`,\n\t\t\t\t\ttitle,\n\t\t\t\t\tcontent,\n\t\t\t\t\tdetailWidth,\n\t\t\t\t\tdetailRows,\n\t\t\t\t\tkeyGroupAction([\"app.question.pageUp\", \"app.question.pageDown\"], \"scroll\"),\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\tfocusRow = left.focusRow;\n\t\t\t\tif (sideBySide) {\n\t\t\t\t\tfor (let row = 0; row < Math.max(left.rows.length, right.length); row++) {\n\t\t\t\t\t\tconst leftText = left.rows[row] ?? \"\";\n\t\t\t\t\t\tconst leftPadded = leftText + \" \".repeat(Math.max(0, listWidth - visibleWidth(leftText)));\n\t\t\t\t\t\tlines.push(`${leftPadded}${theme.fg(\"dim\", \" │ \")}${right[row] ?? \"\"}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlines.push(...left.rows, ...right);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst anchorLine = regionStart + focusRow;\n\t\t\tlines.push(...footerLines);\n\t\t\t// Only a terminal too short for the pinned rows has lines left to drop here.\n\t\t\treturn applyVerticalViewport(lines, renderWidth, maxRows, theme, { anchorLine }).lines;\n\t\t}\n\n\t\treturn {\n\t\t\tget focused() {\n\t\t\t\treturn dialogFocused;\n\t\t\t},\n\t\t\tset focused(value: boolean) {\n\t\t\t\tdialogFocused = value;\n\t\t\t\tsyncEditorFocus();\n\t\t\t},\n\t\t\trender,\n\t\t\tinvalidate: () => {\n\t\t\t\tcache.invalidate();\n\t\t\t},\n\t\t\thandleInput,\n\t\t\tdispose() {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /** One block of rows in the option area: an option, or the notes/custom editor under the list. */
2
+ export interface WindowItem {
3
+ height: number;
4
+ countsAsOption: boolean;
5
+ }
6
+ export interface ItemWindow {
7
+ /** Index of the first and last visible item. */
8
+ first: number;
9
+ last: number;
10
+ /** Rows left for the visible items after reserving the hint rows. */
11
+ contentRows: number;
12
+ showAbove: boolean;
13
+ showBelow: boolean;
14
+ /** Options (not rows) outside the window. */
15
+ hiddenAbove: number;
16
+ hiddenBelow: number;
17
+ }
18
+ export declare function moreOptionsHint(direction: "up" | "down", count: number): string;
19
+ /**
20
+ * Choose the whole items to show in `rows` rows, keeping `focus` visible. Hint rows
21
+ * ("↑ N more options", "↓ N more options") are reserved only on a side that has
22
+ * hidden items, so a list that starts or ends in view gets that row back.
23
+ * An item taller than the window stays alone; the caller clips its rows.
24
+ */
25
+ export declare function windowItems(items: readonly WindowItem[], focus: number, rows: number): ItemWindow;
26
+ //# sourceMappingURL=option-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-window.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/option-window.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAsCjG"}
@@ -0,0 +1,53 @@
1
+ export function moreOptionsHint(direction, count) {
2
+ const arrow = direction === "up" ? "↑" : "↓";
3
+ if (count <= 0)
4
+ return `${arrow} more ${direction === "up" ? "above" : "below"}`;
5
+ return `${arrow} ${count} more option${count === 1 ? "" : "s"}`;
6
+ }
7
+ /**
8
+ * Choose the whole items to show in `rows` rows, keeping `focus` visible. Hint rows
9
+ * ("↑ N more options", "↓ N more options") are reserved only on a side that has
10
+ * hidden items, so a list that starts or ends in view gets that row back.
11
+ * An item taller than the window stays alone; the caller clips its rows.
12
+ */
13
+ export function windowItems(items, focus, rows) {
14
+ const count = items.length;
15
+ const total = items.reduce((sum, item) => sum + item.height, 0);
16
+ const build = (first, last, contentRows) => ({
17
+ first,
18
+ last,
19
+ contentRows,
20
+ showAbove: first > 0,
21
+ showBelow: last < count - 1,
22
+ hiddenAbove: items.slice(0, first).filter((item) => item.countsAsOption).length,
23
+ hiddenBelow: items.slice(last + 1).filter((item) => item.countsAsOption).length,
24
+ });
25
+ if (total <= rows)
26
+ return build(0, count - 1, rows);
27
+ const windowFor = (contentRows) => {
28
+ let first = focus;
29
+ let last = focus;
30
+ let used = items[focus].height;
31
+ for (let grew = true; grew;) {
32
+ grew = false;
33
+ if (last + 1 < count && used + items[last + 1].height <= contentRows) {
34
+ last++;
35
+ used += items[last].height;
36
+ grew = true;
37
+ }
38
+ if (first > 0 && used + items[first - 1].height <= contentRows) {
39
+ first--;
40
+ used += items[first].height;
41
+ grew = true;
42
+ }
43
+ }
44
+ return build(first, last, contentRows);
45
+ };
46
+ if (rows <= 2)
47
+ return { ...windowFor(Math.max(1, rows)), showAbove: false, showBelow: false };
48
+ const window = windowFor(rows - 2);
49
+ if (window.first === 0 || window.last === count - 1)
50
+ return windowFor(rows - 1);
51
+ return window;
52
+ }
53
+ //# sourceMappingURL=option-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-window.js","sourceRoot":"","sources":["../../../src/extensions/question/option-window.ts"],"names":[],"mappings":"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","sourcesContent":["/** One block of rows in the option area: an option, or the notes/custom editor under the list. */\nexport interface WindowItem {\n\theight: number;\n\tcountsAsOption: boolean;\n}\n\nexport interface ItemWindow {\n\t/** Index of the first and last visible item. */\n\tfirst: number;\n\tlast: number;\n\t/** Rows left for the visible items after reserving the hint rows. */\n\tcontentRows: number;\n\tshowAbove: boolean;\n\tshowBelow: boolean;\n\t/** Options (not rows) outside the window. */\n\thiddenAbove: number;\n\thiddenBelow: number;\n}\n\nexport function moreOptionsHint(direction: \"up\" | \"down\", count: number): string {\n\tconst arrow = direction === \"up\" ? \"↑\" : \"↓\";\n\tif (count <= 0) return `${arrow} more ${direction === \"up\" ? \"above\" : \"below\"}`;\n\treturn `${arrow} ${count} more option${count === 1 ? \"\" : \"s\"}`;\n}\n\n/**\n * Choose the whole items to show in `rows` rows, keeping `focus` visible. Hint rows\n * (\"↑ N more options\", \"↓ N more options\") are reserved only on a side that has\n * hidden items, so a list that starts or ends in view gets that row back.\n * An item taller than the window stays alone; the caller clips its rows.\n */\nexport function windowItems(items: readonly WindowItem[], focus: number, rows: number): ItemWindow {\n\tconst count = items.length;\n\tconst total = items.reduce((sum, item) => sum + item.height, 0);\n\tconst build = (first: number, last: number, contentRows: number): ItemWindow => ({\n\t\tfirst,\n\t\tlast,\n\t\tcontentRows,\n\t\tshowAbove: first > 0,\n\t\tshowBelow: last < count - 1,\n\t\thiddenAbove: items.slice(0, first).filter((item) => item.countsAsOption).length,\n\t\thiddenBelow: items.slice(last + 1).filter((item) => item.countsAsOption).length,\n\t});\n\tif (total <= rows) return build(0, count - 1, rows);\n\n\tconst windowFor = (contentRows: number): ItemWindow => {\n\t\tlet first = focus;\n\t\tlet last = focus;\n\t\tlet used = items[focus].height;\n\t\tfor (let grew = true; grew; ) {\n\t\t\tgrew = false;\n\t\t\tif (last + 1 < count && used + items[last + 1].height <= contentRows) {\n\t\t\t\tlast++;\n\t\t\t\tused += items[last].height;\n\t\t\t\tgrew = true;\n\t\t\t}\n\t\t\tif (first > 0 && used + items[first - 1].height <= contentRows) {\n\t\t\t\tfirst--;\n\t\t\t\tused += items[first].height;\n\t\t\t\tgrew = true;\n\t\t\t}\n\t\t}\n\t\treturn build(first, last, contentRows);\n\t};\n\n\tif (rows <= 2) return { ...windowFor(Math.max(1, rows)), showAbove: false, showBelow: false };\n\tconst window = windowFor(rows - 2);\n\tif (window.first === 0 || window.last === count - 1) return windowFor(rows - 1);\n\treturn window;\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Memoize rendered preview lines by (previewText, width, maxLines) so editor
3
- * keystrokes don't re-parse the preview markdown on every frame. Questions are
4
- * immutable for a dialog's lifetime and carry few previews, so no eviction.
2
+ * Memoize rendered preview lines by (previewText, width) so editor keystrokes and
3
+ * option scrolling don't re-parse the preview markdown on every frame. Questions
4
+ * are immutable for a dialog's lifetime and carry few previews, so no eviction.
5
5
  */
6
6
  export declare class PreviewLinesCache {
7
7
  private cache;
8
- get(previewText: string, width: number, maxLines: number, compute: () => string[]): string[];
8
+ get(previewText: string, width: number, compute: () => string[]): string[];
9
9
  }
10
10
  /** Cache custom dialog output by terminal dimensions. */
11
11
  export declare class WidthCachedRender {
@@ -1 +1 @@
1
- {"version":3,"file":"render-cache.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE;CAc5F;AAED,yDAAyD;AACzD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,IAAI,IAAI;IAIlB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE;CAQlG"}
1
+ {"version":3,"file":"render-cache.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE;CAa1E;AAED,yDAAyD;AACzD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,IAAI,IAAI;IAIlB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE;CAQlG"}
@@ -1,23 +1,22 @@
1
1
  /**
2
- * Memoize rendered preview lines by (previewText, width, maxLines) so editor
3
- * keystrokes don't re-parse the preview markdown on every frame. Questions are
4
- * immutable for a dialog's lifetime and carry few previews, so no eviction.
2
+ * Memoize rendered preview lines by (previewText, width) so editor keystrokes and
3
+ * option scrolling don't re-parse the preview markdown on every frame. Questions
4
+ * are immutable for a dialog's lifetime and carry few previews, so no eviction.
5
5
  */
6
6
  export class PreviewLinesCache {
7
7
  constructor() {
8
8
  this.cache = new Map();
9
9
  }
10
- get(previewText, width, maxLines, compute) {
11
- let byDimensions = this.cache.get(previewText);
12
- if (!byDimensions) {
13
- byDimensions = new Map();
14
- this.cache.set(previewText, byDimensions);
10
+ get(previewText, width, compute) {
11
+ let byWidth = this.cache.get(previewText);
12
+ if (!byWidth) {
13
+ byWidth = new Map();
14
+ this.cache.set(previewText, byWidth);
15
15
  }
16
- const key = `${width}x${maxLines}`;
17
- let lines = byDimensions.get(key);
16
+ let lines = byWidth.get(width);
18
17
  if (!lines) {
19
18
  lines = compute();
20
- byDimensions.set(key, lines);
19
+ byWidth.set(width, lines);
21
20
  }
22
21
  return lines;
23
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACS,UAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAgB1D,CAAC;IAdA,GAAG,CAAC,WAAmB,EAAE,KAAa,EAAE,QAAgB,EAAE,OAAuB;QAChF,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,OAAO,EAAE,CAAC;YAClB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,yDAAyD;AACzD,MAAM,OAAO,iBAAiB;IAK7B,UAAU;QACT,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,OAAoD;QACtF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;YAC/F,OAAO,IAAI,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD","sourcesContent":["/**\n * Memoize rendered preview lines by (previewText, width, maxLines) so editor\n * keystrokes don't re-parse the preview markdown on every frame. Questions are\n * immutable for a dialog's lifetime and carry few previews, so no eviction.\n */\nexport class PreviewLinesCache {\n\tprivate cache = new Map<string, Map<string, string[]>>();\n\n\tget(previewText: string, width: number, maxLines: number, compute: () => string[]): string[] {\n\t\tlet byDimensions = this.cache.get(previewText);\n\t\tif (!byDimensions) {\n\t\t\tbyDimensions = new Map();\n\t\t\tthis.cache.set(previewText, byDimensions);\n\t\t}\n\t\tconst key = `${width}x${maxLines}`;\n\t\tlet lines = byDimensions.get(key);\n\t\tif (!lines) {\n\t\t\tlines = compute();\n\t\t\tbyDimensions.set(key, lines);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\n/** Cache custom dialog output by terminal dimensions. */\nexport class WidthCachedRender {\n\tprivate cachedLines: string[] | undefined;\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedHeight: number | undefined;\n\n\tinvalidate(): void {\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tget(width: number, height: number, compute: (width: number, height: number) => string[]): string[] {\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === width && this.cachedHeight === height)\n\t\t\treturn this.cachedLines;\n\t\tthis.cachedLines = compute(width, height);\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedHeight = height;\n\t\treturn this.cachedLines;\n\t}\n}\n"]}
1
+ {"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACS,UAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAe1D,CAAC;IAbA,GAAG,CAAC,WAAmB,EAAE,KAAa,EAAE,OAAuB;QAC9D,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,yDAAyD;AACzD,MAAM,OAAO,iBAAiB;IAK7B,UAAU;QACT,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,OAAoD;QACtF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;YAC/F,OAAO,IAAI,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD","sourcesContent":["/**\n * Memoize rendered preview lines by (previewText, width) so editor keystrokes and\n * option scrolling don't re-parse the preview markdown on every frame. Questions\n * are immutable for a dialog's lifetime and carry few previews, so no eviction.\n */\nexport class PreviewLinesCache {\n\tprivate cache = new Map<string, Map<number, string[]>>();\n\n\tget(previewText: string, width: number, compute: () => string[]): string[] {\n\t\tlet byWidth = this.cache.get(previewText);\n\t\tif (!byWidth) {\n\t\t\tbyWidth = new Map();\n\t\t\tthis.cache.set(previewText, byWidth);\n\t\t}\n\t\tlet lines = byWidth.get(width);\n\t\tif (!lines) {\n\t\t\tlines = compute();\n\t\t\tbyWidth.set(width, lines);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\n/** Cache custom dialog output by terminal dimensions. */\nexport class WidthCachedRender {\n\tprivate cachedLines: string[] | undefined;\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedHeight: number | undefined;\n\n\tinvalidate(): void {\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tget(width: number, height: number, compute: (width: number, height: number) => string[]): string[] {\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === width && this.cachedHeight === height)\n\t\t\treturn this.cachedLines;\n\t\tthis.cachedLines = compute(width, height);\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedHeight = height;\n\t\treturn this.cachedLines;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AA6BxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyEnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AA6BxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8EnD"}
@@ -12,7 +12,7 @@ import { isStaleExtensionContextError, } from "../../core/extensions/types.js";
12
12
  import { TODO_PROMPT_GUIDELINES, TODO_PROMPT_SNIPPET, TODO_TOOL_DESCRIPTION, TODO_TOOL_LABEL, TODO_TOOL_NAME, TODOS_COMMAND_NAME, } from "./constants.js";
13
13
  import { TodoParamsSchema } from "./schema.js";
14
14
  import { createTodoStore, replayTodosFromBranch } from "./state.js";
15
- import { formatCommandList, formatTodoCall, formatTodoContent, formatTodoGroupCall } from "./view.js";
15
+ import { formatCommandList, formatTodoCall, formatTodoContent, formatTodoSummary } from "./view.js";
16
16
  import { TodoWidget } from "./widget.js";
17
17
  function safeReplay(ctx, store) {
18
18
  // Every ctx.sessionManager access stays inside the guard: a lifecycle event
@@ -38,10 +38,6 @@ export default function todo(pi) {
38
38
  parameters: TodoParamsSchema,
39
39
  constrainedSampling: { type: "json_schema", strict: "prefer" },
40
40
  executionMode: "sequential",
41
- // Consecutive todo calls collapse into one run like read/find's `explore`
42
- // group; the widget already carries the live list, so the transcript only
43
- // needs the sequence of operations.
44
- toolGroup: TODO_TOOL_NAME,
45
41
  async execute(_toolCallId, params, _signal, _onUpdate) {
46
42
  // Validation errors throw before any state mutation, so the store is
47
43
  // untouched on failure.
@@ -49,11 +45,19 @@ export default function todo(pi) {
49
45
  const text = formatTodoContent(details.change, details.state);
50
46
  return { content: [{ type: "text", text }], details };
51
47
  },
48
+ // The widget already carries the live list, so a collapsed row is one
49
+ // result-aware line and the result text appears only when expanded.
52
50
  renderCall(args, theme, context) {
53
51
  const text = context.lastComponent ?? new Text("", 0, 0);
54
- text.setText(context.toolGroupSummary
55
- ? formatTodoGroupCall(args, theme, context)
56
- : formatTodoCall(args, theme, context.expanded, context.result));
52
+ text.setText(context.expanded
53
+ ? formatTodoCall(args, theme, true, context.result)
54
+ : formatTodoSummary(args, theme, context));
55
+ return text;
56
+ },
57
+ renderResult(result, options, theme, context) {
58
+ const text = context.lastComponent ?? new Text("", 0, 0);
59
+ const output = result.content.flatMap((block) => (block.type === "text" ? [block.text] : [])).join("\n");
60
+ text.setText(options.expanded ? theme.fg("toolOutput", output) : "");
57
61
  return text;
58
62
  },
59
63
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * State is conversation-backed: every tool result carries a full v3 snapshot\n * in `details`, and lifecycle handlers replay the current branch into the\n * closure store created by createTodoStore(). Resume, /reload, and /tree\n * navigation stay aligned with the conversation without a disk database or\n * any per-session global state.\n */\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\ttype AgentToolResult,\n\ttype ExtensionAPI,\n\tisStaleExtensionContextError,\n\ttype ToolExecutionMode,\n} from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport { createTodoStore, replayTodosFromBranch, type TodoStore } from \"./state.ts\";\nimport { formatCommandList, formatTodoCall, formatTodoContent, formatTodoGroupCall } from \"./view.ts\";\nimport { TodoWidget } from \"./widget.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown> };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx, store: TodoStore): void {\n\t// Every ctx.sessionManager access stays inside the guard: a lifecycle event\n\t// can race session replacement (resume, /tree, /reload), and a stale ctx\n\t// just means another session took over — nothing left to replay for it.\n\ttry {\n\t\tstore.replaceState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tconst store = createTodoStore();\n\tlet widget: TodoWidget | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\t\t// Consecutive todo calls collapse into one run like read/find's `explore`\n\t\t// group; the widget already carries the live list, so the transcript only\n\t\t// needs the sequence of operations.\n\t\ttoolGroup: TODO_TOOL_NAME,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Validation errors throw before any state mutation, so the store is\n\t\t\t// untouched on failure.\n\t\t\tconst details = store.execute(params);\n\t\t\tconst text = formatTodoContent(details.change, details.state);\n\t\t\treturn { content: [{ type: \"text\", text }], details };\n\t\t},\n\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tcontext.toolGroupSummary\n\t\t\t\t\t? formatTodoGroupCall(args, theme, context)\n\t\t\t\t\t: formatTodoCall(args, theme, context.expanded, context.result),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show the complete todo list for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.ui.notify(formatCommandList(store.getState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx, store);\n\t\tif (ctx.hasUI) {\n\t\t\twidget ??= new TodoWidget(() => store.getState());\n\t\t\twidget.setUI(ctx.ui);\n\t\t\twidget.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx, store);\n\t\twidget?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, _ctx) => {\n\t\t// The store belongs to this extension runtime and is collected with it;\n\t\t// the next runtime restores its own store during session_start.\n\t\twidget?.dispose();\n\t\twidget = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\twidget?.update();\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * State is conversation-backed: every tool result carries a full v3 snapshot\n * in `details`, and lifecycle handlers replay the current branch into the\n * closure store created by createTodoStore(). Resume, /reload, and /tree\n * navigation stay aligned with the conversation without a disk database or\n * any per-session global state.\n */\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\ttype AgentToolResult,\n\ttype ExtensionAPI,\n\tisStaleExtensionContextError,\n\ttype ToolExecutionMode,\n} from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport { createTodoStore, replayTodosFromBranch, type TodoStore } from \"./state.ts\";\nimport { formatCommandList, formatTodoCall, formatTodoContent, formatTodoSummary } from \"./view.ts\";\nimport { TodoWidget } from \"./widget.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown> };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx, store: TodoStore): void {\n\t// Every ctx.sessionManager access stays inside the guard: a lifecycle event\n\t// can race session replacement (resume, /tree, /reload), and a stale ctx\n\t// just means another session took over — nothing left to replay for it.\n\ttry {\n\t\tstore.replaceState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tconst store = createTodoStore();\n\tlet widget: TodoWidget | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Validation errors throw before any state mutation, so the store is\n\t\t\t// untouched on failure.\n\t\t\tconst details = store.execute(params);\n\t\t\tconst text = formatTodoContent(details.change, details.state);\n\t\t\treturn { content: [{ type: \"text\", text }], details };\n\t\t},\n\n\t\t// The widget already carries the live list, so a collapsed row is one\n\t\t// result-aware line and the result text appears only when expanded.\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tcontext.expanded\n\t\t\t\t\t? formatTodoCall(args, theme, true, context.result)\n\t\t\t\t\t: formatTodoSummary(args, theme, context),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst output = result.content.flatMap((block) => (block.type === \"text\" ? [block.text] : [])).join(\"\\n\");\n\t\t\ttext.setText(options.expanded ? theme.fg(\"toolOutput\", output) : \"\");\n\t\t\treturn text;\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show the complete todo list for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.ui.notify(formatCommandList(store.getState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx, store);\n\t\tif (ctx.hasUI) {\n\t\t\twidget ??= new TodoWidget(() => store.getState());\n\t\t\twidget.setUI(ctx.ui);\n\t\t\twidget.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx, store);\n\t\twidget?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, _ctx) => {\n\t\t// The store belongs to this extension runtime and is collected with it;\n\t\t// the next runtime restores its own store during session_start.\n\t\twidget?.dispose();\n\t\twidget = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\twidget?.update();\n\t});\n}\n"]}
@@ -25,12 +25,12 @@ export declare function formatTodoContent(change: TodoChange, state: TodoState):
25
25
  type TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;
26
26
  /** One-line call summary when collapsed; headline plus details when expanded. */
27
27
  export declare function formatTodoCall(args: TodoCallArgs | undefined, theme: Theme, expanded: boolean, result?: AgentToolResult<unknown>): string;
28
- export interface TodoGroupRenderContext {
28
+ export interface TodoSummaryContext {
29
29
  isError: boolean;
30
30
  isPartial: boolean;
31
31
  result?: AgentToolResult<unknown>;
32
32
  }
33
- /** Compact result-aware summary used only by collapsed todo tool groups. */
34
- export declare function formatTodoGroupCall(args: TodoCallArgs | undefined, theme: Theme, context: TodoGroupRenderContext): string;
33
+ /** Compact result-aware one-line summary of a collapsed todo row. */
34
+ export declare function formatTodoSummary(args: TodoCallArgs | undefined, theme: Theme, context: TodoSummaryContext): string;
35
35
  export {};
36
36
  //# sourceMappingURL=view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAOpE,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIlD,CAAC;AAmBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEtD;AAsBD,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwDxF;AAID,iFAAiF;AACjF,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYhD;AAED,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,uBAAiB,CAAC;AAUhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA+B9E;AASD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAkR/D,iFAAiF;AACjF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,MAAM,CAGR;AAiID,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CAClC;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,GAC7B,MAAM,CAwBR"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAOpE,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIlD,CAAC;AAmBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEtD;AAsBD,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwDxF;AAID,iFAAiF;AACjF,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYhD;AAED,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,uBAAiB,CAAC;AAUhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA+B9E;AASD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAkR/D,iFAAiF;AACjF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,MAAM,CAGR;AAiID,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CAClC;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAyBnH"}