@sayknow-cli/coding-agent 0.4.7 → 0.5.1

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 +122 -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
package/CHANGELOG.md CHANGED
@@ -5,6 +5,128 @@ This file tracks the **fork's own releases**; upstream's full feature history li
5
5
  in that project. Each release notes the upstream version it is built on.
6
6
 
7
7
 
8
+ ## [0.5.1] — 2026-07-29
9
+
10
+ Built on upstream **gajae-code v0.12.0**.
11
+
12
+ ### Fixed (Sayknow Pet still left sixel residue under tmux)
13
+
14
+ 0.5.0 gave tmux ownership of the pet's sixel, which is the real fix — but it only
15
+ takes effect for a client that attaches *after* the feature is set, because tmux
16
+ computes client features at attach time. Every already-attached client kept
17
+ falling back to DCS passthrough, and that fallback still erased at tmux level
18
+ while its pixels lived in the outer terminal. So the residue persisted for
19
+ exactly the people who already had a session open.
20
+
21
+ - **The erase now rides the same envelope as the draw.** When the frame goes out
22
+ through passthrough, the erase does too, reaching the terminal that actually
23
+ holds the image; the absolute coordinates match because the draw used the same
24
+ ones. When tmux owns the sixel, the erase stays at tmux level as before.
25
+ - **`terminal-features` is set with the correct scope.** It is a *server* option,
26
+ so the previous `set-option -aq -t <target>` silently ignored the target. Now
27
+ `set-option -saq`.
28
+ - Added a regression test that pins the multiplexer environment and asserts draw
29
+ and erase share one envelope. The pet suite previously inherited whatever
30
+ terminal the developer ran it in, so it passed on CI and failed inside tmux;
31
+ the environment is now pinned per test.
32
+
33
+ ## [0.5.0] — 2026-07-28
34
+
35
+ Built on upstream **gajae-code v0.12.0** (previous fork release tracked v0.11.6).
36
+
37
+ ### Security (inherited from upstream v0.12.0)
38
+
39
+ Every path below trusted the caller's `cwd/.env`, so **opening a hostile repository
40
+ was enough** to trigger it. All now resolve through the non-project resolver
41
+ (launching shell plus SKC/user-owned files); shell and user configuration are
42
+ unchanged.
43
+
44
+ - **Provider base URLs** — `<PROVIDER>_BASE_URL` is derived generically, so a planted
45
+ `.env` could redirect authenticated traffic for *every* provider.
46
+ - **Browser launch overrides** — could pick the browser binary, route all traffic
47
+ through an attacker proxy, and disable certificate validation.
48
+ - **Spawned command overrides** (`SKC_SDK_SESSION_COMMAND`,
49
+ `SKC_HARNESS_PROCESS_START_COMMAND`) — chose which binary those paths execute.
50
+ - **Smithery origin / API base / API key** — the auth session the user is sent to,
51
+ and the credential sent with every call.
52
+ - **Native skill hook config dirs** — could point the hook at a directory the repo
53
+ ships and inject its own `skills.customDirectories`, bypassing escalation guards.
54
+
55
+ Also: **memory consolidation now redacts GitHub tokens.** The scrubber covered AWS
56
+ ids, JWTs, and keyword-prefixed keys, but `ghp_` / `gho_` / `github_pat_` carry none
57
+ of those markers, so a token reached `MEMORY.md` and `memory_summary.md` verbatim —
58
+ and that summary is injected into every later session.
59
+
60
+ ### Changed (upstream replaced two surfaces the fork had ported)
61
+
62
+ - The typed deep-interview **draft** CLI was reverted upstream and replaced with a
63
+ staged-transition surface (`stage --for <transition> --input '<json>'`, `check`,
64
+ `apply`, `discard`; one pending draft per session, no `--draft-id`). The fork
65
+ follows upstream here rather than keeping a surface upstream retired.
66
+ - The fork's `absoluteClear` multiplexer width-reflow repair is superseded by
67
+ upstream's width-settle repair, which runs once per settled width sequence
68
+ instead of once per SIGWINCH. Upstream's implementation is kept.
69
+
70
+ ### Fixed (Sayknow Pet leaves sixel residue under tmux)
71
+
72
+ - **Give tmux ownership of the pet's sixel instead of smuggling it past tmux.**
73
+ The pet was drawn with DCS passthrough, which writes pixels straight into the
74
+ outer terminal's image plane, while the erase was an `ECH` that only ever
75
+ reached tmux's cell buffer. tmux never recorded the image, so nothing could
76
+ remove it — every frame stacked another vertical band above the pet.
77
+
78
+ This is the same root cause behind the oversize/frozen animation (0.4.6) and
79
+ the viewport scroll (0.4.7): tmux's screen model and the real screen disagreed.
80
+ Those releases each patched the *draw* path; the *erase* path was never
81
+ revisited, so the residue survived all three fixes.
82
+
83
+ SKC-launched sessions now append `terminal-features ,*:sixel`, and the widget
84
+ sends the frame directly whenever tmux claims sixel. tmux 3.4+ parses it into
85
+ its own screen model (`screen_write_sixelimage`) and re-renders it, so the
86
+ existing erase actually deletes the image and scroll/resize/copy-mode stay
87
+ consistent. Passthrough remains only as the fallback for terminals or tmux
88
+ builds that do not claim sixel.
89
+
90
+ ### Fixed (rebrand leakage)
91
+
92
+ - **Stop creating `.gjc-*` paths.** `recovery_fs` and `path_identity` still wrote
93
+ `.gjc-recovery`, `.gjc-managed-remove-*`, and `.gjc-exact-unlink-*` on disk: the
94
+ rename never reached them, so recovery state landed under an upstream-branded
95
+ directory name. 24 residual tokens are gone and the sync pipeline now fails the
96
+ build instead of shipping them.
97
+
98
+ ### Fixed (fork pipeline)
99
+
100
+ The fork layer is regenerated as `gen-tree(upstream tag) = codemod + deletions +
101
+ overlay + patches + identity`. Five defects made that identity false:
102
+
103
+ - **Overlay swallowed upstream changes.** 66 upstream-owned files were carried as
104
+ whole-file overlays, so every upstream edit to them was silently discarded —
105
+ including `packages/tui`'s `node-pty` dependency. Ownership is now decided by
106
+ the base tree: present upstream ⇒ patch, absent ⇒ overlay (45 → 134 patches).
107
+ - **Release versions leaked into patch context.** A version bump invalidated the
108
+ context lines of unrelated hunks, so patches rejected on every release. Version
109
+ text is now neutralized on both sides of extraction and restored by the identity
110
+ stamp.
111
+ - **Deletions were unrepresentable.** Upstream files the fork drops (`crates/skc-sdk`
112
+ and others) reappeared on each sync; they are now declared and replayed.
113
+ - **Binary assets were declared as patches**, producing unappliable
114
+ "Binary files differ" stubs. They are demoted to overlay automatically.
115
+ - **The codemod never converged.** Overlay and patch payloads carry upstream text
116
+ that the single first pass cannot see, so the idempotence gate could not pass.
117
+
118
+ `gen-tree` also refuses to run against the fork repo itself — an empty argument
119
+ previously codemodded and version-stamped the working tree in place.
120
+
121
+ ### Added (ported from upstream)
122
+
123
+ - `ServerHandle::push_frame_and_wait` in `skc-notifications`, so the SDK can await
124
+ per-connection delivery receipts instead of fire-and-forget broadcast.
125
+ - `Process.signalRoot` napi binding for pinned single-process signalling.
126
+ - Worker integration attempts accept an `AbortSignal` and bail between git probes.
127
+ - The deep-interview staged-transition surface (`stage`, `check`, `apply`, `discard`,
128
+ `initialize-context`, `confirm-topology`).
129
+
8
130
  ## [0.4.7] — 2026-07-24
