@sayknow-cli/coding-agent 0.4.6 → 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 +112 -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 +27 -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
@@ -5,10 +5,14 @@
5
5
  */
6
6
 
7
7
  import * as fs from "node:fs/promises";
8
+ import * as http from "node:http";
9
+ import * as https from "node:https";
10
+ import * as net from "node:net";
8
11
  import * as os from "node:os";
9
12
  import * as path from "node:path";
10
13
  import { isEnoent, logger } from "@sayknow-cli/utils";
11
14
  import * as git from "../../../utils/git";
15
+ import { isPrivateOrSpecialAddress, validatePublicHttpUrl } from "../../../web/insane/url-guard";
12
16
 
13
17
  import type { MarketplaceCatalog, MarketplaceSourceType } from "./types";
14
18
  import { isValidNameSegment } from "./types";
@@ -194,6 +198,192 @@ export function parseMarketplaceCatalog(content: string, filePath: string): Mark
194
198
 
195
199
  /** Relative path from a marketplace root to its catalog file. */
196
200
  const CATALOG_RELATIVE_PATH = path.join(".claude-plugin", "marketplace.json");
201
+ const URL_FETCH_TIMEOUT_MS = 60_000;
202
+ const URL_FETCH_MAX_REDIRECTS = 5;
203
+ const URL_FETCH_MAX_HEADER_BYTES = 16 * 1024;
204
+ /** Direct JSON catalogs are metadata; 2 MiB leaves ample room without permitting unbounded buffering. */
205
+ const URL_FETCH_MAX_BYTES = 2 * 1024 * 1024;
206
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
207
+
208
+ function withAbortSignal<T>(operation: Promise<T>, signal: AbortSignal): Promise<T> {
209
+ if (signal.aborted) return Promise.reject(signal.reason);
210
+ const deferred = Promise.withResolvers<T>();
211
+ const abort = () => deferred.reject(signal.reason);
212
+ signal.addEventListener("abort", abort, { once: true });
213
+ operation.then(deferred.resolve, deferred.reject).finally(() => signal.removeEventListener("abort", abort));
214
+ return deferred.promise;
215
+ }
216
+
217
+ function normalizePeerAddress(address: string): string {
218
+ const normalized = address.toLowerCase();
219
+ return normalized.startsWith("::ffff:") ? normalized.slice(7) : normalized;
220
+ }
221
+
222
+ function normalizeUrlHostname(hostname: string): string {
223
+ return hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
224
+ }
225
+
226
+ async function validateCatalogUrl(rawUrl: string, signal: AbortSignal) {
227
+ const url = new URL(rawUrl);
228
+ const hostname = normalizeUrlHostname(url.hostname);
229
+ // URL.hostname retains IPv6 brackets in Node/Bun, while net.isIP expects the bare literal.
230
+ if (net.isIP(hostname) === 6) {
231
+ if (url.protocol !== "http:" && url.protocol !== "https:")
232
+ return { ok: false as const, reason: `unsupported scheme ${url.protocol}` };
233
+ if (url.username || url.password) return { ok: false as const, reason: "URL credentials are not allowed" };
234
+ if (isPrivateOrSpecialAddress(hostname))
235
+ return { ok: false as const, reason: "private, loopback, link-local, or reserved IP literal" };
236
+ return { ok: true as const, url, addresses: [hostname] };
237
+ }
238
+ return withAbortSignal(validatePublicHttpUrl(rawUrl), signal);
239
+ }
240
+
241
+ function openCatalogResponse(url: URL, addresses: string[], signal: AbortSignal): Promise<http.IncomingMessage> {
242
+ const hostname = normalizeUrlHostname(url.hostname);
243
+ const approved = addresses.map(address => ({ address, family: net.isIP(address) }));
244
+ const approvedPeers = new Set(approved.map(record => normalizePeerAddress(record.address)));
245
+ const lookup: net.LookupFunction = (requestedHostname, options, callback) => {
246
+ const requestedFamily = options.family === "IPv4" ? 4 : options.family === "IPv6" ? 6 : (options.family ?? 0);
247
+ const matching = approved.filter(record => requestedFamily === 0 || record.family === requestedFamily);
248
+ if (normalizeUrlHostname(requestedHostname) !== hostname || matching.length === 0) {
249
+ const error = Object.assign(new Error("No approved address for marketplace host"), { code: "ENOTFOUND" });
250
+ callback(error, options.all ? [] : "", 0);
251
+ return;
252
+ }
253
+ if (options.all) callback(null, matching);
254
+ else callback(null, matching[0].address, matching[0].family);
255
+ };
256
+ const deferred = Promise.withResolvers<http.IncomingMessage>();
257
+ const options: https.RequestOptions = {
258
+ protocol: url.protocol,
259
+ hostname,
260
+ port: url.port || undefined,
261
+ path: `${url.pathname}${url.search}`,
262
+ method: "GET",
263
+ headers: { Accept: "application/json", "Accept-Encoding": "identity", Connection: "close", Host: url.host },
264
+ agent: false,
265
+ insecureHTTPParser: false,
266
+ lookup,
267
+ maxHeaderSize: URL_FETCH_MAX_HEADER_BYTES,
268
+ signal,
269
+ ...(url.protocol === "https:"
270
+ ? { rejectUnauthorized: true, servername: net.isIP(hostname) === 0 ? hostname : undefined }
271
+ : {}),
272
+ };
273
+ const requestFn = url.protocol === "https:" ? https.request : http.request;
274
+ const request = requestFn(options, response => {
275
+ const peer = response.socket.remoteAddress;
276
+ if (!peer || isPrivateOrSpecialAddress(peer) || !approvedPeers.has(normalizePeerAddress(peer))) {
277
+ response.destroy();
278
+ deferred.reject(
279
+ new Error(`Refusing marketplace catalog response from unapproved connected peer ${peer ?? "unknown"}`),
280
+ );
281
+ return;
282
+ }
283
+ deferred.resolve(response);
284
+ });
285
+ request.once("error", deferred.reject);
286
+ const abort = () => {
287
+ request.destroy(signal.reason);
288
+ deferred.reject(signal.reason);
289
+ };
290
+ if (signal.aborted) abort();
291
+ else signal.addEventListener("abort", abort, { once: true });
292
+ request.once("close", () => signal.removeEventListener("abort", abort));
293
+ request.end();
294
+ return deferred.promise;
295
+ }
296
+
297
+ async function readCatalogResponse(
298
+ response: http.IncomingMessage,
299
+ source: string,
300
+ signal: AbortSignal,
301
+ ): Promise<string> {
302
+ const rawContentLengths: string[] = [];
303
+ let hasTransferEncoding = false;
304
+ for (let index = 0; index < response.rawHeaders.length; index += 2) {
305
+ const name = response.rawHeaders[index]?.toLowerCase();
306
+ if (name === "content-length") rawContentLengths.push(response.rawHeaders[index + 1] ?? "");
307
+ if (name === "transfer-encoding") hasTransferEncoding = true;
308
+ }
309
+ if (rawContentLengths.length > 1 || (rawContentLengths.length > 0 && hasTransferEncoding)) {
310
+ response.destroy();
311
+ throw new Error(`Marketplace catalog from ${source} has ambiguous response framing`);
312
+ }
313
+ const contentLength = response.headers["content-length"];
314
+ if (contentLength !== undefined) {
315
+ const declaredBytes =
316
+ typeof contentLength === "string" && /^\d+$/.test(contentLength) ? Number(contentLength) : NaN;
317
+ if (!Number.isSafeInteger(declaredBytes)) {
318
+ response.destroy();
319
+ throw new Error(`Marketplace catalog from ${source} has an invalid Content-Length`);
320
+ }
321
+ if (declaredBytes > URL_FETCH_MAX_BYTES) {
322
+ response.destroy();
323
+ throw new Error(`Marketplace catalog from ${source} exceeds the maximum size of 2 MiB`);
324
+ }
325
+ }
326
+
327
+ const abort = () => response.destroy(signal.reason);
328
+ if (signal.aborted) {
329
+ abort();
330
+ throw signal.reason;
331
+ }
332
+ signal.addEventListener("abort", abort, { once: true });
333
+ const chunks: Buffer[] = [];
334
+ let receivedBytes = 0;
335
+ try {
336
+ for await (const chunk of response) {
337
+ const bytes = Buffer.from(chunk);
338
+ receivedBytes += bytes.byteLength;
339
+ if (receivedBytes > URL_FETCH_MAX_BYTES) {
340
+ response.destroy();
341
+ throw new Error(`Marketplace catalog from ${source} exceeds the maximum size of 2 MiB`);
342
+ }
343
+ chunks.push(bytes);
344
+ }
345
+ return Buffer.concat(chunks, receivedBytes).toString("utf8");
346
+ } finally {
347
+ signal.removeEventListener("abort", abort);
348
+ }
349
+ }
350
+
351
+ async function fetchMarketplaceCatalogUrl(source: string): Promise<string> {
352
+ const deadline = AbortSignal.timeout(URL_FETCH_TIMEOUT_MS);
353
+ let currentUrl = source;
354
+ try {
355
+ for (let redirectCount = 0; ; redirectCount++) {
356
+ const guard = await validateCatalogUrl(currentUrl, deadline);
357
+ if (!guard.ok) {
358
+ throw new Error(`Refusing marketplace catalog URL: target URL is not public HTTP(S): ${guard.reason}`);
359
+ }
360
+ const response = await openCatalogResponse(guard.url, guard.addresses, deadline);
361
+ const status = response.statusCode ?? 0;
362
+ if (REDIRECT_STATUSES.has(status)) {
363
+ if (redirectCount >= URL_FETCH_MAX_REDIRECTS) {
364
+ response.destroy();
365
+ throw new Error(`Too many redirects fetching marketplace catalog from ${source}`);
366
+ }
367
+ const location = response.headers.location;
368
+ response.destroy();
369
+ if (!location)
370
+ throw new Error(`Marketplace catalog redirect from ${currentUrl} is missing a Location header`);
371
+ currentUrl = new URL(location, guard.url).toString();
372
+ continue;
373
+ }
374
+ if (status < 200 || status >= 300) {
375
+ response.destroy();
376
+ throw new Error(
377
+ `Failed to fetch marketplace catalog from ${currentUrl}: HTTP ${status} ${response.statusMessage ?? ""}`,
378
+ );
379
+ }
380
+ return await readCatalogResponse(response, currentUrl, deadline);
381
+ }
382
+ } catch (err) {
383
+ if (deadline.aborted) throw new Error(`Timed out fetching marketplace catalog from ${source}`);
384
+ throw err;
385
+ }
386
+ }
197
387
 
