@di-code/coding-agent 0.1.0

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 (157) hide show
  1. package/dist/cli.d.ts +26 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +117 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config/models-loader.d.ts +4 -0
  6. package/dist/config/models-loader.d.ts.map +1 -0
  7. package/dist/config/models-loader.js +134 -0
  8. package/dist/config/models-loader.js.map +1 -0
  9. package/dist/config/models-types.d.ts +23 -0
  10. package/dist/config/models-types.d.ts.map +1 -0
  11. package/dist/config/models-types.js +2 -0
  12. package/dist/config/models-types.js.map +1 -0
  13. package/dist/config/settings-loader.d.ts +3 -0
  14. package/dist/config/settings-loader.d.ts.map +1 -0
  15. package/dist/config/settings-loader.js +130 -0
  16. package/dist/config/settings-loader.js.map +1 -0
  17. package/dist/config/settings-types.d.ts +21 -0
  18. package/dist/config/settings-types.d.ts.map +1 -0
  19. package/dist/config/settings-types.js +2 -0
  20. package/dist/config/settings-types.js.map +1 -0
  21. package/dist/core/context-builder.d.ts +8 -0
  22. package/dist/core/context-builder.d.ts.map +1 -0
  23. package/dist/core/context-builder.js +46 -0
  24. package/dist/core/context-builder.js.map +1 -0
  25. package/dist/core/model-catalog-store.d.ts +8 -0
  26. package/dist/core/model-catalog-store.d.ts.map +1 -0
  27. package/dist/core/model-catalog-store.js +68 -0
  28. package/dist/core/model-catalog-store.js.map +1 -0
  29. package/dist/core/model-composer.d.ts +4 -0
  30. package/dist/core/model-composer.d.ts.map +1 -0
  31. package/dist/core/model-composer.js +37 -0
  32. package/dist/core/model-composer.js.map +1 -0
  33. package/dist/core/session/session-manager.d.ts +44 -0
  34. package/dist/core/session/session-manager.d.ts.map +1 -0
  35. package/dist/core/session/session-manager.js +138 -0
  36. package/dist/core/session/session-manager.js.map +1 -0
  37. package/dist/core/session/session-storage.d.ts +11 -0
  38. package/dist/core/session/session-storage.d.ts.map +1 -0
  39. package/dist/core/session/session-storage.js +382 -0
  40. package/dist/core/session/session-storage.js.map +1 -0
  41. package/dist/core/session/types.d.ts +65 -0
  42. package/dist/core/session/types.d.ts.map +1 -0
  43. package/dist/core/session/types.js +28 -0
  44. package/dist/core/session/types.js.map +1 -0
  45. package/dist/core/session.d.ts +80 -0
  46. package/dist/core/session.d.ts.map +1 -0
  47. package/dist/core/session.js +262 -0
  48. package/dist/core/session.js.map +1 -0
  49. package/dist/core/tools/bash.d.ts +39 -0
  50. package/dist/core/tools/bash.d.ts.map +1 -0
  51. package/dist/core/tools/bash.js +208 -0
  52. package/dist/core/tools/bash.js.map +1 -0
  53. package/dist/core/tools/edit.d.ts +18 -0
  54. package/dist/core/tools/edit.d.ts.map +1 -0
  55. package/dist/core/tools/edit.js +107 -0
  56. package/dist/core/tools/edit.js.map +1 -0
  57. package/dist/core/tools/file-mutation-queue.d.ts +2 -0
  58. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  59. package/dist/core/tools/file-mutation-queue.js +24 -0
  60. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  61. package/dist/core/tools/path-boundary.d.ts +3 -0
  62. package/dist/core/tools/path-boundary.d.ts.map +1 -0
  63. package/dist/core/tools/path-boundary.js +62 -0
  64. package/dist/core/tools/path-boundary.js.map +1 -0
  65. package/dist/core/tools/read.d.ts +17 -0
  66. package/dist/core/tools/read.d.ts.map +1 -0
  67. package/dist/core/tools/read.js +132 -0
  68. package/dist/core/tools/read.js.map +1 -0
  69. package/dist/core/tools/write.d.ts +17 -0
  70. package/dist/core/tools/write.d.ts.map +1 -0
  71. package/dist/core/tools/write.js +45 -0
  72. package/dist/core/tools/write.js.map +1 -0
  73. package/dist/entry.d.ts +3 -0
  74. package/dist/entry.d.ts.map +1 -0
  75. package/dist/entry.js +27 -0
  76. package/dist/entry.js.map +1 -0
  77. package/dist/extensions/index.d.ts +5 -0
  78. package/dist/extensions/index.d.ts.map +1 -0
  79. package/dist/extensions/index.js +3 -0
  80. package/dist/extensions/index.js.map +1 -0
  81. package/dist/extensions/runtime.d.ts +46 -0
  82. package/dist/extensions/runtime.d.ts.map +1 -0
  83. package/dist/extensions/runtime.js +179 -0
  84. package/dist/extensions/runtime.js.map +1 -0
  85. package/dist/extensions/trust.d.ts +8 -0
  86. package/dist/extensions/trust.d.ts.map +1 -0
  87. package/dist/extensions/trust.js +59 -0
  88. package/dist/extensions/trust.js.map +1 -0
  89. package/dist/extensions/types.d.ts +46 -0
  90. package/dist/extensions/types.d.ts.map +1 -0
  91. package/dist/extensions/types.js +2 -0
  92. package/dist/extensions/types.js.map +1 -0
  93. package/dist/index.d.ts +8 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +8 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/main.d.ts +19 -0
  98. package/dist/main.d.ts.map +1 -0
  99. package/dist/main.js +198 -0
  100. package/dist/main.js.map +1 -0
  101. package/dist/modes/interactive-components.d.ts +41 -0
  102. package/dist/modes/interactive-components.d.ts.map +1 -0
  103. package/dist/modes/interactive-components.js +195 -0
  104. package/dist/modes/interactive-components.js.map +1 -0
  105. package/dist/modes/interactive-layout.d.ts +20 -0
  106. package/dist/modes/interactive-layout.d.ts.map +1 -0
  107. package/dist/modes/interactive-layout.js +34 -0
  108. package/dist/modes/interactive-layout.js.map +1 -0
  109. package/dist/modes/interactive-state.d.ts +61 -0
  110. package/dist/modes/interactive-state.d.ts.map +1 -0
  111. package/dist/modes/interactive-state.js +201 -0
  112. package/dist/modes/interactive-state.js.map +1 -0
  113. package/dist/modes/interactive.d.ts +61 -0
  114. package/dist/modes/interactive.d.ts.map +1 -0
  115. package/dist/modes/interactive.js +436 -0
  116. package/dist/modes/interactive.js.map +1 -0
  117. package/dist/modes/json.d.ts +14 -0
  118. package/dist/modes/json.d.ts.map +1 -0
  119. package/dist/modes/json.js +26 -0
  120. package/dist/modes/json.js.map +1 -0
  121. package/dist/modes/print.d.ts +10 -0
  122. package/dist/modes/print.d.ts.map +1 -0
  123. package/dist/modes/print.js +28 -0
  124. package/dist/modes/print.js.map +1 -0
  125. package/dist/provider-onboarding.d.ts +13 -0
  126. package/dist/provider-onboarding.d.ts.map +1 -0
  127. package/dist/provider-onboarding.js +162 -0
  128. package/dist/provider-onboarding.js.map +1 -0
  129. package/dist/rpc/client.d.ts +38 -0
  130. package/dist/rpc/client.d.ts.map +1 -0
  131. package/dist/rpc/client.js +153 -0
  132. package/dist/rpc/client.js.map +1 -0
  133. package/dist/rpc/index.d.ts +5 -0
  134. package/dist/rpc/index.d.ts.map +1 -0
  135. package/dist/rpc/index.js +5 -0
  136. package/dist/rpc/index.js.map +1 -0
  137. package/dist/rpc/jsonl.d.ts +17 -0
  138. package/dist/rpc/jsonl.d.ts.map +1 -0
  139. package/dist/rpc/jsonl.js +52 -0
  140. package/dist/rpc/jsonl.js.map +1 -0
  141. package/dist/rpc/protocol.d.ts +80 -0
  142. package/dist/rpc/protocol.d.ts.map +1 -0
  143. package/dist/rpc/protocol.js +231 -0
  144. package/dist/rpc/protocol.js.map +1 -0
  145. package/dist/rpc/server.d.ts +41 -0
  146. package/dist/rpc/server.d.ts.map +1 -0
  147. package/dist/rpc/server.js +186 -0
  148. package/dist/rpc/server.js.map +1 -0
  149. package/dist/rpc-entry.d.ts +3 -0
  150. package/dist/rpc-entry.d.ts.map +1 -0
  151. package/dist/rpc-entry.js +28 -0
  152. package/dist/rpc-entry.js.map +1 -0
  153. package/dist/startup.d.ts +24 -0
  154. package/dist/startup.d.ts.map +1 -0
  155. package/dist/startup.js +227 -0
  156. package/dist/startup.js.map +1 -0
  157. package/package.json +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAyC,MAAM,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAgB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgB9D,MAAM,yBAAyB,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC/D,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAEvC,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,GAAW,EAAE,GAAiB;IAClF,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;QACzF,OAAO,cAAc,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,gBAAwB,EAAE,GAAiB;IAClE,OAAO,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,gBAAwB;IAC5D,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACJ,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;aAChE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;aACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC3F,MAAM,KAAK,CAAC;IACb,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC;YACJ,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC3F,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC,CAAC,CACF,CAAC;IACF,OAAO,UAAU;SACf,MAAM,CAAC,CAAC,SAAS,EAAyD,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC;SACrG,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5G,EAAE,QAAQ,CAAC;AACb,CAAC;AAED,KAAK,UAAU,oBAAoB,CAClC,OAA6C,EAC7C,WAAmB,EACnB,GAAiB;IAEjB,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,cAAc,CAAC,gBAAgB,EAAE,GAAG,CAAC;QAC/C,GAAG,EAAE,WAAW;QAChB,GAAG;QACH,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAiB,EAAE,QAAgB;IAClE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAClF,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACzD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAClH,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,IAAI,cAAc,EAAE,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClF,OAAO,GAAG,QAAQ,KAAK,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;IAClH,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO;SAC7C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;SAC5C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SAC9B,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACT,MAAM,KAAK,GACV,QAAQ,CAAC,MAAM,GAAG,2BAA2B;QAC5C,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,GAAG,CAAC,CAAC,KAAK;QAC5D,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC;IACzB,MAAM,SAAS,GAAG,sBAAsB,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACrG,OAAO,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,cAAc,CAC5B,gBAAwB,EACxB,WAAmB,EACnB,IAAiD;IAEjD,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACJ,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;aAChE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;aACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,EAAE,CAAC;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;IAC1F,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CACjB,KAAK;SACH,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;SAC1E,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,CAAC;YACJ,KAAK,GAAG,kBAAkB,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACR,sFAAsF;QACvF,CAAC;QACD,OAAO;YACN,EAAE;YACF,KAAK;YACL,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1B,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAuB,EAAE,OAAoB;IAC1E,MAAM,YAAY,GAAoB;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YACtE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;gBAChC,WAAW;gBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,cAAc,EAAE,OAAO;aACvB,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACpC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;oBAChC,OAAO;oBACP,GAAG;oBACH,QAAQ,EAAE;wBACT;4BACC,EAAE,EAAE,aAAa;4BACjB,KAAK,EAAE,aAAa;4BACpB,WAAW,EAAE,sCAAsC;4BACnD,IAAI,EAAE,KAAK,IAAI,EAAE;gCAChB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;gCAC3D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC;oCAC/C,QAAQ;oCACR,GAAG,EAAE,WAAW;oCAChB,GAAG;oCACH,WAAW,EAAE,IAAI;iCACjB,CAAC,CAAC;gCACH,OAAO,IAAI,YAAY,CAAC;oCACvB,WAAW;oCACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;oCAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;oCACpB,GAAG,EAAE,OAAO,CAAC,GAAG;oCAChB,cAAc,EAAE,WAAW;iCAC3B,CAAC,CAAC;4BACJ,CAAC;yBACD;wBACD,GAAG,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;4BAC9E,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;4BACjE,OAAO,IAAI,YAAY,CAAC;gCACvB,WAAW;gCACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;gCAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gCACpB,GAAG,EAAE,OAAO,CAAC,GAAG;gCAChB,cAAc,EAAE,WAAW;6BAC3B,CAAC,CAAC;wBACJ,CAAC,CAAC,CAAC;qBACH;iBACD,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC;YACV,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;KACD,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { access, readdir, stat } from \"node:fs/promises\";\nimport { basename, dirname, extname, join, resolve } from \"node:path\";\nimport type { Model, Provider } from \"@di-code/ai\";\nimport { ProcessTerminal, TUI } from \"@di-code/tui\";\nimport { type CliCommand, type CliDependencies, runCli } from \"./cli.ts\";\nimport { SessionManager } from \"./core/session/session-manager.ts\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { InteractiveMode } from \"./modes/interactive.ts\";\nimport { runJsonMode } from \"./modes/json.ts\";\nimport { type PrintIo, runPrintMode } from \"./modes/print.ts\";\n\nexport interface MainRuntime {\n\treadonly provider: Provider;\n\treadonly model: Model;\n}\n\nexport interface MainOptions extends PrintIo {\n\treadonly version: string;\n\treadonly createRuntime: (\n\t\tcommand: Extract<CliCommand, { kind: \"run\" }>,\n\t) => MainRuntime | undefined | Promise<MainRuntime | undefined>;\n\treadonly allowedRoot?: string;\n\treadonly now?: () => number;\n}\n\nconst DEFAULT_SESSION_DIRECTORY = join(\".di-code\", \"sessions\");\nconst MAX_SESSION_QUESTION_LENGTH = 72;\n\nasync function openOrCreateSession(filePath: string, cwd: string, now: () => number): Promise<SessionManager> {\n\ttry {\n\t\tawait access(filePath);\n\t\treturn await SessionManager.open(filePath, { now });\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t\treturn SessionManager.create({ filePath, cwd, now, deferCreate: true });\n\t}\n}\n\nfunction newSessionPath(sessionDirectory: string, now: () => number): string {\n\treturn join(sessionDirectory, `session-${now()}-${randomUUID().slice(0, 8)}.jsonl`);\n}\n\nasync function mostRecentSessionPath(sessionDirectory: string): Promise<string | undefined> {\n\tlet names: string[];\n\ttry {\n\t\tnames = (await readdir(sessionDirectory, { withFileTypes: true }))\n\t\t\t.filter((entry) => entry.isFile() && extname(entry.name) === \".jsonl\")\n\t\t\t.map((entry) => entry.name);\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return undefined;\n\t\tthrow cause;\n\t}\n\n\tconst candidates = await Promise.all(\n\t\tnames.map(async (name) => {\n\t\t\tconst filePath = join(sessionDirectory, name);\n\t\t\ttry {\n\t\t\t\treturn { filePath, modifiedAt: (await stat(filePath)).mtimeMs };\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return undefined;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t}),\n\t);\n\treturn candidates\n\t\t.filter((candidate): candidate is { filePath: string; modifiedAt: number } => candidate !== undefined)\n\t\t.sort((left, right) => right.modifiedAt - left.modifiedAt || right.filePath.localeCompare(left.filePath))[0]\n\t\t?.filePath;\n}\n\nasync function selectStartupSession(\n\tcommand: Extract<CliCommand, { kind: \"run\" }>,\n\tallowedRoot: string,\n\tnow: () => number,\n): Promise<SessionManager> {\n\tconst sessionDirectory = resolve(allowedRoot, DEFAULT_SESSION_DIRECTORY);\n\tif (command.sessionPath !== undefined) {\n\t\treturn openOrCreateSession(resolve(allowedRoot, command.sessionPath), allowedRoot, now);\n\t}\n\tif (command.continueSession) {\n\t\tconst recentPath = await mostRecentSessionPath(sessionDirectory);\n\t\tif (recentPath !== undefined) return SessionManager.open(recentPath, { now });\n\t}\n\treturn SessionManager.create({\n\t\tfilePath: newSessionPath(sessionDirectory, now),\n\t\tcwd: allowedRoot,\n\t\tnow,\n\t\tdeferCreate: true,\n\t});\n}\n\nfunction formatSessionTimestamp(timestamp: number, fallback: string): string {\n\tconst date = new Date(timestamp);\n\tconst isoTimestamp = Number.isNaN(date.getTime()) ? fallback : date.toISOString();\n\treturn isoTimestamp.slice(0, 16).replace(\"T\", \" \");\n}\n\nexport function formatSessionLabel(manager: SessionManager): string {\n\tconst firstUserEntry = manager.entries.find((entry) => entry.type === \"message\" && entry.message.role === \"user\");\n\tconst fileName = basename(manager.filePath, extname(manager.filePath));\n\tif (firstUserEntry?.type !== \"message\" || firstUserEntry.message.role !== \"user\") {\n\t\treturn `${fileName} (${formatSessionTimestamp(Date.parse(manager.header.timestamp), manager.header.timestamp)})`;\n\t}\n\n\tconst question = firstUserEntry.message.content\n\t\t.filter((content) => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tconst label =\n\t\tquestion.length > MAX_SESSION_QUESTION_LENGTH\n\t\t\t? `${question.slice(0, MAX_SESSION_QUESTION_LENGTH - 3)}...`\n\t\t\t: question || fileName;\n\tconst timestamp = formatSessionTimestamp(firstUserEntry.message.timestamp, firstUserEntry.timestamp);\n\treturn `${label} (${timestamp})`;\n}\n\nasync function sessionChoices(\n\tsessionDirectory: string,\n\tcurrentFile: string,\n\topen: (filePath: string) => Promise<AgentSession>,\n): Promise<readonly { id: string; label: string; description: string; open: () => Promise<AgentSession> }[]> {\n\tlet names: string[] = [];\n\ttry {\n\t\tnames = (await readdir(sessionDirectory, { withFileTypes: true }))\n\t\t\t.filter((entry) => entry.isFile() && extname(entry.name) === \".jsonl\")\n\t\t\t.map((entry) => entry.name)\n\t\t\t.sort();\n\t} catch (cause) {\n\t\tif (!(cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\")) throw cause;\n\t}\n\n\treturn Promise.all(\n\t\tnames\n\t\t\t.filter((name) => resolve(sessionDirectory, name) !== resolve(currentFile))\n\t\t\t.map(async (name) => {\n\t\t\t\tconst filePath = join(sessionDirectory, name);\n\t\t\t\tconst id = basename(name, extname(name));\n\t\t\t\tlet label = id;\n\t\t\t\ttry {\n\t\t\t\t\tlabel = formatSessionLabel(await SessionManager.open(filePath));\n\t\t\t\t} catch {\n\t\t\t\t\t// Keep damaged sessions selectable so opening one can report the detailed load error.\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\tlabel,\n\t\t\t\t\tdescription: filePath,\n\t\t\t\t\topen: () => open(filePath),\n\t\t\t\t};\n\t\t\t}),\n\t);\n}\n\nexport async function runMain(args: readonly string[], options: MainOptions): Promise<number> {\n\tconst dependencies: CliDependencies = {\n\t\tstdout: options.stdout,\n\t\tstderr: options.stderr,\n\t\tversion: options.version,\n\t\trun: async (command) => {\n\t\t\tconst allowedRoot = resolve(options.allowedRoot ?? process.cwd());\n\t\t\tconst now = options.now ?? Date.now;\n\t\t\tconst runtime = await options.createRuntime(command);\n\t\t\tif (runtime === undefined) return 0;\n\t\t\tconst manager = await selectStartupSession(command, allowedRoot, now);\n\t\t\tconst sessionFile = manager.filePath;\n\t\t\tconst session = new AgentSession({\n\t\t\t\tallowedRoot,\n\t\t\t\tprovider: runtime.provider,\n\t\t\t\tmodel: runtime.model,\n\t\t\t\tnow: options.now,\n\t\t\t\tsessionManager: manager,\n\t\t\t});\n\t\t\tif (command.mode === \"json\") {\n\t\t\t\treturn runJsonMode(command.prompt, session, options);\n\t\t\t}\n\t\t\tif (command.mode === \"interactive\") {\n\t\t\t\tconst terminal = new ProcessTerminal();\n\t\t\t\tconst tui = new TUI(terminal);\n\t\t\t\tconst mode = new InteractiveMode({\n\t\t\t\t\tsession,\n\t\t\t\t\ttui,\n\t\t\t\t\tsessions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"new-session\",\n\t\t\t\t\t\t\tlabel: \"New session\",\n\t\t\t\t\t\t\tdescription: \"Start a new persistent conversation.\",\n\t\t\t\t\t\t\topen: async () => {\n\t\t\t\t\t\t\t\tconst filePath = newSessionPath(dirname(sessionFile), now);\n\t\t\t\t\t\t\t\tconst nextManager = await SessionManager.create({\n\t\t\t\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\t\t\t\tcwd: allowedRoot,\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\tdeferCreate: true,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn new AgentSession({\n\t\t\t\t\t\t\t\t\tallowedRoot,\n\t\t\t\t\t\t\t\t\tprovider: runtime.provider,\n\t\t\t\t\t\t\t\t\tmodel: runtime.model,\n\t\t\t\t\t\t\t\t\tnow: options.now,\n\t\t\t\t\t\t\t\t\tsessionManager: nextManager,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(await sessionChoices(dirname(sessionFile), sessionFile, async (filePath) => {\n\t\t\t\t\t\t\tconst nextManager = await SessionManager.open(filePath, { now });\n\t\t\t\t\t\t\treturn new AgentSession({\n\t\t\t\t\t\t\t\tallowedRoot,\n\t\t\t\t\t\t\t\tprovider: runtime.provider,\n\t\t\t\t\t\t\t\tmodel: runtime.model,\n\t\t\t\t\t\t\t\tnow: options.now,\n\t\t\t\t\t\t\t\tsessionManager: nextManager,\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});\n\t\t\t\tmode.start(command.prompt);\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn runPrintMode(command.prompt, session, options);\n\t\t},\n\t};\n\n\treturn runCli(args, dependencies);\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import type { AutocompleteItem, Component } from "@di-code/tui";