9
131
 
10
132
  ### Fixed (Sayknow Pet scroll under tmux)
@@ -17,26 +17,16 @@ export declare function loadCapability<T>(capabilityId: string, options?: LoadOp
17
17
  * Call this once on startup to enable persistent provider state.
18
18
  */
19
19
  export declare function initializeWithSettings(activeSettings: Settings): void;
20
- /**
21
- * Disable a provider globally (across all capabilities).
22
- */
23
- export declare function disableProvider(providerId: string): void;
24
- /**
25
- * Enable a previously disabled provider.
26
- */
27
- export declare function enableProvider(providerId: string): void;
28
- /**
29
- * Check if a provider is enabled.
30
- */
31
- export declare function isProviderEnabled(providerId: string): boolean;
32
- /**
33
- * Get list of all disabled provider IDs.
34
- */
35
- export declare function getDisabledProviders(): string[];
36
- /**
37
- * Set disabled providers from a list (replaces current set).
38
- */
39
- export declare function setDisabledProviders(providerIds: string[]): void;
20
+ /** Disable a provider for the supplied session settings. */
21
+ export declare function disableProvider(providerId: string, activeSettings?: Settings): void;
22
+ /** Enable a provider for the supplied session settings. */
23
+ export declare function enableProvider(providerId: string, activeSettings?: Settings): void;
24
+ /** Check whether a provider is enabled by the supplied session settings. */
25
+ export declare function isProviderEnabled(providerId: string, activeSettings?: Settings | undefined): boolean;
26
+ /** Get disabled providers from the supplied session settings. */
27
+ export declare function getDisabledProviders(activeSettings?: Settings | undefined): string[];
28
+ /** Replace disabled providers for the supplied session settings. */
29
+ export declare function setDisabledProviders(providerIds: string[], activeSettings?: Settings): void;
40
30
  /**
41
31
  * Get a capability definition (for introspection).
42
32
  */
@@ -5,6 +5,7 @@
5
5
  * paths like `.skc`, `.gemini`, or `.vscode`, they simply ask for `load("mcps")`
6
6
  * and get back a unified array of MCP servers.
7
7
  */
8
+ import type { Settings } from "../config/settings";
8
9
  /**
9
10
  * Context passed to every provider loader.
10
11
  */
@@ -64,6 +65,8 @@ export interface LoadOptions {
64
65
  includeDisabled?: boolean;
65
66
  /** Explicit disabled extension IDs to apply instead of settings. */
66
67
  disabledExtensions?: string[];
68
+ /** Session settings whose provider policy applies to this load. */
69
+ settings?: Settings;
67
70
  }
68
71
  /**
69
72
  * Source metadata attached to every loaded item.
@@ -52,5 +52,3 @@ export interface Args {
52
52
  authBootstrap?: true;
53
53
  }
54
54
  export declare function parseArgs(args: string[]): Args;
55
- export declare function getExtraHelpText(): string;
56
- export declare function printHelp(): void;
@@ -1,4 +1,5 @@
1
1
  export interface ReadCommandArgs {
2
2
  path: string;
3
+ truncation?: "head" | "last" | "both";
3
4
  }
4
5
  export declare function runReadCommand(cmd: ReadCommandArgs): Promise<void>;
@@ -6,6 +6,13 @@
6
6
  import "@sayknow-cli/utils/postmortem";
7
7
  import { Command, type CommandEntry } from "@sayknow-cli/utils/cli";
8
8
  export declare const commands: CommandEntry[];
9
+ export declare function interactiveBootstrapText(argv: readonly string[], stdinIsTTY?: boolean, stdoutIsTTY?: boolean): string | undefined;
10
+ type MemoryGuardNativeSmokeLoad = () => Record<string, unknown>;
11
+ export declare function isMemoryGuardNativeSmokeFastPath(argv: readonly string[]): boolean;
12
+ export declare function runMemoryGuardNativeSmokeFastPath(options?: {
13
+ loadNative?: MemoryGuardNativeSmokeLoad;
14
+ writeStdout?: (text: string) => void;
15
+ }): void;
9
16
  export declare class RootHelpCommand extends Command {
10
17
  static description: string;
11
18
  static hidden: boolean;
@@ -98,7 +105,7 @@ export declare class RootHelpCommand extends Command {
98
105
  };
99
106
  thinking: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
100
107
  description: string;
101
- options: string[];
108
+ options: import("@sayknow-cli/ai").Effort[];
102
109
  };
103
110
  hook: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
104
111
  description: string;
@@ -141,3 +148,4 @@ export declare function normalizeResumeAlias(argv: readonly string[]): string[];
141
148
  export declare function routeRootArgv(argv: readonly string[]): string[];
142
149
  /** Run the CLI with the given argv (no `process.argv` prefix). */
143
150
  export declare function runCli(argv: string[]): Promise<void>;
151
+ export {};
@@ -31,10 +31,10 @@ export default class Daemon extends Command {
31
31
  force: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
32
32
  description: string;
33
33
  };
34
- "graceful-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"integer"> & {
34
+ "graceful-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
35
35
  description: string;
36
36
  };
