@sayknow-cli/coding-agent 0.4.7 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/dist/types/capability/index.d.ts +10 -20
  3. package/dist/types/capability/types.d.ts +3 -0
  4. package/dist/types/cli/args.d.ts +0 -2
  5. package/dist/types/cli/read-cli.d.ts +1 -0
  6. package/dist/types/cli.d.ts +9 -1
  7. package/dist/types/commands/daemon.d.ts +2 -2
  8. package/dist/types/commands/deep-interview.d.ts +9 -0
  9. package/dist/types/commands/harness.d.ts +22 -0
  10. package/dist/types/commands/read.d.ts +6 -0
  11. package/dist/types/commands/sdk.d.ts +20 -2
  12. package/dist/types/config/keybindings.d.ts +34 -4
  13. package/dist/types/config/model-profile-contract.d.ts +40 -0
  14. package/dist/types/config/model-profiles.d.ts +2 -3
  15. package/dist/types/config/model-registry.d.ts +5 -0
  16. package/dist/types/config/provider-auth-health.d.ts +14 -0
  17. package/dist/types/config/provider-ranking.d.ts +59 -0
  18. package/dist/types/config/settings-schema.d.ts +156 -10
  19. package/dist/types/config/settings.d.ts +3 -0
  20. package/dist/types/edit/modes/patch.d.ts +13 -0
  21. package/dist/types/edit/path-mutation-lock.d.ts +15 -0
  22. package/dist/types/eval/py/executor.d.ts +1 -1
  23. package/dist/types/eval/py/runner-artifact.d.ts +8 -0
  24. package/dist/types/eval/py/tool-bridge.d.ts +1 -2
  25. package/dist/types/extensibility/extensions/types.d.ts +43 -2
  26. package/dist/types/extensibility/shared-events.d.ts +6 -0
  27. package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
  28. package/dist/types/main.d.ts +33 -2
  29. package/dist/types/memories/index.d.ts +2 -0
  30. package/dist/types/modes/acp/acp-agent.d.ts +22 -9
  31. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  32. package/dist/types/modes/components/btw-panel.d.ts +1 -0
  33. package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
  34. package/dist/types/modes/components/queue-pane.d.ts +8 -0
  35. package/dist/types/modes/components/queued-message-selector.d.ts +6 -0
  36. package/dist/types/modes/components/read-tool-group.d.ts +4 -4
  37. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
  38. package/dist/types/modes/components/session-observer-overlay.d.ts +4 -0
  39. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  40. package/dist/types/modes/components/tool-execution.d.ts +8 -0
  41. package/dist/types/modes/components/tool-status-header.d.ts +4 -2
  42. package/dist/types/modes/components/welcome.d.ts +5 -0
  43. package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
  44. package/dist/types/modes/controllers/command-controller.d.ts +2 -0
  45. package/dist/types/modes/controllers/event-controller.d.ts +3 -0
  46. package/dist/types/modes/interactive-mode.d.ts +13 -2
  47. package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
  48. package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
  49. package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
  50. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
  51. package/dist/types/modes/types.d.ts +6 -0
  52. package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
  53. package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
  54. package/dist/types/runtime/memory-domain.d.ts +9 -0
  55. package/dist/types/runtime/memory-guard-contract.d.ts +71 -0
  56. package/dist/types/runtime/memory-guard.d.ts +39 -0
  57. package/dist/types/runtime/memory-limit.d.ts +11 -0
  58. package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
  59. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +1 -1
  60. package/dist/types/runtime-mcp/manager.d.ts +9 -1
  61. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
  62. package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
  63. package/dist/types/runtime-mcp/redaction.d.ts +2 -0
  64. package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
  65. package/dist/types/sdk/acp/final-text.d.ts +19 -0
  66. package/dist/types/sdk/acp/mcp.d.ts +23 -0
  67. package/dist/types/sdk/broker/broker.d.ts +2 -0
  68. package/dist/types/sdk/broker/lifecycle.d.ts +13 -0
  69. package/dist/types/sdk/bus/chat-daemon-control.d.ts +9 -1
  70. package/dist/types/sdk/bus/config-commands.d.ts +2 -2
  71. package/dist/types/sdk/bus/config.d.ts +2 -0
  72. package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
  73. package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
  74. package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
  75. package/dist/types/sdk/bus/index.d.ts +52 -4
  76. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +37 -0
  77. package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
  78. package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
  79. package/dist/types/sdk/bus/notification-service.d.ts +34 -0
  80. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -0
  81. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +106 -0
  82. package/dist/types/sdk/bus/rate-limit-pool.d.ts +2 -0
  83. package/dist/types/sdk/bus/reconciliation-store.d.ts +65 -0
  84. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +33 -9
  85. package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
  86. package/dist/types/sdk/bus/telegram-daemon.d.ts +286 -12
  87. package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
  88. package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
  89. package/dist/types/sdk/client/discovery.d.ts +2 -0
  90. package/dist/types/sdk/client/liveness.d.ts +7 -0
  91. package/dist/types/sdk/host/control/operations.d.ts +3 -2
  92. package/dist/types/sdk/host/host.d.ts +3 -1
  93. package/dist/types/sdk/host/query/handlers.d.ts +14 -0
  94. package/dist/types/sdk/index.d.ts +2 -0
  95. package/dist/types/sdk/lifecycle-session.d.ts +10 -1
  96. package/dist/types/sdk/prompt-status.d.ts +88 -0
  97. package/dist/types/sdk/session-directory.d.ts +1 -1
  98. package/dist/types/sdk/session.d.ts +7 -0
  99. package/dist/types/sdk/startup-capability.d.ts +9 -0
  100. package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
  101. package/dist/types/sdk/transport/index.d.ts +12 -0
  102. package/dist/types/sdk/transport/relay.d.ts +43 -0
  103. package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
  104. package/dist/types/sdk/transport/socket.d.ts +7 -0
  105. package/dist/types/sdk/transport/stdio.d.ts +3 -0
  106. package/dist/types/session/agent-session.d.ts +83 -24
  107. package/dist/types/session/btw-contract.d.ts +16 -0
  108. package/dist/types/session/fallback-chain-controller.d.ts +18 -2
  109. package/dist/types/session/internal/managed-session-scope.d.ts +70 -10
  110. package/dist/types/session/internal/managed-session-storage.d.ts +34 -12
  111. package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
  112. package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
  113. package/dist/types/session/session-manager.d.ts +89 -18
  114. package/dist/types/session/session-storage.d.ts +31 -0
  115. package/dist/types/session/streaming-output.d.ts +60 -5
  116. package/dist/types/setup/credential-import.d.ts +5 -1
  117. package/dist/types/setup/provider-onboarding.d.ts +2 -0
  118. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +1 -1
  119. package/dist/types/skc-runtime/deep-interview-stage.d.ts +37 -0
  120. package/dist/types/skc-runtime/gc-runtime.d.ts +1 -1
  121. package/dist/types/skc-runtime/linux-proc.d.ts +22 -14
  122. package/dist/types/skc-runtime/memory-guard-owner-claims.d.ts +47 -0
  123. package/dist/types/skc-runtime/ralplan-runtime.d.ts +112 -1
  124. package/dist/types/skc-runtime/repository-binding.d.ts +63 -0
  125. package/dist/types/skc-runtime/state-runtime.d.ts +3 -1
  126. package/dist/types/skc-runtime/state-writer.d.ts +5 -1
  127. package/dist/types/skc-runtime/team-launch.d.ts +1 -1
  128. package/dist/types/skc-runtime/team-runtime.d.ts +9 -2
  129. package/dist/types/skc-runtime/team-store.d.ts +12 -0
  130. package/dist/types/skc-runtime/team-worker-memory-guard.d.ts +92 -0
  131. package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +7 -0
  132. package/dist/types/skc-runtime/ultragoal-guard.d.ts +6 -5
  133. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +28 -0
  134. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +43 -5
  135. package/dist/types/skill-state/workflow-hud.d.ts +3 -0
  136. package/dist/types/ssh/utils.d.ts +1 -0
  137. package/dist/types/task/discovery.d.ts +3 -1
  138. package/dist/types/task/executor.d.ts +6 -0
  139. package/dist/types/task/index.d.ts +3 -1
  140. package/dist/types/task/provider-retry-status.d.ts +13 -0
  141. package/dist/types/task/receipt.d.ts +2 -0
  142. package/dist/types/task/types.d.ts +133 -0
  143. package/dist/types/task/ultragoal-redteam-activation.d.ts +33 -0
  144. package/dist/types/tools/browser/launch.d.ts +7 -0
  145. package/dist/types/tools/fetch.d.ts +22 -9
  146. package/dist/types/tools/image-gen.d.ts +63 -1
  147. package/dist/types/tools/index.d.ts +7 -1
  148. package/dist/types/tools/output-meta.d.ts +21 -1
  149. package/dist/types/tools/read-internals.d.ts +12 -0
  150. package/dist/types/tools/read.d.ts +45 -1
  151. package/dist/types/tools/resource-gc.d.ts +23 -0
  152. package/dist/types/tools/skill-discovery.d.ts +7 -0
  153. package/dist/types/tools/sqlite-reader.d.ts +7 -0
  154. package/dist/types/tools/tool-result.d.ts +7 -1
  155. package/dist/types/utils/prompt-suggestion.d.ts +33 -0
  156. package/dist/types/utils/shell-snapshot.d.ts +12 -0
  157. package/dist/types/web/insane/bridge.d.ts +1 -0
  158. package/dist/types/web/insane/url-guard.d.ts +17 -0
  159. package/package.json +8 -12
  160. package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
  161. package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
  162. package/scripts/capture-sticky-viewport-showcase.ts +292 -0
  163. package/scripts/compile-args.ts +0 -1
  164. package/scripts/dogfood-repository-binding.ts +209 -0
  165. package/scripts/generate-docs-index.ts +4 -1
  166. package/scripts/generate-sdk-operation-inventory.ts +9 -0
  167. package/scripts/run-test-manifest.ts +6 -4
  168. package/scripts/verify-skc-sdk-canonicalization.ts +122 -18
  169. package/scripts/verify-sticky-viewport-showcase.ts +611 -0
  170. package/src/capability/index.ts +58 -42
  171. package/src/capability/types.ts +3 -0
  172. package/src/cli/args.ts +16 -100
  173. package/src/cli/fast-help.ts +1 -1
  174. package/src/cli/mcp-cli.ts +4 -21
  175. package/src/cli/notify-cli.ts +6 -38
  176. package/src/cli/read-cli.ts +2 -1
  177. package/src/cli/setup-cli.ts +10 -4
  178. package/src/cli.ts +133 -11
  179. package/src/commands/daemon.ts +22 -5
  180. package/src/commands/deep-interview.ts +26 -1
  181. package/src/commands/harness.ts +35 -12
  182. package/src/commands/read.ts +11 -2
  183. package/src/commands/sdk.ts +134 -17
  184. package/src/commands/team.ts +1 -1
  185. package/src/commit/agentic/index.ts +3 -3
  186. package/src/commit/map-reduce/index.ts +2 -2
  187. package/src/config/keybindings.ts +158 -25
  188. package/src/config/model-profile-contract.ts +174 -0
  189. package/src/config/model-profiles.ts +51 -10
  190. package/src/config/model-registry.ts +24 -4
  191. package/src/config/model-resolver.ts +2 -2
  192. package/src/config/provider-auth-health.ts +42 -0
  193. package/src/config/provider-ranking.ts +119 -0
  194. package/src/config/settings-schema.ts +157 -10
  195. package/src/config/settings.ts +254 -108
  196. package/src/coordinator-mcp/model-preset.ts +21 -74
  197. package/src/defaults/skc/skills/deep-interview/SKILL.md +147 -24
  198. package/src/defaults/skc/skills/ralplan/SKILL.md +91 -34
  199. package/src/defaults/skc/skills/team/SKILL.md +1 -1
  200. package/src/defaults/skc/skills/ultragoal/SKILL.md +68 -17
  201. package/src/discovery/ssh.ts +12 -1
  202. package/src/edit/index.ts +3 -6
  203. package/src/edit/modes/patch.ts +38 -1
  204. package/src/edit/modes/replace.ts +42 -0
  205. package/src/edit/path-mutation-lock.ts +112 -0
  206. package/src/eval/js/tool-bridge.ts +1 -1
  207. package/src/eval/py/executor.ts +37 -13
  208. package/src/eval/py/kernel.ts +1 -21
  209. package/src/eval/py/prelude.py +2 -2
  210. package/src/eval/py/runner-artifact.ts +84 -0
  211. package/src/eval/py/tool-bridge.ts +34 -18
  212. package/src/extensibility/extensions/runner.ts +4 -0
  213. package/src/extensibility/extensions/types.ts +42 -4
  214. package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
  215. package/src/extensibility/shared-events.ts +5 -0
  216. package/src/extensibility/skc-plugins/runtime-adapters.ts +2 -1
  217. package/src/hooks/native-skill-hook.ts +17 -4
  218. package/src/internal-urls/docs-index.generated.ts +17 -16
  219. package/src/internal-urls/local-protocol.ts +87 -25
  220. package/src/internal-urls/local-root-gc.ts +127 -0
  221. package/src/internal-urls/mcp-protocol.ts +73 -11
  222. package/src/main.ts +120 -42
  223. package/src/memories/index.ts +10 -0
  224. package/src/modes/DESIGN.md +52 -0
  225. package/src/modes/acp/acp-agent.ts +647 -83
  226. package/src/modes/acp/acp-event-mapper.ts +106 -12
  227. package/src/modes/acp/acp-mode.ts +39 -3
  228. package/src/modes/action-registry.ts +1 -1
  229. package/src/modes/components/assistant-message.ts +123 -22
  230. package/src/modes/components/btw-panel.ts +82 -16
  231. package/src/modes/components/irc-sidebar.ts +176 -62
  232. package/src/modes/components/model-selector.ts +61 -4
  233. package/src/modes/components/notifications-settings-editor.ts +1 -1
  234. package/src/modes/components/oauth-selector.ts +42 -12
  235. package/src/modes/components/plan-preview-overlay.ts +1 -1
  236. package/src/modes/components/queue-pane.ts +55 -9
  237. package/src/modes/components/queued-message-selector.ts +53 -10
  238. package/src/modes/components/read-tool-group.ts +82 -14
  239. package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
  240. package/src/modes/components/sayknow-pet-widget.ts +20 -8
  241. package/src/modes/components/session-observer-overlay.ts +187 -32
  242. package/src/modes/components/settings-selector.ts +60 -18
  243. package/src/modes/components/tool-execution.ts +138 -27
  244. package/src/modes/components/tool-status-header.ts +26 -8
  245. package/src/modes/components/welcome.ts +50 -23
  246. package/src/modes/controllers/btw-controller.ts +119 -36
  247. package/src/modes/controllers/command-controller.ts +101 -54
  248. package/src/modes/controllers/event-controller.ts +119 -27
  249. package/src/modes/controllers/extension-ui-controller.ts +23 -12
  250. package/src/modes/controllers/input-controller.ts +100 -8
  251. package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
  252. package/src/modes/controllers/selector-controller.ts +4 -1
  253. package/src/modes/interactive-mode.ts +201 -60
  254. package/src/modes/irc-observation-ledger.ts +71 -15
  255. package/src/modes/prompt-action-autocomplete.ts +32 -13
  256. package/src/modes/prompt-suggestion-controller.ts +96 -0
  257. package/src/modes/runtime-init.ts +20 -2
  258. package/src/modes/shared/agent-wire/command-dispatch.ts +3 -3
  259. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
  260. package/src/modes/types.ts +6 -0
  261. package/src/modes/utils/hotkeys-markdown.ts +64 -36
  262. package/src/modes/utils/ui-helpers.ts +99 -4
  263. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  264. package/src/prompts/agents/architect.md +17 -3
  265. package/src/prompts/agents/critic.md +17 -2
  266. package/src/prompts/agents/executor.md +1 -1
  267. package/src/prompts/agents/planner.md +8 -1
  268. package/src/prompts/system/btw-user.md +3 -8
  269. package/src/prompts/system/prompt-suggestion-system.md +32 -0
  270. package/src/prompts/system/system-prompt.md +6 -3
  271. package/src/prompts/tools/cron.md +3 -1
  272. package/src/prompts/tools/read.md +4 -2
  273. package/src/prompts/tools/skill-discovery.md +1 -0
  274. package/src/runtime/memory-domain.ts +66 -0
  275. package/src/runtime/memory-guard-contract.ts +73 -0
  276. package/src/runtime/memory-guard.ts +292 -0
  277. package/src/runtime/memory-limit.ts +50 -0
  278. package/src/runtime-mcp/client.ts +41 -55
  279. package/src/runtime-mcp/content-limits.ts +71 -0
  280. package/src/runtime-mcp/discoverable-tool-metadata.ts +1 -1
  281. package/src/runtime-mcp/json-rpc.ts +28 -11
  282. package/src/runtime-mcp/manager.ts +77 -59
  283. package/src/runtime-mcp/oauth-flow.ts +0 -72
  284. package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
  285. package/src/runtime-mcp/redaction.ts +30 -0
  286. package/src/runtime-mcp/smithery-auth.ts +17 -2
  287. package/src/runtime-mcp/smithery-connect.ts +11 -1
  288. package/src/runtime-mcp/transports/http.ts +63 -22
  289. package/src/sdk/acp/adapter.ts +8 -1
  290. package/src/sdk/acp/final-text.ts +40 -0
  291. package/src/sdk/acp/mcp.ts +26 -0
  292. package/src/sdk/broker/broker.ts +34 -20
  293. package/src/sdk/broker/identity.ts +22 -12
  294. package/src/sdk/broker/lifecycle.ts +293 -43
  295. package/src/sdk/broker/session-index.ts +11 -1
  296. package/src/sdk/bus/chat-daemon-cli.ts +2 -2
  297. package/src/sdk/bus/chat-daemon-control.ts +22 -5
  298. package/src/sdk/bus/config-commands.ts +2 -2
  299. package/src/sdk/bus/config.ts +10 -2
  300. package/src/sdk/bus/control-drain-lease.ts +104 -0
  301. package/src/sdk/bus/conversation-store.ts +40 -6
  302. package/src/sdk/bus/daemon-paths.ts +2 -0
  303. package/src/sdk/bus/index.ts +793 -121
  304. package/src/sdk/bus/kind-aware-reconciliation.ts +242 -0
  305. package/src/sdk/bus/lifecycle-commands.ts +63 -10
  306. package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
  307. package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
  308. package/src/sdk/bus/notification-orchestration.ts +12 -0
  309. package/src/sdk/bus/notification-service.ts +87 -25
  310. package/src/sdk/bus/operator-runtime.ts +31 -5
  311. package/src/sdk/bus/prompt-reconciliation.ts +240 -0
  312. package/src/sdk/bus/rate-limit-pool.ts +8 -0
  313. package/src/sdk/bus/recent-activity.ts +90 -26
  314. package/src/sdk/bus/reconciliation-store.ts +224 -0
  315. package/src/sdk/bus/telegram-cli.ts +6 -13
  316. package/src/sdk/bus/telegram-daemon-cli.ts +8 -3
  317. package/src/sdk/bus/telegram-daemon-contract.ts +34 -9
  318. package/src/sdk/bus/telegram-daemon-control.ts +161 -40
  319. package/src/sdk/bus/telegram-daemon.ts +3649 -593
  320. package/src/sdk/bus/telegram-reference.ts +20 -2
  321. package/src/sdk/bus/topic-registry.ts +451 -12
  322. package/src/sdk/cli/session-cli.ts +15 -2
  323. package/src/sdk/client/discovery.ts +19 -3
  324. package/src/sdk/client/liveness.ts +49 -0
  325. package/src/sdk/host/control/dispatch.ts +8 -2
  326. package/src/sdk/host/control/operations.ts +3 -2
  327. package/src/sdk/host/host.ts +27 -9
  328. package/src/sdk/host/query/handlers.ts +125 -5
  329. package/src/sdk/index.ts +12 -0
  330. package/src/sdk/lifecycle-session.ts +19 -3
  331. package/src/sdk/mcp/server.ts +46 -18
  332. package/src/sdk/prompt-status.ts +97 -0
  333. package/src/sdk/protocol/operation-inventory.generated.json +145 -0
  334. package/src/sdk/protocol/operation-registry.ts +24 -4
  335. package/src/sdk/session-directory.ts +5 -1
  336. package/src/sdk/session.ts +69 -8
  337. package/src/sdk/startup-capability.ts +15 -1
  338. package/src/sdk/transport/auth-preface.ts +82 -0
  339. package/src/sdk/transport/index.ts +18 -0
  340. package/src/sdk/transport/relay.ts +252 -0
  341. package/src/sdk/transport/serve-cli.ts +105 -0
  342. package/src/sdk/transport/socket.ts +197 -0
  343. package/src/sdk/transport/stdio.ts +17 -0
  344. package/src/session/agent-session.ts +1112 -314
  345. package/src/session/blob-store.ts +25 -7
  346. package/src/session/btw-contract.ts +59 -0
  347. package/src/session/fallback-chain-controller.ts +47 -8
  348. package/src/session/internal/managed-session-scope.ts +1426 -259
  349. package/src/session/internal/managed-session-storage.ts +414 -238
  350. package/src/session/internal/native-publish-outcome.ts +271 -0
  351. package/src/session/memory-guard-checkpoint-participant.ts +131 -0
  352. package/src/session/session-manager.ts +2079 -469
  353. package/src/session/session-storage.ts +151 -11
  354. package/src/session/streaming-output.ts +262 -43
  355. package/src/setup/credential-import.ts +28 -3
  356. package/src/setup/provider-onboarding.ts +49 -5
  357. package/src/setup/provider-presets.json +2 -1
  358. package/src/skc-runtime/deep-interview-runtime.ts +303 -36
  359. package/src/skc-runtime/deep-interview-stage.ts +1016 -0
  360. package/src/skc-runtime/deep-interview-state.ts +8 -5
  361. package/src/skc-runtime/gc-render.ts +1 -0
  362. package/src/skc-runtime/gc-runtime.ts +11 -1
  363. package/src/skc-runtime/linux-proc.ts +70 -36
  364. package/src/skc-runtime/managed-owner-supervisor.ts +83 -4
  365. package/src/skc-runtime/memory-guard-owner-claims.ts +389 -0
  366. package/src/skc-runtime/ralplan-runtime.ts +1057 -75
  367. package/src/skc-runtime/repository-binding.ts +267 -0
  368. package/src/skc-runtime/session-state-sidecar.ts +25 -9
  369. package/src/skc-runtime/state-runtime.ts +50 -12
  370. package/src/skc-runtime/state-writer.ts +68 -56
  371. package/src/skc-runtime/team-launch.ts +34 -5
  372. package/src/skc-runtime/team-runtime.ts +41 -1
  373. package/src/skc-runtime/team-store.ts +32 -0
  374. package/src/skc-runtime/team-worker-memory-guard.ts +363 -0
  375. package/src/skc-runtime/team-workers.ts +1 -0
  376. package/src/skc-runtime/tmux-common.ts +13 -2
  377. package/src/skc-runtime/tmux-owner-isolation.ts +20 -1
  378. package/src/skc-runtime/tmux-sessions.ts +45 -6
  379. package/src/skc-runtime/ultragoal-guard.ts +93 -15
  380. package/src/skc-runtime/ultragoal-receipt-freshness.ts +123 -0
  381. package/src/skc-runtime/ultragoal-runtime.ts +469 -38
  382. package/src/skc-runtime/workflow-manifest.generated.json +195 -5
  383. package/src/skc-runtime/workflow-manifest.ts +67 -3
  384. package/src/skill-state/workflow-hud.ts +25 -2
  385. package/src/skill-state/workflow-mutation-guard.ts +104 -12
  386. package/src/slash-commands/builtin-registry.ts +1 -1
  387. package/src/ssh/utils.ts +14 -0
  388. package/src/task/discovery.ts +8 -2
  389. package/src/task/executor.ts +165 -47
  390. package/src/task/index.ts +123 -15
  391. package/src/task/provider-retry-status.ts +88 -0
  392. package/src/task/receipt.ts +3 -0
  393. package/src/task/render.ts +45 -26
  394. package/src/task/skc-command.ts +2 -2
  395. package/src/task/types.ts +55 -10
  396. package/src/task/ultragoal-redteam-activation.ts +75 -0
  397. package/src/tools/ask.ts +1 -1
  398. package/src/tools/ast-edit.ts +2 -2
  399. package/src/tools/bash-allowed-prefixes.ts +45 -1
  400. package/src/tools/bash-pty-selection.ts +2 -2
  401. package/src/tools/browser/launch.ts +41 -6
  402. package/src/tools/browser/screenshot-format.ts +6 -1
  403. package/src/tools/cron.ts +1 -1
  404. package/src/tools/fetch.ts +127 -154
  405. package/src/tools/image-gen.ts +476 -23
  406. package/src/tools/index.ts +7 -1
  407. package/src/tools/output-meta.ts +176 -9
  408. package/src/tools/path-utils.ts +5 -1
  409. package/src/tools/read-internals.ts +44 -0
  410. package/src/tools/read.ts +1544 -310
  411. package/src/tools/resource-gc.ts +665 -125
  412. package/src/tools/skill-discovery.ts +39 -3
  413. package/src/tools/sqlite-reader.ts +63 -5
  414. package/src/tools/subagent-render.ts +74 -16
  415. package/src/tools/subagent.ts +2 -0
  416. package/src/tools/tool-result.ts +14 -1
  417. package/src/utils/edit-mode.ts +2 -2
  418. package/src/utils/pasted-image-path.ts +15 -6
  419. package/src/utils/prompt-suggestion.ts +265 -0
  420. package/src/utils/shell-snapshot.ts +173 -63
  421. package/src/utils/sixel.ts +3 -3
  422. package/src/web/insane/bridge.ts +5 -1
  423. package/src/web/insane/url-guard.ts +140 -27
  424. package/src/web/scrapers/docs-rs.ts +30 -5
  425. package/src/web/scrapers/types.ts +19 -49
  426. package/src/web/scrapers/utils.ts +12 -26
  427. package/src/web/search/providers/codex.ts +1 -1
  428. package/src/workflow/workflow-intent-diff.ts +4 -1
