@autonav/core 1.6.0 → 1.7.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 (257) hide show
  1. package/README.md +2 -2
  2. package/dist/adapter/index.d.ts +3 -3
  3. package/dist/adapter/index.d.ts.map +1 -1
  4. package/dist/adapter/index.js +3 -3
  5. package/dist/adapter/index.js.map +1 -1
  6. package/dist/adapter/navigator-adapter.d.ts +196 -0
  7. package/dist/adapter/navigator-adapter.d.ts.map +1 -0
  8. package/dist/adapter/navigator-adapter.js +579 -0
  9. package/dist/adapter/navigator-adapter.js.map +1 -0
  10. package/dist/cli/autonav.d.ts +2 -6
  11. package/dist/cli/autonav.d.ts.map +1 -1
  12. package/dist/cli/autonav.js +32 -53
  13. package/dist/cli/autonav.js.map +1 -1
  14. package/dist/cli/nav-chat.d.ts +2 -1
  15. package/dist/cli/nav-chat.d.ts.map +1 -1
  16. package/dist/cli/nav-chat.js +32 -3
  17. package/dist/cli/nav-chat.js.map +1 -1
  18. package/dist/cli/nav-init.d.ts +2 -1
  19. package/dist/cli/nav-init.d.ts.map +1 -1
  20. package/dist/cli/nav-init.js +12 -4
  21. package/dist/cli/nav-init.js.map +1 -1
  22. package/dist/cli/nav-install.d.ts +2 -1
  23. package/dist/cli/nav-install.d.ts.map +1 -1
  24. package/dist/cli/nav-install.js +4 -2
  25. package/dist/cli/nav-install.js.map +1 -1
  26. package/dist/cli/nav-memento.d.ts +3 -2
  27. package/dist/cli/nav-memento.d.ts.map +1 -1
  28. package/dist/cli/nav-memento.js +12 -6
  29. package/dist/cli/nav-memento.js.map +1 -1
  30. package/dist/cli/nav-mend.d.ts +2 -1
  31. package/dist/cli/nav-mend.d.ts.map +1 -1
  32. package/dist/cli/nav-mend.js +4 -1
  33. package/dist/cli/nav-mend.js.map +1 -1
  34. package/dist/cli/nav-migrate.d.ts +2 -1
  35. package/dist/cli/nav-migrate.d.ts.map +1 -1
  36. package/dist/cli/nav-migrate.js +2 -6
  37. package/dist/cli/nav-migrate.js.map +1 -1
  38. package/dist/cli/nav-query.d.ts +2 -1
  39. package/dist/cli/nav-query.d.ts.map +1 -1
  40. package/dist/cli/nav-query.js +12 -6
  41. package/dist/cli/nav-query.js.map +1 -1
  42. package/dist/cli/nav-standup.d.ts +18 -0
  43. package/dist/cli/nav-standup.d.ts.map +1 -0
  44. package/dist/cli/nav-standup.js +151 -0
  45. package/dist/cli/nav-standup.js.map +1 -0
  46. package/dist/cli/nav-uninstall.d.ts +2 -1
  47. package/dist/cli/nav-uninstall.d.ts.map +1 -1
  48. package/dist/cli/nav-uninstall.js +4 -2
  49. package/dist/cli/nav-uninstall.js.map +1 -1
  50. package/dist/cli/nav-update.d.ts +2 -1
  51. package/dist/cli/nav-update.d.ts.map +1 -1
  52. package/dist/cli/nav-update.js +11 -6
  53. package/dist/cli/nav-update.js.map +1 -1
  54. package/dist/conversation/App.d.ts +9 -2
  55. package/dist/conversation/App.d.ts.map +1 -1
  56. package/dist/conversation/App.js +304 -111
  57. package/dist/conversation/App.js.map +1 -1
  58. package/dist/conversation/index.d.ts +5 -0
  59. package/dist/conversation/index.d.ts.map +1 -1
  60. package/dist/conversation/index.js +17 -2
  61. package/dist/conversation/index.js.map +1 -1
  62. package/dist/harness/chibi-harness.d.ts +36 -0
  63. package/dist/harness/chibi-harness.d.ts.map +1 -0
  64. package/dist/harness/chibi-harness.js +383 -0
  65. package/dist/harness/chibi-harness.js.map +1 -0
  66. package/dist/harness/chibi-plugins/get_plugin_config +64 -0
  67. package/dist/harness/chibi-plugins/query_navigator +114 -0
  68. package/dist/harness/chibi-plugins/submit_answer +38 -0
  69. package/dist/harness/chibi-plugins/update_plugin_config +91 -0
  70. package/dist/harness/claude-code-harness.d.ts +24 -0
  71. package/dist/harness/claude-code-harness.d.ts.map +1 -0
  72. package/dist/harness/claude-code-harness.js +242 -0
  73. package/dist/harness/claude-code-harness.js.map +1 -0
  74. package/dist/harness/ephemeral-home.d.ts +34 -0
  75. package/dist/harness/ephemeral-home.d.ts.map +1 -0
  76. package/dist/harness/ephemeral-home.js +56 -0
  77. package/dist/harness/ephemeral-home.js.map +1 -0
  78. package/dist/harness/factory.d.ts +47 -0
  79. package/dist/harness/factory.d.ts.map +1 -0
  80. package/dist/harness/factory.js +84 -0
  81. package/dist/harness/factory.js.map +1 -0
  82. package/dist/harness/helpers.d.ts +58 -0
  83. package/dist/harness/helpers.d.ts.map +1 -0
  84. package/dist/harness/helpers.js +78 -0
  85. package/dist/harness/helpers.js.map +1 -0
  86. package/dist/harness/index.d.ts +14 -0
  87. package/dist/harness/index.d.ts.map +1 -0
  88. package/dist/harness/index.js +13 -0
  89. package/dist/harness/index.js.map +1 -0
  90. package/dist/harness/opencode-harness.d.ts +79 -0
  91. package/dist/harness/opencode-harness.d.ts.map +1 -0
  92. package/dist/harness/opencode-harness.js +537 -0
  93. package/dist/harness/opencode-harness.js.map +1 -0
  94. package/dist/harness/opencode-tools/get_plugin_config.ts +72 -0
  95. package/dist/harness/opencode-tools/query_navigator.ts +126 -0
  96. package/dist/harness/opencode-tools/submit_answer.ts +40 -0
  97. package/dist/harness/opencode-tools/update_plugin_config.ts +105 -0
  98. package/dist/harness/sandbox.d.ts +59 -0
  99. package/dist/harness/sandbox.d.ts.map +1 -0
  100. package/dist/harness/sandbox.js +152 -0
  101. package/dist/harness/sandbox.js.map +1 -0
  102. package/dist/harness/tool-server.d.ts +50 -0
  103. package/dist/harness/tool-server.d.ts.map +1 -0
  104. package/dist/harness/tool-server.js +27 -0
  105. package/dist/harness/tool-server.js.map +1 -0
  106. package/dist/harness/types.d.ts +168 -0
  107. package/dist/harness/types.d.ts.map +1 -0
  108. package/dist/harness/types.js +12 -0
  109. package/dist/harness/types.js.map +1 -0
  110. package/dist/index.d.ts +3 -2
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/interview/App.d.ts +4 -2
  115. package/dist/interview/App.d.ts.map +1 -1
  116. package/dist/interview/App.js +36 -56
  117. package/dist/interview/App.js.map +1 -1
  118. package/dist/interview/index.d.ts +3 -0
  119. package/dist/interview/index.d.ts.map +1 -1
  120. package/dist/interview/index.js +1 -0
  121. package/dist/interview/index.js.map +1 -1
  122. package/dist/interview/prompts.d.ts +3 -1
  123. package/dist/interview/prompts.d.ts.map +1 -1
  124. package/dist/interview/prompts.js +5 -1
  125. package/dist/interview/prompts.js.map +1 -1
  126. package/dist/interview/ui/ChatBanner.d.ts +17 -0
  127. package/dist/interview/ui/ChatBanner.d.ts.map +1 -0
  128. package/dist/interview/ui/ChatBanner.js +30 -0
  129. package/dist/interview/ui/ChatBanner.js.map +1 -0
  130. package/dist/interview/ui/ChatInput.d.ts +36 -0
  131. package/dist/interview/ui/ChatInput.d.ts.map +1 -0
  132. package/dist/interview/ui/ChatInput.js +304 -0
  133. package/dist/interview/ui/ChatInput.js.map +1 -0
  134. package/dist/interview/ui/MarkdownText.d.ts +13 -0
  135. package/dist/interview/ui/MarkdownText.d.ts.map +1 -0
  136. package/dist/interview/ui/MarkdownText.js +107 -0
  137. package/dist/interview/ui/MarkdownText.js.map +1 -0
  138. package/dist/interview/ui/index.d.ts +3 -0
  139. package/dist/interview/ui/index.d.ts.map +1 -1
  140. package/dist/interview/ui/index.js +3 -0
  141. package/dist/interview/ui/index.js.map +1 -1
  142. package/dist/memento/implementer-agent.d.ts +31 -0
  143. package/dist/memento/implementer-agent.d.ts.map +1 -0
  144. package/dist/memento/implementer-agent.js +95 -0
  145. package/dist/memento/implementer-agent.js.map +1 -0
  146. package/dist/memento/index.d.ts +6 -5
  147. package/dist/memento/index.d.ts.map +1 -1
  148. package/dist/memento/index.js +7 -5
  149. package/dist/memento/index.js.map +1 -1
  150. package/dist/memento/loop.d.ts +6 -5
  151. package/dist/memento/loop.d.ts.map +1 -1
  152. package/dist/memento/loop.js +872 -180
  153. package/dist/memento/loop.js.map +1 -1
  154. package/dist/memento/matrix-animation.d.ts +26 -0
  155. package/dist/memento/matrix-animation.d.ts.map +1 -1
  156. package/dist/memento/matrix-animation.js +93 -18
  157. package/dist/memento/matrix-animation.js.map +1 -1
  158. package/dist/memento/nav-protocol.d.ts +2 -2
  159. package/dist/memento/nav-protocol.d.ts.map +1 -1
  160. package/dist/memento/nav-protocol.js +39 -43
  161. package/dist/memento/nav-protocol.js.map +1 -1
  162. package/dist/memento/prompts.d.ts +21 -8
  163. package/dist/memento/prompts.d.ts.map +1 -1
  164. package/dist/memento/prompts.js +79 -39
  165. package/dist/memento/prompts.js.map +1 -1
  166. package/dist/memento/rate-limit.d.ts +85 -0
  167. package/dist/memento/rate-limit.d.ts.map +1 -0
  168. package/dist/memento/rate-limit.js +221 -0
  169. package/dist/memento/rate-limit.js.map +1 -0
  170. package/dist/memento/types.d.ts +6 -6
  171. package/dist/memento/types.d.ts.map +1 -1
  172. package/dist/memento/types.js +3 -3
  173. package/dist/memento/worker-agent.d.ts +4 -1
  174. package/dist/memento/worker-agent.d.ts.map +1 -1
  175. package/dist/memento/worker-agent.js +38 -54
  176. package/dist/memento/worker-agent.js.map +1 -1
  177. package/dist/registry.d.ts +35 -0
  178. package/dist/registry.d.ts.map +1 -0
  179. package/dist/registry.js +87 -0
  180. package/dist/registry.js.map +1 -0
  181. package/dist/repo-analyzer/index.d.ts +2 -1
  182. package/dist/repo-analyzer/index.d.ts.map +1 -1
  183. package/dist/repo-analyzer/index.js +6 -17
  184. package/dist/repo-analyzer/index.js.map +1 -1
  185. package/dist/skill-generator/index.d.ts +142 -0
  186. package/dist/skill-generator/index.d.ts.map +1 -0
  187. package/dist/skill-generator/index.js +510 -0
  188. package/dist/skill-generator/index.js.map +1 -0
  189. package/dist/standup/config.d.ts +19 -0
  190. package/dist/standup/config.d.ts.map +1 -0
  191. package/dist/standup/config.js +42 -0
  192. package/dist/standup/config.js.map +1 -0
  193. package/dist/standup/index.d.ts +24 -0
  194. package/dist/standup/index.d.ts.map +1 -0
  195. package/dist/standup/index.js +29 -0
  196. package/dist/standup/index.js.map +1 -0
  197. package/dist/standup/loop.d.ts +36 -0
  198. package/dist/standup/loop.d.ts.map +1 -0
  199. package/dist/standup/loop.js +508 -0
  200. package/dist/standup/loop.js.map +1 -0
  201. package/dist/standup/prompts.d.ts +62 -0
  202. package/dist/standup/prompts.d.ts.map +1 -0
  203. package/dist/standup/prompts.js +211 -0
  204. package/dist/standup/prompts.js.map +1 -0
  205. package/dist/standup/standup-protocol.d.ts +33 -0
  206. package/dist/standup/standup-protocol.d.ts.map +1 -0
  207. package/dist/standup/standup-protocol.js +189 -0
  208. package/dist/standup/standup-protocol.js.map +1 -0
  209. package/dist/standup/types.d.ts +185 -0
  210. package/dist/standup/types.d.ts.map +1 -0
  211. package/dist/standup/types.js +67 -0
  212. package/dist/standup/types.js.map +1 -0
  213. package/dist/templates/.gitignore.template +26 -0
  214. package/dist/templates/CLAUDE-pack.md.template +114 -0
  215. package/dist/templates/CLAUDE.md.template +153 -0
  216. package/dist/templates/README.md.template +174 -0
  217. package/dist/templates/config-pack.json.template +16 -0
  218. package/dist/templates/config.json.template +11 -0
  219. package/dist/templates/index.d.ts +22 -0
  220. package/dist/templates/index.d.ts.map +1 -0
  221. package/dist/templates/index.js +32 -0
  222. package/dist/templates/index.js.map +1 -0
  223. package/dist/templates/plugins.json.template +33 -0
  224. package/dist/templates/system-configuration.md.template +70 -0
  225. package/dist/tools/cross-nav.d.ts +21 -0
  226. package/dist/tools/cross-nav.d.ts.map +1 -0
  227. package/dist/tools/cross-nav.js +93 -0
  228. package/dist/tools/cross-nav.js.map +1 -0
  229. package/dist/tools/index.d.ts +1 -0
  230. package/dist/tools/index.d.ts.map +1 -1
  231. package/dist/tools/index.js +1 -0
  232. package/dist/tools/index.js.map +1 -1
  233. package/dist/tools/related-navs-config.d.ts +15 -0
  234. package/dist/tools/related-navs-config.d.ts.map +1 -0
  235. package/dist/tools/related-navs-config.js +132 -0
  236. package/dist/tools/related-navs-config.js.map +1 -0
  237. package/dist/tools/related-navs.d.ts +23 -0
  238. package/dist/tools/related-navs.d.ts.map +1 -0
  239. package/dist/tools/related-navs.js +107 -0
  240. package/dist/tools/related-navs.js.map +1 -0
  241. package/dist/tools/response.d.ts +3 -2
  242. package/dist/tools/response.d.ts.map +1 -1
  243. package/dist/tools/response.js +7 -11
  244. package/dist/tools/response.js.map +1 -1
  245. package/dist/tools/self-config.d.ts +2 -1
  246. package/dist/tools/self-config.d.ts.map +1 -1
  247. package/dist/tools/self-config.js +5 -9
  248. package/dist/tools/self-config.js.map +1 -1
  249. package/package.json +4 -1
  250. package/dist/memento/state.d.ts +0 -56
  251. package/dist/memento/state.d.ts.map +0 -1
  252. package/dist/memento/state.js +0 -156
  253. package/dist/memento/state.js.map +0 -1
  254. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +0 -18
  255. package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +0 -1
  256. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +0 -207
  257. package/dist/migrations/versions/v1.4.0-rfc2119-skills.js.map +0 -1
