@pellux/goodvibes-tui 0.18.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 (732) hide show
  1. package/.goodvibes/GOODVIBES.md +35 -0
  2. package/.goodvibes/agents/reviewer.md +89 -0
  3. package/.goodvibes/skills/add-provider/SKILL.md +199 -0
  4. package/CHANGELOG.md +1681 -0
  5. package/README.md +1607 -0
  6. package/bin/goodvibes +66 -0
  7. package/docs/README.md +32 -0
  8. package/docs/foundation-artifacts/README.md +16 -0
  9. package/docs/foundation-artifacts/knowledge-graphql.graphql +397 -0
  10. package/docs/foundation-artifacts/knowledge-store.sql +183 -0
  11. package/docs/foundation-artifacts/operator-contract.json +55157 -0
  12. package/docs/foundation-artifacts/peer-contract.json +2384 -0
  13. package/package.json +114 -0
  14. package/scripts/postinstall.mjs +203 -0
  15. package/src/acp/connection.ts +447 -0
  16. package/src/acp/index.ts +7 -0
  17. package/src/acp/manager.ts +133 -0
  18. package/src/adapters/bluebubbles/index.ts +127 -0
  19. package/src/adapters/discord/index.ts +297 -0
  20. package/src/adapters/github/index.ts +73 -0
  21. package/src/adapters/google-chat/index.ts +119 -0
  22. package/src/adapters/imessage/index.ts +92 -0
  23. package/src/adapters/index.ts +15 -0
  24. package/src/adapters/matrix/index.ts +116 -0
  25. package/src/adapters/mattermost/index.ts +151 -0
  26. package/src/adapters/msteams/index.ts +180 -0
  27. package/src/adapters/ntfy/index.ts +118 -0
  28. package/src/adapters/signal/index.ts +92 -0
  29. package/src/adapters/slack/index.ts +323 -0
  30. package/src/adapters/telegram/index.ts +160 -0
  31. package/src/adapters/types.ts +97 -0
  32. package/src/adapters/webhook/index.ts +178 -0
  33. package/src/adapters/whatsapp/index.ts +135 -0
  34. package/src/agents/message-bus-core.ts +312 -0
  35. package/src/agents/message-bus.ts +2 -0
  36. package/src/agents/orchestrator-prompts.ts +351 -0
  37. package/src/agents/orchestrator-runner.ts +668 -0
  38. package/src/agents/orchestrator.ts +437 -0
  39. package/src/agents/session.ts +108 -0
  40. package/src/agents/worktree.ts +153 -0
  41. package/src/agents/wrfc-config.ts +47 -0
  42. package/src/agents/wrfc-controller.ts +747 -0
  43. package/src/agents/wrfc-gate-runtime.ts +75 -0
  44. package/src/agents/wrfc-reporting.ts +284 -0
  45. package/src/agents/wrfc-runtime-events.ts +150 -0
  46. package/src/agents/wrfc-types.ts +67 -0
  47. package/src/automation/delivery-manager.ts +368 -0
  48. package/src/automation/index.ts +72 -0
  49. package/src/automation/manager-runtime-delivery.ts +139 -0
  50. package/src/automation/manager-runtime-events.ts +131 -0
  51. package/src/automation/manager-runtime-execution.ts +511 -0
  52. package/src/automation/manager-runtime-helpers.ts +433 -0
  53. package/src/automation/manager-runtime-job-mutations.ts +175 -0
  54. package/src/automation/manager-runtime-reconcile.ts +148 -0
  55. package/src/automation/manager-runtime-scheduling.ts +189 -0
  56. package/src/automation/manager-runtime-sync.ts +54 -0
  57. package/src/automation/manager-runtime.ts +721 -0
  58. package/src/automation/manager.ts +10 -0
  59. package/src/automation/service.ts +242 -0
  60. package/src/channels/builtin/account-actions.ts +490 -0
  61. package/src/channels/builtin/accounts.ts +433 -0
  62. package/src/channels/builtin/contracts.ts +405 -0
  63. package/src/channels/builtin/plugins.ts +308 -0
  64. package/src/channels/builtin/rendering.ts +174 -0
  65. package/src/channels/builtin/setup-schema.ts +504 -0
  66. package/src/channels/builtin/shared.ts +96 -0
  67. package/src/channels/builtin/surfaces.ts +57 -0
  68. package/src/channels/builtin/targets.ts +693 -0
  69. package/src/channels/builtin-runtime.ts +443 -0
  70. package/src/channels/delivery/shared.ts +199 -0
  71. package/src/channels/delivery/strategies-bridge.ts +246 -0
  72. package/src/channels/delivery/strategies-core.ts +299 -0
  73. package/src/channels/delivery/strategies-enterprise.ts +178 -0
  74. package/src/channels/delivery/types.ts +59 -0
  75. package/src/channels/delivery-router.ts +127 -0
  76. package/src/channels/index.ts +77 -0
  77. package/src/channels/plugin-registry.ts +551 -0
  78. package/src/channels/provider-runtime.ts +330 -0
  79. package/src/channels/reply-pipeline.ts +522 -0
  80. package/src/channels/route-manager.ts +340 -0
  81. package/src/channels/surface-registry.ts +186 -0
  82. package/src/config/helper-model.ts +233 -0
  83. package/src/config/index.ts +193 -0
  84. package/src/config/manager.ts +404 -0
  85. package/src/config/secrets.ts +547 -0
  86. package/src/config/service-registry.ts +329 -0
  87. package/src/config/subscription-auth.ts +31 -0
  88. package/src/config/subscription-providers.ts +127 -0
  89. package/src/config/tool-llm.ts +110 -0
  90. package/src/control-plane/approval-broker.ts +351 -0
  91. package/src/control-plane/gateway.ts +713 -0
  92. package/src/control-plane/index.ts +54 -0
  93. package/src/control-plane/media-contract-schemas.ts +208 -0
  94. package/src/control-plane/method-catalog-admin.ts +136 -0
  95. package/src/control-plane/method-catalog-channels.ts +591 -0
  96. package/src/control-plane/method-catalog-control-automation.ts +475 -0
  97. package/src/control-plane/method-catalog-control-core.ts +594 -0
  98. package/src/control-plane/method-catalog-control.ts +8 -0
  99. package/src/control-plane/method-catalog-events.ts +74 -0
  100. package/src/control-plane/method-catalog-knowledge.ts +531 -0
  101. package/src/control-plane/method-catalog-media.ts +279 -0
  102. package/src/control-plane/method-catalog-runtime.ts +304 -0
  103. package/src/control-plane/method-catalog-shared.ts +223 -0
  104. package/src/control-plane/method-catalog.ts +242 -0
  105. package/src/control-plane/operator-contract-schemas-admin.ts +639 -0
  106. package/src/control-plane/operator-contract-schemas-channels.ts +375 -0
  107. package/src/control-plane/operator-contract-schemas-control.ts +226 -0
  108. package/src/control-plane/operator-contract-schemas-domains.ts +4 -0
  109. package/src/control-plane/operator-contract-schemas-knowledge.ts +582 -0
  110. package/src/control-plane/operator-contract-schemas-media.ts +297 -0
  111. package/src/control-plane/operator-contract-schemas-permissions.ts +100 -0
  112. package/src/control-plane/operator-contract-schemas-remote.ts +38 -0
  113. package/src/control-plane/operator-contract-schemas-runtime.ts +563 -0
  114. package/src/control-plane/operator-contract-schemas-shared.ts +85 -0
  115. package/src/control-plane/operator-contract-schemas-telemetry.ts +349 -0
  116. package/src/control-plane/operator-contract-schemas.ts +6 -0
  117. package/src/control-plane/operator-contract.ts +163 -0
  118. package/src/control-plane/session-broker.ts +780 -0
  119. package/src/core/compaction-sections.ts +492 -0
  120. package/src/core/compaction-types.ts +147 -0
  121. package/src/core/composer-state.ts +59 -0
  122. package/src/core/context-compaction.ts +542 -0
  123. package/src/core/conversation-compaction.ts +68 -0
  124. package/src/core/conversation-diff.ts +55 -0
  125. package/src/core/conversation-rendering.ts +343 -0
  126. package/src/core/conversation-utils.ts +72 -0
  127. package/src/core/conversation.ts +775 -0
  128. package/src/core/event-replay.ts +287 -0
  129. package/src/core/orchestrator-context-runtime.ts +407 -0
  130. package/src/core/orchestrator-follow-up-runtime.ts +134 -0
  131. package/src/core/orchestrator-runtime.ts +132 -0
  132. package/src/core/orchestrator-tool-runtime.ts +468 -0
  133. package/src/core/orchestrator-turn-helpers.ts +355 -0
  134. package/src/core/orchestrator-turn-loop.ts +443 -0
  135. package/src/core/orchestrator.ts +733 -0
  136. package/src/core/plan-command-handler.ts +169 -0
  137. package/src/core/system-message-router.ts +210 -0
  138. package/src/core/transcript-events/classify.ts +95 -0
  139. package/src/core/transcript-events/index.ts +15 -0
  140. package/src/daemon/cli.ts +88 -0
  141. package/src/daemon/control-plane.ts +522 -0
  142. package/src/daemon/facade-composition.ts +397 -0
  143. package/src/daemon/facade.ts +638 -0
  144. package/src/daemon/helpers.ts +74 -0
  145. package/src/daemon/http/router-route-contexts.ts +370 -0
  146. package/src/daemon/http/router.ts +531 -0
  147. package/src/daemon/http-listener.ts +301 -0
  148. package/src/daemon/index.ts +3 -0
  149. package/src/daemon/server.ts +1 -0
  150. package/src/daemon/service-manager.ts +413 -0
  151. package/src/daemon/surface-actions.ts +183 -0
  152. package/src/daemon/surface-delivery.ts +530 -0
  153. package/src/daemon/surface-policy.ts +60 -0
  154. package/src/daemon/transport-events.ts +110 -0
  155. package/src/daemon/types.ts +191 -0
  156. package/src/export/markdown.ts +213 -0
  157. package/src/export/session-export.ts +633 -0
  158. package/src/git/index.ts +1 -0
  159. package/src/git/service.ts +414 -0
  160. package/src/hooks/chain-engine.ts +414 -0
  161. package/src/hooks/dispatcher.ts +414 -0
  162. package/src/hooks/hook-api.ts +170 -0
  163. package/src/hooks/index.ts +48 -0
  164. package/src/hooks/runners/agent.ts +93 -0
  165. package/src/hooks/runners/prompt.ts +69 -0
  166. package/src/hooks/workbench.ts +360 -0
  167. package/src/input/autocomplete.ts +96 -0
  168. package/src/input/bookmark-modal.ts +115 -0
  169. package/src/input/command-registry.ts +300 -0
  170. package/src/input/commands/branch-runtime.ts +72 -0
  171. package/src/input/commands/config.ts +515 -0
  172. package/src/input/commands/control-room-runtime.ts +255 -0
  173. package/src/input/commands/conversation-runtime.ts +207 -0
  174. package/src/input/commands/diff-runtime.ts +161 -0
  175. package/src/input/commands/discovery-runtime.ts +45 -0
  176. package/src/input/commands/eval.ts +204 -0
  177. package/src/input/commands/experience-runtime.ts +278 -0
  178. package/src/input/commands/git-runtime.ts +81 -0
  179. package/src/input/commands/guidance-runtime.ts +101 -0
  180. package/src/input/commands/health-runtime.ts +434 -0
  181. package/src/input/commands/hooks-runtime.ts +148 -0
  182. package/src/input/commands/incident-runtime.ts +95 -0
  183. package/src/input/commands/integration-runtime.ts +394 -0
  184. package/src/input/commands/intelligence-runtime.ts +223 -0
  185. package/src/input/commands/knowledge.ts +368 -0
  186. package/src/input/commands/local-auth-runtime.ts +105 -0
  187. package/src/input/commands/local-provider-runtime.ts +170 -0
  188. package/src/input/commands/local-runtime.ts +458 -0
  189. package/src/input/commands/local-setup-review.ts +192 -0
  190. package/src/input/commands/local-setup-transfer.ts +134 -0
  191. package/src/input/commands/local-setup.ts +292 -0
  192. package/src/input/commands/managed-runtime.ts +208 -0
  193. package/src/input/commands/marketplace-runtime.ts +290 -0
  194. package/src/input/commands/mcp-runtime.ts +202 -0
  195. package/src/input/commands/memory-product-runtime.ts +111 -0
  196. package/src/input/commands/memory.ts +151 -0
  197. package/src/input/commands/notify-runtime.ts +83 -0
  198. package/src/input/commands/operator-panel-runtime.ts +141 -0
  199. package/src/input/commands/operator-runtime.ts +392 -0
  200. package/src/input/commands/permissions-runtime.ts +104 -0
  201. package/src/input/commands/planning-runtime.ts +97 -0
  202. package/src/input/commands/platform-access-runtime.ts +422 -0
  203. package/src/input/commands/platform-runtime.ts +6 -0
  204. package/src/input/commands/platform-sandbox-qemu.ts +137 -0
  205. package/src/input/commands/platform-sandbox-runtime.ts +406 -0
  206. package/src/input/commands/platform-sandbox-session.ts +128 -0
  207. package/src/input/commands/platform-services-runtime.ts +246 -0
  208. package/src/input/commands/policy-dispatch.ts +339 -0
  209. package/src/input/commands/policy.ts +17 -0
  210. package/src/input/commands/product-runtime.ts +351 -0
  211. package/src/input/commands/profile-sync-runtime.ts +99 -0
  212. package/src/input/commands/provider-accounts-runtime.ts +113 -0
  213. package/src/input/commands/provider.ts +363 -0
  214. package/src/input/commands/quit-shared.ts +162 -0
  215. package/src/input/commands/recall-bundle.ts +132 -0
  216. package/src/input/commands/recall-capture.ts +152 -0
  217. package/src/input/commands/recall-query.ts +229 -0
  218. package/src/input/commands/recall-review.ts +98 -0
  219. package/src/input/commands/recall-shared.ts +22 -0
  220. package/src/input/commands/remote-runtime-pool.ts +106 -0
  221. package/src/input/commands/remote-runtime-setup.ts +199 -0
  222. package/src/input/commands/remote-runtime.ts +531 -0
  223. package/src/input/commands/replay-runtime.ts +18 -0
  224. package/src/input/commands/runtime-services.ts +279 -0
  225. package/src/input/commands/schedule-runtime.ts +332 -0
  226. package/src/input/commands/services-runtime.ts +207 -0
  227. package/src/input/commands/session-content.ts +408 -0
  228. package/src/input/commands/session-workflow.ts +464 -0
  229. package/src/input/commands/session.ts +376 -0
  230. package/src/input/commands/settings-sync-runtime.ts +173 -0
  231. package/src/input/commands/share-runtime.ts +114 -0
  232. package/src/input/commands/shell-core.ts +320 -0
  233. package/src/input/commands/skills-runtime.ts +221 -0
  234. package/src/input/commands/subscription-runtime.ts +434 -0
  235. package/src/input/commands/tasks-runtime.ts +230 -0
  236. package/src/input/commands/teamwork-runtime.ts +374 -0
  237. package/src/input/commands/teleport-runtime.ts +57 -0
  238. package/src/input/commands/worktree-runtime.ts +137 -0
  239. package/src/input/commands.ts +127 -0
  240. package/src/input/file-picker.ts +192 -0
  241. package/src/input/handler-command-route.ts +106 -0
  242. package/src/input/handler-content-actions.ts +465 -0
  243. package/src/input/handler-feed-routes.ts +541 -0
  244. package/src/input/handler-feed.ts +361 -0
  245. package/src/input/handler-modal-routes.ts +335 -0
  246. package/src/input/handler-modal-stack.ts +237 -0
  247. package/src/input/handler-modal-token-routes.ts +272 -0
  248. package/src/input/handler-picker-routes.ts +416 -0
  249. package/src/input/handler-prompt-buffer.ts +320 -0
  250. package/src/input/handler-shortcuts.ts +195 -0
  251. package/src/input/handler-ui-state.ts +294 -0
  252. package/src/input/handler.ts +798 -0
  253. package/src/input/input-history.ts +267 -0
  254. package/src/input/keybindings.ts +256 -0
  255. package/src/input/model-picker.ts +730 -0
  256. package/src/input/panel-integration-actions.ts +77 -0
  257. package/src/input/profile-picker-modal.ts +222 -0
  258. package/src/input/search.ts +100 -0
  259. package/src/input/selection-modal.ts +163 -0
  260. package/src/input/selection.ts +135 -0
  261. package/src/input/session-picker-modal.ts +136 -0
  262. package/src/input/settings-modal.ts +718 -0
  263. package/src/input/submission-intent.ts +18 -0
  264. package/src/input/submission-router.ts +64 -0
  265. package/src/integrations/index.ts +42 -0
  266. package/src/integrations/notifier.ts +206 -0
  267. package/src/integrations/webhooks.ts +177 -0
  268. package/src/knowledge/consolidation.ts +346 -0
  269. package/src/knowledge/graphql.ts +324 -0
  270. package/src/knowledge/index.ts +60 -0
  271. package/src/knowledge/ingest-compile.ts +386 -0
  272. package/src/knowledge/ingest-context.ts +18 -0
  273. package/src/knowledge/ingest-inputs.ts +387 -0
  274. package/src/knowledge/ingest.ts +20 -0
  275. package/src/knowledge/internal.ts +257 -0
  276. package/src/knowledge/knowledge-api.ts +432 -0
  277. package/src/knowledge/lint.ts +121 -0
  278. package/src/knowledge/memory-sync.ts +62 -0
  279. package/src/knowledge/packet.ts +370 -0
  280. package/src/knowledge/scheduling.ts +283 -0
  281. package/src/knowledge/service.ts +715 -0
  282. package/src/main.ts +798 -0
  283. package/src/mcp/client.ts +383 -0
  284. package/src/mcp/index.ts +12 -0
  285. package/src/mcp/mcp-api.ts +90 -0
  286. package/src/mcp/registry.ts +508 -0
  287. package/src/media/builtin-image-understanding.ts +303 -0
  288. package/src/media/builtin-providers.ts +26 -0
  289. package/src/media/index.ts +18 -0
  290. package/src/multimodal/index.ts +13 -0
  291. package/src/multimodal/service.ts +492 -0
  292. package/src/panels/agent-inspector-panel.ts +515 -0
  293. package/src/panels/agent-inspector-shared.ts +94 -0
  294. package/src/panels/agent-logs-panel.ts +539 -0
  295. package/src/panels/agent-logs-shared.ts +129 -0
  296. package/src/panels/approval-panel.ts +169 -0
  297. package/src/panels/automation-control-panel.ts +253 -0
  298. package/src/panels/base-panel.ts +72 -0
  299. package/src/panels/builtin/agent.ts +88 -0
  300. package/src/panels/builtin/development.ts +111 -0
  301. package/src/panels/builtin/knowledge.ts +26 -0
  302. package/src/panels/builtin/operations.ts +385 -0
  303. package/src/panels/builtin/session.ts +61 -0
  304. package/src/panels/builtin/shared.ts +240 -0
  305. package/src/panels/builtin-panels.ts +23 -0
  306. package/src/panels/cockpit-panel.ts +183 -0
  307. package/src/panels/communication-panel.ts +191 -0
  308. package/src/panels/context-visualizer-panel.ts +199 -0
  309. package/src/panels/control-plane-panel.ts +266 -0
  310. package/src/panels/cost-tracker-panel.ts +444 -0
  311. package/src/panels/debug-panel.ts +432 -0
  312. package/src/panels/diff-panel.ts +518 -0
  313. package/src/panels/docs-panel.ts +283 -0
  314. package/src/panels/eval-panel.ts +399 -0
  315. package/src/panels/file-explorer-panel.ts +556 -0
  316. package/src/panels/file-preview-panel.ts +412 -0
  317. package/src/panels/forensics-panel.ts +364 -0
  318. package/src/panels/git-panel.ts +630 -0
  319. package/src/panels/hooks-panel.ts +274 -0
  320. package/src/panels/incident-review-panel.ts +247 -0
  321. package/src/panels/index.ts +48 -0
  322. package/src/panels/intelligence-panel.ts +176 -0
  323. package/src/panels/knowledge-panel.ts +328 -0
  324. package/src/panels/local-auth-panel.ts +146 -0
  325. package/src/panels/marketplace-panel.ts +223 -0
  326. package/src/panels/mcp-panel.ts +260 -0
  327. package/src/panels/memory-panel.ts +293 -0
  328. package/src/panels/ops-control-panel.ts +184 -0
  329. package/src/panels/ops-strategy-panel.ts +235 -0
  330. package/src/panels/orchestration-panel.ts +254 -0
  331. package/src/panels/panel-list-panel.ts +508 -0
  332. package/src/panels/panel-manager.ts +538 -0
  333. package/src/panels/panel-picker.ts +106 -0
  334. package/src/panels/plan-dashboard-panel.ts +272 -0
  335. package/src/panels/plugins-panel.ts +201 -0
  336. package/src/panels/policy-panel.ts +308 -0
  337. package/src/panels/polish.ts +668 -0
  338. package/src/panels/provider-account-snapshot.ts +259 -0
  339. package/src/panels/provider-accounts-panel.ts +221 -0
  340. package/src/panels/provider-health-domains.ts +211 -0
  341. package/src/panels/provider-health-panel.ts +725 -0
  342. package/src/panels/provider-health-tracker.ts +115 -0
  343. package/src/panels/provider-stats-panel.ts +366 -0
  344. package/src/panels/remote-panel.ts +449 -0
  345. package/src/panels/routes-panel.ts +228 -0
  346. package/src/panels/sandbox-panel.ts +289 -0
  347. package/src/panels/schedule-panel.ts +344 -0
  348. package/src/panels/search-focus.ts +32 -0
  349. package/src/panels/security-panel.ts +329 -0
  350. package/src/panels/services-panel.ts +271 -0
  351. package/src/panels/session-browser-panel.ts +399 -0
  352. package/src/panels/session-maintenance.ts +125 -0
  353. package/src/panels/settings-sync-panel.ts +164 -0
  354. package/src/panels/skills-panel.ts +475 -0
  355. package/src/panels/subscription-panel.ts +273 -0
  356. package/src/panels/symbol-outline-panel.ts +486 -0
  357. package/src/panels/system-messages-panel.ts +224 -0
  358. package/src/panels/tasks-panel.ts +448 -0
  359. package/src/panels/thinking-panel.ts +304 -0
  360. package/src/panels/token-budget-panel.ts +469 -0
  361. package/src/panels/tool-inspector-panel.ts +434 -0
  362. package/src/panels/types.ts +44 -0
  363. package/src/panels/watchers-panel.ts +241 -0
  364. package/src/panels/welcome-panel.ts +64 -0
  365. package/src/panels/worktree-panel.ts +180 -0
  366. package/src/panels/wrfc-panel.ts +480 -0
  367. package/src/permissions/briefs/build.ts +88 -0
  368. package/src/permissions/manager.ts +356 -0
  369. package/src/permissions/prompt.ts +184 -0
  370. package/src/plugins/api.ts +383 -0
  371. package/src/plugins/loader.ts +304 -0
  372. package/src/plugins/manager.ts +481 -0
  373. package/src/profiles/shape.ts +58 -0
  374. package/src/providers/amazon-bedrock-mantle.ts +50 -0
  375. package/src/providers/amazon-bedrock.ts +61 -0
  376. package/src/providers/anthropic-compat.ts +373 -0
  377. package/src/providers/anthropic-sdk-provider.ts +230 -0
  378. package/src/providers/anthropic-vertex.ts +59 -0
  379. package/src/providers/anthropic.ts +469 -0
  380. package/src/providers/auto-register.ts +417 -0
  381. package/src/providers/builtin-catalog.ts +326 -0
  382. package/src/providers/builtin-registry.ts +575 -0
  383. package/src/providers/cache-planner.ts +258 -0
  384. package/src/providers/capabilities.ts +601 -0
  385. package/src/providers/custom-loader.ts +425 -0
  386. package/src/providers/discovered-compat.ts +18 -0
  387. package/src/providers/discovered-factory.ts +61 -0
  388. package/src/providers/discovered-traits.ts +138 -0
  389. package/src/providers/gemini.ts +462 -0
  390. package/src/providers/github-copilot.ts +254 -0
  391. package/src/providers/index.ts +47 -0
  392. package/src/providers/interface.ts +185 -0
  393. package/src/providers/llama-cpp.ts +402 -0
  394. package/src/providers/lm-studio-helpers.ts +367 -0
  395. package/src/providers/lm-studio.ts +484 -0
  396. package/src/providers/model-catalog-cache.ts +221 -0
  397. package/src/providers/model-catalog-notifications.ts +97 -0
  398. package/src/providers/model-catalog-synthetic.ts +202 -0
  399. package/src/providers/model-catalog.ts +211 -0
  400. package/src/providers/model-limits.ts +280 -0
  401. package/src/providers/ollama.ts +469 -0
  402. package/src/providers/openai-codex.ts +472 -0
  403. package/src/providers/openai-compat.ts +615 -0
  404. package/src/providers/openai.ts +231 -0
  405. package/src/providers/optimizer.ts +381 -0
  406. package/src/providers/provider-api.ts +553 -0
  407. package/src/providers/registry-helpers.ts +34 -0
  408. package/src/providers/registry-models.ts +77 -0
  409. package/src/providers/registry-types.ts +67 -0
  410. package/src/providers/registry.ts +729 -0
  411. package/src/providers/runtime-metadata.ts +149 -0
  412. package/src/providers/runtime-snapshot.ts +130 -0
  413. package/src/providers/synthetic.ts +561 -0
  414. package/src/providers/tier-prompts.ts +84 -0
  415. package/src/providers/tool-formats.ts +414 -0
  416. package/src/renderer/agent-detail-modal.ts +285 -0
  417. package/src/renderer/autocomplete-overlay.ts +154 -0
  418. package/src/renderer/block-actions.ts +76 -0
  419. package/src/renderer/bookmark-modal.ts +101 -0
  420. package/src/renderer/bottom-bar.ts +58 -0
  421. package/src/renderer/buffer.ts +34 -0
  422. package/src/renderer/code-block.ts +373 -0
  423. package/src/renderer/compositor.ts +261 -0
  424. package/src/renderer/context-inspector.ts +219 -0
  425. package/src/renderer/conversation-layout.ts +67 -0
  426. package/src/renderer/conversation-overlays.ts +123 -0
  427. package/src/renderer/conversation-surface.ts +260 -0
  428. package/src/renderer/diff-view.ts +132 -0
  429. package/src/renderer/diff.ts +122 -0
  430. package/src/renderer/file-picker-overlay.ts +101 -0
  431. package/src/renderer/file-tree.ts +153 -0
  432. package/src/renderer/git-status.ts +89 -0
  433. package/src/renderer/help-overlay.ts +247 -0
  434. package/src/renderer/history-search-overlay.ts +73 -0
  435. package/src/renderer/layout-engine.ts +97 -0
  436. package/src/renderer/layout.ts +32 -0
  437. package/src/renderer/live-tail-modal.ts +156 -0
  438. package/src/renderer/markdown.ts +777 -0
  439. package/src/renderer/modal-factory.ts +467 -0
  440. package/src/renderer/modal-utils.ts +24 -0
  441. package/src/renderer/model-picker-overlay.ts +396 -0
  442. package/src/renderer/overlay-box.ts +165 -0
  443. package/src/renderer/overlay-viewport.ts +104 -0
  444. package/src/renderer/panel-composite.ts +80 -0
  445. package/src/renderer/panel-picker-overlay.ts +202 -0
  446. package/src/renderer/panel-tab-bar.ts +69 -0
  447. package/src/renderer/panel-workspace-bar.ts +38 -0
  448. package/src/renderer/process-indicator.ts +96 -0
  449. package/src/renderer/process-modal.ts +295 -0
  450. package/src/renderer/profile-picker-modal.ts +129 -0
  451. package/src/renderer/progress.ts +98 -0
  452. package/src/renderer/search-overlay.ts +54 -0
  453. package/src/renderer/selection-modal-overlay.ts +214 -0
  454. package/src/renderer/semantic-diff.ts +369 -0
  455. package/src/renderer/session-picker-modal.ts +127 -0
  456. package/src/renderer/settings-modal.ts +701 -0
  457. package/src/renderer/shell-surface.ts +88 -0
  458. package/src/renderer/surface-layout.ts +101 -0
  459. package/src/renderer/syntax-highlighter.ts +542 -0
  460. package/src/renderer/system-message.ts +83 -0
  461. package/src/renderer/tab-strip.ts +108 -0
  462. package/src/renderer/text-layout.ts +31 -0
  463. package/src/renderer/thinking.ts +17 -0
  464. package/src/renderer/tool-call.ts +233 -0
  465. package/src/renderer/ui-factory.ts +524 -0
  466. package/src/renderer/ui-primitives.ts +96 -0
  467. package/src/runtime/auth/inspection.ts +125 -0
  468. package/src/runtime/bootstrap-background.ts +147 -0
  469. package/src/runtime/bootstrap-command-context.ts +265 -0
  470. package/src/runtime/bootstrap-command-parts.ts +357 -0
  471. package/src/runtime/bootstrap-core.ts +375 -0
  472. package/src/runtime/bootstrap-helpers.ts +88 -0
  473. package/src/runtime/bootstrap-hook-bridge.ts +271 -0
  474. package/src/runtime/bootstrap-runtime-events.ts +254 -0
  475. package/src/runtime/bootstrap-services.ts +197 -0
  476. package/src/runtime/bootstrap-shell.ts +262 -0
  477. package/src/runtime/bootstrap.ts +488 -0
  478. package/src/runtime/compaction/index.ts +90 -0
  479. package/src/runtime/compaction/lifecycle.ts +167 -0
  480. package/src/runtime/compaction/manager.ts +474 -0
  481. package/src/runtime/compaction/quality-score.ts +279 -0
  482. package/src/runtime/compaction/resume-repair.ts +183 -0
  483. package/src/runtime/compaction/strategies/autocompact.ts +65 -0
  484. package/src/runtime/compaction/strategies/boundary-commit.ts +106 -0
  485. package/src/runtime/compaction/strategies/collapse.ts +90 -0
  486. package/src/runtime/compaction/strategies/index.ts +23 -0
  487. package/src/runtime/compaction/strategies/microcompact.ts +74 -0
  488. package/src/runtime/compaction/strategies/reactive.ts +89 -0
  489. package/src/runtime/compaction/types.ts +221 -0
  490. package/src/runtime/context.ts +158 -0
  491. package/src/runtime/diagnostics/actions.ts +776 -0
  492. package/src/runtime/diagnostics/index.ts +99 -0
  493. package/src/runtime/diagnostics/panels/agents.ts +252 -0
  494. package/src/runtime/diagnostics/panels/events.ts +188 -0
  495. package/src/runtime/diagnostics/panels/health.ts +242 -0
  496. package/src/runtime/diagnostics/panels/index.ts +24 -0
  497. package/src/runtime/diagnostics/panels/ops.ts +156 -0
  498. package/src/runtime/diagnostics/panels/policy.ts +176 -0
  499. package/src/runtime/diagnostics/panels/tasks.ts +251 -0
  500. package/src/runtime/diagnostics/panels/tool-calls.ts +267 -0
  501. package/src/runtime/diagnostics/provider.ts +262 -0
  502. package/src/runtime/ecosystem/catalog.ts +606 -0
  503. package/src/runtime/ecosystem/recommendations.ts +117 -0
  504. package/src/runtime/emitters/agents.ts +96 -0
  505. package/src/runtime/emitters/automation.ts +112 -0
  506. package/src/runtime/emitters/communication.ts +53 -0
  507. package/src/runtime/emitters/compaction.ts +161 -0
  508. package/src/runtime/emitters/control-plane.ts +65 -0
  509. package/src/runtime/emitters/deliveries.ts +65 -0
  510. package/src/runtime/emitters/forensics.ts +17 -0
  511. package/src/runtime/emitters/index.ts +59 -0
  512. package/src/runtime/emitters/knowledge.ts +129 -0
  513. package/src/runtime/emitters/mcp.ts +95 -0
  514. package/src/runtime/emitters/ops.ts +163 -0
  515. package/src/runtime/emitters/orchestration.ts +87 -0
  516. package/src/runtime/emitters/permissions.ts +98 -0
  517. package/src/runtime/emitters/planner.ts +23 -0
  518. package/src/runtime/emitters/plugins.ts +78 -0
  519. package/src/runtime/emitters/providers.ts +30 -0
  520. package/src/runtime/emitters/routes.ts +57 -0
  521. package/src/runtime/emitters/security.ts +53 -0
  522. package/src/runtime/emitters/session.ts +93 -0
  523. package/src/runtime/emitters/surfaces.ts +57 -0
  524. package/src/runtime/emitters/tasks.ts +69 -0
  525. package/src/runtime/emitters/tools.ts +140 -0
  526. package/src/runtime/emitters/transport.ts +78 -0
  527. package/src/runtime/emitters/turn.ts +155 -0
  528. package/src/runtime/emitters/ui.ts +57 -0
  529. package/src/runtime/emitters/watchers.ts +57 -0
  530. package/src/runtime/emitters/workflows.ts +79 -0
  531. package/src/runtime/eval/index.ts +48 -0
  532. package/src/runtime/eval/runner.ts +163 -0
  533. package/src/runtime/eval/suites.ts +264 -0
  534. package/src/runtime/events/domain-map.ts +148 -0
  535. package/src/runtime/events/index.ts +194 -0
  536. package/src/runtime/events/turn.ts +60 -0
  537. package/src/runtime/events/workflows.ts +17 -0
  538. package/src/runtime/forensics/collector.ts +693 -0
  539. package/src/runtime/forensics/index.ts +23 -0
  540. package/src/runtime/foundation-clients.ts +78 -0
  541. package/src/runtime/foundation-services.ts +96 -0
  542. package/src/runtime/guidance.ts +183 -0
  543. package/src/runtime/health/effect-handlers.ts +189 -0
  544. package/src/runtime/health/index.ts +70 -0
  545. package/src/runtime/health/wiring.ts +115 -0
  546. package/src/runtime/index.ts +174 -0
  547. package/src/runtime/integration/helpers.ts +640 -0
  548. package/src/runtime/lifecycle.ts +107 -0
  549. package/src/runtime/mcp/index.ts +68 -0
  550. package/src/runtime/mcp/manager.ts +513 -0
  551. package/src/runtime/network/inbound.ts +131 -0
  552. package/src/runtime/network/index.ts +30 -0
  553. package/src/runtime/network/outbound.ts +292 -0
  554. package/src/runtime/network/shared.ts +82 -0
  555. package/src/runtime/operator-client.ts +235 -0
  556. package/src/runtime/ops/control-plane.ts +363 -0
  557. package/src/runtime/ops/index.ts +122 -0
  558. package/src/runtime/ops/playbooks/index.ts +10 -0
  559. package/src/runtime/ops/playbooks/session-unrecoverable.ts +196 -0
  560. package/src/runtime/ops/playbooks/stuck-turn.ts +197 -0
  561. package/src/runtime/ops/runtime-context.ts +100 -0
  562. package/src/runtime/ops-api.ts +27 -0
  563. package/src/runtime/orchestration/spawn-policy.ts +83 -0
  564. package/src/runtime/peer-client.ts +404 -0
  565. package/src/runtime/perf/index.ts +57 -0
  566. package/src/runtime/perf/slo-collector.ts +375 -0
  567. package/src/runtime/permissions/index.ts +190 -0
  568. package/src/runtime/permissions/policy-runtime.ts +175 -0
  569. package/src/runtime/permissions/preflight.ts +101 -0
  570. package/src/runtime/permissions/rule-suggestions.ts +36 -0
  571. package/src/runtime/plugins/hot-reload.ts +221 -0
  572. package/src/runtime/plugins/index.ts +84 -0
  573. package/src/runtime/plugins/lifecycle.ts +95 -0
  574. package/src/runtime/plugins/manager.ts +474 -0
  575. package/src/runtime/plugins/manifest.ts +167 -0
  576. package/src/runtime/plugins/quarantine.ts +202 -0
  577. package/src/runtime/plugins/trust.ts +291 -0
  578. package/src/runtime/plugins/types.ts +205 -0
  579. package/src/runtime/provider-accounts/registry.ts +326 -0
  580. package/src/runtime/remote/distributed-runtime-contract-schemas.ts +386 -0
  581. package/src/runtime/remote/index.ts +488 -0
  582. package/src/runtime/remote/runner-registry.ts +438 -0
  583. package/src/runtime/remote/supervisor.ts +70 -0
  584. package/src/runtime/runtime-hook-api.ts +5 -0
  585. package/src/runtime/runtime-knowledge-api.ts +14 -0
  586. package/src/runtime/runtime-mcp-api.ts +5 -0
  587. package/src/runtime/runtime-ops-api.ts +86 -0
  588. package/src/runtime/runtime-provider-api.ts +18 -0
  589. package/src/runtime/sandbox/backend.ts +291 -0
  590. package/src/runtime/sandbox/manager.ts +364 -0
  591. package/src/runtime/sandbox/provisioning.ts +422 -0
  592. package/src/runtime/sandbox/session-registry.ts +289 -0
  593. package/src/runtime/services.ts +541 -0
  594. package/src/runtime/session-maintenance.ts +188 -0
  595. package/src/runtime/session-persistence.ts +288 -0
  596. package/src/runtime/session-return-context.ts +195 -0
  597. package/src/runtime/settings/control-plane-store.ts +258 -0
  598. package/src/runtime/settings/control-plane.ts +599 -0
  599. package/src/runtime/shell-command-extensions.ts +54 -0
  600. package/src/runtime/shell-command-ops.ts +207 -0
  601. package/src/runtime/shell-command-platform.ts +47 -0
  602. package/src/runtime/shell-command-services.ts +143 -0
  603. package/src/runtime/shell-command-workspace.ts +31 -0
  604. package/src/runtime/store/domains/conversation.ts +181 -0
  605. package/src/runtime/store/domains/domain-read-matrix.ts +17 -0
  606. package/src/runtime/store/domains/index.ts +222 -0
  607. package/src/runtime/store/domains/panels.ts +117 -0
  608. package/src/runtime/store/domains/permissions.ts +143 -0
  609. package/src/runtime/store/domains/ui-perf.ts +103 -0
  610. package/src/runtime/store/helpers/reducers/conversation.ts +228 -0
  611. package/src/runtime/store/helpers/reducers/lifecycle.ts +440 -0
  612. package/src/runtime/store/helpers/reducers/shared.ts +60 -0
  613. package/src/runtime/store/helpers/reducers/sync.ts +555 -0
  614. package/src/runtime/store/helpers/reducers.ts +30 -0
  615. package/src/runtime/store/index.ts +304 -0
  616. package/src/runtime/store/selectors/index.ts +354 -0
  617. package/src/runtime/store/state.ts +137 -0
  618. package/src/runtime/tasks/adapters/acp-adapter.ts +211 -0
  619. package/src/runtime/tasks/adapters/agent-adapter.ts +208 -0
  620. package/src/runtime/tasks/adapters/index.ts +16 -0
  621. package/src/runtime/tasks/adapters/process-adapter.ts +214 -0
  622. package/src/runtime/tasks/adapters/scheduler-adapter.ts +193 -0
  623. package/src/runtime/tasks/index.ts +68 -0
  624. package/src/runtime/tasks/manager.ts +415 -0
  625. package/src/runtime/telemetry/api-helpers.ts +517 -0
  626. package/src/runtime/telemetry/api.ts +768 -0
  627. package/src/runtime/telemetry/index.ts +178 -0
  628. package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +440 -0
  629. package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +200 -0
  630. package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +18 -0
  631. package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +204 -0
  632. package/src/runtime/telemetry/instrumentation/domain-bridge.ts +125 -0
  633. package/src/runtime/telemetry/instrumentation/index.ts +67 -0
  634. package/src/runtime/tools/context.ts +114 -0
  635. package/src/runtime/tools/index.ts +46 -0
  636. package/src/runtime/tools/phased-executor.ts +448 -0
  637. package/src/runtime/tools/phases/budget.ts +130 -0
  638. package/src/runtime/tools/phases/execute.ts +69 -0
  639. package/src/runtime/tools/phases/index.ts +13 -0
  640. package/src/runtime/tools/phases/map-output.ts +98 -0
  641. package/src/runtime/tools/phases/permission.ts +133 -0
  642. package/src/runtime/tools/phases/posthook.ts +57 -0
  643. package/src/runtime/tools/phases/prehook.ts +68 -0
  644. package/src/runtime/tools/phases/validate.ts +53 -0
  645. package/src/runtime/transports/direct.ts +73 -0
  646. package/src/runtime/transports/http-helpers.ts +218 -0
  647. package/src/runtime/transports/http-types.ts +364 -0
  648. package/src/runtime/transports/http.ts +629 -0
  649. package/src/runtime/transports/realtime.ts +50 -0
  650. package/src/runtime/transports/remote-events.ts +16 -0
  651. package/src/runtime/transports/shared.ts +39 -0
  652. package/src/runtime/transports/ui-runtime-events.ts +35 -0
  653. package/src/runtime/ui/index.ts +39 -0
  654. package/src/runtime/ui/model-picker/data-provider.ts +182 -0
  655. package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
  656. package/src/runtime/ui/model-picker/index.ts +59 -0
  657. package/src/runtime/ui/model-picker/types.ts +149 -0
  658. package/src/runtime/ui/provider-health/data-provider.ts +244 -0
  659. package/src/runtime/ui/provider-health/fallback-visualizer.ts +69 -0
  660. package/src/runtime/ui/provider-health/index.ts +46 -0
  661. package/src/runtime/ui/provider-health/types.ts +146 -0
  662. package/src/runtime/ui-events.ts +46 -0
  663. package/src/runtime/ui-read-model-helpers.ts +32 -0
  664. package/src/runtime/ui-read-models-core.ts +95 -0
  665. package/src/runtime/ui-read-models-observability-maintenance.ts +81 -0
  666. package/src/runtime/ui-read-models-observability-options.ts +5 -0
  667. package/src/runtime/ui-read-models-observability-remote.ts +73 -0
  668. package/src/runtime/ui-read-models-observability-security.ts +172 -0
  669. package/src/runtime/ui-read-models-observability-system.ts +217 -0
  670. package/src/runtime/ui-read-models-observability.ts +59 -0
  671. package/src/runtime/ui-read-models-operations.ts +203 -0
  672. package/src/runtime/ui-read-models.ts +61 -0
  673. package/src/runtime/ui-service-queries.ts +114 -0
  674. package/src/runtime/ui-services.ts +163 -0
  675. package/src/runtime/worktree/registry.ts +252 -0
  676. package/src/scripts/process-messages.ts +42 -0
  677. package/src/sessions/manager.ts +388 -0
  678. package/src/shell/blocking-input.ts +89 -0
  679. package/src/shell/ui-openers.ts +163 -0
  680. package/src/state/file-watcher.ts +294 -0
  681. package/src/state/index.ts +56 -0
  682. package/src/state/knowledge-injection.ts +214 -0
  683. package/src/state/memory-embedding-http.ts +642 -0
  684. package/src/state/memory-embeddings.ts +312 -0
  685. package/src/state/memory-ingest.ts +132 -0
  686. package/src/state/memory-registry.ts +111 -0
  687. package/src/state/memory-store-helpers.ts +160 -0
  688. package/src/state/memory-store.ts +728 -0
  689. package/src/state/memory-vector-store.ts +418 -0
  690. package/src/templates/manager.ts +187 -0
  691. package/src/tools/agent/index.ts +610 -0
  692. package/src/tools/agent/manager.ts +476 -0
  693. package/src/tools/analyze/git-modes.ts +380 -0
  694. package/src/tools/analyze/index.ts +128 -0
  695. package/src/tools/channel/agent-tools.ts +16 -0
  696. package/src/tools/channel/index.ts +268 -0
  697. package/src/tools/control/index.ts +90 -0
  698. package/src/tools/edit/core.ts +619 -0
  699. package/src/tools/edit/index.ts +4 -0
  700. package/src/tools/edit/phased.ts +33 -0
  701. package/src/tools/fetch/index.ts +3 -0
  702. package/src/tools/fetch/phased.ts +34 -0
  703. package/src/tools/fetch/runtime.ts +499 -0
  704. package/src/tools/index.ts +186 -0
  705. package/src/tools/mcp/index.ts +190 -0
  706. package/src/tools/remote-trigger/index.ts +130 -0
  707. package/src/tools/repl/index.ts +318 -0
  708. package/src/tools/shared/auto-heal.ts +282 -0
  709. package/src/tools/state/index.ts +688 -0
  710. package/src/tools/web-search/index.ts +38 -0
  711. package/src/tools/write/index.ts +604 -0
  712. package/src/tools/write/phased.ts +41 -0
  713. package/src/types/generated/foundation-client-types.ts +22 -0
  714. package/src/types/sql-js.d.ts +15 -0
  715. package/src/utils/splash-lines.ts +46 -0
  716. package/src/version.ts +17 -0
  717. package/src/watchers/index.ts +11 -0
  718. package/src/watchers/registry.ts +517 -0
  719. package/src/web-search/index.ts +26 -0
  720. package/src/web-search/provider-registry.ts +64 -0
  721. package/src/web-search/providers/brave.ts +100 -0
  722. package/src/web-search/providers/duckduckgo.ts +270 -0
  723. package/src/web-search/providers/exa.ts +77 -0
  724. package/src/web-search/providers/firecrawl.ts +90 -0
  725. package/src/web-search/providers/perplexity.ts +86 -0
  726. package/src/web-search/providers/searxng.ts +88 -0
  727. package/src/web-search/providers/shared.ts +249 -0
  728. package/src/web-search/providers/tavily.ts +90 -0
  729. package/src/web-search/service.ts +142 -0
  730. package/src/widget/index.ts +2 -0
  731. package/src/widget/types.ts +9 -0
  732. package/src/widget/widget.ts +8 -0