37
- "kill-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"integer"> & {
37
+ "kill-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
38
38
  description: string;
39
39
  };
40
40
  "spawn-if-stopped": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
@@ -24,6 +24,15 @@ export default class DeepInterview extends Command {
24
24
  "session-id": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
25
25
  description: string;
26
26
  };
27
+ input: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
28
+ description: string;
29
+ };
30
+ for: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
31
+ description: string;
32
+ };
33
+ reset: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
34
+ description: string;
35
+ };
27
36
  write: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
28
37
  description: string;
29
38
  };
@@ -1,4 +1,25 @@
1
1
  import { Command } from "@sayknow-cli/utils/cli";
2
+ /**
3
+ * Operator override for the process-start probe command, resolved from trusted
4
+ * environment sources only.
5
+ *
6
+ * The result is spawned, so whatever can set it chooses which binary runs.
7
+ * `$env` merges the caller's `cwd/.env` into `process.env`, so reading it there
8
+ * would let repository content pick the command; resolve it the same way
9
+ * provider credentials are (launching shell plus SKC/user-owned `.env` files,
10
+ * never the project `.env`). A malformed override stays fatal rather than
11
+ * silently falling back to `ps`, matching the previous behavior.
12
+ */
13
+ type ProcessStartCommandOverride = {
14
+ kind: "none";
15
+ } | {
16
+ kind: "invalid";
17
+ } | {
18
+ kind: "command";
19
+ command: string[];
20
+ };
21
+ /** Test seam: the process-start command override as resolved from trusted env. */
22
+ export declare function processStartCommandOverrideForTest(): ProcessStartCommandOverride;
2
23
  export default class Harness extends Command {
3
24
  #private;
4
25
  static description: string;
@@ -41,3 +62,4 @@ export default class Harness extends Command {
41
62
  static examples: string[];
42
63
  run(): Promise<void>;
43
64
  }
65
+ export {};
@@ -10,6 +10,12 @@ export default class Read extends Command {
10
10
  required: true;
11
11
  };
12
12
  };