@@ -17,6 +17,7 @@ Guide the user through understanding their needs so you can create a well-config
17
17
  4. **Knowledge Sources**: What documentation will be added? How should new knowledge be captured over time?
18
18
  5. **Audience**: Who will use this? How should it communicate? (formal, casual, technical depth)
19
19
  6. **Autonomy**: How autonomous should it be? Should it create/modify files freely, or ask first?
20
+ 7. **Tools & CLI integrations**: Does the navigator need access to any CLI tools? (e.g., linear, gh, kubectl, npm). If so, the navigator will be configured with sandbox tool overrides so it can use them.
20
21
 
21
22
  ## Philosophy
22
23
  Navs are "self-organizing notebooks that talk back" - they edit their own knowledge files, learn from conversations, and maintain their own context. Help the user think through how they want this self-organization to work.
@@ -54,12 +55,15 @@ The JSON must include:
54
55
  "audience": "Who uses this navigator and how it should communicate",
55
56
  "autonomy": "Autonomy level - can it create files freely or should it ask first",
56
57
  "claudeMd": "The complete CLAUDE.md content as a string with proper newlines (\\n)",
57
- "suggestedDirectories": ["optional", "array", "of", "subdirectories"]
58
+ "suggestedDirectories": ["optional", "array", "of", "subdirectories"],
59
+ "sandboxAllowedTools": ["optional", "array", "of", "tool", "names", "like", "Bash"]
58
60
  }