@@ -0,0 +1,247 @@
1
+ /**
2
+ * renderHelpOverlay — renders the help overlay with keyboard shortcuts and slash commands.
3
+ *
4
+ * Toggle with `?` key or `/help` command.
5
+ */
6
+
7
+ import { type Line } from '@pellux/goodvibes-sdk/platform/types/grid';
8
+ import { ModalFactory } from './modal-factory.ts';
9
+ import type { SlashCommand } from '../input/command-registry.ts';
10
+ import type { KeybindingsManager } from '../input/keybindings.ts';
11
+ import { getOverlaySurfaceMetrics } from './overlay-viewport.ts';
12
+ import { getVisibleWindow } from './surface-layout.ts';
13
+
14
+ function toModalSections(rows: readonly string[]): import('./modal-factory.ts').ModalSection[] {
15
+ return rows.map((row) => {
16
+ if (row === '') return { type: 'spacer' as const };
17
+ if (row.startsWith(' ') && !row.slice(2).includes(' ')) {
18
+ return { type: 'title' as const, content: row.trim() };
19
+ }
20
+ if (row.startsWith(' \u2500')) return { type: 'separator' as const };
21
+ return { type: 'text' as const, content: row };
22
+ });
23
+ }
24
+
25
+ /**
26
+ * Render the help overlay as Line[].
27
+ * Shows keyboard shortcuts summary and slash commands.
28
+ *
29
+ * @param width Terminal width.
30
+ * @param commands List of registered slash commands.
31
+ * @param scrollOffset Number of lines scrolled (for navigation).
32
+ */
33
+ export function renderHelpOverlay(
34
+ width: number,
35
+ keybindingsManager: KeybindingsManager,
36
+ commands?: SlashCommand[],
37
+ scrollOffset = 0,
38
+ viewportHeight = process.stdout.rows || 24,
39
+ ): Line[] {
40
+ const kb = (action: Parameters<typeof keybindingsManager.getComboLabel>[0]) => keybindingsManager.getComboLabel(action);
41
+
42
+ const hasCommand = (name: string): boolean => Boolean(commands?.some((command) => command.name === name || (command.aliases ?? []).includes(name)));
43
+
44
+ // Keyboard shortcut sections
45
+ const shortcutRows: string[] = [
46
+ ' Core Navigation',
47
+ ' ' + '\u2500'.repeat(40),
48
+ ` ${'Up / Down'.padEnd(20)} Scroll / history recall`,
49
+ ` ${'PageUp / PageDn'.padEnd(20)} Scroll by full page`,
50
+ ` ${kb('search').padEnd(20)} Search conversation (Ctrl+F)`,
51
+ '',
52
+ ' Prompt And Editing',
53
+ ' ' + '\u2500'.repeat(40),
54
+ ` ${'Enter'.padEnd(20)} Submit message`,
55
+ ` ${'Shift+Enter'.padEnd(20)} Insert newline`,
56
+ ` ${kb('paste').padEnd(20)} Paste (image priority)`,
57
+ ` ${(kb('undo') + ' / ' + kb('redo')).padEnd(20)} Undo / redo`,
58
+ '',
59
+ ' Overlays And Panels',
60
+ ' ' + '\u2500'.repeat(40),
61
+ ` ${'?'.padEnd(20)} Toggle help`,
62
+ ` ${'/shortcuts'.padEnd(20)} Full keyboard shortcuts`,
63
+ ` ${kb('panel-picker').padEnd(20)} Open or focus the panel workspace`,
64
+ '',
65
+ ];
66
+
67
+ const commandRows: string[] = [
68
+ ' Quick Start',
69
+ ' ' + '\u2500'.repeat(40),
70
+ ' /setup onboarding Guided first-run review and environment posture',
71
+ ' /cockpit Unified runtime control room',
72
+ ' /settings Settings and config browser',
73
+ '',
74
+ ' Build And Operate',
75
+ ' ' + '\u2500'.repeat(40),
76
+ ' /provider Choose provider or model family',
77
+ ' /subscription Review provider logins and subscriptions',
78
+ ' /marketplace open Browse plugins, skills, and packs',
79
+ ' /remote setup Review remote, bridge, and tunnel flows',
80
+ ' /sandbox review Inspect secure execution posture',
81
+ '',
82
+ ' Review And Govern',
83
+ ' ' + '\u2500'.repeat(40),
84
+ ' /security Security review workspace',
85
+ ' /policy Simulation, lint, and preflight review',
86
+ ' /incident Incident workspace and export flows',
87
+ ' /knowledge Durable knowledge and review queue',
88
+ '',
89
+ ' Power Surfaces',
90
+ ' ' + '\u2500'.repeat(40),
91
+ ' /hooks Hook workbench and runtime activity',
92
+ ' /orchestration Graph and recursive-agent control room',
93
+ ' /communication Structured agent communication workspace',
94
+ ' /tasks Task surface for list/show/pause/resume/output',
95
+ ];
96
+
97
+ if (commands && commands.length > 0) {
98
+ commandRows.push('', ' Available Slash Commands', ' ' + '\u2500'.repeat(40));
99
+ const preferred = ['setup', 'cockpit', 'settings', 'provider', 'subscription', 'marketplace', 'remote', 'sandbox', 'security', 'policy', 'incident', 'knowledge', 'hooks', 'orchestration', 'communication', 'tasks'];
100
+ const seen = new Set<string>();
101
+ for (const name of preferred) {
102
+ const cmd = commands.find((entry) => entry.name === name);
103
+ if (!cmd) continue;
104
+ seen.add(cmd.name);
105
+ const nameCol = `/${cmd.name}`.padEnd(18);
106
+ commandRows.push(` ${nameCol} ${cmd.description}`);
107
+ }
108
+ const remainder = [...commands]
109
+ .filter((cmd) => !seen.has(cmd.name))
110
+ .sort((a, b) => a.name.localeCompare(b.name))
111
+ .slice(0, 24);
112
+ if (remainder.length > 0) {
113
+ commandRows.push('', ' More Commands', ' ' + '\u2500'.repeat(40));
114
+ for (const cmd of remainder) {
115
+ const nameCol = `/${cmd.name}`.padEnd(18);
116
+ commandRows.push(` ${nameCol} ${cmd.description}`);
117
+ }
118
+ }
119
+ } else if (!hasCommand('help')) {
120
+ commandRows.push('', ' Essentials', ' ' + '\u2500'.repeat(40));
121
+ commandRows.push(' /help Show this help overlay');
122
+ commandRows.push(' /shortcuts Keyboard shortcut reference');
123
+ commandRows.push(' /model Select LLM model');
124
+ commandRows.push(' /clear Clear conversation');
125
+ }
126
+
127
+ const allRows = [...shortcutRows, ...commandRows];
128
+
129
+ // Apply scroll offset — show a window of rows
130
+ const metrics = getOverlaySurfaceMetrics(width, viewportHeight, {
131
+ chromeRows: 4,
132
+ minContentRows: 8,
133
+ maxContentRows: 12,
134
+ });
135
+ const maxVisible = metrics.contentRows;
136
+ const clampedOffset = Math.max(0, Math.min(scrollOffset, Math.max(0, allRows.length - maxVisible)));
137
+ const visibleRows = allRows.slice(clampedOffset, clampedOffset + maxVisible);
138
+ const window = getVisibleWindow(allRows.length, clampedOffset, maxVisible);
139
+
140
+ return ModalFactory.createModal(
141
+ {
142
+ title: 'Help',
143
+ width: metrics.boxWidth,
144
+ margin: metrics.margin,
145
+ targetContentRows: metrics.contentRows,
146
+ tabs: [
147
+ { label: 'Overview', active: true },
148
+ { label: 'Commands' },
149
+ ],
150
+ sections: toModalSections(visibleRows),
151
+ helpers: allRows.length > maxVisible
152
+ ? [{ content: `[${window.start + 1}-${Math.min(allRows.length, clampedOffset + visibleRows.length)} of ${allRows.length}]` }]
153
+ : undefined,
154
+ hints: ['? or Esc Close', 'Up/Down Scroll'],
155
+ },
156
+ width,
157
+ );
158
+ }
159
+
160
+ /**
161
+ * renderShortcutsOverlay — renders keyboard shortcuts as Line[].
162
+ * Accessed via /shortcuts command. Reflects live keybindings (user overrides included).
163
+ */
164
+ export function renderShortcutsOverlay(
165
+ width: number,
166
+ keybindingsManager: KeybindingsManager,
167
+ scrollOffset = 0,
168
+ viewportHeight = process.stdout.rows || 24,
169
+ ): Line[] {
170
+ function row(key: string, desc: string): string {
171
+ const keyCol = key.length > 20 ? key.slice(0, 19) + '\u2026' : key.padEnd(20);
172
+ return ` ${keyCol} ${desc}`;
173
+ }
174
+
175
+ // Helper: get the label for a bindable action, falling back to literal string.
176
+ const kb = (action: Parameters<typeof keybindingsManager.getComboLabel>[0]) => keybindingsManager.getComboLabel(action);
177
+
178
+ const allRows: string[] = [
179
+ ' Navigation',
180
+ ' ' + '\u2500'.repeat(40),
181
+ row('Up / Down', 'Scroll / history recall'),
182
+ row('PageUp / PageDn', 'Scroll by full page'),
183
+ row('Home / End', 'Jump to start / end of line'),
184
+ row(kb('search'), 'Search conversation'),
185
+ row('Mouse wheel', 'Scroll conversation'),
186
+ '',
187
+ ' Editing',
188
+ ' ' + '\u2500'.repeat(40),
189
+ row('Enter', 'Submit message'),
190
+ row('Shift+Enter', 'Insert newline'),
191
+ row('@', 'Open file picker'),
192
+ row('/', 'Slash command mode'),
193
+ row(kb('paste'), 'Paste (image priority)'),
194
+ row(`${kb('undo')} / ${kb('redo')}`, 'Undo / redo'),
195
+ row(kb('clear-prompt'), 'Clear prompt'),
196
+ row(kb('delete-word'), 'Delete word backward'),
197
+ row(kb('kill-line'), 'Kill to end of line'),
198
+ row(kb('apply-diff-line-start'), 'Apply diff / line start'),
199
+ row(kb('next-error-line-end'), 'Next error / line end'),
200
+ '',
201
+ ' Actions',
202
+ ' ' + '\u2500'.repeat(40),
203
+ row('Tab', 'Collapse/expand block'),
204
+ row(kb('bookmark'), 'Bookmark block'),
205
+ row(kb('block-copy'), 'Copy block to clipboard'),
206
+ row(kb('block-save'), 'Save block to file'),
207
+ row(kb('copy-selection'), 'Copy selection'),
208
+ row('F2', 'Process monitor'),
209
+ row('?', 'Help overlay'),
210
+ row(`${kb('clear-cancel')} x2`, 'Exit'),
211
+ '',
212
+ ' Panels',
213
+ ' ' + '\u2500'.repeat(40),
214
+ row('Tab', 'Swap focus between input and panel workspace'),
215
+ row(kb('panel-picker'), 'Open / focus / hide panel workspace'),
216
+ row(kb('panel-tab-next'), 'Next workspace panel tab'),
217
+ row(kb('panel-tab-prev'), 'Previous workspace panel tab'),
218
+ '',
219
+ ` Config: /keybindings to list and customize`,
220
+ ];
221
+
222
+ const metrics = getOverlaySurfaceMetrics(width, viewportHeight, {
223
+ chromeRows: 4,
224
+ minContentRows: 8,
225
+ maxContentRows: 12,
226
+ });
227
+ const maxVisible = metrics.contentRows;
228
+ const clampedOffset = Math.max(0, Math.min(scrollOffset, Math.max(0, allRows.length - maxVisible)));
229
+ const visibleRows = allRows.slice(clampedOffset, clampedOffset + maxVisible);
230
+ const window = getVisibleWindow(allRows.length, clampedOffset, maxVisible);
231
+
232
+ return ModalFactory.createModal(
233
+ {
234
+ title: 'Keyboard Shortcuts',
235
+ width: metrics.boxWidth,
236
+ margin: metrics.margin,
237
+ targetContentRows: metrics.contentRows,
238
+ tabs: [{ label: 'Shortcuts', active: true }],
239
+ sections: toModalSections(visibleRows),
240
+ helpers: allRows.length > maxVisible
241
+ ? [{ content: `[${window.start + 1}-${Math.min(allRows.length, clampedOffset + visibleRows.length)} of ${allRows.length}]` }]
242
+ : undefined,
243
+ hints: ['Esc Close', 'Up/Down Scroll'],
244
+ },
245
+ width,
246
+ );
247
+ }
@@ -0,0 +1,73 @@
1
+ import type { Line } from '@pellux/goodvibes-sdk/platform/types/grid';
2
+ import { getDisplayWidth } from '@pellux/goodvibes-sdk/platform/utils/terminal-width';
3
+ import type { HistorySearch } from '../input/input-history.ts';
4
+ import { createBottomBarLine, writeBottomBarText } from './bottom-bar.ts';
5
+
6
+ /**
7
+ * Truncate `text` to at most `maxWidth` display columns, then pad with spaces
8
+ * to exactly `maxWidth` columns. CJK/emoji wide characters count as 2 columns.
9
+ */
10
+ function truncateToWidth(text: string, maxWidth: number): string {
11
+ let usedWidth = 0;
12
+ let result = '';
13
+ let i = 0;
14
+ while (i < text.length) {
15
+ const code = text.codePointAt(i)!;
16
+ const charLen = code > 0xFFFF ? 2 : 1;
17
+ const charWidth = getDisplayWidth(text.slice(i, i + charLen));
18
+ if (usedWidth + charWidth > maxWidth) break;
19
+ result += text.slice(i, i + charLen);
20
+ usedWidth += charWidth;
21
+ i += charLen;
22
+ }
23
+ // Pad to exactly maxWidth columns with spaces
24
+ return result + ' '.repeat(maxWidth - usedWidth);
25
+ }
26
+
27
+ /**
28
+ * Render the reverse-i-search bar as a single Line[] overlay at the bottom of the viewport.
29
+ * Format: (reverse-i-search)`query': matched-command-text
30
+ *
31
+ * - The matched command text is shown in dim grey over the teal bar.
32
+ * - If no match, shows "(failed reverse-i-search)" prefix.
33
+ */
34
+ export function renderHistorySearchOverlay(
35
+ historySearch: HistorySearch,
36
+ width: number
37
+ ): Line[] {
38
+ if (width <= 0) return [];
39
+
40
+ const match = historySearch.currentMatch;
41
+ const hasMatch = match !== null && historySearch.query.length > 0;
42
+ const noMatch = historySearch.query.length > 0 && !hasMatch;
43
+
44
+ const prefix = noMatch
45
+ ? '(failed reverse-i-search)`'
46
+ : '(reverse-i-search)`';
47
+ const queryPart = historySearch.query + "': ";
48
+ const matchText = hasMatch ? match?.entry ?? '' : '';
49
+
50
+ // Build the display string
51
+ const label = prefix + queryPart;
52
+ const full = truncateToWidth(label + matchText, width);
53
+
54
+ const line = createBottomBarLine(width, { fg: '#000000', bg: '#00ffcc' });
55
+ writeBottomBarText(line, 0, width, full, { fg: '#000000', bg: '#00ffcc' });
56
+
57
+ // Highlight the matched region in the match text with dim styling
58
+ if (hasMatch && match) {
59
+ const labelW = getDisplayWidth(label);
60
+ const matchStartCol = labelW + match.matchStart;
61
+ const matchEndCol = matchStartCol + match.matchLength;
62
+ const highlightWidth = Math.max(0, matchEndCol - matchStartCol);
63
+ const matchedSlice = truncateToWidth(match.entry.slice(match.matchStart, match.matchStart + match.matchLength), highlightWidth);
64
+ writeBottomBarText(line, matchStartCol, highlightWidth, matchedSlice, {
65
+ fg: '#000000',
66
+ bg: '#00ffcc',
67
+ bold: true,
68
+ underline: true,
69
+ });
70
+ }
71
+
72
+ return [line];
73
+ }
@@ -0,0 +1,97 @@
1
+ export interface ShellLayoutRequest {
2
+ readonly width: number;
3
+ readonly height: number;
4
+ readonly headerHeight: number;
5
+ readonly footerHeight: number;
6
+ readonly panelWidth?: number;
7
+ }
8
+
9
+ export interface Rect {
10
+ readonly x: number;
11
+ readonly y: number;
12
+ readonly width: number;
13
+ readonly height: number;
14
+ }
15
+
16
+ export interface ShellLayout {
17
+ readonly screen: Rect;
18
+ readonly header: Rect;
19
+ readonly body: Rect;
20
+ readonly footer: Rect;
21
+ readonly conversation: Rect;
22
+ readonly panel?: Rect;
23
+ readonly separatorX?: number;
24
+ }
25
+
26
+ export interface SplitPaneLayout {
27
+ readonly totalRows: number;
28
+ readonly topTabRows: number;
29
+ readonly bottomTabRows: number;
30
+ readonly separatorRows: number;
31
+ readonly topContentRows: number;
32
+ readonly bottomContentRows: number;
33
+ }
34
+
35
+ function clamp(value: number, min: number, max: number): number {
36
+ return Math.max(min, Math.min(max, value));
37
+ }
38
+
39
+ export function createShellLayout(request: ShellLayoutRequest): ShellLayout {
40
+ const width = Math.max(1, request.width);
41
+ const height = Math.max(1, request.height);
42
+ const headerHeight = clamp(request.headerHeight, 0, height);
43
+ const footerHeight = clamp(request.footerHeight, 0, Math.max(0, height - headerHeight));
44
+ const bodyHeight = Math.max(0, height - headerHeight - footerHeight);
45
+
46
+ const hasPanel = typeof request.panelWidth === 'number' && request.panelWidth > 0;
47
+ const safePanelWidth = hasPanel
48
+ ? clamp(request.panelWidth as number, 1, Math.max(1, width - 2))
49
+ : 0;
50
+ const separatorWidth = hasPanel ? 1 : 0;
51
+ const conversationWidth = hasPanel ? Math.max(1, width - safePanelWidth - separatorWidth) : width;
52
+
53
+ return {
54
+ screen: { x: 0, y: 0, width, height },
55
+ header: { x: 0, y: 0, width, height: headerHeight },
56
+ body: { x: 0, y: headerHeight, width, height: bodyHeight },
57
+ footer: { x: 0, y: headerHeight + bodyHeight, width, height: footerHeight },
58
+ conversation: { x: 0, y: headerHeight, width: conversationWidth, height: bodyHeight },
59
+ panel: hasPanel
60
+ ? {
61
+ x: conversationWidth + separatorWidth,
62
+ y: headerHeight,
63
+ width: safePanelWidth,
64
+ height: bodyHeight,
65
+ }
66
+ : undefined,
67
+ separatorX: hasPanel ? conversationWidth : undefined,
68
+ };
69
+ }
70
+
71
+ export function createSplitPaneLayout(
72
+ totalRows: number,
73
+ ratio: number,
74
+ options: {
75
+ readonly topTabRows?: number;
76
+ readonly bottomTabRows?: number;
77
+ readonly separatorRows?: number;
78
+ } = {},
79
+ ): SplitPaneLayout {
80
+ const topTabRows = options.topTabRows ?? 1;
81
+ const bottomTabRows = options.bottomTabRows ?? 1;
82
+ const separatorRows = options.separatorRows ?? 1;
83
+ const chromeRows = topTabRows + bottomTabRows + separatorRows;
84
+ const contentRows = Math.max(0, totalRows - chromeRows);
85
+ const normalizedRatio = clamp(ratio, 0.2, 0.8);
86
+ const topContentRows = contentRows <= 1 ? contentRows : Math.max(1, Math.floor(contentRows * normalizedRatio));
87
+ const bottomContentRows = contentRows <= 1 ? 0 : Math.max(1, contentRows - topContentRows);
88
+
89
+ return {
90
+ totalRows,
91
+ topTabRows,
92
+ bottomTabRows,
93
+ separatorRows,
94
+ topContentRows,
95
+ bottomContentRows,
96
+ };
97
+ }
@@ -0,0 +1,32 @@
1
+ import { GLYPHS } from './ui-primitives.ts';
2
+
3
+ /**
4
+ * Layout constants — single source of truth for margins and content width.
5
+ * All renderers import these instead of hardcoding indent values.
6
+ */
7
+ export const LAYOUT = {
8
+ LEFT_MARGIN: 4,
9
+ RIGHT_MARGIN: 2,
10
+ contentWidth: (termWidth: number) => termWidth - LAYOUT.LEFT_MARGIN - LAYOUT.RIGHT_MARGIN,
11
+ /** Used by createMessageBar in ui-factory.ts for user message ghost boxes. */
12
+ USER_BOX_MARGIN: 2,
13
+ } as const;
14
+
15
+ export const TOOL_STATUS = {
16
+ SUCCESS_ICON: GLYPHS.status.success,
17
+ SPINNER_FRAMES: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
18
+ FAIL_ICON: GLYPHS.status.failure,
19
+ PENDING_ICON: GLYPHS.status.pending,
20
+ TOOL_NAME_PAD: 8,
21
+ } as const;
22
+
23
+ export const COLORS = {
24
+ DIM_TEXT: '244',
25
+ } as const;
26
+
27
+ export const BORDERS = {
28
+ THINKING: { char: '▌', color: '#9945FF' },
29
+ ERROR: { char: '▌', color: '#ef4444' },
30
+ WARNING: { char: '▌', color: '#eab308' },
31
+ INFO: { char: '▌', color: '#22d3ee' },
32
+ } as const;
@@ -0,0 +1,156 @@
1
+ import { type Line } from '@pellux/goodvibes-sdk/platform/types/grid';
2
+ import { ModalFactory } from './modal-factory.ts';
3
+ import type { ProcessManager } from '@pellux/goodvibes-sdk/platform/tools/shared/process-manager';
4
+ import type { AgentManager } from '../tools/agent/index.ts';
5
+ import type { ProcessEntry } from './process-modal.ts';
6
+ import { getOverlaySurfaceMetrics, getStableOverlayContentRows } from './overlay-viewport.ts';
7
+
8
+ export interface LiveTailModalDeps {
9
+ readonly agentManager: Pick<AgentManager, 'cancel' | 'getStatus'>;
10
+ readonly processManager: Pick<ProcessManager, 'stop' | 'getOutput'>;
11
+ }
12
+
13
+ // ─── LiveTailModal ────────────────────────────────────────────────────────────
14
+
15
+ /**
16
+ * LiveTailModal — manages state for the live output peek modal.
17
+ *
18
+ * Shows streaming stdout/stderr from a selected background process or agent
19
+ * progress notes. Auto-scrolls to the bottom unless the user scrolled up.
20
+ */
21
+ export class LiveTailModal {
22
+ public active = false;
23
+ public entry: ProcessEntry | null = null;
24
+
25
+ /** Number of lines scrolled up from the bottom (0 = at bottom). */
26
+ public scrollOffset = 0;
27
+
28
+ constructor(private readonly deps: LiveTailModalDeps) {}
29
+
30
+ open(entry: ProcessEntry): void {
31
+ this.entry = entry;
32
+ this.scrollOffset = 0;
33
+ this.active = true;
34
+ }
35
+
36
+ close(): void {
37
+ this.active = false;
38
+ this.entry = null;
39
+ this.scrollOffset = 0;
40
+ }
41
+
42
+ scrollUp(): void {
43
+ this.scrollOffset++;
44
+ }
45
+
46
+ scrollDown(): void {
47
+ this.scrollOffset = Math.max(0, this.scrollOffset - 1);
48
+ }
49
+
50
+ /**
51
+ * Kill the current process.
52
+ * Returns true if the process was found and stopped.
53
+ */
54
+ killProcess(): boolean {
55
+ if (!this.entry) return false;
56
+
57
+ if (this.entry.type === 'exec') {
58
+ return this.deps.processManager.stop(this.entry.id);
59
+ } else {
60
+ return this.deps.agentManager.cancel(this.entry.id);
61
+ }
62
+ }
63
+
64
+ /** Retrieve the current output text for the watched process. */
65
+ getOutput(): string {
66
+ if (!this.entry) return '';
67
+
68
+ if (this.entry.type === 'exec') {
69
+ const out = this.deps.processManager.getOutput(this.entry.id);
70
+ if (!out) return '';
71
+ const combined = [out.stdout, out.stderr].filter(Boolean).join('\n').trim();
72
+ return combined || '(no output yet)';
73
+ } else {
74
+ // For agents, show progress note and status
75
+ const rec = this.deps.agentManager.getStatus(this.entry.id);
76
+ if (!rec) return '(process not found)';
77
+ const parts: string[] = [
78
+ `Task: ${rec.task}`,
79
+ `Status: ${rec.status}`,
80
+ `Tool calls: ${rec.toolCallCount}`,
81
+ ];
82
+ if (rec.progress) parts.push(`Progress: ${rec.progress}`);
83
+ if (rec.error) parts.push(`Error: ${rec.error}`);
84
+ return parts.join('\n');
85
+ }
86
+ }
87
+ }
88
+
89
+ // ─── renderLiveTailModal ──────────────────────────────────────────────────────
90
+
91
+ /**
92
+ * Render the live-tail peek modal as Line[] for overlay in the viewport.
93
+ *
94
+ * Shows a scrollable view of the process output. scrollOffset=0 means the
95
+ * bottom of the output is visible (auto-scroll behaviour).
96
+ *
97
+ * @param modal LiveTailModal state
98
+ * @param width Terminal width
99
+ * @param maxOutputLines Maximum lines to show inside the box (default: 16)
100
+ */
101
+ export function renderLiveTailModal(
102
+ modal: LiveTailModal,
103
+ width: number,
104
+ viewportHeight = 24,
105
+ ): Line[] {
106
+ const entry = modal.entry;
107
+ if (!entry) return [];
108
+ const metrics = getOverlaySurfaceMetrics(width, viewportHeight, {
109
+ chromeRows: 4,
110
+ minContentRows: 6,
111
+ maxContentRows: 10,
112
+ });
113
+ const maxOutputLines = metrics.contentRows;
114
+ const targetContentRows = getStableOverlayContentRows(metrics.contentRows, 8);
115
+
116
+ const output = modal.getOutput();
117
+ const allLines = output.split('\n');
118
+
119
+ // Apply scroll: scrollOffset=0 → show tail; larger → scroll toward head
120
+ const totalLines = allLines.length;
121
+ // Clamp scrollOffset so we never scroll past the top of the content
122
+ const maxScroll = Math.max(0, totalLines - maxOutputLines);
123
+ const clampedOffset = Math.min(modal.scrollOffset, maxScroll);
124
+ const endIdx = Math.max(maxOutputLines, totalLines - clampedOffset);
125
+ const startIdx = Math.max(0, endIdx - maxOutputLines);
126
+ const visibleLines = allLines.slice(startIdx, endIdx);
127
+
128
+ const typeTag = entry.type === 'agent' ? '[agent]' : '[exec]';
129
+ const maxLabelW = Math.max(20, width - 30);
130
+ const title = `${typeTag} ${entry.label.slice(0, maxLabelW)}`;
131
+
132
+ // Build scroll indicator for text section header
133
+ const scrollInfo = totalLines > maxOutputLines
134
+ ? ` Lines ${startIdx + 1}-${Math.min(endIdx, totalLines)} of ${totalLines} [Up/Down] Scroll`
135
+ : '';
136
+
137
+ const contentText = visibleLines.join('\n') || '(no output yet)';
138
+
139
+ const sections: import('./modal-factory.ts').ModalSection[] = [];
140
+
141
+ if (scrollInfo) {
142
+ sections.push({ type: 'text', content: scrollInfo });
143
+ sections.push({ type: 'separator' });
144
+ }
145
+
146
+ sections.push({ type: 'text', content: contentText });
147
+
148
+ return ModalFactory.createModal({
149
+ title,
150
+ width: metrics.boxWidth,
151
+ margin: 2,
152
+ targetContentRows,
153
+ sections,
154
+ hints: ['[Up/Down] Scroll', '[k] Kill', '[Esc] Back'],
155
+ }, width);
156
+ }