orynacode-ai 1.16.2 → 1.16.4

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 (310) hide show
  1. package/package.json +3 -4
  2. package/parsers-config.ts +1 -386
  3. package/script/build.ts +1 -1
  4. package/script/schema.ts +2 -2
  5. package/script/trace-imports.ts +1 -1
  6. package/src/cli/cmd/{tui/attach.ts → attach.ts} +40 -46
  7. package/src/cli/cmd/models.ts +1 -1
  8. package/src/cli/cmd/prompt-display.ts +1 -48
  9. package/src/cli/cmd/providers.ts +3 -3
  10. package/src/cli/cmd/run/demo.ts +1 -1
  11. package/src/cli/cmd/run/entry.body.ts +11 -0
  12. package/src/cli/cmd/run/footer.command.tsx +298 -112
  13. package/src/cli/cmd/run/footer.menu.tsx +84 -37
  14. package/src/cli/cmd/run/footer.permission.tsx +9 -2
  15. package/src/cli/cmd/run/footer.prompt.tsx +135 -30
  16. package/src/cli/cmd/run/footer.question.tsx +2 -1
  17. package/src/cli/cmd/run/footer.subagent.tsx +9 -1
  18. package/src/cli/cmd/run/footer.ts +104 -43
  19. package/src/cli/cmd/run/footer.view.tsx +475 -425
  20. package/src/cli/cmd/run/footer.width.ts +27 -0
  21. package/src/cli/cmd/run/prompt.editor.ts +157 -0
  22. package/src/cli/cmd/run/prompt.shared.ts +7 -1
  23. package/src/cli/cmd/run/runtime.boot.ts +3 -11
  24. package/src/cli/cmd/run/runtime.lifecycle.ts +72 -11
  25. package/src/cli/cmd/run/runtime.queue.ts +12 -10
  26. package/src/cli/cmd/run/runtime.ts +49 -26
  27. package/src/cli/cmd/run/scrollback.surface.ts +14 -1
  28. package/src/cli/cmd/run/scrollback.writer.tsx +19 -1
  29. package/src/cli/cmd/run/session-replay.ts +78 -5
  30. package/src/cli/cmd/run/splash.ts +22 -48
  31. package/src/cli/cmd/run/stream.transport.ts +6 -9
  32. package/src/cli/cmd/run/subagent-data.ts +77 -45
  33. package/src/cli/cmd/run/theme.ts +138 -51
  34. package/src/cli/cmd/run/turn-summary.ts +47 -0
  35. package/src/cli/cmd/run/types.ts +10 -2
  36. package/src/cli/cmd/{tui/thread.ts → tui.ts} +40 -40
  37. package/src/cli/tui/layer.ts +7 -0
  38. package/src/config/tui-host-attention.ts +21 -0
  39. package/src/{cli/cmd/tui/config → config}/tui-migrate.ts +4 -4
  40. package/src/{cli/cmd/tui/config → config}/tui.ts +37 -53
  41. package/src/index.ts +2 -2
  42. package/src/mcp/index.ts +20 -6
  43. package/src/{cli/cmd/tui/context/agent.tsx → oryna/agent-signal.ts} +2 -1
  44. package/src/oryna/agent.ts +21 -13
  45. package/src/oryna/reply-service.ts +3 -1
  46. package/src/plugin/index.ts +2 -2
  47. package/src/plugin/oryna.ts +4 -4
  48. package/src/plugin/tui/internal.ts +12 -0
  49. package/src/{cli/cmd/tui/plugin → plugin/tui}/runtime.ts +65 -22
  50. package/src/server/routes/instance/httpapi/api.ts +4 -2
  51. package/src/server/routes/instance/httpapi/groups/reference.ts +60 -0
  52. package/src/server/routes/instance/httpapi/groups/tui.ts +1 -1
  53. package/src/server/routes/instance/httpapi/handlers/config.ts +11 -11
  54. package/src/server/routes/instance/httpapi/handlers/control.ts +2 -2
  55. package/src/server/routes/instance/httpapi/handlers/provider.ts +5 -5
  56. package/src/server/routes/instance/httpapi/handlers/reference.ts +27 -0
  57. package/src/server/routes/instance/httpapi/handlers/tui.ts +1 -1
  58. package/src/server/routes/instance/httpapi/middleware/authorization.ts +4 -1
  59. package/src/server/routes/instance/httpapi/server.ts +12 -8
  60. package/src/session/session.ts +2 -0
  61. package/src/temporary.ts +1 -1
  62. package/src/tool/registry.ts +1 -25
  63. package/src/tool/reply.ts +1 -1
  64. package/src/tool/task.ts +4 -3
  65. package/src/util/error.ts +1 -88
  66. package/src/util/locale.ts +2 -86
  67. package/src/util/process.ts +2 -1
  68. package/src/util/record.ts +1 -3
  69. package/test/cli/cmd/tui/attention.test.ts +2 -2
  70. package/test/cli/run/footer.view.test.tsx +443 -35
  71. package/test/cli/run/footer.width.test.ts +35 -0
  72. package/test/cli/run/prompt.editor.test.ts +101 -0
  73. package/test/cli/run/prompt.shared.test.ts +0 -32
  74. package/test/cli/run/runtime.boot.test.ts +2 -1
  75. package/test/cli/run/runtime.queue.test.ts +16 -0
  76. package/test/cli/run/runtime.test.ts +238 -0
  77. package/test/cli/run/scrollback.surface.test.ts +17 -0
  78. package/test/cli/run/session-replay.test.ts +248 -12
  79. package/test/cli/run/stream.transport.test.ts +2 -2
  80. package/test/cli/run/subagent-data.test.ts +98 -7
  81. package/test/cli/run/theme.test.ts +25 -0
  82. package/test/cli/tui/attach.test.ts +11 -0
  83. package/test/cli/tui/editor-context-zed.test.ts +1 -6
  84. package/test/cli/tui/editor-context.test.tsx +13 -4
  85. package/test/cli/tui/plugin-add.test.ts +2 -2
  86. package/test/cli/tui/plugin-install.test.ts +2 -2
  87. package/test/cli/tui/plugin-lifecycle.test.ts +1 -1
  88. package/test/cli/tui/plugin-loader-entrypoint.test.ts +2 -2
  89. package/test/cli/tui/plugin-loader-pure.test.ts +2 -2
  90. package/test/cli/tui/plugin-loader.test.ts +3 -3
  91. package/test/cli/tui/plugin-toggle.test.ts +2 -2
  92. package/test/cli/tui/thread.test.ts +9 -1
  93. package/test/config/tui.test.ts +14 -6
  94. package/test/fixture/tui-environment.tsx +32 -0
  95. package/test/fixture/tui-plugin.ts +1 -1
  96. package/test/fixture/tui-runtime.ts +17 -25
  97. package/test/fixture/tui-sdk.ts +1 -1
  98. package/test/mcp/lifecycle.test.ts +90 -0
  99. package/test/mcp/oauth-auto-connect.test.ts +38 -0
  100. package/test/mcp/oauth-browser.test.ts +4 -0
  101. package/test/preload.ts +5 -1
  102. package/test/server/httpapi-authorization.test.ts +6 -6
  103. package/test/server/httpapi-exercise/index.ts +13 -10
  104. package/test/server/httpapi-public-openapi.test.ts +9 -9
  105. package/test/server/httpapi-query-schema-drift.test.ts +2 -2
  106. package/test/server/httpapi-reference.test.ts +56 -0
  107. package/test/server/httpapi-sdk.test.ts +1 -1
  108. package/test/server/httpapi-session.test.ts +4 -4
  109. package/test/session/compaction.test.ts +2 -0
  110. package/test/session/prompt.test.ts +2 -0
  111. package/test/tool/__snapshots__/parameters.test.ts.snap +1 -1
  112. package/test/tool/skill.test.ts +3 -0
  113. package/test/util/error.test.ts +0 -48
  114. package/tsconfig.json +0 -1
  115. package/src/cli/cmd/tui/app.tsx +0 -1113
  116. package/src/cli/cmd/tui/attention.ts +0 -262
  117. package/src/cli/cmd/tui/component/bg-pulse-render.ts +0 -436
  118. package/src/cli/cmd/tui/component/bg-pulse.tsx +0 -99
  119. package/src/cli/cmd/tui/component/border.tsx +0 -21
  120. package/src/cli/cmd/tui/component/command-palette.tsx +0 -79
  121. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  122. package/src/cli/cmd/tui/component/dialog-console-org.tsx +0 -103
  123. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -85
  124. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -185
  125. package/src/cli/cmd/tui/component/dialog-move-session.tsx +0 -240
  126. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -687
  127. package/src/cli/cmd/tui/component/dialog-retry-action.tsx +0 -160
  128. package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +0 -99
  129. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -318
  130. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  131. package/src/cli/cmd/tui/component/dialog-skill.tsx +0 -36
  132. package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
  133. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -168
  134. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -47
  135. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  136. package/src/cli/cmd/tui/component/dialog-variant.tsx +0 -39
  137. package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +0 -313
  138. package/src/cli/cmd/tui/component/dialog-workspace-file-changes.tsx +0 -144
  139. package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +0 -112
  140. package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +0 -69
  141. package/src/cli/cmd/tui/component/error-component.tsx +0 -81
  142. package/src/cli/cmd/tui/component/logo.tsx +0 -885
  143. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +0 -14
  144. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -799
  145. package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
  146. package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -90
  147. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -117
  148. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1725
  149. package/src/cli/cmd/tui/component/prompt/move.tsx +0 -192
  150. package/src/cli/cmd/tui/component/prompt/part.ts +0 -31
  151. package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
  152. package/src/cli/cmd/tui/component/prompt/traits.ts +0 -35
  153. package/src/cli/cmd/tui/component/prompt/workspace.tsx +0 -137
  154. package/src/cli/cmd/tui/component/spinner.tsx +0 -24
  155. package/src/cli/cmd/tui/component/startup-loading.tsx +0 -63
  156. package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
  157. package/src/cli/cmd/tui/component/use-connected.tsx +0 -9
  158. package/src/cli/cmd/tui/component/workspace-label.tsx +0 -19
  159. package/src/cli/cmd/tui/config/keybind.ts +0 -467
  160. package/src/cli/cmd/tui/config/tui-schema.ts +0 -88
  161. package/src/cli/cmd/tui/context/aggregate-failures.ts +0 -51
  162. package/src/cli/cmd/tui/context/args.tsx +0 -15
  163. package/src/cli/cmd/tui/context/directory.ts +0 -15
  164. package/src/cli/cmd/tui/context/editor-zed.ts +0 -287
  165. package/src/cli/cmd/tui/context/editor.ts +0 -469
  166. package/src/cli/cmd/tui/context/event.ts +0 -38
  167. package/src/cli/cmd/tui/context/exit.tsx +0 -42
  168. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  169. package/src/cli/cmd/tui/context/kv.tsx +0 -76
  170. package/src/cli/cmd/tui/context/local.tsx +0 -510
  171. package/src/cli/cmd/tui/context/path-format.tsx +0 -39
  172. package/src/cli/cmd/tui/context/project.tsx +0 -111
  173. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  174. package/src/cli/cmd/tui/context/route.tsx +0 -52
  175. package/src/cli/cmd/tui/context/sdk.tsx +0 -142
  176. package/src/cli/cmd/tui/context/sync-v2.tsx +0 -447
  177. package/src/cli/cmd/tui/context/sync.tsx +0 -628
  178. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  179. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  180. package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
  181. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -230
  182. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -230
  183. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  184. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -225
  185. package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
  186. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  187. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  188. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  189. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  190. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
  191. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  192. package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -234
  193. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  194. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  195. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  196. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  197. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  198. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  199. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  200. package/src/cli/cmd/tui/context/theme/opencode.json +0 -245
  201. package/src/cli/cmd/tui/context/theme/orng.json +0 -249
  202. package/src/cli/cmd/tui/context/theme/oryna.json +0 -95
  203. package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
  204. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  205. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  206. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  207. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  208. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  209. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  210. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  211. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  212. package/src/cli/cmd/tui/context/theme.tsx +0 -1341
  213. package/src/cli/cmd/tui/context/thinking.ts +0 -67
  214. package/src/cli/cmd/tui/context/tui-config.tsx +0 -9
  215. package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +0 -98
  216. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +0 -288
  217. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +0 -59
  218. package/src/cli/cmd/tui/feature-plugins/session/dialog.tsx +0 -356
  219. package/src/cli/cmd/tui/feature-plugins/session/index.tsx +0 -32
  220. package/src/cli/cmd/tui/feature-plugins/session/preview-pane.tsx +0 -288
  221. package/src/cli/cmd/tui/feature-plugins/session/util.tsx +0 -54
  222. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +0 -65
  223. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +0 -70
  224. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +0 -96
  225. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +0 -65
  226. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +0 -97
  227. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +0 -49
  228. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree-utils.ts +0 -232
  229. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree.tsx +0 -162
  230. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-ui.tsx +0 -103
  231. package/src/cli/cmd/tui/feature-plugins/system/diff-viewer.tsx +0 -1058
  232. package/src/cli/cmd/tui/feature-plugins/system/notifications.ts +0 -94
  233. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +0 -269
  234. package/src/cli/cmd/tui/feature-plugins/system/session-v2.tsx +0 -1184
  235. package/src/cli/cmd/tui/feature-plugins/system/which-key.tsx +0 -608
  236. package/src/cli/cmd/tui/keymap.tsx +0 -283
  237. package/src/cli/cmd/tui/layer.ts +0 -6
  238. package/src/cli/cmd/tui/plugin/api.tsx +0 -390
  239. package/src/cli/cmd/tui/plugin/command-shim.ts +0 -109
  240. package/src/cli/cmd/tui/plugin/internal.ts +0 -42
  241. package/src/cli/cmd/tui/plugin/slots.tsx +0 -60
  242. package/src/cli/cmd/tui/routes/home/session-destination.tsx +0 -39
  243. package/src/cli/cmd/tui/routes/home.tsx +0 -149
  244. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -76
  245. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -108
  246. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -26
  247. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
  248. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
  249. package/src/cli/cmd/tui/routes/session/index.tsx +0 -2629
  250. package/src/cli/cmd/tui/routes/session/permission.tsx +0 -729
  251. package/src/cli/cmd/tui/routes/session/question.tsx +0 -514
  252. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -102
  253. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +0 -132
  254. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -66
  255. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -108
  256. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -217
  257. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -40
  258. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -126
  259. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -712
  260. package/src/cli/cmd/tui/ui/dialog.tsx +0 -218
  261. package/src/cli/cmd/tui/ui/link.tsx +0 -34
  262. package/src/cli/cmd/tui/ui/spinner.ts +0 -368
  263. package/src/cli/cmd/tui/ui/toast.tsx +0 -102
  264. package/src/cli/cmd/tui/util/audio.ts +0 -58
  265. package/src/cli/cmd/tui/util/clipboard.ts +0 -181
  266. package/src/cli/cmd/tui/util/collapse-tool-output.ts +0 -19
  267. package/src/cli/cmd/tui/util/editor.ts +0 -43
  268. package/src/cli/cmd/tui/util/layout.ts +0 -25
  269. package/src/cli/cmd/tui/util/model.ts +0 -23
  270. package/src/cli/cmd/tui/util/provider-origin.ts +0 -7
  271. package/src/cli/cmd/tui/util/revert-diff.ts +0 -18
  272. package/src/cli/cmd/tui/util/scroll.ts +0 -25
  273. package/src/cli/cmd/tui/util/selection.ts +0 -73
  274. package/src/cli/cmd/tui/util/signal.ts +0 -41
  275. package/src/cli/cmd/tui/util/transcript.ts +0 -112
  276. package/src/cli/cmd/tui/win32.ts +0 -130
  277. package/src/util/format.ts +0 -20
  278. package/test/cli/cmd/tui/aggregate-failures.test.ts +0 -93
  279. package/test/cli/cmd/tui/dialog-workspace-create.test.ts +0 -28
  280. package/test/cli/cmd/tui/model-options.test.ts +0 -30
  281. package/test/cli/cmd/tui/notifications.test.ts +0 -267
  282. package/test/cli/cmd/tui/prompt-history.test.ts +0 -44
  283. package/test/cli/cmd/tui/prompt-part.test.ts +0 -77
  284. package/test/cli/cmd/tui/prompt-traits.test.ts +0 -29
  285. package/test/cli/cmd/tui/provider-options.test.ts +0 -29
  286. package/test/cli/cmd/tui/sync-fixture.tsx +0 -64
  287. package/test/cli/cmd/tui/sync-live-hydration.test.tsx +0 -278
  288. package/test/cli/cmd/tui/sync-undefined-messages.test.tsx +0 -47
  289. package/test/cli/cmd/tui/sync.test.tsx +0 -70
  290. package/test/cli/tui/__snapshots__/inline-tool-wrap-snapshot.test.tsx.snap +0 -72
  291. package/test/cli/tui/app-lifecycle.test.ts +0 -261
  292. package/test/cli/tui/dialog-prompt.test.tsx +0 -146
  293. package/test/cli/tui/diff-viewer-file-tree-utils.test.ts +0 -323
  294. package/test/cli/tui/diff-viewer-file-tree.test.tsx +0 -197
  295. package/test/cli/tui/diff-viewer.test.tsx +0 -230
  296. package/test/cli/tui/inline-tool-wrap-snapshot.test.tsx +0 -232
  297. package/test/cli/tui/keymap.test.tsx +0 -136
  298. package/test/cli/tui/prompt-submit-race.test.ts +0 -98
  299. package/test/cli/tui/revert-diff.test.ts +0 -35
  300. package/test/cli/tui/slot-replace.test.tsx +0 -50
  301. package/test/cli/tui/sync-v2.test.tsx +0 -558
  302. package/test/cli/tui/theme-store.test.ts +0 -76
  303. package/test/cli/tui/thinking.test.ts +0 -36
  304. package/test/cli/tui/transcript.test.ts +0 -426
  305. package/test/cli/tui/use-event.test.tsx +0 -145
  306. package/test/util/format.test.ts +0 -59
  307. /package/src/cli/{cmd/tui → tui}/validate-session.ts +0 -0
  308. /package/src/cli/{cmd/tui → tui}/worker.ts +0 -0
  309. /package/src/{cli/cmd/tui/config/cwd.ts → config/tui-cwd.ts} +0 -0
  310. /package/src/{cli/cmd/tui/event.ts → server/tui-event.ts} +0 -0