@@ -1,12 +1,28 @@
1
- import { prompt } from "@sayknow-cli/utils";
2
1
  import btwUserPrompt from "../../prompts/system/btw-user.md" with { type: "text" };
2
+ import type { BtwConversationScope, BtwTurnCapture } from "../../session/agent-session";
3
+ import {
4
+ BTW_MAX_QUESTION_UTF8_BYTES,
5
+ type BtwTextExchange,
6
+ boundBtwExchanges,
7
+ sanitizeBtwError,
8
+ utf8ByteLength,
9
+ } from "../../session/btw-contract";
3
10
  import { BtwPanelComponent } from "../components/btw-panel";
4
11
  import type { InteractiveModeContext } from "../types";
5
12
 
13
+ type BtwFollowUpResult = "accepted" | "busy" | "closed" | "rejected";
14
+
15
+ interface ActiveBtwTurn extends BtwTurnCapture {
16
+ abortController: AbortController | undefined;
17
+ active: boolean;
18
+ }
19
+
6
20
  interface BtwRequest {
7
21
  component: BtwPanelComponent;
8
- abortController: AbortController;
9
- question: string;
22
+ conversationScope: BtwConversationScope | undefined;
23
+ activeTurn: ActiveBtwTurn | undefined;
24
+ inFlight: boolean;
25
+ contextExchanges: BtwTextExchange[];
10
26
  }