2
+ import type { InteractiveState } from "./interactive-state.ts";
3
+ export interface InteractiveViewState extends InteractiveState {
4
+ readonly model: string;
5
+ readonly theme: "dark" | "light";
6
+ }
7
+ export declare class InteractiveHeader implements Component {
8
+ private readonly readState;
9
+ constructor(readState: () => InteractiveViewState);
10
+ invalidate(): void;
11
+ render(width: number): string[];
12
+ }
13
+ export declare class InteractiveChat implements Component {
14
+ private readonly readState;
15
+ constructor(readState: () => InteractiveViewState);
16
+ invalidate(): void;
17
+ render(width: number): string[];
18
+ }
19
+ export declare class InteractiveComposer implements Component {
20
+ private readonly readState;
21
+ constructor(readState: () => InteractiveViewState);
22
+ invalidate(): void;
23
+ render(width: number): string[];
24
+ }
25
+ export declare class InteractiveFooter implements Component {
26
+ private readonly readState;
27
+ constructor(readState: () => InteractiveViewState);
28
+ invalidate(): void;
29
+ render(width: number): string[];
30
+ }
31
+ export interface AutocompleteMenuState {
32
+ readonly items: readonly AutocompleteItem[];
33
+ readonly index: number;
34
+ }
35
+ export declare class AutocompleteMenu implements Component {
36
+ private readonly readState;
37
+ constructor(readState: () => AutocompleteMenuState);
38
+ invalidate(): void;
39
+ render(width: number): string[];
40
+ }
41
+ //# sourceMappingURL=interactive-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-components.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AA2DD,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAW/B;AAED,qBAAa,eAAgB,YAAW,SAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAwD/B;AAED,qBAAa,mBAAoB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAS/B;AAED,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,SAAS,EAAE,MAAM,oBAAoB;IAIjD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAkB/B;AAQD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;gBAE5C,SAAS,EAAE,MAAM,qBAAqB;IAIlD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAQ/B"}
@@ -0,0 +1,195 @@
1
+ import { Markdown, Text, truncateToWidth, visibleWidth } from "@di-code/tui";
2
+ const RESET = "\x1b[0m";
3
+ const BOLD = "\x1b[1m";
4
+ const MAX_VISIBLE_TOOL_ITEMS = 6;
5
+ const SPINNER_FRAMES = ["|", "/", "-", "\\"];
6
+ function paletteFor(theme) {
7
+ return theme === "light"
8
+ ? {
9
+ accent: "\x1b[38;5;25m",
10
+ assistant: "\x1b[38;5;30m",
11
+ dim: "\x1b[38;5;242m",
12
+ error: "\x1b[38;5;160m",
13
+ success: "\x1b[38;5;28m",
14
+ warning: "\x1b[38;5;130m",
15
+ }
16
+ : {
17
+ accent: "\x1b[38;5;45m",
18
+ assistant: "\x1b[38;5;80m",
19
+ dim: "\x1b[38;5;245m",
20
+ error: "\x1b[38;5;210m",
21
+ success: "\x1b[38;5;114m",
22
+ warning: "\x1b[38;5;222m",
23
+ };
24
+ }
25
+ function paint(color, text, bold = false) {
26
+ return `${color}${bold ? BOLD : ""}${text}${RESET}`;
27
+ }
28
+ function renderLine(text, width) {
29
+ return new Text(truncateToWidth(text, width, "")).render(width);
30
+ }
31
+ function alignEnds(left, right, width) {
32
+ const gap = 3;
33
+ if (visibleWidth(left) + visibleWidth(right) + gap > width)
34
+ return truncateToWidth(left, width, "");
35
+ return `${left}${" ".repeat(width - visibleWidth(left) - visibleWidth(right))}${right}`;
36
+ }
37
+ function activityLabel(state) {
38
+ const colors = paletteFor(state.theme);
39
+ if (state.error)
40
+ return { text: "ERROR", color: colors.error };
41
+ if (state.compacting)
42
+ return { text: "COMPACTING", color: colors.warning };
43
+ if (state.retrying)
44
+ return { text: "RETRYING", color: colors.warning };
45
+ if (state.busy)
46
+ return { text: "WORKING", color: colors.accent };
47
+ return { text: "READY", color: colors.success };
48
+ }
49
+ export class InteractiveHeader {
50
+ readState;
51
+ constructor(readState) {
52
+ this.readState = readState;
53
+ }
54
+ invalidate() { }
55
+ render(width) {
56
+ const state = this.readState();
57
+ const colors = paletteFor(state.theme);
58
+ const brand = paint(colors.accent, "DI-CODE / INTERACTIVE", true);
59
+ const model = paint(colors.dim, `MODEL ${state.model}`);
60
+ const title = width >= 56
61
+ ? alignEnds(brand, model, width)
62
+ : `${paint(colors.accent, "DI-CODE", true)} ${paint(colors.dim, state.model)}`;
63
+ return [...renderLine(title, width), ...renderLine(paint(colors.dim, "-".repeat(Math.max(0, width))), width)];
64
+ }
65
+ }
66
+ export class InteractiveChat {
67
+ readState;
68
+ constructor(readState) {
69
+ this.readState = readState;
70
+ }
71
+ invalidate() { }
72
+ render(width) {
73
+ const state = this.readState();
74
+ const lines = [];
75
+ const colors = paletteFor(state.theme);
76
+ for (const [index, message] of state.messageItems.entries()) {
77
+ if (index > 0)
78
+ lines.push(" ");
79
+ if (message.role === "user") {
80
+ lines.push(...renderLine(` ${paint(colors.accent, "You", true)}`, width));
81
+ lines.push(...new Text(` ${message.text}`).render(width));
82
+ }
83
+ else {
84
+ lines.push(...renderLine(` ${paint(colors.assistant, "Assistant", true)}`, width));
85
+ lines.push(...new Markdown(message.text, { paddingX: 4 }).render(width));
86
+ }
87
+ }
88
+ const toolCount = state.processItems.filter((item) => item.type === "tool").length;
89
+ const hiddenToolItems = Math.max(0, toolCount - MAX_VISIBLE_TOOL_ITEMS);
90
+ let skippedToolItems = 0;
91
+ for (const item of state.processItems) {
92
+ if (item.type === "tool" && skippedToolItems < hiddenToolItems) {
93
+ skippedToolItems += 1;
94
+ continue;
95
+ }
96
+ if (item.type === "tool" && skippedToolItems === hiddenToolItems && hiddenToolItems > 0) {
97
+ lines.push(...renderLine(` ${paint(colors.dim, `${hiddenToolItems} earlier tool updates`)}`, width));
98
+ skippedToolItems += 1;
99
+ }
100
+ if (item.type === "thinking") {
101
+ const frame = SPINNER_FRAMES[state.spinnerFrame % SPINNER_FRAMES.length] ?? SPINNER_FRAMES[0];
102
+ lines.push(...renderLine(` ${paint(colors.accent, `${frame} Thinking`)}`, width));
103
+ continue;
104
+ }
105
+ const marker = item.status === "running" ? ">" : item.status === "error" ? "!" : "+";
106
+ const command = truncateToWidth(item.command, Math.max(1, width - 6), "...");
107
+ const color = item.status === "error" ? colors.error : item.status === "done" ? colors.success : colors.warning;
108
+ lines.push(...renderLine(` ${paint(color, marker)} ${paint(colors.dim, command)}`, width));
109
+ }
110
+ if (state.streamingText) {
111
+ if (lines.length > 0)
112
+ lines.push(" ");
113
+ lines.push(...renderLine(` ${paint(colors.assistant, "Assistant", true)}`, width));
114
+ lines.push(...new Markdown(state.streamingText, { paddingX: 4 }).render(width));
115
+ }
116
+ const hasActivity = state.status || state.queue.length > 0 || state.error;
117
+ if (hasActivity) {
118
+ if (lines.length > 0)
119
+ lines.push(" ");
120
+ lines.push(...renderLine(` ${paint(colors.dim, "ACTIVITY", true)}`, width));
121
+ if (state.status)
122
+ lines.push(...renderLine(` ${paint(colors.dim, state.status)}`, width));
123
+ if (state.queue.length > 0) {
124
+ lines.push(...renderLine(` ${paint(colors.dim, `Queue (${state.queue.length})`)}`, width));
125
+ for (const prompt of state.queue)
126
+ lines.push(...new Text(` ${prompt}`).render(width));
127
+ }
128
+ if (state.error)
129
+ lines.push(...new Text(` ${paint(colors.error, `Error: ${state.error}`, true)}`).render(width));
130
+ }
131
+ const rendered = lines.flatMap((line) => new Text(line).render(width));
132
+ return rendered.length > 0 ? rendered : [""];
133
+ }
134
+ }
135
+ export class InteractiveComposer {
136
+ readState;
137
+ constructor(readState) {
138
+ this.readState = readState;
139
+ }
140
+ invalidate() { }
141
+ render(width) {
142
+ const state = this.readState();
143
+ const colors = paletteFor(state.theme);
144
+ const copy = width >= 56 ? "COMPOSE / commands Tab complete" : "COMPOSE / commands";
145
+ return [
146
+ ...renderLine(paint(colors.dim, "-".repeat(Math.max(0, width))), width),
147
+ ...renderLine(paint(colors.dim, copy), width),
148
+ ];
149
+ }
150
+ }
151
+ export class InteractiveFooter {
152
+ readState;
153
+ constructor(readState) {
154
+ this.readState = readState;
155
+ }
156
+ invalidate() { }
157
+ render(width) {
158
+ const state = this.readState();
159
+ const colors = paletteFor(state.theme);
160
+ const activity = activityLabel(state);
161
+ const left = paint(activity.color, `* ${activity.text}`, true);
162
+ const context = paint(colors.dim, `${state.messageItems.length} messages ctx ${formatTokenCount(state.usage.estimatedContextTokens)}/${formatTokenCount(state.usage.contextWindow)} total ${formatTokenCount(state.usage.totalTokens)} tok`);
163
+ const right = paint(colors.dim, `${state.model} ${state.theme}`);
164
+ const status = width >= 60 ? alignEnds(`${left} ${context}`, right, width) : `${left} ${right}`;
165
+ const hints = width >= 60 ? "Enter send Esc cancel Ctrl+O model Ctrl+L session" : "Enter send Ctrl+O model";
166
+ return [
167
+ ...renderLine(paint(colors.dim, "-".repeat(Math.max(0, width))), width),
168
+ ...renderLine(status, width),
169
+ ...renderLine(paint(colors.dim, hints), width),
170
+ ];
171
+ }
172
+ }
173
+ function formatTokenCount(value) {
174
+ if (value >= 1_000_000)
175
+ return `${(value / 1_000_000).toFixed(1)}m`;
176
+ if (value >= 1_000)
177
+ return `${(value / 1_000).toFixed(1)}k`;
178
+ return String(value);
179
+ }
180
+ export class AutocompleteMenu {
181
+ readState;
182
+ constructor(readState) {
183
+ this.readState = readState;
184
+ }
185
+ invalidate() { }
186
+ render(width) {
187
+ const state = this.readState();
188
+ return state.items.slice(0, 6).flatMap((item, index) => {
189
+ const prefix = index === state.index ? "> " : " ";
190
+ const description = item.description ? ` - ${item.description}` : "";
191
+ return new Text(`${prefix}${item.label}${description}`).render(width);
192
+ });
193
+ }
194
+ }
195
+ //# sourceMappingURL=interactive-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-components.js","sourceRoot":"","sources":["../../src/modes/interactive-components.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AutocompleteItem, Component } from \"@di-code/tui\";\nimport { Markdown, Text, truncateToWidth, visibleWidth } from \"@di-code/tui\";\nimport type { InteractiveState } from \"./interactive-state.ts\";\n\nexport interface InteractiveViewState extends InteractiveState {\n\treadonly model: string;\n\treadonly theme: \"dark\" | \"light\";\n}\n\ninterface Palette {\n\treadonly accent: string;\n\treadonly assistant: string;\n\treadonly dim: string;\n\treadonly error: string;\n\treadonly success: string;\n\treadonly warning: string;\n}\n\nconst RESET = \"\\x1b[0m\";\nconst BOLD = \"\\x1b[1m\";\nconst MAX_VISIBLE_TOOL_ITEMS = 6;\nconst SPINNER_FRAMES = [\"|\", \"/\", \"-\", \"\\\\\"] as const;\n\nfunction paletteFor(theme: InteractiveViewState[\"theme\"]): Palette {\n\treturn theme === \"light\"\n\t\t? {\n\t\t\t\taccent: \"\\x1b[38;5;25m\",\n\t\t\t\tassistant: \"\\x1b[38;5;30m\",\n\t\t\t\tdim: \"\\x1b[38;5;242m\",\n\t\t\t\terror: \"\\x1b[38;5;160m\",\n\t\t\t\tsuccess: \"\\x1b[38;5;28m\",\n\t\t\t\twarning: \"\\x1b[38;5;130m\",\n\t\t\t}\n\t\t: {\n\t\t\t\taccent: \"\\x1b[38;5;45m\",\n\t\t\t\tassistant: \"\\x1b[38;5;80m\",\n\t\t\t\tdim: \"\\x1b[38;5;245m\",\n\t\t\t\terror: \"\\x1b[38;5;210m\",\n\t\t\t\tsuccess: \"\\x1b[38;5;114m\",\n\t\t\t\twarning: \"\\x1b[38;5;222m\",\n\t\t\t};\n}\n\nfunction paint(color: string, text: string, bold = false): string {\n\treturn `${color}${bold ? BOLD : \"\"}${text}${RESET}`;\n}\n\nfunction renderLine(text: string, width: number): string[] {\n\treturn new Text(truncateToWidth(text, width, \"\")).render(width);\n}\n\nfunction alignEnds(left: string, right: string, width: number): string {\n\tconst gap = 3;\n\tif (visibleWidth(left) + visibleWidth(right) + gap > width) return truncateToWidth(left, width, \"\");\n\treturn `${left}${\" \".repeat(width - visibleWidth(left) - visibleWidth(right))}${right}`;\n}\n\nfunction activityLabel(state: InteractiveViewState): { readonly text: string; readonly color: string } {\n\tconst colors = paletteFor(state.theme);\n\tif (state.error) return { text: \"ERROR\", color: colors.error };\n\tif (state.compacting) return { text: \"COMPACTING\", color: colors.warning };\n\tif (state.retrying) return { text: \"RETRYING\", color: colors.warning };\n\tif (state.busy) return { text: \"WORKING\", color: colors.accent };\n\treturn { text: \"READY\", color: colors.success };\n}\n\nexport class InteractiveHeader implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst brand = paint(colors.accent, \"DI-CODE / INTERACTIVE\", true);\n\t\tconst model = paint(colors.dim, `MODEL ${state.model}`);\n\t\tconst title =\n\t\t\twidth >= 56\n\t\t\t\t? alignEnds(brand, model, width)\n\t\t\t\t: `${paint(colors.accent, \"DI-CODE\", true)} ${paint(colors.dim, state.model)}`;\n\t\treturn [...renderLine(title, width), ...renderLine(paint(colors.dim, \"-\".repeat(Math.max(0, width))), width)];\n\t}\n}\n\nexport class InteractiveChat implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst lines: string[] = [];\n\t\tconst colors = paletteFor(state.theme);\n\t\tfor (const [index, message] of state.messageItems.entries()) {\n\t\t\tif (index > 0) lines.push(\" \");\n\t\t\tif (message.role === \"user\") {\n\t\t\t\tlines.push(...renderLine(` ${paint(colors.accent, \"You\", true)}`, width));\n\t\t\t\tlines.push(...new Text(` ${message.text}`).render(width));\n\t\t\t} else {\n\t\t\t\tlines.push(...renderLine(` ${paint(colors.assistant, \"Assistant\", true)}`, width));\n\t\t\t\tlines.push(...new Markdown(message.text, { paddingX: 4 }).render(width));\n\t\t\t}\n\t\t}\n\t\tconst toolCount = state.processItems.filter((item) => item.type === \"tool\").length;\n\t\tconst hiddenToolItems = Math.max(0, toolCount - MAX_VISIBLE_TOOL_ITEMS);\n\t\tlet skippedToolItems = 0;\n\t\tfor (const item of state.processItems) {\n\t\t\tif (item.type === \"tool\" && skippedToolItems < hiddenToolItems) {\n\t\t\t\tskippedToolItems += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === \"tool\" && skippedToolItems === hiddenToolItems && hiddenToolItems > 0) {\n\t\t\t\tlines.push(...renderLine(` ${paint(colors.dim, `${hiddenToolItems} earlier tool updates`)}`, width));\n\t\t\t\tskippedToolItems += 1;\n\t\t\t}\n\t\t\tif (item.type === \"thinking\") {\n\t\t\t\tconst frame = SPINNER_FRAMES[state.spinnerFrame % SPINNER_FRAMES.length] ?? SPINNER_FRAMES[0];\n\t\t\t\tlines.push(...renderLine(` ${paint(colors.accent, `${frame} Thinking`)}`, width));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst marker = item.status === \"running\" ? \">\" : item.status === \"error\" ? \"!\" : \"+\";\n\t\t\tconst command = truncateToWidth(item.command, Math.max(1, width - 6), \"...\");\n\t\t\tconst color = item.status === \"error\" ? colors.error : item.status === \"done\" ? colors.success : colors.warning;\n\t\t\tlines.push(...renderLine(` ${paint(color, marker)} ${paint(colors.dim, command)}`, width));\n\t\t}\n\t\tif (state.streamingText) {\n\t\t\tif (lines.length > 0) lines.push(\" \");\n\t\t\tlines.push(...renderLine(` ${paint(colors.assistant, \"Assistant\", true)}`, width));\n\t\t\tlines.push(...new Markdown(state.streamingText, { paddingX: 4 }).render(width));\n\t\t}\n\t\tconst hasActivity = state.status || state.queue.length > 0 || state.error;\n\t\tif (hasActivity) {\n\t\t\tif (lines.length > 0) lines.push(\" \");\n\t\t\tlines.push(...renderLine(` ${paint(colors.dim, \"ACTIVITY\", true)}`, width));\n\t\t\tif (state.status) lines.push(...renderLine(` ${paint(colors.dim, state.status)}`, width));\n\t\t\tif (state.queue.length > 0) {\n\t\t\t\tlines.push(...renderLine(` ${paint(colors.dim, `Queue (${state.queue.length})`)}`, width));\n\t\t\t\tfor (const prompt of state.queue) lines.push(...new Text(` ${prompt}`).render(width));\n\t\t\t}\n\t\t\tif (state.error)\n\t\t\t\tlines.push(...new Text(` ${paint(colors.error, `Error: ${state.error}`, true)}`).render(width));\n\t\t}\n\t\tconst rendered = lines.flatMap((line) => new Text(line).render(width));\n\t\treturn rendered.length > 0 ? rendered : [\"\"];\n\t}\n}\n\nexport class InteractiveComposer implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst copy = width >= 56 ? \"COMPOSE / commands Tab complete\" : \"COMPOSE / commands\";\n\t\treturn [\n\t\t\t...renderLine(paint(colors.dim, \"-\".repeat(Math.max(0, width))), width),\n\t\t\t...renderLine(paint(colors.dim, copy), width),\n\t\t];\n\t}\n}\n\nexport class InteractiveFooter implements Component {\n\tprivate readonly readState: () => InteractiveViewState;\n\n\tconstructor(readState: () => InteractiveViewState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\tconst colors = paletteFor(state.theme);\n\t\tconst activity = activityLabel(state);\n\t\tconst left = paint(activity.color, `* ${activity.text}`, true);\n\t\tconst context = paint(\n\t\t\tcolors.dim,\n\t\t\t`${state.messageItems.length} messages ctx ${formatTokenCount(state.usage.estimatedContextTokens)}/${formatTokenCount(state.usage.contextWindow)} total ${formatTokenCount(state.usage.totalTokens)} tok`,\n\t\t);\n\t\tconst right = paint(colors.dim, `${state.model} ${state.theme}`);\n\t\tconst status = width >= 60 ? alignEnds(`${left} ${context}`, right, width) : `${left} ${right}`;\n\t\tconst hints = width >= 60 ? \"Enter send Esc cancel Ctrl+O model Ctrl+L session\" : \"Enter send Ctrl+O model\";\n\t\treturn [\n\t\t\t...renderLine(paint(colors.dim, \"-\".repeat(Math.max(0, width))), width),\n\t\t\t...renderLine(status, width),\n\t\t\t...renderLine(paint(colors.dim, hints), width),\n\t\t];\n\t}\n}\n\nfunction formatTokenCount(value: number): string {\n\tif (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}m`;\n\tif (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n\treturn String(value);\n}\n\nexport interface AutocompleteMenuState {\n\treadonly items: readonly AutocompleteItem[];\n\treadonly index: number;\n}\n\nexport class AutocompleteMenu implements Component {\n\tprivate readonly readState: () => AutocompleteMenuState;\n\n\tconstructor(readState: () => AutocompleteMenuState) {\n\t\tthis.readState = readState;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.readState();\n\t\treturn state.items.slice(0, 6).flatMap((item, index) => {\n\t\t\tconst prefix = index === state.index ? \"> \" : \" \";\n\t\t\tconst description = item.description ? ` - ${item.description}` : \"\";\n\t\t\treturn new Text(`${prefix}${item.label}${description}`).render(width);\n\t\t});\n\t}\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { Component } from "@di-code/tui";
2
+ export interface InteractiveLayoutOptions {
3
+ readonly header: Component;
4
+ readonly chat: Component;
5
+ readonly composer: Component;
6
+ readonly editor: Component;
7
+ readonly footer: Component;
8
+ }
9
+ export declare class InteractiveLayout implements Component {
10
+ private readonly header;
11
+ private readonly chat;
12
+ private readonly composer;
13
+ private readonly editor;
14
+ private readonly footer;
15
+ constructor(options: InteractiveLayoutOptions);
16
+ invalidate(): void;
17
+ renderTranscript(width: number): string[];
18
+ render(width: number): string[];
19
+ }
20
+ //# sourceMappingURL=interactive-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-layout.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,iBAAkB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBACvB,OAAO,EAAE,wBAAwB;IAQ7C,UAAU,IAAI,IAAI;IAQlB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAIzC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAS/B"}
@@ -0,0 +1,34 @@
1
+ export class InteractiveLayout {
2
+ header;
3
+ chat;
4
+ composer;
5
+ editor;
6
+ footer;
7
+ constructor(options) {
8
+ this.header = options.header;
9
+ this.chat = options.chat;
10
+ this.composer = options.composer;
11
+ this.editor = options.editor;
12
+ this.footer = options.footer;
13
+ }
14
+ invalidate() {
15
+ this.header.invalidate();
16
+ this.chat.invalidate();
17
+ this.composer.invalidate();
18
+ this.editor.invalidate();
19
+ this.footer.invalidate();
20
+ }
21
+ renderTranscript(width) {
22
+ return [...this.header.render(width), ...this.chat.render(width), ...this.footer.render(width)];
23
+ }
24
+ render(width) {
25
+ return [
26
+ ...this.header.render(width),
27
+ ...this.chat.render(width),
28
+ ...this.composer.render(width),
29
+ ...this.editor.render(width),
30
+ ...this.footer.render(width),
31
+ ];
32
+ }
33
+ }
34
+ //# sourceMappingURL=interactive-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-layout.js","sourceRoot":"","sources":["../../src/modes/interactive-layout.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,iBAAiB;IACZ,MAAM,CAAY;IAClB,IAAI,CAAY;IAChB,QAAQ,CAAY;IACpB,MAAM,CAAY;IAClB,MAAM,CAAY;IACnC,YAAY,OAAiC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,UAAU;QACT,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC7B,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,OAAO;YACN,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAC1B,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAC9B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;SAC5B,CAAC;IACH,CAAC;CACD","sourcesContent":["import type { Component } from \"@di-code/tui\";\n\nexport interface InteractiveLayoutOptions {\n\treadonly header: Component;\n\treadonly chat: Component;\n\treadonly composer: Component;\n\treadonly editor: Component;\n\treadonly footer: Component;\n}\n\nexport class InteractiveLayout implements Component {\n\tprivate readonly header: Component;\n\tprivate readonly chat: Component;\n\tprivate readonly composer: Component;\n\tprivate readonly editor: Component;\n\tprivate readonly footer: Component;\n\tconstructor(options: InteractiveLayoutOptions) {\n\t\tthis.header = options.header;\n\t\tthis.chat = options.chat;\n\t\tthis.composer = options.composer;\n\t\tthis.editor = options.editor;\n\t\tthis.footer = options.footer;\n\t}\n\n\tinvalidate(): void {\n\t\tthis.header.invalidate();\n\t\tthis.chat.invalidate();\n\t\tthis.composer.invalidate();\n\t\tthis.editor.invalidate();\n\t\tthis.footer.invalidate();\n\t}\n\n\trenderTranscript(width: number): string[] {\n\t\treturn [...this.header.render(width), ...this.chat.render(width), ...this.footer.render(width)];\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [\n\t\t\t...this.header.render(width),\n\t\t\t...this.chat.render(width),\n\t\t\t...this.composer.render(width),\n\t\t\t...this.editor.render(width),\n\t\t\t...this.footer.render(width),\n\t\t];\n\t}\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import type { Message } from "@di-code/ai";
2
+ import type { AgentSessionEvent, SessionUsage } from "../core/session.ts";
3
+ export interface InteractiveMessage {
4
+ readonly role: "user" | "assistant";
5
+ readonly text: string;
6
+ }
7
+ export type InteractiveProcessItem = {
8
+ readonly type: "thinking";
9
+ readonly id: "thinking";
10
+ } | {
11
+ readonly type: "tool";
12
+ readonly id: string;
13
+ readonly command: string;
14
+ readonly status: "running" | "done" | "error";
15
+ };
16
+ export interface InteractiveState {
17
+ readonly messages: readonly string[];
18
+ readonly messageItems: readonly InteractiveMessage[];
19
+ readonly processItems: readonly InteractiveProcessItem[];
20
+ readonly spinnerFrame: number;
21
+ readonly streamingText: string;
22
+ readonly toolStatus: readonly string[];
23
+ readonly busy: boolean;
24
+ readonly error?: string;
25
+ readonly queue: readonly string[];
26
+ readonly status?: string;
27
+ readonly compacting: boolean;
28
+ readonly retrying: boolean;
29
+ readonly usage: SessionUsage;
30
+ }
31
+ export declare class InteractiveProjection {
32
+ private readonly messages;
33
+ private readonly messageItems;
34
+ private readonly processItems;
35
+ private readonly toolStatus;
36
+ private spinnerFrame;
37
+ private streamingText;
38
+ private busy;
39
+ private error;
40
+ private queue;
41
+ private status;
42
+ private compacting;
43
+ private retrying;
44
+ private usage;
45
+ get state(): InteractiveState;
46
+ setError(message: string | undefined): void;
47
+ clearVisibleMessages(): void;
48
+ setQueue(queue: readonly string[]): void;
49
+ setStatus(status: string | undefined): void;
50
+ setCompacting(value: boolean): void;
51
+ setRetrying(value: boolean): void;
52
+ setUsage(usage: SessionUsage): void;
53
+ advanceSpinner(): boolean;
54
+ clearTransientProcess(): void;
55
+ replaceTranscript(messages: readonly Message[]): void;
56
+ apply(event: AgentSessionEvent): void;
57
+ private removeThinking;
58
+ private updateToolStatus;
59
+ private appendCompletedMessage;
60
+ }
61
+ //# sourceMappingURL=interactive-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-state.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"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"}