@@ -79,6 +79,13 @@ function systemBody(raw: string, phase: StreamCommit["phase"]): RunEntryBody {
79
79
  }
80
80
 
81
81
  export function entryFlags(commit: StreamCommit): EntryFlags {
82
+ if (commit.summary) {
83
+ return {
84
+ startOnNewLine: true,
85
+ trailingNewline: false,
86
+ }
87
+ }
88
+
82
89
  if (commit.kind === "user") {
83
90
  return {
84
91
  startOnNewLine: true,
@@ -156,6 +163,10 @@ export function entryCanStream(commit: StreamCommit, body: RunEntryBody): boolea
156
163
  }
157
164
 
158
165
  export function entryBody(commit: StreamCommit): RunEntryBody {
166
+ if (commit.summary) {
167
+ return RUN_ENTRY_NONE
168
+ }
169
+
159
170
  const raw = cleanRunText(commit.text)
160
171
 
161
172
  if (commit.kind === "user") {
@@ -14,6 +14,8 @@ type PanelEntry = RunFooterMenuItem & {
14
14
 
15
15
  type CommandEntry =
16
16
  | (PanelEntry & { action: "model" })
17
+ | (PanelEntry & { action: "editor" })
18
+ | (PanelEntry & { action: "skill" })
17
19
  | (PanelEntry & { action: "queued" })
18
20
  | (PanelEntry & { action: "subagent" })
19
21
  | (PanelEntry & { action: "variant.cycle" })
@@ -33,6 +35,10 @@ type VariantEntry = PanelEntry & {
33
35
  current: boolean
34
36
  }
35
37
 
38
+ type SkillEntry = PanelEntry & {
39
+ name: string
40
+ }
41
+
36
42
  type SubagentEntry = PanelEntry & {
37
43
  sessionID: string
38
44
  current: boolean
@@ -107,6 +113,10 @@ function subagentStatusLabel(status: FooterSubagentTab["status"]) {
107
113
  return "done"
108
114
  }
109
115
 
116
+ if (status === "cancelled") {
117
+ return "cancelled"
118
+ }
119
+
110
120
  if (status === "error") {
111
121
  return "error"
112
122
  }
@@ -203,94 +213,129 @@ function PanelShell(props: {
203
213
  inputRef: (input: InputRenderable) => void
204
214
  onQuery: (query: string) => void
205
215
  children: JSX.Element
216
+ dark?: boolean
217
+ chrome?: "default" | "minimal"
206
218
  }) {
207
- return (
208
- <box id={props.id} width="100%" flexDirection="column" backgroundColor="transparent" flexShrink={0}>
219
+ const background = () => (props.dark ? props.theme().shade : props.theme().surface)
220
+ const minimal = () => props.chrome === "minimal"
221
+ const content = (
222
+ <>
223
+ <box height={1} flexShrink={0} backgroundColor={background()} />
224
+ <box
225
+ width="100%"
226
+ height={1}
227
+ paddingLeft={PANEL_PAD}
228
+ paddingRight={PANEL_PAD}
229
+ flexDirection="row"
230
+ gap={1}
231
+ flexShrink={0}
232
+ backgroundColor={background()}
233
+ >
234
+ <text fg={props.theme().text} attributes={TextAttributes.BOLD} wrapMode="none" flexShrink={0}>
235
+ {props.title}
236
+ </text>
237
+ {props.countVisible !== false ? (
238
+ <text fg={props.theme().muted} wrapMode="none" flexShrink={0}>
239
+ {countLabel(props.count, props.total, props.query)}
240
+ </text>
241
+ ) : null}
242
+ <box flexGrow={1} flexShrink={1} backgroundColor="transparent" />
243
+ <text fg={props.theme().muted} wrapMode="none" truncate flexShrink={0}>
244
+ esc
245
+ </text>
246
+ </box>
247
+ <box height={1} flexShrink={0} backgroundColor={background()} />
209
248
  <box
210
249
  width="100%"
211
- flexDirection="column"
212
- border={["left"]}
213
- borderColor={props.theme().highlight}
214
- backgroundColor="transparent"
215
- customBorderChars={PANEL_BORDER}
250
+ height={1}
251
+ paddingLeft={PANEL_PAD}
252
+ paddingRight={PANEL_PAD}
216
253
  flexShrink={0}
254
+ backgroundColor={background()}
217
255
  >
218
- <box height={1} flexShrink={0} backgroundColor={props.theme().surface} />
256
+ <input
257
+ width="100%"
258
+ focusedBackgroundColor={background()}
259
+ focusedTextColor={props.theme().text}
260
+ placeholder={props.placeholder}
261
+ placeholderColor={props.theme().muted}
262
+ cursorColor={props.theme().highlight}
263
+ onInput={props.onQuery}
264
+ ref={(input) => {
265
+ props.inputRef(input)
266
+ input.traits = { status: "FILTER" }
267
+ queueMicrotask(() => {
268
+ if (!input.isDestroyed) {
269
+ input.focus()
270
+ }
271
+ })
272
+ }}
273
+ />
274
+ </box>
275
+ <box height={1} flexShrink={0} backgroundColor={background()} />
276
+ <box width="100%" flexDirection="column" flexShrink={0} backgroundColor={background()}>
277
+ {props.children}
278
+ </box>
279
+ </>
280
+ )
281
+ return (
282
+ <box id={props.id} width="100%" flexDirection="column" border={false} backgroundColor="transparent" flexShrink={0}>
283
+ {minimal() ? (
284
+ <box width="100%" flexDirection="column" border={false} backgroundColor="transparent" flexShrink={0}>
285
+ {content}
286
+ </box>
287
+ ) : (
219
288
  <box
220
289
  width="100%"
221
- height={1}
222
- paddingLeft={PANEL_PAD}
223
- paddingRight={PANEL_PAD}
224
- flexDirection="row"
225
- gap={1}
290
+ flexDirection="column"
291
+ border={["left"]}
292
+ borderColor={props.theme().highlight}
293
+ backgroundColor="transparent"
294
+ customBorderChars={PANEL_BORDER}
226
295
  flexShrink={0}
227
- backgroundColor={props.theme().surface}
228
296
  >
229
- <text fg={props.theme().text} attributes={TextAttributes.BOLD} wrapMode="none" flexShrink={0}>
230
- {props.title}
231
- </text>
232
- {props.countVisible !== false ? (
233
- <text fg={props.theme().muted} wrapMode="none" flexShrink={0}>
234
- {countLabel(props.count, props.total, props.query)}
235
- </text>
236
- ) : null}
237
- <box flexGrow={1} flexShrink={1} backgroundColor="transparent" />
238
- <text fg={props.theme().muted} wrapMode="none" truncate flexShrink={0}>
239
- esc
240
- </text>
297
+ {content}
241
298
  </box>
242
- <box height={1} flexShrink={0} backgroundColor={props.theme().surface} />
299
+ )}
300
+ {minimal() ? (
243
301
  <box
302
+ id={`${props.id}-bottom`}
244
303
  width="100%"
245
304
  height={1}
246
- paddingLeft={PANEL_PAD}
247
- paddingRight={PANEL_PAD}
305
+ border={false}
306
+ backgroundColor="transparent"
248
307
  flexShrink={0}
249
- backgroundColor={props.theme().surface}
250
308
  >
251
- <input
309
+ <box
252
310
  width="100%"
253
- focusedBackgroundColor={props.theme().surface}
254
- focusedTextColor={props.theme().text}
255
- placeholder={props.placeholder}
256
- placeholderColor={props.theme().muted}
257
- cursorColor={props.theme().highlight}
258
- onInput={props.onQuery}
259
- ref={(input) => {
260
- props.inputRef(input)
261
- input.traits = { status: "FILTER" }
262
- queueMicrotask(() => {
263
- if (!input.isDestroyed) {
264
- input.focus()
265
- }
266
- })
267
- }}
311
+ height={1}
312
+ border={["bottom"]}
313
+ borderColor={background()}
314
+ backgroundColor="transparent"
315
+ customBorderChars={HALF_BLOCK_BORDER}
268
316
  />
269
317
  </box>
270
- <box height={1} flexShrink={0} backgroundColor={props.theme().surface} />
271
- <box width="100%" flexDirection="column" flexShrink={0} backgroundColor={props.theme().surface}>
272
- {props.children}
273
- </box>
274
- </box>
275
- <box
276
- id={`${props.id}-bottom`}
277
- width="100%"
278
- height={1}
279
- border={["left"]}
280
- borderColor={props.theme().highlight}
281
- backgroundColor="transparent"
282
- customBorderChars={PANEL_BOTTOM_BORDER}
283
- flexShrink={0}
284
- >
318
+ ) : (
285
319
  <box
320
+ id={`${props.id}-bottom`}
286
321
  width="100%"
287
322
  height={1}
288
- border={["bottom"]}
289
- borderColor={props.theme().surface}
323
+ border={["left"]}
324
+ borderColor={props.theme().highlight}
290
325
  backgroundColor="transparent"
291
- customBorderChars={HALF_BLOCK_BORDER}
292
- />
293
- </box>
326
+ customBorderChars={PANEL_BOTTOM_BORDER}
327
+ flexShrink={0}
328
+ >
329
+ <box
330
+ width="100%"
331
+ height={1}
332
+ border={["bottom"]}
333
+ borderColor={background()}
334
+ backgroundColor="transparent"
335
+ customBorderChars={HALF_BLOCK_BORDER}
336
+ />
337
+ </box>
338
+ )}
294
339
  </box>
295
340
  )
296
341
  }
@@ -304,6 +349,8 @@ export function RunCommandMenuBody(props: {
304
349
  variantCycle: string
305
350
  onClose: () => void
306
351
  onModel: () => void
352
+ onEditor: () => void
353
+ onSkill: () => void
307
354
  onSubagent: () => void
308
355
  onQueued: () => void
309
356
  onVariant: () => void
@@ -314,19 +361,67 @@ export function RunCommandMenuBody(props: {
314
361
  }) {
315
362
  let field: InputRenderable | undefined
316
363
  const [query, setQuery] = createSignal("")
364
+ const skills = createMemo(() => (props.commands() ?? []).filter((item) => item.source === "skill"))
365
+ const activeSubagentCount = createMemo(() => props.subagents().filter((item) => item.status === "running").length)
317
366
  const entries = createMemo<CommandEntry[]>(() => {
318
- const builtins = ["new"]
319
- return [
367
+ const builtins = ["editor", "new"]
368
+ const session: CommandEntry[] = [
369
+ {
370
+ action: "editor",
371
+ category: "Session",
372
+ display: "Open editor",
373
+ footer: "/editor",
374
+ keywords: "editor compose draft external editor",
375
+ },
376
+ ...(props.subagents().length > 0
377
+ ? [
378
+ {
379
+ action: "subagent" as const,
380
+ category: "Session",
381
+ display: "View subagents",
382
+ footer:
383
+ activeSubagentCount() > 0 ? `${activeSubagentCount()} active` : `${props.subagents().length} recent`,
384
+ keywords: props
385
+ .subagents()
386
+ .map((item) => `${item.label} ${item.description} ${item.title ?? ""}`)
387
+ .join(" "),
388
+ },
389
+ ]
390
+ : []),
391
+ {
392
+ action: "slash",
393
+ category: "Session",
394
+ name: "new",
395
+ display: "New session",
396
+ footer: "/new",
397
+ keywords: "new session clear",
398
+ },
399
+ ]
400
+ const prompt: CommandEntry[] =
401
+ props.commands() === undefined || skills().length > 0
402
+ ? [
403
+ {
404
+ action: "skill" as const,
405
+ category: "Prompt",
406
+ display: "Skills",
407
+ footer: "/skills",
408
+ keywords: `skill skills ${skills()
409
+ .map((item) => `${item.name} ${item.description ?? ""}`)
410
+ .join(" ")}`.trim(),
411
+ },
412
+ ]
413
+ : []
414
+ const agent: CommandEntry[] = [
320
415
  {
321
416
  action: "model",
322
- category: "Suggested",
417
+ category: "Agent",
323
418
  display: "Switch model",
324
419
  },
325
420
  ...(props.queued().length > 0
326
421
  ? [
327
422
  {
328
423
  action: "queued" as const,
329
- category: "Suggested",
424
+ category: "Agent",
330
425
  display: "Manage queued prompts",
331
426
  footer: `${props.queued().length} queued`,
332
427
  keywords: props
@@ -336,23 +431,9 @@ export function RunCommandMenuBody(props: {
336
431
  },
337
432
  ]
338
433
  : []),
339
- ...(props.subagents().length > 0
340
- ? [
341
- {
342
- action: "subagent" as const,
343
- category: "Suggested",
344
- display: "View subagents",
345
- footer: `${props.subagents().length} active`,
346
- keywords: props
347
- .subagents()
348
- .map((item) => `${item.label} ${item.description} ${item.title ?? ""}`)
349
- .join(" "),
350
- },
351
- ]
352
- : []),
353
434
  {
354
435
  action: "variant.cycle",
355
- category: "Suggested",
436
+ category: "Agent",
356
437
  display: "Variant cycle",
357
438
  footer: props.variantCycle,
358
439
  keywords: "variant cycle",
@@ -361,37 +442,36 @@ export function RunCommandMenuBody(props: {
361
442
  ? [
362
443
  {
363
444
  action: "variant.list" as const,
364
- category: "Suggested",
445
+ category: "Agent",
365
446
  display: "Switch model variant",
366
447
  keywords: `variant variants ${props.variants().join(" ")}`,
367
448
  },
368
449
  ]
369
450
  : []),
370
- {
371
- action: "slash",
372
- category: "Session",
373
- name: "new",
374
- display: "New session",
375
- footer: "/new",
376
- keywords: "new session clear",
377
- },
378
- ...(props.commands() ?? [])
379
- .filter((item) => item.source !== "skill" && !builtins.includes(item.name))
380
- .map(
381
- (item) =>
382
- ({
383
- action: "slash",
384
- category: item.source === "mcp" ? "MCP Commands" : "Project Commands",
385
- name: item.name,
386
- display: item.name,
387
- footer: `/${item.name}`,
388
- keywords:
389
- item.source === "mcp"
390
- ? `/${item.name} ${item.name} mcp ${item.description ?? ""}`
391
- : `/${item.name} ${item.name} ${item.description ?? ""}`,
392
- }) satisfies CommandEntry,
393
- )
394
- .sort((a, b) => categoryRank(a.category) - categoryRank(b.category) || a.display.localeCompare(b.display)),
451
+ ]
452
+ const commands = (props.commands() ?? [])
453
+ .filter((item) => item.source !== "skill" && !builtins.includes(item.name))
454
+ .map(
455
+ (item) =>
456
+ ({
457
+ action: "slash",
458
+ category: item.source === "mcp" ? "MCP Commands" : "Project Commands",
459
+ name: item.name,
460
+ display: item.name,
461
+ footer: `/${item.name}`,
462
+ keywords:
463
+ item.source === "mcp"
464
+ ? `/${item.name} ${item.name} mcp ${item.description ?? ""}`
465
+ : `/${item.name} ${item.name} ${item.description ?? ""}`,
466
+ }) satisfies CommandEntry,
467
+ )
468
+ .sort((a, b) => categoryRank(a.category) - categoryRank(b.category) || a.display.localeCompare(b.display))
469
+
470
+ return [
471
+ ...session,
472
+ ...prompt,
473
+ ...agent,
474
+ ...commands,
395
475
  { action: "exit", category: "System", display: "Exit", footer: "/exit", keywords: "/exit exit" },
396
476
  ]
397
477
  })
@@ -403,6 +483,16 @@ export function RunCommandMenuBody(props: {
403
483
  return
404
484
  }
405
485
 
486
+ if (item.action === "editor") {
487
+ props.onEditor()
488
+ return
489
+ }
490
+
491
+ if (item.action === "skill") {
492
+ props.onSkill()
493
+ return
494
+ }
495
+
406
496
  if (item.action === "subagent") {
407
497
  props.onSubagent()
408
498
  return
@@ -471,6 +561,8 @@ export function RunCommandMenuBody(props: {
471
561
  field = input
472
562
  }}
473
563
  onQuery={setQuery}
564
+ dark
565
+ chrome="minimal"
474
566
  >
475
567
  <RunFooterMenu
476
568
  id="run-direct-footer-command-list"
@@ -485,6 +577,8 @@ export function RunCommandMenuBody(props: {
485
577
  paddingLeft={PANEL_PAD}
486
578
  paddingRight={PANEL_PAD}
487
579
  grouped={!query().trim()}
580
+ background
581
+ headerColor={props.theme().muted}
488
582
  />
489
583
  </PanelShell>
490
584
  )
@@ -566,6 +660,8 @@ export function RunSubagentSelectBody(props: {
566
660
  field = input
567
661
  }}
568
662
  onQuery={setQuery}
663
+ dark
664
+ chrome="minimal"
569
665
  >
570
666
  <RunFooterMenu
571
667
  id="run-direct-footer-subagent-list"
@@ -575,11 +671,12 @@ export function RunSubagentSelectBody(props: {
575
671
  offset={menu.offset}
576
672
  rows={menu.rows}
577
673
  limit={SUBAGENT_LIST_ROWS}
578
- empty="No active subagents"
674
+ empty="No subagents found"
579
675
  border={false}
580
676
  paddingLeft={PANEL_PAD}
581
677
  paddingRight={PANEL_PAD}
582
678
  grouped={false}
679
+ background
583
680
  />
584
681
  </PanelShell>
585
682
  )
@@ -662,6 +759,8 @@ export function RunQueuedPromptSelectBody(props: {
662
759
  field = input
663
760
  }}
664
761
  onQuery={setQuery}
762
+ dark
763
+ chrome="minimal"
665
764
  >
666
765
  <RunFooterMenu
667
766
  id="run-direct-footer-queued-list"
@@ -676,6 +775,86 @@ export function RunQueuedPromptSelectBody(props: {
676
775
  paddingLeft={PANEL_PAD}
677
776
  paddingRight={PANEL_PAD}
678
777
  grouped={false}
778
+ background
779
+ />
780
+ </PanelShell>
781
+ )
782
+ }
783
+
784
+ export function RunSkillSelectBody(props: {
785
+ theme: Accessor<RunFooterTheme>
786
+ commands: Accessor<RunCommand[] | undefined>
787
+ onClose: () => void
788
+ onSelect: (name: string) => void
789
+ }) {
790
+ let field: InputRenderable | undefined
791
+ const [query, setQuery] = createSignal("")
792
+ const entries = createMemo<SkillEntry[]>(() =>
793
+ (props.commands() ?? [])
794
+ .filter((item) => item.source === "skill")
795
+ .map((item) => ({
796
+ category: "",
797
+ display: item.name,
798
+ description: item.description?.replace(/\s+/g, " ").trim() || undefined,
799
+ keywords: `skill ${item.name} ${item.description ?? ""}`,
800
+ name: item.name,
801
+ }))
802
+ .sort((a, b) => a.display.localeCompare(b.display)),
803
+ )
804
+ const items = createMemo<SkillEntry[]>(() => match(query(), entries()))
805
+ const menu = createFooterMenuState({ count: () => items().length, limit: PANEL_LIST_ROWS })
806
+ const select = () => {
807
+ const item = items()[menu.selected()]
808
+ if (!item) {
809
+ return
810
+ }
811
+
812
+ props.onSelect(item.name)
813
+ }
814
+
815
+ createEffect(() => {
816
+ query()
817
+ menu.reset()
818
+ })
819
+
820
+ useKeyboard((event) => {
821
+ if (event.defaultPrevented) {
822
+ return
823
+ }
824
+
825
+ handleKey({ event, menu, field: () => field, setQuery, select, close: props.onClose })
826
+ })
827
+
828
+ return (
829
+ <PanelShell
830
+ id="run-direct-footer-skill-panel"
831
+ title="Skills"
832
+ query={query()}
833
+ count={items().length}
834
+ total={entries().length}
835
+ placeholder="Search"
836
+ theme={props.theme}
837
+ inputRef={(input) => {
838
+ field = input
839
+ }}
840
+ onQuery={setQuery}
841
+ dark
842
+ chrome="minimal"
843
+ >
844
+ <RunFooterMenu
845
+ id="run-direct-footer-skill-list"
846
+ theme={props.theme}
847
+ items={items}
848
+ selected={menu.selected}
849
+ offset={menu.offset}
850
+ rows={() => PANEL_LIST_ROWS}
851
+ limit={PANEL_LIST_ROWS}
852
+ empty={props.commands() ? "No skills found" : "Skills loading"}
853
+ border={false}
854
+ paddingLeft={PANEL_PAD}
855
+ paddingRight={PANEL_PAD}
856
+ grouped={false}
857
+ background
679
858
  />
680
859
  </PanelShell>
681
860
  )
@@ -759,6 +938,8 @@ export function RunVariantSelectBody(props: {
759
938
  field = input
760
939
  }}
761
940
  onQuery={setQuery}
941
+ dark
942
+ chrome="minimal"
762
943
  >
763
944
  <RunFooterMenu
764
945
  id="run-direct-footer-variant-list"
@@ -773,6 +954,7 @@ export function RunVariantSelectBody(props: {
773
954
  paddingLeft={PANEL_PAD}
774
955
  paddingRight={PANEL_PAD}
775
956
  grouped={false}
957
+ background
776
958
  />
777
959
  </PanelShell>
778
960
  )
@@ -879,6 +1061,8 @@ export function RunModelSelectBody(props: {
879
1061
  field = input
880
1062
  }}
881
1063
  onQuery={setQuery}
1064
+ dark
1065
+ chrome="minimal"
882
1066
  >
883
1067
  <RunFooterMenu
884
1068
  id="run-direct-footer-model-list"
@@ -893,6 +1077,8 @@ export function RunModelSelectBody(props: {
893
1077
  paddingLeft={PANEL_PAD}
894
1078
  paddingRight={PANEL_PAD}
895
1079
  grouped={!query().trim()}
1080
+ background
1081
+ headerColor={props.theme().muted}
896
1082
  />
897
1083
  </PanelShell>
898
1084
  )