198
388
  /**
199
389
  * Expand a `~/...` path to an absolute path using os.homedir().
@@ -249,13 +439,7 @@ export async function fetchMarketplace(source: string, cacheDir: string): Promis
249
439
  }
250
440
 
251
441
  // type === "url"
252
- const response = await fetch(source, { signal: AbortSignal.timeout(60_000) });
253
- if (!response.ok) {
254
- throw new Error(
255
- `Failed to fetch marketplace catalog from ${source}: HTTP ${response.status} ${response.statusText}`,
256
- );
257
- }
258
- const text = await response.text();
442
+ const text = await fetchMarketplaceCatalogUrl(source);
259
443
  const catalog = parseMarketplaceCatalog(text, source);
260
444
 
261
445
  const catalogDir = path.join(cacheDir, catalog.name);
@@ -38,6 +38,9 @@ export interface SessionBeforeSwitchEvent {
38
38
  targetSessionFile?: string;
39
39
  }
40
40
 
41
+ /** Origin used when an interactive session selector resumes a session. */
42
+ export const INTERACTIVE_SELECTOR_RESUME_ORIGIN = "interactive_selector_resume";
43
+
41
44
  /** Fired after switching to another session */
42
45
  export interface SessionSwitchEvent {
43
46
  type: "session_switch";
@@ -45,6 +48,8 @@ export interface SessionSwitchEvent {
45
48
  reason: "new" | "resume" | "fork";
46
49
  /** Session file we came from */
47
50
  previousSessionFile: string | undefined;
51
+ /** Optional provenance for this session transition. */
52
+ transition?: { origin: string };
48
53
  }
49
54
 
50
55
  /** Fired before branching a session (can be cancelled) */
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import * as fs from "node:fs/promises";
3
3
  import * as path from "node:path";
4
+ import { bindPluginMcpToPublicNetwork } from "../../runtime-mcp/plugin-network-boundary";
4
5
  import { loadCustomTools } from "../custom-tools/loader";
5
6
  import type { CustomTool } from "../custom-tools/types";
6
7
  import { loadEffectiveSkcPluginRegistry, registryPathForScope } from "./registry";
@@ -330,7 +331,7 @@ export async function buildPluginMcpConfigs(input: { cwd: string }): Promise<{
330
331
  // resolution path expands ${env:...}/shell templates, which would let
331
332
  // a third-party bundle exfiltrate host secrets. Plugin-bundle MCP
332
333
  // servers connect without bundle-declared headers.
333
- configs[m.name] = { type: cfg.transport, url: cfg.url };
334
+ configs[m.name] = bindPluginMcpToPublicNetwork({ type: cfg.transport, url: url.toString() });
334
335
  }
335
336
  } catch (error) {
336
337
  quarantine.push({
@@ -1,6 +1,6 @@
1
1
  import { appendFile, mkdir, stat } from "node:fs/promises";
2
- import * as os from "node:os";
3
2
  import * as path from "node:path";
3
+ import { getAgentDir, getConfigDirName } from "@sayknow-cli/utils";
4
4
  import { YAML } from "bun";
5
5
  import type { SkillDiscoverySettings } from "../config/skill-settings-defaults";
6
6
  import { DEFAULT_DISABLED_EXTENSIONS, DEFAULT_SKILL_DISCOVERY_SETTINGS } from "../config/skill-settings-defaults";
@@ -153,11 +153,24 @@ async function readRawConfig(filePath: string): Promise<Record<string, unknown>
153
153
  }
154
154
  }
155
155
 
156
+ /**
157
+ * Config files that decide skill discovery, resolved through the trusted helpers.
158
+ *
159
+ * These paths pick the `config.yml` whose `skills.customDirectories` the agent
160
+ * then loads skills from, so the directory they are built from is a trust
161
+ * boundary. Bun loads `cwd/.env` into `process.env` before any module runs, so
162
+ * reading `SKC_CODING_AGENT_DIR` / `SKC_CONFIG_DIR` directly let a repository
163
+ * point this at a directory it ships and inject its own skill directories.
164
+ *
165
+ * `getAgentDir()` and `getConfigDirName()` apply the escalation guards that
166
+ * already exist for exactly this (`trustedAgentDirOverride`,
167
+ * `trustedConfigDirName`), and resolve to the same locations this used to build
168
+ * by hand: `dirs.agentDir` is `path.join(os.homedir(), getConfigDirName(), "agent")`
169
+ * when no trusted override is present.
170
+ */
156
171
  function resolveConfigPaths(cwd: string, override?: string[]): string[] {
157
172
  if (override) return override;
158
- const configDirName = process.env.SKC_CONFIG_DIR ?? process.env.PI_CONFIG_DIR ?? ".skc";
159
- const userAgentDir = process.env.SKC_CODING_AGENT_DIR ?? path.join(os.homedir(), configDirName, "agent");
160
- return [path.join(userAgentDir, "config.yml"), path.join(cwd, configDirName, "config.yml")];
173
+ return [path.join(getAgentDir(), "config.yml"), path.join(cwd, getConfigDirName(), "config.yml")];
161
174
  }
162
175
 
163
176
  async function resolveEffectiveSkillConfig(