59
61
  \`\`\`
60
62
 
61
63
  **IMPORTANT**: After outputting the JSON block, your job is complete. Do NOT add any commentary, instructions, or ask for further confirmation. The system will automatically use this configuration to create the navigator.
62
64
 
65
+ The sandboxAllowedTools field should list tool names (like "Bash") that the navigator needs for CLI integrations mentioned during the interview. By default, queries are read-only and block write/edit tools. If the user mentions needing CLI tools, include "Bash" in sandboxAllowedTools. Only include this field if the user mentions specific tool needs.
66
+
63
67
  The claudeMd field should be a complete, personalized CLAUDE.md file based on what you learned, including:
64
68
  - Clear purpose statement
65
69
  - Grounding rules (always cite, never invent, acknowledge uncertainty)
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/interview/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0EAsE4C,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAyB,EACzB,eAAgC;IAEhC,IAAI,MAAM,GAAG,qBAAqB,CAAC;IAEnC,uCAAuC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG;;;6CAGuB,WAAW,CAAC,QAAQ,uBAAuB,WAAW,CAAC,WAAW;;CAE9G,CAAC;QAEE,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YAC1B,WAAW,IAAI;;;;;;EAMnB,WAAW,CAAC,SAAS;;;;CAItB,CAAC;QACE,CAAC;aAAM,CAAC;YACN,WAAW,IAAI;;;;;;CAMpB,CAAC;QACE,CAAC;QAED,MAAM,IAAI,WAAW,CAAC;IACxB,CAAC;IAED,2CAA2C;IAC3C,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG;;;;;;iBAMX,eAAe,CAAC,OAAO;eACzB,eAAe,CAAC,KAAK;kBAClB,eAAe,CAAC,QAAQ;oBACtB,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;;;;;;;CAShE,CAAC;QAEE,MAAM,IAAI,eAAe,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAe7D;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAoB,CAAC;QAEvD,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzD,uCAAuC;YACvC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBACnE,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;oBACjD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;oBAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;iBAC/B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gCAAgC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/interview/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0EA0E4C,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAyB,EACzB,eAAgC;IAEhC,IAAI,MAAM,GAAG,qBAAqB,CAAC;IAEnC,uCAAuC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG;;;6CAGuB,WAAW,CAAC,QAAQ,uBAAuB,WAAW,CAAC,WAAW;;CAE9G,CAAC;QAEE,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YAC1B,WAAW,IAAI;;;;;;EAMnB,WAAW,CAAC,SAAS;;;;CAItB,CAAC;QACE,CAAC;aAAM,CAAC;YACN,WAAW,IAAI;;;;;;CAMpB,CAAC;QACE,CAAC;QAED,MAAM,IAAI,WAAW,CAAC;IACxB,CAAC;IAED,2CAA2C;IAC3C,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG;;;;;;iBAMX,eAAe,CAAC,OAAO;eACzB,eAAe,CAAC,KAAK;kBAClB,eAAe,CAAC,QAAQ;oBACtB,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;;;;;;;CAShE,CAAC;QAEE,MAAM,IAAI,eAAe,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAiB7D;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAoB,CAAC;QAEvD,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzD,uCAAuC;YACvC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBACnE,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;oBACjD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;oBAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;iBAC/B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gCAAgC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Welcome banner for chat mode
3
+ *
4
+ * Follows the same double-line box pattern as Banner.tsx with
5
+ * navigator name and model info instead of creation context.
6
+ */
7
+ interface ChatBannerProps {
8
+ /** Navigator name */
9
+ navigatorName: string;
10
+ /** Model being used */
11
+ model: string;
12
+ /** Version string */
13
+ version?: string;
14
+ }
15
+ export declare function ChatBanner({ navigatorName, model, version, }: ChatBannerProps): React.ReactNode;
16
+ export {};
17
+ //# sourceMappingURL=ChatBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatBanner.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/ChatBanner.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,UAAU,eAAe;IACvB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,wBAAgB,UAAU,CAAC,EACzB,aAAa,EACb,KAAK,EACL,OAAO,GACR,EAAE,eAAe,GAAG,KAAK,CAAC,SAAS,CAyDnC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Welcome banner for chat mode
4
+ *
5
+ * Follows the same double-line box pattern as Banner.tsx with
6
+ * navigator name and model info instead of creation context.
7
+ */
8
+ import { Box, Text } from "ink";
9
+ import { colors, boxChars } from "./theme.js";
10
+ /** Fixed inner width for the banner box */
11
+ const INNER_WIDTH = 60;
12
+ export function ChatBanner({ navigatorName, model, version, }) {
13
+ const { double } = boxChars;
14
+ // Block letter AUTONAV (same as Banner.tsx)
15
+ const logoLine1 = " ▄▀█ █░█ ▀█▀ █▀█ █▄░█ ▄▀█ █░█";
16
+ const logoLine2 = " █▀█ █▄█ ░█░ █▄█ █░▀█ █▀█ ▀▄▀";
17
+ // Info lines
18
+ const navLine = ` Navigator ${navigatorName}`;
19
+ const modelLine = ` Model ${model}`;
20
+ const versionSuffix = version ? ` v${version}` : "";
21
+ const helpLine = ` /help for commands · Ctrl+C twice to exit${versionSuffix}`;
22
+ const topBorder = double.topLeft + double.horizontal.repeat(INNER_WIDTH) + double.topRight;
23
+ const midBorder = double.leftT + double.horizontal.repeat(INNER_WIDTH) + double.rightT;
24
+ const bottomBorder = double.bottomLeft +
25
+ double.horizontal.repeat(INNER_WIDTH) +
26
+ double.bottomRight;
27
+ const emptyLine = double.vertical + " ".repeat(INNER_WIDTH) + double.vertical;
28
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: colors.dimmed, children: topBorder }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: colors.primary, children: logoLine1.padEnd(INNER_WIDTH) }), double.vertical] }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: colors.primary, children: logoLine2.padEnd(INNER_WIDTH) }), double.vertical] }), _jsx(Text, { color: colors.dimmed, children: midBorder }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: "white", children: navLine.padEnd(INNER_WIDTH) }), double.vertical] }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: "white", children: modelLine.padEnd(INNER_WIDTH) }), double.vertical] }), _jsx(Text, { color: colors.dimmed, children: emptyLine }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: colors.accent, children: helpLine.padEnd(INNER_WIDTH) }), double.vertical] }), _jsx(Text, { color: colors.dimmed, children: bottomBorder })] }));
29
+ }
30
+ //# sourceMappingURL=ChatBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatBanner.js","sourceRoot":"","sources":["../../../src/interview/ui/ChatBanner.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Multiline chat input with word navigation and readline keybindings
3
+ *
4
+ * Replaces ink-text-input with a purpose-built component for chat UIs.
5
+ *
6
+ * Keybindings:
7
+ * Enter — Submit message
8
+ * Ctrl+J — Insert newline
9
+ * Left/Right — Move cursor by character
10
+ * Option+Left — Move cursor to previous word boundary
11
+ * Option+Right — Move cursor to next word boundary
12
+ * Ctrl+A / Home — Move to start of current line
13
+ * Ctrl+E / End — Move to end of current line
14
+ * Ctrl+W — Delete word backward
15
+ * Ctrl+U — Delete to start of line
16
+ * Ctrl+K — Delete to end of line
17
+ * Backspace — Delete character backward
18
+ * Delete — Delete character forward
19
+ */
20
+ interface ChatInputProps {
21
+ /** Current input value (controlled) */
22
+ value: string;
23
+ /** Called when value changes */
24
+ onChange: (value: string) => void;
25
+ /** Called when user presses Enter to submit */
26
+ onSubmit: (value: string) => void;
27
+ /** Placeholder text when empty */
28
+ placeholder?: string;
29
+ /** Whether input is active */
30
+ focus?: boolean;
31
+ /** Prompt string displayed before input */
32
+ prompt?: string;
33
+ }
34
+ export declare function ChatInput({ value, onChange, onSubmit, placeholder, focus, prompt, }: ChatInputProps): React.ReactNode;
35
+ export {};
36
+ //# sourceMappingURL=ChatInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/ChatInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,UAAU,cAAc;IACtB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyGD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAiC,EACjC,KAAY,EACZ,MAAa,GACd,EAAE,cAAc,GAAG,KAAK,CAAC,SAAS,CAoQlC"}
@@ -0,0 +1,304 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Multiline chat input with word navigation and readline keybindings
4
+ *
5
+ * Replaces ink-text-input with a purpose-built component for chat UIs.
6
+ *
7
+ * Keybindings:
8
+ * Enter — Submit message
9
+ * Ctrl+J — Insert newline
10
+ * Left/Right — Move cursor by character
11
+ * Option+Left — Move cursor to previous word boundary
12
+ * Option+Right — Move cursor to next word boundary
13
+ * Ctrl+A / Home — Move to start of current line
14
+ * Ctrl+E / End — Move to end of current line
15
+ * Ctrl+W — Delete word backward
16
+ * Ctrl+U — Delete to start of line
17
+ * Ctrl+K — Delete to end of line
18
+ * Backspace — Delete character backward
19
+ * Delete — Delete character forward
20
+ */
21
+ import { useState, useEffect, useCallback } from "react";
22
+ import { Box, Text, useInput, useStdout } from "ink";
23
+ import chalk from "chalk";
24
+ import { colors } from "./theme.js";
25
+ /** Find the start of the previous word from cursor position */
26
+ function wordBoundaryLeft(text, cursor) {
27
+ let pos = cursor - 1;
28
+ // Skip whitespace
29
+ while (pos > 0 && /\s/.test(text[pos - 1] ?? ""))
30
+ pos--;
31
+ // Skip word characters
32
+ while (pos > 0 && /\S/.test(text[pos - 1] ?? ""))
33
+ pos--;
34
+ return Math.max(0, pos);
35
+ }
36
+ /** Find the end of the next word from cursor position */
37
+ function wordBoundaryRight(text, cursor) {
38
+ let pos = cursor;
39
+ // Skip word characters
40
+ while (pos < text.length && /\S/.test(text[pos] ?? ""))
41
+ pos++;
42
+ // Skip whitespace
43
+ while (pos < text.length && /\s/.test(text[pos] ?? ""))
44
+ pos++;
45
+ return Math.min(text.length, pos);
46
+ }
47
+ /** Find start of current line relative to cursor */
48
+ function lineStart(text, cursor) {
49
+ const before = text.slice(0, cursor);
50
+ const lastNewline = before.lastIndexOf("\n");
51
+ return lastNewline + 1;
52
+ }
53
+ /** Find end of current line relative to cursor */
54
+ function lineEnd(text, cursor) {
55
+ const nextNewline = text.indexOf("\n", cursor);
56
+ return nextNewline === -1 ? text.length : nextNewline;
57
+ }
58
+ /**
59
+ * Split text into visual lines based on terminal width, tracking
60
+ * which visual line the cursor is on and its column offset.
61
+ */
62
+ function layoutLines(text, width, cursor, promptWidth) {
63
+ const lines = [];
64
+ let cursorLine = 0;
65
+ let cursorCol = 0;
66
+ let charsSoFar = 0;
67
+ const logicalLines = text.split("\n");
68
+ for (let li = 0; li < logicalLines.length; li++) {
69
+ const line = logicalLines[li] ?? "";
70
+ // First logical line shares space with prompt
71
+ const maxWidth = li === 0 ? width - promptWidth : width;
72
+ if (line.length === 0) {
73
+ // Track cursor on empty lines
74
+ if (charsSoFar === cursor) {
75
+ cursorLine = lines.length;
76
+ cursorCol = li === 0 ? promptWidth : 0;
77
+ }
78
+ lines.push(line);
79
+ charsSoFar++; // for the \n
80
+ continue;
81
+ }
82
+ // Wrap long lines
83
+ let start = 0;
84
+ let isFirstWrap = true;
85
+ while (start < line.length) {
86
+ const wrapWidth = isFirstWrap ? maxWidth : width;
87
+ const segment = line.slice(start, start + wrapWidth);
88
+ lines.push(segment);
89
+ // Check if cursor falls in this segment
90
+ const segStart = charsSoFar;
91
+ const segEnd = charsSoFar + segment.length;
92
+ if (cursor >= segStart && cursor <= segEnd) {
93
+ cursorLine = lines.length - 1;
94
+ const offset = cursor - segStart;
95
+ cursorCol = isFirstWrap && li === 0 ? promptWidth + offset : offset;
96
+ }
97
+ charsSoFar += segment.length;
98
+ start += segment.length;
99
+ isFirstWrap = false;
100
+ }
101
+ charsSoFar++; // for the \n between logical lines
102
+ }
103
+ // Handle cursor at very end
104
+ if (cursor >= charsSoFar - 1 && cursor === text.length) {
105
+ cursorLine = Math.max(0, lines.length - 1);
106
+ const lastLine = lines[cursorLine] ?? "";
107
+ cursorCol =
108
+ logicalLines.length === 1 && lines.length === 1
109
+ ? promptWidth + lastLine.length
110
+ : lastLine.length;
111
+ }
112
+ return { lines, cursorLine, cursorCol };
113
+ }
114
+ export function ChatInput({ value, onChange, onSubmit, placeholder = "Type a message...", focus = true, prompt = "▸ ", }) {
115
+ const { stdout } = useStdout();
116
+ const terminalWidth = (stdout?.columns ?? 80) - 2; // padding
117
+ const [cursor, setCursor] = useState(value.length);
118
+ // Keep cursor in bounds when value changes externally
119
+ useEffect(() => {
120
+ setCursor((prev) => Math.min(prev, value.length));
121
+ }, [value]);
122
+ const handleInput = useCallback((input, key) => {
123
+ // Ignore when not focused
124
+ if (!focus)
125
+ return;
126
+ // Skip Ctrl+C/D (handled by parent)
127
+ if (key.ctrl && (input === "c" || input === "d"))
128
+ return;
129
+ // Submit on Enter
130
+ if (key.return) {
131
+ onSubmit(value);
132
+ return;
133
+ }
134
+ let nextValue = value;
135
+ let nextCursor = cursor;
136
+ // --- Newline insertion ---
137
+ // Ctrl+J sends name='enter' which ink maps to input='' with no key flags
138
+ // We detect it via the raw check: when input is empty and no key flag is set
139
+ // But ink strips it. Let's check for Shift+Return or handle Ctrl+J specially.
140
+ // Actually, ink's parseKeypress maps \n to name='enter', and useInput
141
+ // puts input='' for nonAlphanumericKeys. So we need to hook stdin directly
142
+ // for Ctrl+J. Instead, let's use a pragmatic approach:
143
+ // Ctrl+J: key.ctrl && input === 'j' (ink gives input = key.name for ctrl combos)
144
+ if (key.ctrl && input === "j") {
145
+ nextValue = value.slice(0, cursor) + "\n" + value.slice(cursor);
146
+ nextCursor = cursor + 1;
147
+ onChange(nextValue);
148
+ setCursor(nextCursor);
149
+ return;
150
+ }
151
+ // --- Word navigation ---
152
+ // Option+Left (Mac) sends ESC b → key.meta=true, input='b'
153
+ // Some terminals send ESC [1;3D → key.meta=true, key.leftArrow=true
154
+ if ((key.meta && input === "b") || (key.leftArrow && key.meta)) {
155
+ setCursor(wordBoundaryLeft(value, cursor));
156
+ return;
157
+ }
158
+ // Option+Right (Mac) sends ESC f → key.meta=true, input='f'
159
+ // Some terminals send ESC [1;3C → key.meta=true, key.rightArrow=true
160
+ if ((key.meta && input === "f") || (key.rightArrow && key.meta)) {
161
+ setCursor(wordBoundaryRight(value, cursor));
162
+ return;
163
+ }
164
+ // Option+Delete (Mac) sends ESC DEL → word delete backward
165
+ if (key.meta && key.delete) {
166
+ const boundary = wordBoundaryLeft(value, cursor);
167
+ nextValue = value.slice(0, boundary) + value.slice(cursor);
168
+ nextCursor = boundary;
169
+ onChange(nextValue);
170
+ setCursor(nextCursor);
171
+ return;
172
+ }
173
+ // --- Line navigation ---
174
+ // Ctrl+A or Home: start of line
175
+ if (key.ctrl && input === "a") {
176
+ setCursor(lineStart(value, cursor));
177
+ return;
178
+ }
179
+ // Ctrl+E or End: end of line
180
+ if (key.ctrl && input === "e") {
181
+ setCursor(lineEnd(value, cursor));
182
+ return;
183
+ }
184
+ // --- Deletion ---
185
+ // Ctrl+W: delete word backward
186
+ if (key.ctrl && input === "w") {
187
+ const boundary = wordBoundaryLeft(value, cursor);
188
+ nextValue = value.slice(0, boundary) + value.slice(cursor);
189
+ nextCursor = boundary;
190
+ onChange(nextValue);
191
+ setCursor(nextCursor);
192
+ return;
193
+ }
194
+ // Ctrl+U: delete to start of line
195
+ if (key.ctrl && input === "u") {
196
+ const ls = lineStart(value, cursor);
197
+ nextValue = value.slice(0, ls) + value.slice(cursor);
198
+ nextCursor = ls;
199
+ onChange(nextValue);
200
+ setCursor(nextCursor);
201
+ return;
202
+ }
203
+ // Ctrl+K: delete to end of line
204
+ if (key.ctrl && input === "k") {
205
+ const le = lineEnd(value, cursor);
206
+ nextValue = value.slice(0, cursor) + value.slice(le);
207
+ onChange(nextValue);
208
+ return;
209
+ }
210
+ // --- Basic navigation ---
211
+ if (key.leftArrow) {
212
+ setCursor(Math.max(0, cursor - 1));
213
+ return;
214
+ }
215
+ if (key.rightArrow) {
216
+ setCursor(Math.min(value.length, cursor + 1));
217
+ return;
218
+ }
219
+ // Up/Down arrow: move between visual lines if multiline, else ignore
220
+ if (key.upArrow || key.downArrow) {
221
+ if (value.includes("\n")) {
222
+ const lines = value.split("\n");
223
+ // Find which logical line and offset cursor is at
224
+ let pos = 0;
225
+ let logLine = 0;
226
+ for (let i = 0; i < lines.length; i++) {
227
+ if (pos + (lines[i]?.length ?? 0) >= cursor) {
228
+ logLine = i;
229
+ break;
230
+ }
231
+ pos += (lines[i]?.length ?? 0) + 1;
232
+ }
233
+ const colInLine = cursor - pos;
234
+ if (key.upArrow && logLine > 0) {
235
+ // Move to previous logical line, same column
236
+ let prevStart = 0;
237
+ for (let i = 0; i < logLine - 1; i++) {
238
+ prevStart += (lines[i]?.length ?? 0) + 1;
239
+ }
240
+ const prevLen = lines[logLine - 1]?.length ?? 0;
241
+ setCursor(prevStart + Math.min(colInLine, prevLen));
242
+ return;
243
+ }
244
+ if (key.downArrow && logLine < lines.length - 1) {
245
+ // Move to next logical line, same column
246
+ let nextStart = 0;
247
+ for (let i = 0; i <= logLine; i++) {
248
+ nextStart += (lines[i]?.length ?? 0) + 1;
249
+ }
250
+ const nextLen = lines[logLine + 1]?.length ?? 0;
251
+ setCursor(nextStart + Math.min(colInLine, nextLen));
252
+ return;
253
+ }
254
+ }
255
+ return;
256
+ }
257
+ // --- Backspace / Delete ---
258
+ // Ink maps Mac's backspace key (\x7f) to key.delete, not key.backspace.
259
+ // Both key.backspace (\x08/Ctrl+H) and key.delete (\x7f) do backward
260
+ // delete — this matches ink-text-input behavior and Mac expectations.
261
+ if (key.backspace || key.delete) {
262
+ if (cursor > 0) {
263
+ nextValue = value.slice(0, cursor - 1) + value.slice(cursor);
264
+ nextCursor = cursor - 1;
265
+ onChange(nextValue);
266
+ setCursor(nextCursor);
267
+ }
268
+ return;
269
+ }
270
+ // --- Tab, Escape, unhandled Meta combos: ignore ---
271
+ if (key.tab || key.escape || key.meta)
272
+ return;
273
+ // --- Character input ---
274
+ if (input && !key.ctrl) {
275
+ nextValue = value.slice(0, cursor) + input + value.slice(cursor);
276
+ nextCursor = cursor + input.length;
277
+ onChange(nextValue);
278
+ setCursor(nextCursor);
279
+ }
280
+ }, [value, cursor, focus, onChange, onSubmit, terminalWidth, prompt.length]);
281
+ useInput(handleInput, { isActive: focus });
282
+ // --- Rendering ---
283
+ const isEmpty = value.length === 0;
284
+ const { lines, cursorLine, cursorCol } = layoutLines(isEmpty ? "" : value, terminalWidth, cursor, prompt.length);
285
+ if (isEmpty) {
286
+ // Show placeholder with cursor
287
+ return (_jsxs(Box, { children: [_jsx(Text, { color: colors.primary, children: prompt }), _jsxs(Text, { children: [chalk.inverse(" "), chalk.gray(placeholder)] })] }));
288
+ }
289
+ return (_jsxs(Box, { flexDirection: "column", children: [lines.map((line, i) => {
290
+ const isFirstLine = i === 0;
291
+ const isCursorLine = i === cursorLine;
292
+ // Render the line with cursor
293
+ let rendered = line;
294
+ if (isCursorLine && focus) {
295
+ const col = isFirstLine ? cursorCol - prompt.length : cursorCol;
296
+ const before = line.slice(0, col);
297
+ const cursorChar = line[col] ?? " ";
298
+ const after = line.slice(col + 1);
299
+ rendered = before + chalk.inverse(cursorChar) + after;
300
+ }
301
+ return (_jsx(Box, { children: isFirstLine ? (_jsxs(Text, { children: [_jsx(Text, { color: colors.primary, children: prompt }), rendered] })) : (_jsxs(Text, { children: [" ".repeat(prompt.length), rendered] })) }, i));
302
+ }), value.includes("\n") && (_jsx(Box, { children: _jsxs(Text, { color: colors.dimmed, children: [" ", "Enter to send \u00B7 Ctrl+J for newline"] }) }))] }));
303
+ }
304
+ //# sourceMappingURL=ChatInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../../src/interview/ui/ChatInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Markdown renderer for terminal output
3
+ *
4
+ * Wraps marked + marked-terminal to render markdown strings as
5
+ * ANSI-styled terminal text within Ink components.
6
+ */
7
+ interface MarkdownTextProps {
8
+ /** Markdown content to render */
9
+ content: string;
10
+ }
11
+ export declare function MarkdownText({ content }: MarkdownTextProps): React.ReactNode;
12
+ export {};
13
+ //# sourceMappingURL=MarkdownText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownText.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/MarkdownText.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,iBAAiB;IACzB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CA4D5E"}
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Markdown renderer for terminal output
4
+ *
5
+ * Wraps marked + marked-terminal to render markdown strings as
6
+ * ANSI-styled terminal text within Ink components.
7
+ */
8
+ import { useMemo } from "react";
9
+ import { Text, useStdout } from "ink";
10
+ import { Marked } from "marked";
11
+ import { markedTerminal } from "marked-terminal";
12
+ import chalk from "chalk";
13
+ import { highlight } from "cli-highlight";
14
+ import { matrixBrightness, boxChars } from "./theme.js";
15
+ /** Bright green from theme for headers */
16
+ const headerColor = chalk.rgb(matrixBrightness.bright.r, matrixBrightness.bright.g, matrixBrightness.bright.b);
17
+ const dimColor = chalk.gray;
18
+ const { single } = boxChars;
19
+ /**
20
+ * Render a fenced code block with box-drawing borders and language label.
21
+ *
22
+ * ┌─ typescript ──────────────────
23
+ * │ const x = 1;
24
+ * │ const y = 2;
25
+ * └───────────────────────────────
26
+ */
27
+ function renderCodeBlock(code, lang, width) {
28
+ // Syntax-highlight the code
29
+ let highlighted;
30
+ try {
31
+ highlighted = highlight(code, { language: lang });
32
+ }
33
+ catch {
34
+ highlighted = code;
35
+ }
36
+ const codeLines = highlighted.split("\n");
37
+ // Remove trailing empty line that marked often adds
38
+ if (codeLines.length > 0 && (codeLines[codeLines.length - 1] ?? "").trim() === "") {
39
+ codeLines.pop();
40
+ }
41
+ const innerWidth = Math.max(width - 6, 30);
42
+ const langLabel = lang ? ` ${lang} ` : "";
43
+ const topRule = langLabel
44
+ ? single.horizontal + langLabel + single.horizontal.repeat(Math.max(0, innerWidth - langLabel.length - 1))
45
+ : single.horizontal.repeat(innerWidth);
46
+ const bottomRule = single.horizontal.repeat(innerWidth);
47
+ const top = dimColor(` ${single.topLeft}${topRule}`);
48
+ const bottom = dimColor(` ${single.bottomLeft}${bottomRule}`);
49
+ const body = codeLines
50
+ .map((line) => dimColor(` ${single.vertical} `) + line)
51
+ .join("\n");
52
+ return `\n${top}\n${body}\n${bottom}\n`;
53
+ }
54
+ export function MarkdownText({ content }) {
55
+ const { stdout } = useStdout();
56
+ const terminalWidth = stdout?.columns ?? 80;
57
+ const rendered = useMemo(() => {
58
+ const contentWidth = terminalWidth - 4;
59
+ // Configure marked with terminal renderer
60
+ const instance = new Marked();
61
+ instance.use(markedTerminal({
62
+ reflowText: true,
63
+ width: contentWidth,
64
+ showSectionPrefix: false,
65
+ tab: 2,
66
+ emoji: false,
67
+ // Theme headers with bright green
68
+ firstHeading: (text) => headerColor.bold(`\n${text}\n`),
69
+ heading: (text) => headerColor(`\n${text}\n`),
70
+ // Yellow for inline code
71
+ codespan: (text) => chalk.yellow(text),
72
+ // Cyan for links
73
+ link: (href, _title, text) => chalk.cyan(text) + (href !== text ? chalk.gray(` (${href})`) : ""),
74
+ // Gray italic for blockquotes
75
+ blockquote: (quote) => chalk.gray.italic(` │ ${quote.trim().split("\n").join("\n │ ")}\n`),
76
+ }));
77
+ // Fix: marked-terminal's text renderer doesn't parse inline tokens
78
+ // (bold, italic, etc.) inside list items in marked v14+. Override
79
+ // the text renderer to call parseInline when tokens are available.
80
+ instance.use({
81
+ renderer: {
82
+ // Fix: marked-terminal's text renderer doesn't parse inline tokens
83
+ // (bold, italic, etc.) inside list items in marked v14+.
84
+ text(token) {
85
+ if (typeof token === "object" && token.tokens) {
86
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+ return this.parser.parseInline(token.tokens);
88
+ }
89
+ return typeof token === "object"
90
+ ? (token.text ?? token.raw ?? "")
91
+ : String(token);
92
+ },
93
+ // Custom code block with box-drawing borders and language label
94
+ code(token) {
95
+ const code = typeof token === "object" ? (token.text ?? "") : token;
96
+ const lang = typeof token === "object" ? token.lang : undefined;
97
+ return renderCodeBlock(code, lang, contentWidth);
98
+ },
99
+ },
100
+ });
101
+ const result = instance.parse(content, { async: false });
102
+ // Trim trailing whitespace from marked output
103
+ return (typeof result === "string" ? result : String(result)).trimEnd();
104
+ }, [content, terminalWidth]);
105
+ return _jsx(Text, { children: rendered });
106
+ }
107
+ //# sourceMappingURL=MarkdownText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownText.js","sourceRoot":"","sources":["../../../src/interview/ui/MarkdownText.tsx"],"names":[],"mappings":"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"}
@@ -7,6 +7,9 @@ export { SystemMessage } from "./SystemMessage.js";
7
7
  export { UserResponse } from "./UserResponse.js";
8
8
  export { Divider } from "./Divider.js";
9
9
  export { CompletionScreen } from "./CompletionScreen.js";
10
+ export { MarkdownText } from "./MarkdownText.js";
11
+ export { ChatBanner } from "./ChatBanner.js";
12
+ export { ChatInput } from "./ChatInput.js";
10
13
  export * from "./theme.js";
11
14
  export * from "./text-utils.js";
12
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
@@ -7,6 +7,9 @@ export { SystemMessage } from "./SystemMessage.js";
7
7
  export { UserResponse } from "./UserResponse.js";
8
8
  export { Divider } from "./Divider.js";
9
9
  export { CompletionScreen } from "./CompletionScreen.js";
10
+ export { MarkdownText } from "./MarkdownText.js";
11
+ export { ChatBanner } from "./ChatBanner.js";
12
+ export { ChatInput } from "./ChatInput.js";
10
13
  export * from "./theme.js";
11
14
  export * from "./text-utils.js";
12
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}