13
+ static flags: {
14
+ truncation: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
15
+ options: string[];
16
+ description: string;
17
+ };
18
+ };
13
19
  static examples: string[];
14
20
  run(): Promise<void>;
15
21
  }
@@ -15,17 +15,35 @@ export declare function runSessionHost(timing?: {
15
15
  cwd?: string;
16
16
  processIncarnation?: (pid: number) => string | undefined;
17
17
  }): Promise<void>;
18
+ export type SdkInternalArgv = {
19
+ action: "broker-internal";
20
+ agentDir: string;
21
+ } | {
22
+ action: "session-host-internal";
23
+ };
24
+ /** Parses the exact private argv contracts used by SDK child-process spawns. */
25
+ export declare function parseSdkInternalArgv(argv: readonly string[]): SdkInternalArgv;
18
26
  export default class Sdk extends Command {
19
27
  static description: string;
20
28
  static hidden: boolean;
29
+ static delegateHelp: boolean;
21
30
  static args: {
22
31
  action: import("@sayknow-cli/utils/cli").ArgDescriptor & {
23
- required: true;
32
+ required: false;
24
33
  options: string[];
25
34
  };
26
35
  };
27
36
  static flags: {
28
- "agent-dir": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
37
+ stdio: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
38
+ description: string;
39
+ };
40
+ socket: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
41
+ description: string;
42
+ };
43
+ session: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
44
+ description: string;
45
+ };
46
+ "pending-ceiling": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
29
47
  description: string;
