@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
@@ -41,6 +41,8 @@ const disabledProviders = new Set<string>();
41
41
 
42
42
  /** Settings manager for persistence (if set) */
43
43
  let settings: Settings | null = null;
44
+ /** Session-local settings keyed by normalized working directory. */
45
+ const settingsByCwd = new Map<string, Settings>();
44
46
 
45
47
  // =============================================================================
46
48
  // Registration API
@@ -208,8 +210,9 @@ async function loadImpl<T>(
208
210
  * Filter providers based on options and disabled state.
209
211
  */
210
212
  function filterProviders<T>(capability: Capability<T>, options: LoadOptions): Provider<T>[] {
211
- let providers = (capability.providers as Provider<T>[]).filter(p => !disabledProviders.has(p.id));
212
-
213
+ const activeSettings = options.settings ?? settingsByCwd.get(path.normalize(options.cwd ?? getProjectDir()));
214
+ const activeDisabledProviders = new Set(activeSettings?.get("disabledProviders") ?? disabledProviders);
215
+ let providers = (capability.providers as Provider<T>[]).filter(p => !activeDisabledProviders.has(p.id));
213
216
  if (options.providers) {
214
217
  const allowed = new Set(options.providers);
215
218
  providers = providers.filter(p => allowed.has(p.id));
@@ -249,63 +252,76 @@ export async function loadCapability<T>(capabilityId: string, options: LoadOptio
249
252
  * Call this once on startup to enable persistent provider state.
250
253
  */
251
254
  export function initializeWithSettings(activeSettings: Settings): void {
255
+ settingsByCwd.set(path.normalize(activeSettings.getCwd()), activeSettings);
252
256
  settings = activeSettings;
253
- // Load disabled providers from settings
254
- const disabled = settings.get("disabledProviders");
257
+ const disabled = activeSettings.get("disabledProviders");
255
258
  disabledProviders.clear();
256
- for (const id of disabled) {
257
- disabledProviders.add(id);
258
- }
259
+ for (const id of disabled) disabledProviders.add(id);
259
260
  }
260
261
 
262
+ function assertDisabledProvidersWritable(activeSettings: Settings): void {
263
+ if (!activeSettings.canWriteDurableConfig()) {
264
+ throw new Error(
265
+ "Cannot change settings while config.yml has invalid YAML syntax. Repair config.yml and reload settings.",
266
+ );
267
+ }
268
+ }
261
269
  /**
262
270
  * Persist current disabled providers to settings.
263
271
  */
264
- function persistDisabledProviders(): void {
265
- if (settings) {
266
- settings.set("disabledProviders", Array.from(disabledProviders));
267
- }
272
+ function persistDisabledProviders(activeSettings: Settings, providers: ReadonlySet<string>): void {
273
+ assertDisabledProvidersWritable(activeSettings);
274
+ activeSettings.set("disabledProviders", Array.from(providers));
268
275
  }
269
276
 
270
- /**
271
- * Disable a provider globally (across all capabilities).
272
- */
273
- export function disableProvider(providerId: string): void {
274
- disabledProviders.add(providerId);
275
- persistDisabledProviders();
277
+ /** Disable a provider for the supplied session settings. */
278
+ export function disableProvider(
279
+ providerId: string,
280
+ activeSettings: Settings = settings ??
281
+ (() => {
282
+ throw new Error("Capability settings unavailable");
283
+ })(),
284
+ ): void {
285
+ const providers = new Set(activeSettings.get("disabledProviders"));
286
+ providers.add(providerId);
287
+ persistDisabledProviders(activeSettings, providers);
276
288
  }
277
289
 
278
- /**
279
- * Enable a previously disabled provider.
280
- */
281
- export function enableProvider(providerId: string): void {
282
- disabledProviders.delete(providerId);
283
- persistDisabledProviders();
290
+ /** Enable a provider for the supplied session settings. */
291
+ export function enableProvider(
292
+ providerId: string,
293
+ activeSettings: Settings = settings ??
294
+ (() => {
295
+ throw new Error("Capability settings unavailable");
296
+ })(),
297
+ ): void {
298
+ const providers = new Set(activeSettings.get("disabledProviders"));
299
+ providers.delete(providerId);
300
+ persistDisabledProviders(activeSettings, providers);
284
301
  }
285
302
 
286
- /**
287
- * Check if a provider is enabled.
288
- */
289
- export function isProviderEnabled(providerId: string): boolean {
290
- return !disabledProviders.has(providerId);
303
+ /** Check whether a provider is enabled by the supplied session settings. */
304
+ export function isProviderEnabled(
305
+ providerId: string,
306
+ activeSettings: Settings | undefined = settings ?? undefined,
307
+ ): boolean {
308
+ return !new Set(activeSettings?.get("disabledProviders") ?? disabledProviders).has(providerId);
291
309
  }
292
310
 
293
- /**
294
- * Get list of all disabled provider IDs.
295
- */
296
- export function getDisabledProviders(): string[] {
297
- return Array.from(disabledProviders);
311
+ /** Get disabled providers from the supplied session settings. */
312
+ export function getDisabledProviders(activeSettings: Settings | undefined = settings ?? undefined): string[] {
313
+ return [...(activeSettings?.get("disabledProviders") ?? disabledProviders)];
298
314
  }
299
315
 
300
- /**
301
- * Set disabled providers from a list (replaces current set).
302
- */
303
- export function setDisabledProviders(providerIds: string[]): void {
304
- disabledProviders.clear();
305
- for (const id of providerIds) {
306
- disabledProviders.add(id);
307
- }
308
- persistDisabledProviders();
316
+ /** Replace disabled providers for the supplied session settings. */
317
+ export function setDisabledProviders(
318
+ providerIds: string[],
319
+ activeSettings: Settings = settings ??
320
+ (() => {
321
+ throw new Error("Capability settings unavailable");
322
+ })(),
323
+ ): void {
324
+ persistDisabledProviders(activeSettings, new Set(providerIds));
309
325
  }
310
326
 
311
327
  // =============================================================================
@@ -6,6 +6,7 @@
6
6
  * and get back a unified array of MCP servers.
7
7
  */
8
8
 
9
+ import type { Settings } from "../config/settings";
9
10
  /**
10
11
  * Context passed to every provider loader.
11
12
  */
@@ -72,6 +73,8 @@ export interface LoadOptions {
72
73
  includeDisabled?: boolean;
73
74
  /** Explicit disabled extension IDs to apply instead of settings. */
74
75
  disabledExtensions?: string[];
76
+ /** Session settings whose provider policy applies to this load. */
77
+ settings?: Settings;
75
78
  }
76
79
 
77
80
  /**
package/src/cli/args.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  /**
2
- * CLI argument parsing and help display
2
+ * CLI argument parsing
3
3
  */
4
4
  import * as path from "node:path";
5
5
  import { type Effort, THINKING_EFFORTS } from "@sayknow-cli/ai";
6
- import { APP_NAME, CONFIG_DIR_NAME, logger } from "@sayknow-cli/utils";
6
+ import { logger } from "@sayknow-cli/utils";
7
7
  import { CliParseError } from "@sayknow-cli/utils/cli";
8
- import chalk from "chalk";
9
8
  import { parseEffort } from "../thinking";
10
9
  import { BUILTIN_TOOLS } from "../tools";
11
10
 
@@ -206,17 +205,23 @@ export function parseArgs(args: string[]): Args {
206
205
  }
207
206
  }
208
207
  result.tools = validTools;
209
- } else if (arg === "--thinking" && i + 1 < args.length) {
208
+ } else if (arg === "--thinking") {
209
+ // Match --credential / --mcp-config: a missing value or a following flag is
210
+ // a usage error, not a silent no-op / accidental consumption of `-p`.
211
+ const next = args[i + 1];
212
+ if (!next || next.startsWith("-")) {
213
+ throw new CliParseError(`--thinking requires <level> (${THINKING_EFFORTS.join(", ")})`);
214
+ }
210
215
  const rawThinking = args[++i];
211
216
  const thinking = parseEffort(rawThinking);
212
- if (thinking !== undefined) {
213
- result.thinking = thinking;
214
- } else {
215
- logger.warn("Invalid thinking level passed to --thinking", {
216
- level: rawThinking,
217
- validThinkingLevels: THINKING_EFFORTS,
218
- });
217
+ if (thinking === undefined) {
218
+ // Fail closed: a silent ignore left users believing `ultra` (or any typo)
219
+ // was applied. Help / Flags.options advertise the real Effort enum.
220
+ throw new CliParseError(
221
+ `Invalid --thinking level "${rawThinking}". Expected one of: ${THINKING_EFFORTS.join(", ")}`,
222
+ );
219
223
  }
224
+ result.thinking = thinking;
220
225
  } else if (arg === "--print" || arg === "-p") {
221
226
  result.print = true;
222
227
  } else if (arg === "--export" && i + 1 < args.length) {
@@ -253,92 +258,3 @@ export function parseArgs(args: string[]): Args {
253
258
 
254
259
  return result;
255
260
  }
256
-
257
- export function getExtraHelpText(): string {
258
- return `${chalk.bold("Environment Variables:")}
259
- ${chalk.dim("# Core Providers")}
260
- ANTHROPIC_API_KEY - Anthropic Claude models
261
- ANTHROPIC_OAUTH_TOKEN - Anthropic OAuth (takes precedence over API key)
262
- CLAUDE_CODE_USE_FOUNDRY - Enable Anthropic Foundry mode (uses Foundry endpoint + mTLS)
263
- FOUNDRY_BASE_URL - Anthropic Foundry base URL (e.g., https://<foundry-host>)
264
- ANTHROPIC_FOUNDRY_API_KEY - Anthropic token used as Authorization: Bearer <token> in Foundry mode
265
- ANTHROPIC_CUSTOM_HEADERS - Extra Foundry headers (e.g., "user-id: USERNAME")
266
- CLAUDE_CODE_CLIENT_CERT - Client certificate (PEM path or inline PEM) for mTLS
267
- CLAUDE_CODE_CLIENT_KEY - Client private key (PEM path or inline PEM) for mTLS
268
- NODE_EXTRA_CA_CERTS - CA bundle path (or inline PEM) for server certificate validation
269
- OPENAI_API_KEY - OpenAI GPT models
270
- GEMINI_API_KEY - Google Gemini models
271
- GITHUB_TOKEN - GitHub Copilot (or GH_TOKEN, COPILOT_GITHUB_TOKEN)
272
-
273
- ${chalk.dim("# Additional LLM Providers")}
274
- AZURE_OPENAI_API_KEY - Azure OpenAI models
275
- GROQ_API_KEY - Groq models
276
- CEREBRAS_API_KEY - Cerebras models
277
- XAI_API_KEY - xAI Grok models
278
- OPENROUTER_API_KEY - OpenRouter aggregated models
279
- KILO_API_KEY - Kilo Gateway models
280
- MISTRAL_API_KEY - Mistral models
281
- ZAI_API_KEY - z.ai models (ZhipuAI/GLM)
282
- MINIMAX_API_KEY - MiniMax models
283
- OPENCODE_API_KEY - OpenCode Zen/OpenCode Go models
284
- CURSOR_ACCESS_TOKEN - Cursor AI models
285
- AI_GATEWAY_API_KEY - Vercel AI Gateway
286
-
287
- ${chalk.dim("# Cloud Providers")}
288
- AWS_PROFILE - AWS Bedrock (or AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY)
289
- GOOGLE_CLOUD_PROJECT - Google Vertex AI (requires GOOGLE_CLOUD_LOCATION)
290
- GOOGLE_APPLICATION_CREDENTIALS - Service account for Vertex AI
291
-
292
- ${chalk.dim("# Search & Tools")}
293
- EXA_API_KEY - Exa web search
294
- BRAVE_API_KEY - Brave web search
295
- PERPLEXITY_API_KEY - Perplexity web search (API)
296
- PERPLEXITY_COOKIES - Perplexity web search (session cookie)
297
- TAVILY_API_KEY - Tavily web search
298
- ANTHROPIC_SEARCH_API_KEY - Anthropic search provider
299
-
300
- ${chalk.dim("# Configuration")}
301
- SKC_CODING_AGENT_DIR - Session storage directory (default: ~/${CONFIG_DIR_NAME}/agent)
302
- SKC_PACKAGE_DIR - Override package directory (for Nix/Guix store paths)
303
- SKC_SMOL_MODEL - Override smol/fast model (see --smol)
304
- SKC_SLOW_MODEL - Override slow/reasoning model (see --slow)
305
- SKC_PLAN_MODEL - Override planning model (see --plan)
306
- SKC_NO_PTY - Disable PTY-based interactive bash execution
307
- --tmux - Launch interactive startup inside a fresh tmux session
308
- skc session - List, inspect, create, remove, or attach tagged SKC-managed tmux sessions
309
- SKC_LAUNCH_POLICY - Launch policy for --tmux startup: tmux or direct
310
- SKC_TMUX_SESSION - Explicit tmux session name override for --tmux startup
311
- SKC_TMUX_PROFILE - Apply SKC tmux scroll/mouse/clipboard profile to --tmux sessions (set 0/off to skip)
312
- SKC_MOUSE - Mouse-wheel scroll in --tmux sessions (set 0/off to let the host terminal scroll)
313
-
314
- For complete environment variable reference, see:
315
- ${chalk.dim("docs/environment-variables.md")}
316
- ${chalk.bold("Available Tools (default-enabled unless noted):")}
317
- read - Read file contents
318
- bash - Execute bash commands
319
- edit - Edit files with find/replace
320
- write - Write files (creates/overwrites)
321
- grep - Search file contents
322
- find - Find files by glob pattern
323
- lsp - Language server protocol (code intelligence)
324
- python - Execute Python code (requires: ${APP_NAME} setup python)
325
- notebook - Edit Jupyter notebooks
326
- browser - Browser automation (Puppeteer)
327
- task - Launch sub-agents for parallel tasks
328
- todo_write - Manage todo/task lists
329
- web_search - Search the web
330
- ask - Ask user questions (interactive mode only)
331
-
332
- ${chalk.bold("Useful Commands:")}
333
- ${APP_NAME} --list-models - List configured provider models
334
- ${APP_NAME} --help - Show this help`;
335
- }
336
-
337
- export function printHelp(): void {
338
- process.stdout.write(
339
- `${chalk.bold(APP_NAME)} - red-octopus AI coding assistant\n\n` +
340
- `Run ${APP_NAME} --help for full command and option details.\n` +
341
- `Run ${APP_NAME} <command> --help for command-specific help.\n\n` +
342
- `${getExtraHelpText()}\n`,
343
- );
344
- }
@@ -84,7 +84,7 @@ Environment Variables:
84
84
  SKC_LAUNCH_POLICY - Launch policy for --tmux startup: tmux or direct
85
85
  SKC_TMUX_SESSION - Explicit tmux session name override for --tmux startup
86
86
  SKC_TMUX_PROFILE - Apply SKC tmux scroll/mouse/clipboard profile to --tmux sessions (set 0/off to skip)
87
- SKC_MOUSE - Mouse-wheel scroll in --tmux sessions (set 0/off to let the host terminal scroll)
87
+ SKC_MOUSE - Apply tmux copy-mode mouse capture in --tmux sessions (set 0/off to skip)
88
88
 
89
89
  For complete environment variable reference, see:
90
90
  docs/environment-variables.md
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { getMCPConfigPath, getProjectDir } from "@sayknow-cli/utils";
8
8
  import { getMCPServer, readMCPConfigFile, removeMCPServer, upsertMCPServer } from "../runtime-mcp/config-writer";
9
+ import { redactMCPEndpoint } from "../runtime-mcp/redaction";
9
10
  import type { MCPConfigFile, MCPServerConfig } from "../runtime-mcp/types";
10
11
 
11
12
  export type MCPAction = "add" | "list" | "remove";
@@ -141,24 +142,6 @@ function redactRecord(
141
142
  );
142
143
  }
143
144
 
144
- function redactUrl(value: string | undefined): string | undefined {
145
- if (!value) return value;
146
- try {
147
- const url = new URL(value);
148
- if (url.username) url.username = REDACTED;
149
- if (url.password) url.password = REDACTED;
150
- if (url.search) {
151
- for (const key of Array.from(url.searchParams.keys())) {
152
- url.searchParams.set(key, REDACTED);
153
- }
154
- }
155
- url.hash = "";
156
- return url.toString();
157
- } catch {
158
- return SENSITIVE_KEY_PATTERN.test(value) ? REDACTED : value;
159
- }
160
- }
161
-
162
145
  function redactArgs(args: string[] | undefined): string[] | undefined {
163
146
  if (!args) return undefined;
164
147
  const redacted: string[] = [];
@@ -196,7 +179,7 @@ export function redactMCPServerConfig(config: MCPServerConfig): MCPServerConfig
196
179
  if (headers) redacted.headers = headers;
197
180
  }
198
181
  if ("url" in redacted) {
199
- const url = redactUrl(redacted.url);
182
+ const url = redactMCPEndpoint(redacted.url);
200
183
  if (url) redacted.url = url;
201
184
  }
202
185
  if ("args" in redacted) {
@@ -207,7 +190,7 @@ export function redactMCPServerConfig(config: MCPServerConfig): MCPServerConfig
207
190
  redacted.auth = {
208
191
  type: redacted.auth.type,
209
192
  credentialId: redacted.auth.credentialId ? REDACTED : undefined,
210
- tokenUrl: redactUrl(redacted.auth.tokenUrl),
193
+ tokenUrl: redactMCPEndpoint(redacted.auth.tokenUrl),
211
194
  clientId: redacted.auth.clientId ? REDACTED : undefined,
212
195
  clientSecret: redacted.auth.clientSecret ? REDACTED : undefined,
213
196
  };
@@ -216,7 +199,7 @@ export function redactMCPServerConfig(config: MCPServerConfig): MCPServerConfig
216
199
  redacted.oauth = {
217
200
  clientId: redacted.oauth.clientId ? REDACTED : undefined,
218
201
  clientSecret: redacted.oauth.clientSecret ? REDACTED : undefined,
219
- redirectUri: redactUrl(redacted.oauth.redirectUri),
202
+ redirectUri: redactMCPEndpoint(redacted.oauth.redirectUri),
220
203
  callbackPort: redacted.oauth.callbackPort,
221
204
  callbackPath: redacted.oauth.callbackPath,
222
205
  };
@@ -7,7 +7,6 @@ import { createInterface } from "node:readline/promises";
7
7
  import { APP_NAME } from "@sayknow-cli/utils/dirs";
8
8
  import chalk from "chalk";
9
9
  import { Settings, type SettingsAtomicPatch } from "../config/settings";
10
- import { isProcessIncarnation, processIncarnation } from "../sdk/broker/process-incarnation";
11
10
  import { type EnsureChatDaemonResult, ensureDiscordDaemon, ensureSlackDaemon } from "../sdk/bus/chat-daemon-control";
12
11
  import { getNotificationConfig, maskToken, tokenFingerprint } from "../sdk/bus/config";
13
12
  import {
@@ -33,7 +32,7 @@ import {
33
32
  import {
34
33
  type EnsureTelegramDaemonDetailedResult,
35
34
  ensureTelegramDaemonRunningDetailed,
36
- readDaemonState,
35
+ resolveTelegramSetupPreflight,
37
36
  } from "../sdk/bus/telegram-daemon";
38
37
  import { runDaemonInternal } from "../sdk/bus/telegram-daemon-cli";
39
38
  import {
@@ -414,6 +413,7 @@ async function runTelegramSetup(cmd: NotifyCommandArgs, deps: NotifyCommandDeps)
414
413
  settings,
415
414
  cwd: process.cwd(),
416
415
  sessionId: `notify-cli-${process.pid}`,
416
+ registerRoot: false,
417
417
  }),
418
418
  persistInactive: async marker => await persistTelegramActivationMarker(settings, marker),
419
419
  clearInactive: async marker => await clearTelegramActivationMarker(settings, marker),
@@ -458,42 +458,10 @@ function proposedIdentityFromSetupPreflight(
458
458
 
459
459
  async function resolveSetupPreflight(settings: Settings, deps: NotifyCommandDeps): Promise<TelegramSetupPreflight> {
460
460
  if (deps.setupPreflight) return deps.setupPreflight;
461
- const cfg = getNotificationConfig(settings);
462
- try {
463
- const state = await readDaemonState(settings);
464
- if (!state) return { storedChatId: cfg.chatId };
465
- const validPid = Number.isSafeInteger(state.pid) && state.pid > 0;
466
- if (!validPid || !(deps.setupPidAlive ?? daemonPidAlive)(state.pid)) return { storedChatId: cfg.chatId };
467
- const persistedIncarnation = state.incarnation;
468
- const currentIncarnation = (deps.setupPidIncarnation ?? processIncarnation)(state.pid);
469
- if (
470
- !isProcessIncarnation(persistedIncarnation) ||
471
- !isProcessIncarnation(currentIncarnation) ||
472
- persistedIncarnation !== currentIncarnation
473
- )
474
- return { storedChatId: cfg.chatId };
475
- return {
476
- storedChatId: cfg.chatId,
477
- daemon: {
478
- live: true,
479
- tokenFingerprint: typeof state.tokenFingerprint === "string" ? state.tokenFingerprint : undefined,
480
- chatId: typeof state.chatId === "string" ? state.chatId : undefined,
481
- },
482
- };
483
- } catch {
484
- // A state read failure is not proof of a live daemon; proceed normally. The
485
- // daemon's own 409 handling remains the backstop against poller contention.
486
- return { storedChatId: cfg.chatId };
487
- }
488
- }
489
-
490
- function daemonPidAlive(pid: number): boolean {
491
- try {
492
- process.kill(pid, 0);
493
- return true;
494
- } catch (error) {
495
- return (error as NodeJS.ErrnoException).code === "EPERM";
496
- }
461
+ return await resolveTelegramSetupPreflight(settings, {
462
+ pidAlive: deps.setupPidAlive,
463
+ pidIncarnation: deps.setupPidIncarnation,
464
+ });
497
465
  }
498
466
 
499
467
  type TokenPromptInput = NodeJS.ReadStream & {
@@ -15,6 +15,7 @@ import { renderError } from "../tools/tool-errors";
15
15
 
16
16
  export interface ReadCommandArgs {
17
17
  path: string;
18
+ truncation?: "head" | "last" | "both";
18
19
  }
19
20
 
20
21
  export async function runReadCommand(cmd: ReadCommandArgs): Promise<void> {
@@ -37,7 +38,7 @@ export async function runReadCommand(cmd: ReadCommandArgs): Promise<void> {
37
38
  const tool = wrapToolWithMetaNotice(new ReadTool(session));
38
39
 
39
40
  try {
40
- const result = await tool.execute("skc-read", { path: cmd.path });
41
+ const result = await tool.execute("skc-read", { path: cmd.path, truncation: cmd.truncation });
41
42
 
42
43
  for (const block of result.content) {
43
44
  if (block.type === "text") {
@@ -18,7 +18,11 @@ import {
18
18
  } from "../hooks/codex-native-hooks-config";
19
19
  import { theme } from "../modes/theme/theme";
20
20
  import { formatCredentialAutoImportResult, runExternalCredentialAutoImport } from "../setup/credential-auto-import";
21
- import { filterAutoImportOAuthCredentials, formatDiscoverySummary } from "../setup/credential-import";
21
+ import {
22
+ formatDiscoverySummary,
23
+ getAutoImportOAuthCredentialSkips,
24
+ isAutoImportOAuthCredential,
25
+ } from "../setup/credential-import";
22
26
  import {
23
27
  formatHermesSetupResult,
24
28
  type HermesSetupFlags,
@@ -596,8 +600,10 @@ export async function handleCredentialsSetup(
596
600
  trigger: "setup-cli",
597
601
  });
598
602
  const result = preview.discovery ?? { importable: [], skipped: [], environment: [] };
599
- const candidates = filterAutoImportOAuthCredentials(result.importable);
600
- const filteredResult = { ...result, importable: candidates };
603
+ const now = Date.now();
604
+ const candidates = result.importable.filter(credential => isAutoImportOAuthCredential(credential, now));
605
+ const autoImportSkips = getAutoImportOAuthCredentialSkips(result.importable, now);
606
+ const filteredResult = { ...result, importable: candidates, skipped: [...result.skipped, ...autoImportSkips] };
601
607
  const redactedPlan = {
602
608
  importable: candidates.map(c => ({
603
609
  provider: c.provider,
@@ -607,7 +613,7 @@ export async function handleCredentialsSetup(
607
613
  expiresAt: c.expiresAt,
608
614
  redactedToken: c.redactedToken,
609
615
  })),
610
- skipped: result.skipped,
616
+ skipped: filteredResult.skipped,
611
617
  environment: result.environment,
612
618
  keychainChecked: flags.keychain === true,
613
619
  };