11
27
 
12
28
  export class BtwController {
@@ -18,84 +34,151 @@ export class BtwController {
18
34
  return this.#activeRequest !== undefined;
19
35
  }
20
36
 
37
+ hasOpenPanel(): boolean {
38
+ return this.hasActiveRequest();
39
+ }
40
+
41
+ isTurnInFlight(): boolean {
42
+ return this.#activeRequest?.inFlight ?? false;
43
+ }
44
+
21
45
  handleEscape(): boolean {
22
46
  if (!this.#activeRequest) return false;
23
- this.#closeActiveRequest({ abort: this.#activeRequest.abortController.signal.aborted === false });
47
+ this.#closeActiveRequest();
24
48
  return true;
25
49
  }
26
50
 
27
51
  dispose(): void {
28
- this.#closeActiveRequest({ abort: true });
52
+ this.#closeActiveRequest();
29
53
  }
30
54
 
31
55
  async start(question: string): Promise<void> {
56
+ if (this.hasOpenPanel()) {
57
+ this.ctx.showStatus("A /btw chat is already open. Type a follow-up or press Esc to return to the main chat.");
58
+ return;
59
+ }
32
60
  const trimmedQuestion = question.trim();
33
61
  if (!trimmedQuestion) {
34
62
  this.ctx.showStatus("Usage: /btw <question>");
35
63
  return;
36
64
  }
65
+ if (!this.#acceptQuestion(trimmedQuestion) || !this.#hasModel()) return;
66
+ const scope = this.ctx.session.createBtwConversationScope(btwUserPrompt);
67
+ const request = this.#openRequest(trimmedQuestion, scope);
68
+ void this.#runRequest(request);
69
+ }
37
70
 
38
- const model = this.ctx.session.model;
39
- if (!model) {
40
- this.ctx.showError("No active model available for /btw.");
41
- return;
71
+ async submitFollowUp(question: string): Promise<BtwFollowUpResult> {
72
+ const request = this.#activeRequest;
73
+ if (!request) return "closed";
74
+ if (request.inFlight) {
75
+ this.ctx.showStatus("The /btw chat is still answering. Wait for it to finish.");
76
+ return "busy";
42
77
  }
78
+ const trimmedQuestion = question.trim();
79
+ if (!trimmedQuestion) return "closed";
80
+ if (!this.#acceptQuestion(trimmedQuestion)) return "rejected";
81
+ if (!request.conversationScope) return "closed";
82
+ request.activeTurn = this.#createTurn(trimmedQuestion, request.conversationScope);
83
+ request.inFlight = true;
84
+ request.component.beginTurn(trimmedQuestion);
85
+ void this.#runRequest(request);
86
+ return "accepted";
87
+ }
88
+
89
+ #acceptQuestion(question: string): boolean {
90
+ if (utf8ByteLength(question) <= BTW_MAX_QUESTION_UTF8_BYTES) return true;
91
+ this.ctx.showError(`/btw questions are limited to ${BTW_MAX_QUESTION_UTF8_BYTES} UTF-8 bytes.`);
92
+ return false;
93
+ }
94
+
95
+ #hasModel(): boolean {
96
+ if (this.ctx.session.model) return true;
97
+ this.ctx.showError("No active model available for /btw.");
98
+ return false;
99
+ }
43
100
 
44
- this.#closeActiveRequest({ abort: true });
101
+ #createTurn(question: string, scope: BtwConversationScope): ActiveBtwTurn {
102
+ return { question, scope, abortController: new AbortController(), active: true };
103
+ }
45
104
 
105
+ #openRequest(question: string, scope: BtwConversationScope): BtwRequest {
46
106
  const request: BtwRequest = {
47
- component: new BtwPanelComponent({ question: trimmedQuestion, tui: this.ctx.ui }),
48
- abortController: new AbortController(),
49
- question: trimmedQuestion,
107
+ component: new BtwPanelComponent({ question, tui: this.ctx.ui }),
108
+ conversationScope: scope,
109
+ activeTurn: this.#createTurn(question, scope),
110
+ inFlight: true,
111
+ contextExchanges: [],
50
112
  };
51
113
  this.ctx.btwContainer.clear();
52
114
  this.ctx.btwContainer.addChild(request.component);
53
115
  this.ctx.ui.requestRender();
54
116
  this.#activeRequest = request;
55
- void this.#runRequest(request);
117
+ return request;
56
118
  }
57
119
 
58
120
  async #runRequest(request: BtwRequest): Promise<void> {
121
+ const turn = request.activeTurn;
122
+ const abortController = turn?.abortController;
123
+ if (!turn?.scope || !abortController) return;
59
124
  try {
60
- const promptText = prompt.render(btwUserPrompt, { question: request.question });
61
125
  const { replyText } = await this.ctx.session.runEphemeralTurn({
62
126
  purpose: "btw",
63
- promptText,
127
+ turn,
128
+ contextExchanges: request.contextExchanges.map(exchange => ({ ...exchange })),
64
129
  onTextDelta: delta => {
65
- if (this.#isActiveRequest(request)) {
66
- request.component.appendText(delta);
67
- }
130
+ if (turn.active && this.#isActiveRequest(request)) request.component.appendText(delta);
68
131
  },
69
- signal: request.abortController.signal,
132
+ signal: abortController.signal,
70
133
  });
71
-
72
- if (!this.#isActiveRequest(request)) {
73
- return;
74
- }
75
- if (replyText) {
76
- request.component.setAnswer(replyText);
77
- }
134
+ if (!turn.active || !this.#isActiveRequest(request)) return;
135
+ request.inFlight = false;
136
+ request.contextExchanges = boundBtwExchanges([
137
+ ...request.contextExchanges,
138
+ { question: turn.question, answer: replyText },
139
+ ]);
140
+ if (replyText) request.component.setAnswer(replyText);
78
141
  request.component.markComplete();
79
- } catch (error) {
80
- if (!this.#isActiveRequest(request)) {
81
- return;
82
- }
83
- if (request.abortController.signal.aborted) {
142
+ } catch {
143
+ if (!turn.active || !this.#isActiveRequest(request)) return;
144
+ request.inFlight = false;
145
+ if (abortController.signal.aborted) {
84
146
  request.component.markAborted();
85
147
  return;
86
148
  }
87
- request.component.markError(error instanceof Error ? error.message : String(error));
149
+ request.component.markError(sanitizeBtwError("Side-chat request failed."));
150
+ } finally {
151
+ if (request.activeTurn === turn) request.activeTurn = undefined;
152
+ this.#scrubTurn(turn);
88
153
  }
89
154
  }
90
155
 
91
- #closeActiveRequest(options: { abort: boolean }): void {
156
+ #scrubTurn(turn: ActiveBtwTurn): void {
157
+ turn.active = false;
158
+ turn.question = "";
159
+ turn.abortController = undefined;
160
+ turn.scope = undefined;
161
+ }
162
+
163
+ #closeActiveRequest(): void {
92
164
  const request = this.#activeRequest;
93
165
  if (!request) return;
94
166
  this.#activeRequest = undefined;
95
- if (options.abort) {
96
- request.abortController.abort();
167
+ const turn = request.activeTurn;
168
+ const abortController = turn?.abortController;
169
+ if (turn) this.#scrubTurn(turn);
170
+ request.activeTurn = undefined;
171
+ request.contextExchanges.splice(0);
172
+ request.inFlight = false;
173
+ if (request.conversationScope) {
174
+ request.conversationScope.messages.splice(0);
175
+ request.conversationScope.systemPrompt.splice(0);
176
+ request.conversationScope = undefined;
97
177
  }
178
+ abortController?.abort();
98
179
  request.component.close();
180
+ this.ctx.editor?.setText("");
181
+ this.ctx.pendingImages = [];
99
182
  this.ctx.btwContainer.clear();
100
183
  this.ctx.ui.requestRender();
101
184
  }
@@ -10,12 +10,12 @@ import {
10
10
  type UsageLimit,
11
11
  type UsageReport,
12
12
  } from "@sayknow-cli/ai";
13
- import { Loader, Markdown, padding, Spacer, Text, visibleWidth } from "@sayknow-cli/tui";
13
+ import { type Keybinding, Loader, Markdown, padding, Spacer, Text, visibleWidth } from "@sayknow-cli/tui";
14
14
  import { formatDuration, Snowflake, setProjectDir } from "@sayknow-cli/utils";
15
- import { $ } from "bun";
16
15
  import { resolveAppendOnlyMode } from "../../append-only-mode";
17
16
  import { jobElapsedMs } from "../../async";
18
17
  import { reset as resetCapabilities } from "../../capability";
18
+ import type { KeybindingsManager } from "../../config/keybindings";
19
19
  import { clearClaudePluginRootsCache } from "../../discovery/helpers";
20
20
  import { loadCustomShare } from "../../export/custom-share";
21
21
  import type { CompactOptions } from "../../extensibility/extensions/types";
@@ -36,7 +36,7 @@ import { EvalExecutionComponent } from "../../modes/components/eval-execution";
36
36
  import { getMarkdownTheme, getSymbolTheme, theme } from "../../modes/theme/theme";
37
37
  import type { InteractiveModeContext } from "../../modes/types";
38
38
  import { computeContextBreakdown, renderContextUsage } from "../../modes/utils/context-usage";
39
- import { buildHotkeysMarkdown } from "../../modes/utils/hotkeys-markdown";
39
+ import { buildHotkeysMarkdown, formatHotkeyMarkdownCode } from "../../modes/utils/hotkeys-markdown";
40
40
  import { buildToolsMarkdown } from "../../modes/utils/tools-markdown";
41
41
  import type { AsyncJobSnapshotItem } from "../../session/agent-session";
42
42
  import type { AuthStorage } from "../../session/auth-storage";
@@ -61,6 +61,43 @@ function showMarkdownPanel(ctx: InteractiveModeContext, title: string, markdown:
61
61
  ctx.ui.requestRender();
62
62
  }
63
63
 
64
+ export function buildHelpMarkdown(keybindings: Pick<KeybindingsManager, "getAccessibleDisplayString">): string {
65
+ const displayKey = (action: Keybinding): string => keybindings.getAccessibleDisplayString(action) || "Disabled";
66
+ const sessionNewKey = formatHotkeyMarkdownCode(displayKey("app.session.new"));
67
+ const selectModelKey = formatHotkeyMarkdownCode(displayKey("app.model.select"));
68
+ const queueMessageKey = formatHotkeyMarkdownCode(displayKey("app.message.queue"));
69
+ const dequeueMessageKey = formatHotkeyMarkdownCode(displayKey("app.message.dequeue"));
70
+ const autocompleteNavigationKeys = formatHotkeyMarkdownCode(
71
+ `${displayKey("tui.select.up")}/${displayKey("tui.select.down")}`,
72
+ false,
73
+ );
74
+ const autocompleteConfirmKeys = formatHotkeyMarkdownCode(
75
+ `${displayKey("tui.input.submit")}/${displayKey("tui.input.tab")}`,
76
+ false,
77
+ );
78
+
79
+ return [
80
+ "**Beginner actions**",
81
+ "",
82
+ "| Action | How |",
83
+ "|---|---|",
84
+ `| Start a fresh session | ${sessionNewKey} or \`/new\` |`,
85
+ "| Resume another session | `/resume` |",
86
+ "| Show session details | `/session info` |",
87
+ "| Delete current session transcript/artifacts | `/session delete` |",
88
+ `| Select a model | \`/model\` or ${selectModelKey} |`,
89
+ `| Queue a message for the next turn | ${queueMessageKey} |`,
90
+ `| Select or edit a queued message | ${dequeueMessageKey} |`,
91
+ "| Show all shortcuts | `?` on an empty prompt or `/hotkeys` |",
92
+ "",
93
+ "**Finding commands**",
94
+ "",
95
+ `- Type \`/\` to browse slash commands, then use ${autocompleteNavigationKeys} and ${autocompleteConfirmKeys}.`,
96
+ "- Type `#` to browse prompt actions like starting a session, pasting an image, or moving the cursor.",
97
+ "- Type `!` for shell commands and `$` for Python snippets.",
98
+ ].join("\n");
99
+ }
100
+
64
101
  export class CommandController {
65
102
  constructor(private readonly ctx: InteractiveModeContext) {}
66
103
 
@@ -120,21 +157,34 @@ export class CommandController {
120
157
  }
121
158
 
122
159
  async handleShareCommand(): Promise<void> {
123
- const tmpFile = path.join(os.tmpdir(), `${Snowflake.next()}.html`);
124
- const cleanupTempFile = async () => {
160
+ let tempDir: string | undefined;
161
+ try {
162
+ let tmpFile: string;
125
163
  try {
126
- await fs.rm(tmpFile, { force: true });
127
- } catch {
128
- // Ignore cleanup errors
164
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "skc-share-"));
165
+ if (process.platform !== "win32") await fs.chmod(tempDir, 0o700);
166
+ tmpFile = path.join(tempDir, "session.html");
167
+ const file = await fs.open(tmpFile, "wx", 0o600);
168
+ await file.close();
169
+ await this.ctx.session.exportToHtml(tmpFile);
170
+ if (process.platform !== "win32") await fs.chmod(tmpFile, 0o600);
171
+ } catch (error: unknown) {
172
+ this.ctx.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
173
+ return;
174
+ }
175
+ await this.#shareExport(tmpFile);
176
+ } finally {
177
+ if (tempDir) {
178
+ try {
179
+ await fs.rm(tempDir, { recursive: true, force: true });
180
+ } catch {
181
+ // Ignore cleanup errors
182
+ }
129
183
  }
130
- };
131
- try {
132
- await this.ctx.session.exportToHtml(tmpFile);
133
- } catch (error: unknown) {
134
- this.ctx.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
135
- return;
136
184
  }
185
+ }
137
186
 
187
+ async #shareExport(tmpFile: string): Promise<void> {
138
188
  try {
139
189
  const customShare = await loadCustomShare();
140
190
  if (customShare) {
@@ -149,7 +199,6 @@ export class CommandController {
149
199
  this.ctx.editorContainer.clear();
150
200
  this.ctx.editorContainer.addChild(this.ctx.editor);
151
201
  this.ctx.ui.setFocus(this.ctx.editor);
152
- await cleanupTempFile();
153
202
  };
154
203
 
155
204
  try {
@@ -176,20 +225,22 @@ export class CommandController {
176
225
  }
177
226
  }
178
227
  } catch (err) {
179
- await cleanupTempFile();
180
228
  this.ctx.showError(err instanceof Error ? err.message : String(err));
181
229
  return;
182
230
  }
183
231
 
184
232
  try {
185
- const authResult = await $`gh auth status`.quiet().nothrow();
186
- if (authResult.exitCode !== 0) {
187
- await cleanupTempFile();
233
+ const authProcess = Bun.spawn(["gh", "auth", "status"], {
234
+ env: process.env,
235
+ stdin: "ignore",
236
+ stdout: "ignore",
237
+ stderr: "ignore",
238
+ });
239
+ if ((await authProcess.exited) !== 0) {
188
240
  this.ctx.showError("GitHub CLI is not logged in. Run 'gh auth login' first.");
189
241
  return;
190
242
  }
191
243
  } catch {
192
- await cleanupTempFile();
193
244
  this.ctx.showError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com/");
194
245
  return;
195
246
  }
@@ -205,27 +256,40 @@ export class CommandController {
205
256
  this.ctx.editorContainer.clear();
206
257
  this.ctx.editorContainer.addChild(this.ctx.editor);
207
258
  this.ctx.ui.setFocus(this.ctx.editor);
208
- await cleanupTempFile();
209
- };
210
-
211
- loader.onAbort = () => {
212
- void restoreEditor();
213
- this.ctx.showStatus("Share cancelled");
214
259
  };
215
260
 
261
+ let cancellationRequested = false;
216
262
  try {
217
- const result = await $`gh gist create --public=false ${tmpFile}`.quiet().nothrow();
218
- if (loader.signal.aborted) return;
263
+ const gistProcess = Bun.spawn(["gh", "gist", "create", "--public=false", tmpFile], {
264
+ env: process.env,
265
+ stdin: "ignore",
266
+ stdout: "pipe",
267
+ stderr: "pipe",
268
+ signal: loader.signal,
269
+ });
270
+ loader.onAbort = () => {
271
+ cancellationRequested = gistProcess.exitCode === null;
272
+ };
273
+ const stdoutPromise = new Response(gistProcess.stdout).text();
274
+ const stderrPromise = new Response(gistProcess.stderr).text();
275
+ const exitCode = await gistProcess.exited;
276
+ const [stdout, stderr] = await Promise.all([stdoutPromise, stderrPromise]);
277
+
278
+ if (cancellationRequested) {
279
+ await restoreEditor();
280
+ this.ctx.showStatus("Share cancelled");
281
+ return;
282
+ }
219
283
 
220
284
  await restoreEditor();
221
285
 
222
- if (result.exitCode !== 0) {
223
- const errorMsg = result.stderr.toString("utf-8").trim() || "Unknown error";
286
+ if (exitCode !== 0) {
287
+ const errorMsg = stderr.trim() || "Unknown error";
224
288
  this.ctx.showError(`Failed to create gist: ${errorMsg}`);
225
289
  return;
226
290
  }
227
291
 
228
- const gistUrl = result.stdout.toString("utf-8").trim();
292
+ const gistUrl = stdout.trim();
229
293
  const gistId = gistUrl.split("/").pop();
230
294
  if (!gistId) {
231
295
  this.ctx.showError("Failed to parse gist ID from gh output");
@@ -236,10 +300,12 @@ export class CommandController {
236
300
  this.ctx.showStatus(`Share URL: ${previewUrl}\nGist: ${gistUrl}`);
237
301
  this.openInBrowser(previewUrl);
238
302
  } catch (error: unknown) {
239
- if (!loader.signal.aborted) {
240
- await restoreEditor();
241
- this.ctx.showError(`Failed to create gist: ${error instanceof Error ? error.message : "Unknown error"}`);
303
+ await restoreEditor();
304
+ if (cancellationRequested) {
305
+ this.ctx.showStatus("Share cancelled");
306
+ return;
242
307
  }
308
+ this.ctx.showError(`Failed to create gist: ${error instanceof Error ? error.message : "Unknown error"}`);
243
309
  }
244
310
  }
245
311
 
@@ -577,26 +643,7 @@ export class CommandController {
577
643
  }
578
644
 
579
645
  handleHelpCommand(): void {
580
- const sessionNewKey = this.ctx.keybindings.getDisplayString("app.session.new") || "/new";
581
- const markdown = [
582
- "**Beginner actions**",
583
- "",
584
- "| Action | How |",
585
- "|---|---|",
586
- `| Start a fresh session | \`${sessionNewKey}\` or \`/new\` |`,
587
- "| Resume another session | `/resume` |",
588
- "| Show session details | `/session info` |",
589
- "| Delete current session transcript/artifacts | `/session delete` |",
590
- "| Select a model | `/model` or `Ctrl+L` |",
591
- "| Show all shortcuts | `?` on an empty prompt or `/hotkeys` |",
592
- "",
593
- "**Finding commands**",
594
- "",
595
- "- Type `/` to browse slash commands, then use arrows and Enter/Tab.",
596
- "- Type `#` to browse prompt actions like starting a session, pasting an image, or moving the cursor.",
597
- "- Type `!` for shell commands and `$` for Python snippets.",
598
- ].join("\n");
599
- showMarkdownPanel(this.ctx, "SKC Help", markdown);
646
+ showMarkdownPanel(this.ctx, "SKC Help", buildHelpMarkdown(this.ctx.keybindings));
600
647
  }
601
648
 
602
649
  handleToolsCommand(): void {