30
48
  };
31
49
  };
@@ -151,7 +151,7 @@ export declare const KEYBINDINGS: {
151
151
  };
152
152
  readonly "app.session.fork": {
153
153
  readonly defaultKeys: [];
154
- readonly description: "Fork session";
154
+ readonly description: "Branch from message";
155
155
  };
156
156
  readonly "app.session.resume": {
157
157
  readonly defaultKeys: [];
@@ -378,6 +378,10 @@ declare function migrateKeybindingsConfigFile(agentDir: string): void;
378
378
  export declare class KeybindingsManager extends TuiKeybindingsManager {
379
379
  #private;
380
380
  constructor(userBindings?: KeybindingsConfig, configPath?: string);
381
+ /**
382
+ * Replace user bindings only after canonical grammar validation.
383
+ */
384
+ setUserBindings(userBindings: KeybindingsConfig): void;
381
385
  /**
382
386
  * Create from config file at agentDir/keybindings.json.
383
387
  */
@@ -386,6 +390,11 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
386
390
  * Create an in-memory keybindings manager without file persistence.
387
391
  */
388
392
  static inMemory(userBindings?: KeybindingsConfig): KeybindingsManager;
393
+ /**
394
+ * Set the default display context used by composed surfaces that do not
395
+ * supply an explicit context.
396
+ */
397
+ setDisplayContext(context: KeyDisplayContext): void;
389
398
  /**
390
399
  * Reload keybindings from the config file.
391
400
  */
@@ -397,9 +406,30 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
397
406
  /**
398
407
  * Get display string for a keybinding (e.g., "ctrl+c/escape").
399
408
  */
400
- getDisplayString(keybinding: Keybinding): string;
409
+ getDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string;
410
+ /**
411
+ * Get an accessibility-oriented display string for help surfaces.
412
+ * Darwin chords include both the concise glyphs and expanded key names.
413
+ */
414
+ getAccessibleDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string;
415
+ /**
416
+ * Format a fixed key chord using this manager's display context.
417
+ */
418
+ formatKeyHint(key: string): string;
419
+ /**
420
+ * Format a fixed key chord for accessibility-oriented help surfaces.
421
+ */
422
+ formatAccessibleKeyHint(key: string): string;
423
+ }
424
+ /**
425
+ * Key hint formatting utilities for UI labels.
426
+ */
427
+ export interface KeyDisplayContext {
428
+ platform: NodeJS.Platform;
401
429
  }
402
- export declare function formatKeyHint(key: KeyId): string;
403
- export declare function formatKeyHints(keys: KeyId | KeyId[]): string;
430
+ export declare function formatKeyHint(key: string, context?: KeyDisplayContext): string;
431
+ export declare function formatAccessibleKeyHint(key: string, context?: KeyDisplayContext): string;
432
+ export declare function formatKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string;
433
+ export declare function formatAccessibleKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string;
404
434
  export type { Keybinding, KeybindingsConfig, KeyId };
405
435
  export { migrateKeybindingsConfigFile };
@@ -0,0 +1,40 @@
1
+ import { type ModelProfileDefinition } from "./model-profiles";
2
+ export declare const MODEL_PROFILE_DISCOVERY_QUERY = "models.profiles.list";
3
+ export declare const MODEL_PROFILE_ERROR_DETAIL_MAX_BYTES = 2048;
4
+ export interface ModelProfileCatalogItem {
5
+ id: string;
6
+ displayName: string;
7
+ source: "builtin" | "configured";
8
+ available?: boolean;
9
+ }
10
+ export interface UnknownModelProfileDetails {
11
+ requestedProfile: string;
12
+ availableProfiles: string[];
13
+ discoveryQuery: typeof MODEL_PROFILE_DISCOVERY_QUERY;
14
+ }
15
+ export interface ModelProfileRegistryErrorDetails {
16
+ requestedProfile?: string;
17
+ availableProfiles: [];
18
+ discoveryQuery: typeof MODEL_PROFILE_DISCOVERY_QUERY;
19
+ }
20
+ export type ModelProfileErrorDetails = UnknownModelProfileDetails | ModelProfileRegistryErrorDetails;
21
+ export type ModelProfileErrorCode = "unknown_model_profile" | "model_profile_registry_error";
22
+ export declare class UnknownModelProfileError extends Error {
23
+ readonly code: "unknown_model_profile";
24
+ readonly details: UnknownModelProfileDetails;
25
+ constructor(requestedProfile: string, profiles: ReadonlyMap<string, unknown>);
26
+ }
27
+ export declare class ModelProfileRegistryError extends Error {
28
+ readonly code: "model_profile_registry_error";
29
+ readonly details: ModelProfileRegistryErrorDetails;
30
+ constructor(requestedProfile?: string);
31
+ }
32
+ export declare function resolveModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>): string;
33
+ export declare function validateModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>, registryError?: unknown): string;
34
+ export declare function projectModelProfileCatalog(profiles: ReadonlyMap<string, ModelProfileDefinition>, registryError?: unknown): ModelProfileCatalogItem[];
35
+ export declare function isModelProfileProviderAvailable(profile: ModelProfileDefinition, authenticatedProviders: ReadonlySet<string>): boolean;
36
+ export declare function isModelProfileError(value: unknown): value is {
37
+ code: ModelProfileErrorCode;
38
+ message: string;
39
+ details: ModelProfileErrorDetails;
40
+ };
@@ -1,7 +1,6 @@
1
- import type { SkcModelAssignmentTargetId } from "./model-registry";
2
1
  import { type ModelSelectorValue } from "./model-selector-value";
3
- import type { ModelsConfig } from "./models-config-schema";
4
- export type ModelProfileRole = SkcModelAssignmentTargetId;
2
+ import type { ModelsConfig, SKC_MODEL_ASSIGNMENT_TARGET_IDS } from "./models-config-schema";
3
+ export type ModelProfileRole = (typeof SKC_MODEL_ASSIGNMENT_TARGET_IDS)[number];
5
4
  export interface ModelProfileDefinition {
6
5
  name: string;
7
6
  requiredProviders: string[];
@@ -371,6 +371,10 @@ export declare class ModelRegistry {
371
371
  * as providers with stored credentials. See issue #993.
372
372
  */
373
373
  hasConfiguredAuth(model: Model<Api>): boolean;
374
+ /**
375
+ * Check whether auth is configured for a provider.
376
+ */
377
+ hasConfiguredProviderAuth(provider: string): boolean;
374
378
  getDiscoverableProviders(): string[];
375
379
  getProviderDiscoveryState(provider: string): ProviderDiscoveryState | undefined;
376
380
  /**
@@ -388,6 +392,7 @@ export declare class ModelRegistry {
388
392
  */
389
393
  getApiKey(model: Model<Api>, sessionId?: string, options?: {
390
394
  credentialSelector?: AuthCredentialSelector;
395
+ signal?: AbortSignal;
391
396
  }): Promise<string | undefined>;
392
397
  /**
393
398
  * Get API key for a provider (e.g., "openai").
@@ -0,0 +1,14 @@
1
+ import type { AuthStorage } from "@sayknow-cli/ai/auth-storage";
2
+ /**
3
+ * Most recent OAuth validation outcome per provider, used only as an ordering
4
+ * hint so `/model` can rank a provider whose stored credentials failed
5
+ * validation below one that is healthy, without re-running validation itself.
6
+ *
7
+ * Entries are scoped to the `AuthStorage` that produced them and to its
8
+ * credential generation, so any login, logout, import, or deletion discards the
9
+ * stale result instead of overriding current auth state.
10
+ */
11
+ export type ProviderAuthHealth = "valid" | "invalid";
12
+ export declare function recordProviderAuthHealth(authStorage: AuthStorage, providerId: string, health: ProviderAuthHealth): void;
13
+ export declare function getProviderAuthHealth(authStorage: AuthStorage, providerId: string): ProviderAuthHealth | undefined;
14
+ export declare function clearProviderAuthHealth(authStorage: AuthStorage): void;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Shared provider ordering used by every provider-facing selector (`/login`,
3
+ * `/model`, `/provider`).
4
+ *
5
+ * Providers the user already has come first, then a curated list of well-known
6
+ * providers, then everything else alphabetically. This is the single source of
7
+ * truth for that order — surfaces must not keep their own famous-provider list.
8
+ */
9
+ /**
10
+ * Auth/config state of a provider as seen by the calling surface.
11
+ *
12
+ * - `valid` — stored credentials that validated successfully.
13
+ * - `checking` — stored credentials whose async validation is still in flight.
14
+ * Ranked with `valid` so rows do not reflow when validation resolves.
15
+ * - `configured` — no OAuth record, but the provider is present in the model
16
+ * registry with a working API key (custom/API-compatible providers).
17
+ * - `invalid` — stored credentials that failed validation (problematic login).
18
+ * - `none` — nothing stored and nothing configured.
19
+ */
20
+ export type ProviderAuthState = "valid" | "checking" | "configured" | "invalid" | "none";
21
+ export declare const PROVIDER_RANK_TIER: {
22
+ readonly existing: 0;
23
+ readonly problematic: 1;
24
+ readonly famous: 2;
25
+ readonly other: 3;
26
+ };
27
+ export type ProviderRankTier = (typeof PROVIDER_RANK_TIER)[keyof typeof PROVIDER_RANK_TIER];
28
+ /**
29
+ * Curated provider order for the famous tier. Regional and device variants sit
30
+ * immediately behind their primary so related entries stay grouped.
31
+ */
32
+ export declare const FAMOUS_PROVIDER_ORDER: readonly string[];
33
+ /** A provider as ranked by a surface. `label` is what the user sees. */
34
+ export interface RankableProvider {
35
+ id: string;
36
+ label: string;
37
+ authState: ProviderAuthState;
38
+ }
39
+ /** A provider's position in the ordering: its tier plus its rank inside that tier. */
40
+ export interface ProviderRank {
41
+ tier: ProviderRankTier;
42
+ intraTierRank: number;
43
+ }
44
+ /**
45
+ * The single ranking result for a provider. `intraTierRank` is the curated
46
+ * famous-list position, or `Number.MAX_SAFE_INTEGER` for providers that are not
47
+ * on the list and therefore order by display label.
48
+ */
49
+ export declare function rankProvider(provider: RankableProvider): ProviderRank;
50
+ export declare function providerRankTier(authState: ProviderAuthState, id: string): ProviderRankTier;
51
+ /** Position within the famous list, or `undefined` for providers not on it. */
52
+ export declare function famousProviderIndex(id: string): number | undefined;
53
+ /**
54
+ * Total order over providers: tier, then famous-list position, then display
55
+ * label, then id. The trailing id comparison guarantees no ties.
56
+ */
57
+ export declare function compareRankedProviders(left: RankableProvider, right: RankableProvider): number;
58
+ /** Convenience wrapper returning a new array in ranked order. */
59
+ export declare function sortRankedProviders<T extends RankableProvider>(providers: readonly T[]): T[];