@gajae-code/coding-agent 0.10.1 → 0.11.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 (474) hide show
  1. package/CHANGELOG.md +70 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/cli/args.d.ts +4 -5
  4. package/dist/types/cli/daemon-cli.d.ts +12 -1
  5. package/dist/types/cli/notify-cli.d.ts +21 -1
  6. package/dist/types/cli.d.ts +3 -0
  7. package/dist/types/commands/daemon.d.ts +39 -0
  8. package/dist/types/commands/launch.d.ts +3 -0
  9. package/dist/types/commands/notify.d.ts +28 -1
  10. package/dist/types/commands/sdk.d.ts +33 -0
  11. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  12. package/dist/types/config/model-profile-activation.d.ts +35 -15
  13. package/dist/types/config/model-profiles.d.ts +11 -5
  14. package/dist/types/config/model-registry.d.ts +3 -3
  15. package/dist/types/config/model-resolver.d.ts +39 -6
  16. package/dist/types/config/model-selector-value.d.ts +17 -0
  17. package/dist/types/config/models-config-schema.d.ts +10 -6
  18. package/dist/types/config/settings-schema.d.ts +133 -6
  19. package/dist/types/config/settings.d.ts +63 -35
  20. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  21. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  22. package/dist/types/daemon/builtin.d.ts +6 -5
  23. package/dist/types/daemon/control-types.d.ts +1 -1
  24. package/dist/types/discovery/mcp-json.d.ts +12 -1
  25. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  27. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  28. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  29. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  30. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  31. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  32. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  33. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  35. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  36. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  37. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  38. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  39. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  40. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  41. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  42. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  43. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  44. package/dist/types/harness-control-plane/types.d.ts +3 -4
  45. package/dist/types/lsp/index.d.ts +1 -1
  46. package/dist/types/main.d.ts +32 -38
  47. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  48. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  49. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  50. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  51. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  52. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  53. package/dist/types/modes/components/gajae-pet-widget.d.ts +1 -0
  54. package/dist/types/modes/components/model-selector.d.ts +1 -0
  55. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  56. package/dist/types/modes/components/pet-capability.d.ts +37 -0
  57. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  58. package/dist/types/modes/components/settings-selector.d.ts +15 -4
  59. package/dist/types/modes/components/welcome.d.ts +1 -1
  60. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  61. package/dist/types/modes/index.d.ts +0 -4
  62. package/dist/types/modes/interactive-mode.d.ts +5 -1
  63. package/dist/types/modes/runtime-init.d.ts +2 -2
  64. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  66. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  67. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  68. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  69. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  72. package/dist/types/modes/types.d.ts +16 -1
  73. package/dist/types/runtime-mcp/client.d.ts +2 -0
  74. package/dist/types/runtime-mcp/config.d.ts +5 -1
  75. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  76. package/dist/types/runtime-mcp/types.d.ts +4 -0
  77. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  78. package/dist/types/sdk/acp/index.d.ts +2 -0
  79. package/dist/types/sdk/broker/broker.d.ts +53 -0
  80. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  81. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  82. package/dist/types/sdk/broker/identity.d.ts +3 -0
  83. package/dist/types/sdk/broker/index.d.ts +8 -0
  84. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  85. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  86. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  87. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  88. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  89. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  90. package/dist/types/sdk/broker/transport.d.ts +9 -0
  91. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  92. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  93. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  94. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  95. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  96. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  97. package/dist/types/sdk/bus/config.d.ts +274 -0
  98. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  99. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  100. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  101. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  102. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  103. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  104. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  105. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  107. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  108. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  109. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  110. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  111. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  112. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  113. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  114. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  115. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  118. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  119. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  121. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  122. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  123. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  124. package/dist/types/sdk/cli/index.d.ts +1 -0
  125. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  126. package/dist/types/sdk/client/client.d.ts +1 -0
  127. package/dist/types/sdk/client/discovery.d.ts +27 -0
  128. package/dist/types/sdk/client/index.d.ts +2 -0
  129. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  130. package/dist/types/sdk/host/control/index.d.ts +2 -0
  131. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  132. package/dist/types/sdk/host/events.d.ts +35 -0
  133. package/dist/types/sdk/host/host.d.ts +35 -0
  134. package/dist/types/sdk/host/index.d.ts +4 -0
  135. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  136. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  137. package/dist/types/sdk/host/query/index.d.ts +3 -0
  138. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  139. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  140. package/dist/types/sdk/host/types.d.ts +32 -0
  141. package/dist/types/sdk/index.d.ts +6 -0
  142. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  143. package/dist/types/sdk/mcp/index.d.ts +1 -0
  144. package/dist/types/sdk/mcp/server.d.ts +37 -0
  145. package/dist/types/sdk/models.d.ts +44 -0
  146. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  147. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  148. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  149. package/dist/types/sdk/startup-capability.d.ts +50 -0
  150. package/dist/types/session/agent-session.d.ts +114 -21
  151. package/dist/types/session/default-model-selection.d.ts +25 -0
  152. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  153. package/dist/types/session/session-manager.d.ts +58 -1
  154. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  155. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  156. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  157. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  158. package/dist/types/tools/browser/launch.d.ts +22 -0
  159. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  160. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  161. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  162. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  163. package/dist/types/tools/browser/registry.d.ts +19 -0
  164. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  165. package/dist/types/tools/index.d.ts +8 -8
  166. package/package.json +34 -13
  167. package/scripts/build-sdk-package-smoke.ts +94 -0
  168. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  169. package/scripts/compile-args.ts +4 -2
  170. package/scripts/g005-daemon-smoke.ts +4 -5
  171. package/scripts/g011-daemon-path-smoke.ts +5 -5
  172. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  173. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  174. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  175. package/scripts/manifest-schema.ts +124 -0
  176. package/scripts/run-test-manifest.ts +153 -0
  177. package/scripts/run-threat-model-check.ts +157 -0
  178. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  179. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  180. package/src/append-only-mode.ts +1 -1
  181. package/src/cli/args.ts +43 -12
  182. package/src/cli/auth-gateway-cli.ts +2 -2
  183. package/src/cli/config-cli.ts +2 -1
  184. package/src/cli/daemon-cli.ts +63 -14
  185. package/src/cli/list-models.ts +1 -1
  186. package/src/cli/notify-cli.ts +288 -286
  187. package/src/cli.ts +21 -2
  188. package/src/commands/daemon.ts +50 -6
  189. package/src/commands/harness.ts +93 -36
  190. package/src/commands/launch.ts +5 -2
  191. package/src/commands/mcp-serve.ts +19 -12
  192. package/src/commands/notify.ts +36 -3
  193. package/src/commands/sdk.ts +426 -0
  194. package/src/commit/agentic/agent.ts +1 -0
  195. package/src/config/atomic-yaml-patch.ts +423 -0
  196. package/src/config/model-profile-activation.ts +240 -89
  197. package/src/config/model-profiles.ts +37 -34
  198. package/src/config/model-registry.ts +51 -26
  199. package/src/config/model-resolver.ts +138 -51
  200. package/src/config/model-selector-value.ts +50 -0
  201. package/src/config/models-config-schema.ts +14 -21
  202. package/src/config/settings-schema.ts +128 -10
  203. package/src/config/settings.ts +1120 -158
  204. package/src/coordinator-mcp/model-preset.ts +74 -20
  205. package/src/coordinator-mcp/server.ts +1597 -3052
  206. package/src/daemon/builtin.ts +8 -5
  207. package/src/daemon/control-types.ts +1 -1
  208. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  209. package/src/discovery/mcp-json.ts +327 -20
  210. package/src/extensibility/custom-tools/types.ts +1 -1
  211. package/src/extensibility/extensions/compact-handler.ts +3 -3
  212. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  213. package/src/extensibility/extensions/loader.ts +69 -5
  214. package/src/extensibility/extensions/runner.ts +112 -4
  215. package/src/extensibility/extensions/types.ts +176 -17
  216. package/src/extensibility/hooks/types.ts +1 -1
  217. package/src/extensibility/slash-commands.ts +3 -3
  218. package/src/gjc-runtime/launch-tmux.ts +170 -86
  219. package/src/gjc-runtime/psmux-detect.ts +82 -4
  220. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  221. package/src/gjc-runtime/team-runtime.ts +54 -35
  222. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  223. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -2
  224. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  225. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  226. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  227. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  228. package/src/harness-control-plane/operate.ts +9 -9
  229. package/src/harness-control-plane/owner.ts +283 -39
  230. package/src/harness-control-plane/receipts.ts +0 -1
  231. package/src/harness-control-plane/sdk-transport.ts +395 -0
  232. package/src/harness-control-plane/session-transport.ts +94 -0
  233. package/src/harness-control-plane/types.ts +1 -1
  234. package/src/internal-urls/docs-index.generated.ts +36 -37
  235. package/src/lsp/client.ts +42 -6
  236. package/src/lsp/index.ts +2 -2
  237. package/src/main.ts +299 -204
  238. package/src/modes/DESIGN.md +258 -0
  239. package/src/modes/acp/acp-agent.ts +1228 -2612
  240. package/src/modes/acp/acp-client-bridge.ts +2 -20
  241. package/src/modes/acp/acp-event-mapper.ts +18 -2
  242. package/src/modes/acp/acp-mode.ts +8 -36
  243. package/src/modes/acp/permission-mode.ts +25 -0
  244. package/src/modes/acp/startup-options.ts +6 -0
  245. package/src/modes/components/agent-dashboard.ts +37 -17
  246. package/src/modes/components/custom-editor.ts +1 -0
  247. package/src/modes/components/gajae-pet-widget.ts +169 -20
  248. package/src/modes/components/model-selector.ts +93 -35
  249. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  250. package/src/modes/components/pet-capability.ts +115 -0
  251. package/src/modes/components/pet-selector.ts +4 -6
  252. package/src/modes/components/settings-selector.ts +86 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +1 -2
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +357 -12
  257. package/src/modes/controllers/input-controller.ts +43 -13
  258. package/src/modes/controllers/selector-controller.ts +671 -44
  259. package/src/modes/index.ts +0 -22
  260. package/src/modes/interactive-mode.ts +108 -24
  261. package/src/modes/runtime-init.ts +298 -6
  262. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  263. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  264. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  265. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  266. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  267. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  268. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  269. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  270. package/src/modes/types.ts +16 -1
  271. package/src/runtime-mcp/client.ts +94 -19
  272. package/src/runtime-mcp/config.ts +27 -15
  273. package/src/runtime-mcp/manager.ts +343 -105
  274. package/src/runtime-mcp/oauth-flow.ts +42 -12
  275. package/src/runtime-mcp/transports/http.ts +49 -19
  276. package/src/runtime-mcp/transports/stdio.ts +47 -28
  277. package/src/runtime-mcp/types.ts +10 -0
  278. package/src/sdk/acp/adapter.ts +418 -0
  279. package/src/sdk/acp/index.ts +2 -0
  280. package/src/sdk/broker/broker.ts +642 -0
  281. package/src/sdk/broker/discovery.ts +94 -0
  282. package/src/sdk/broker/ensure.ts +249 -0
  283. package/src/sdk/broker/identity.ts +42 -0
  284. package/src/sdk/broker/index.ts +8 -0
  285. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  286. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  287. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  288. package/src/sdk/broker/lifecycle.ts +2157 -0
  289. package/src/sdk/broker/process-incarnation.ts +159 -0
  290. package/src/sdk/broker/runtime.ts +164 -0
  291. package/src/sdk/broker/session-index.ts +318 -0
  292. package/src/sdk/broker/state-version.ts +23 -0
  293. package/src/sdk/broker/transport.ts +125 -0
  294. package/src/sdk/bus/chat-command-policy.ts +107 -0
  295. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  296. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  297. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  298. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  299. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  300. package/src/sdk/bus/config.ts +433 -0
  301. package/src/sdk/bus/conversation-store.ts +391 -0
  302. package/src/sdk/bus/discord-conversation.ts +85 -0
  303. package/src/sdk/bus/discord-daemon.ts +2275 -0
  304. package/src/sdk/bus/discord-live-provider.ts +521 -0
  305. package/src/sdk/bus/discord-provider.ts +56 -0
  306. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  307. package/src/sdk/bus/index.ts +3943 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  309. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  310. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  311. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  312. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  313. package/src/sdk/bus/natives-augment.d.ts +38 -0
  314. package/src/sdk/bus/notification-orchestration.ts +535 -0
  315. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  316. package/src/sdk/bus/session-control.ts +333 -0
  317. package/src/sdk/bus/slack-conversation.ts +74 -0
  318. package/src/sdk/bus/slack-daemon.ts +2144 -0
  319. package/src/sdk/bus/slack-live-provider.ts +380 -0
  320. package/src/sdk/bus/slack-provider.ts +76 -0
  321. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  322. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  323. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  324. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  325. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  326. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  327. package/src/sdk/bus/telegram-setup.ts +663 -0
  328. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  329. package/src/sdk/cli/index.ts +1 -0
  330. package/src/sdk/cli/session-cli.ts +275 -0
  331. package/src/sdk/client/client.ts +1 -0
  332. package/src/sdk/client/discovery.ts +108 -0
  333. package/src/sdk/client/index.ts +2 -0
  334. package/src/sdk/host/control/dispatch.ts +367 -0
  335. package/src/sdk/host/control/index.ts +10 -0
  336. package/src/sdk/host/control/operations.ts +63 -0
  337. package/src/sdk/host/events.ts +91 -0
  338. package/src/sdk/host/host.ts +296 -0
  339. package/src/sdk/host/index.ts +4 -0
  340. package/src/sdk/host/query/cursor.ts +189 -0
  341. package/src/sdk/host/query/handlers.ts +533 -0
  342. package/src/sdk/host/query/index.ts +3 -0
  343. package/src/sdk/host/query/revision-store.ts +1126 -0
  344. package/src/sdk/host/reverse-leases.ts +325 -0
  345. package/src/sdk/host/types.ts +29 -0
  346. package/src/sdk/index.ts +13 -0
  347. package/src/sdk/lifecycle-session.ts +39 -0
  348. package/src/sdk/mcp/index.ts +1 -0
  349. package/src/sdk/mcp/server.ts +332 -0
  350. package/src/sdk/models.ts +168 -0
  351. package/src/sdk/protocol/adapter-validation.ts +48 -0
  352. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  353. package/src/sdk/protocol/operation-registry.ts +312 -0
  354. package/src/{sdk.ts → sdk/session.ts} +339 -212
  355. package/src/sdk/startup-capability.ts +189 -0
  356. package/src/session/agent-session.ts +2470 -866
  357. package/src/session/default-model-selection.ts +93 -0
  358. package/src/session/fallback-chain-controller.ts +136 -0
  359. package/src/session/session-manager.ts +447 -13
  360. package/src/session/session-storage.ts +8 -1
  361. package/src/setup/credential-auto-import.ts +290 -35
  362. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  363. package/src/slash-commands/builtin-registry.ts +33 -30
  364. package/src/task/executor.ts +62 -13
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/telegram-send.ts +2 -2
  384. package/vendor/insane-search/MANIFEST.json +2 -1
  385. package/vendor/insane-search/engine/bias_check.py +4 -1
  386. package/vendor/insane-search/engine/phase0.py +26 -1
  387. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  388. package/dist/types/modes/bridge/auth.d.ts +0 -12
  389. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  390. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  391. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  392. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  393. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  394. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  395. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  396. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  397. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  398. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  399. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  400. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  401. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  402. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  403. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  404. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  405. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  406. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  407. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  408. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  409. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  410. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  411. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  412. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  413. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  414. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  415. package/dist/types/notifications/config.d.ts +0 -132
  416. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  417. package/src/modes/bridge/auth.ts +0 -41
  418. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  419. package/src/modes/bridge/bridge-mode.ts +0 -675
  420. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  421. package/src/modes/bridge/event-stream.ts +0 -70
  422. package/src/modes/rpc/host-tools.ts +0 -1
  423. package/src/modes/rpc/host-uris.ts +0 -1
  424. package/src/modes/rpc/rpc-client.ts +0 -1166
  425. package/src/modes/rpc/rpc-mode.ts +0 -1029
  426. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  427. package/src/modes/rpc/rpc-types.ts +0 -637
  428. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  429. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  430. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  431. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  432. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  433. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  434. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  435. package/src/modes/shared/agent-wire/responses.ts +0 -17
  436. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  437. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  438. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  439. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  440. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  441. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  442. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  443. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  444. package/src/notifications/config.ts +0 -219
  445. package/src/notifications/index.ts +0 -1835
  446. package/src/notifications/telegram-daemon-cli.ts +0 -243
  447. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  448. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -4,9 +4,16 @@
4
4
  import { ThinkingLevel } from "@gajae-code/agent-core";
5
5
  import { type Api, type KnownProvider, type Model } from "@gajae-code/ai";
6
6
  import { type ModelRegistry, type ModelRole } from "./model-registry";
7
+ import { type ModelSelectorValue } from "./model-selector-value";
7
8
  import type { Settings } from "./settings";
8
9
  /** Default model IDs for each known provider */
9
10
  export declare const defaultModelPerProvider: Record<KnownProvider, string>;
11
+ /**
12
+ * Cursor's current RPC transport executes its exec protocol while streaming and
13
+ * has no client-side tool-call mode. Managed fallback attempts must not enable
14
+ * that irreversible path.
15
+ */
16
+ export declare function managedCursorFallbackUnavailableReason(model: Model<Api>, selector: string): string | undefined;
10
17
  export interface ScopedModelSelection {
11
18
  model: Model<Api>;
12
19
  thinkingLevel?: ThinkingLevel;
@@ -61,10 +68,10 @@ export declare function parseModelPattern(pattern: string, availableModels: Mode
61
68
  * Expand a role alias like "pi/default" to the configured model string.
62
69
  */
63
70
  export declare function expandRoleAlias(value: string, settings?: Settings): string;
64
- export declare function resolveConfiguredModelPatterns(value: string | string[] | undefined, settings?: Settings): string[];
71
+ export declare function resolveConfiguredModelPatterns(value: ModelSelectorValue | undefined, settings?: Settings): string[];
65
72
  export interface AgentModelPatternResolutionOptions {
66
- settingsOverride?: string | string[];
67
- agentModel?: string | string[];
73
+ settingsOverride?: ModelSelectorValue;
74
+ agentModel?: ModelSelectorValue;
68
75
  settings?: Settings;
69
76
  activeModelPattern?: string;
70
77
  fallbackModelPattern?: string;
@@ -79,12 +86,12 @@ export interface ResolvedModelRoleValue {
79
86
  explicitThinkingLevel: boolean;
80
87
  warning: string | undefined;
81
88
  }
82
- export declare function resolveModelRoleValue(roleValue: string | undefined, availableModels: Model<Api>[], options?: {
89
+ export declare function resolveModelRoleValue(roleValue: ModelSelectorValue | undefined, availableModels: Model<Api>[], options?: {
83
90
  settings?: Settings;
84
91
  matchPreferences?: ModelMatchPreferences;
85
92
  modelRegistry?: CanonicalModelRegistry;
86
93
  }): ResolvedModelRoleValue;
87
- export declare function extractExplicitThinkingSelector(value: string | undefined, settings?: Settings): ThinkingLevel | undefined;
94
+ export declare function extractExplicitThinkingSelector(value: ModelSelectorValue | undefined, settings?: Settings): ThinkingLevel | undefined;
88
95
  /**
89
96
  * Resolve a model identifier or pattern to a Model instance.
90
97
  */
@@ -107,6 +114,26 @@ export declare function resolveModelOverride(modelPatterns: string[], modelRegis
107
114
  thinkingLevel?: ThinkingLevel;
108
115
  explicitThinkingLevel: boolean;
109
116
  };
117
+ /**
118
+ * Resolve a configured fallback chain to its first callable entry without
119
+ * charging requests. For retryable chains, consumers MUST pass
120
+ * `{ managedFallback: true }` so unsuitable entries (including Cursor's
121
+ * provider-side tool mode) fail closed during resolution before any request
122
+ * is attempted. Single-entry chains remain non-managed selections.
123
+ */
124
+ export interface ModelChainResolutionOptions {
125
+ managedFallback?: boolean;
126
+ }
127
+ export declare function resolveModelChainWithAuth(modelPatterns: readonly string[], modelRegistry: ModelLookupRegistry & Pick<ModelRegistry, "getApiKey">, settings?: Settings, sessionId?: string, options?: ModelChainResolutionOptions): Promise<{
128
+ model?: Model<Api>;
129
+ thinkingLevel?: ThinkingLevel;
130
+ explicitThinkingLevel: boolean;
131
+ activeIndex: number;
132
+ skips: Array<{
133
+ selector: string;
134
+ reason: string;
135
+ }>;
136
+ }>;
110
137
  /**
111
138
  * Resolve a list of override patterns to the first matching model, with an
112
139
  * auth-aware fallback to the parent session's active model.
@@ -128,13 +155,19 @@ export declare function resolveModelOverride(modelPatterns: string[], modelRegis
128
155
  * primary resolution unchanged so the existing error path still surfaces
129
156
  * a meaningful failure downstream.
130
157
  */
131
- export declare function resolveModelOverrideWithAuthFallback(modelPatterns: string[], parentActiveModelPattern: string | undefined, modelRegistry: ModelLookupRegistry & Pick<ModelRegistry, "getApiKey">, settings?: Settings, sessionId?: string): Promise<{
158
+ export declare function resolveModelOverrideWithAuthFallback(modelPatterns: string[], parentActiveModelPattern: string | undefined, modelRegistry: ModelLookupRegistry & Pick<ModelRegistry, "getApiKey">, settings?: Settings, sessionId?: string, options?: ModelChainResolutionOptions): Promise<{
132
159
  model?: Model<Api>;
133
160
  thinkingLevel?: ThinkingLevel;
134
161
  explicitThinkingLevel: boolean;
135
162
  authFallbackUsed: boolean;
136
163
  requestedModel?: Model<Api>;
137
164
  fallbackReason?: "auth_unavailable";
165
+ activeIndex?: number;
166
+ parentFallbackSelector?: string;
167
+ skips: Array<{
168
+ selector: string;
169
+ reason: string;
170
+ }>;
138
171
  }>;
139
172
  /**
140
173
  * Resolve a list of role patterns to the first matching model.
@@ -0,0 +1,17 @@
1
+ import * as z from "zod/v4";
2
+ /** A model selector or an ordered fallback chain of selectors. */
3
+ export type ModelSelectorValue = string | readonly string[];
4
+ /**
5
+ * Accept one validated selector or a non-empty ordered chain of validated selectors.
6
+ * Element schemas own each configuration surface's selector grammar.
7
+ */
8
+ export declare function stringOrNonEmptyArray<T extends z.ZodType<string>>(elementSchema: T): z.ZodUnion<readonly [T, z.ZodArray<T>]>;
9
+ /** Return whether a value is a non-blank selector or a non-empty selector chain. */
10
+ export declare function isModelSelectorValue(value: unknown): value is ModelSelectorValue;
11
+ /**
12
+ * Preserve compatibility with comma-delimited selector strings while flattening
13
+ * configured chains in their declared order.
14
+ */
15
+ export declare function normalizeModelSelectorValue(value: ModelSelectorValue | undefined): string[];
16
+ /** Return the first configured selector for consumers that need one selector. */
17
+ export declare function selectorHead(value: ModelSelectorValue | undefined): string | undefined;
@@ -62,6 +62,10 @@ export declare const OpenAICompatSchema: z.ZodObject<{
62
62
  none: "none";
63
63
  }>>;
64
64
  }, z.core.$strip>;
65
+ export declare const ModelBindingsSchema: z.ZodObject<{
66
+ modelRoles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
67
+ agentModelOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
68
+ }, z.core.$strip>;
65
69
  export declare const ProfileRoleSchema: z.ZodEnum<{
66
70
  architect: "architect";
67
71
  critic: "critic";
@@ -76,7 +80,7 @@ export declare const ProfileModelMappingSchema: z.ZodRecord<z.ZodEnum<{
76
80
  default: "default";
77
81
  executor: "executor";
78
82
  planner: "planner";
79
- }> & z.core.$partial, z.ZodString>;
83
+ }> & z.core.$partial, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
80
84
  export declare const ProfileDefinitionSchema: z.ZodObject<{
81
85
  required_providers: z.ZodArray<z.ZodString>;
82
86
  display_name: z.ZodOptional<z.ZodString>;
@@ -86,7 +90,7 @@ export declare const ProfileDefinitionSchema: z.ZodObject<{
86
90
  default: "default";
87
91
  executor: "executor";
88
92
  planner: "planner";
89
- }> & z.core.$partial, z.ZodString>;
93
+ }> & z.core.$partial, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
90
94
  }, z.core.$strict>;
91
95
  export declare const ProfilesSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
92
96
  required_providers: z.ZodArray<z.ZodString>;
@@ -97,7 +101,7 @@ export declare const ProfilesSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
97
101
  default: "default";
98
102
  executor: "executor";
99
103
  planner: "planner";
100
- }> & z.core.$partial, z.ZodString>;
104
+ }> & z.core.$partial, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
101
105
  }, z.core.$strict>>;
102
106
  export declare const ModelOverrideSchema: z.ZodObject<{
103
107
  name: z.ZodOptional<z.ZodString>;
@@ -676,8 +680,8 @@ export declare const ModelsConfigSchema: z.ZodObject<{
676
680
  }, z.core.$strict>>;
677
681
  }, z.core.$strict>>>;
678
682
  modelBindings: z.ZodOptional<z.ZodObject<{
679
- modelRoles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
680
- agentModelOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
683
+ modelRoles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
684
+ agentModelOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
681
685
  }, z.core.$strip>>;
682
686
  equivalence: z.ZodOptional<z.ZodObject<{
683
687
  overrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -692,7 +696,7 @@ export declare const ModelsConfigSchema: z.ZodObject<{
692
696
  default: "default";
693
697
  executor: "executor";
694
698
  planner: "planner";
695
- }> & z.core.$partial, z.ZodString>;
699
+ }> & z.core.$partial, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
696
700
  }, z.core.$strict>>>;
697
701
  }, z.core.$strict>;
698
702
  export type ModelsConfig = z.infer<typeof ModelsConfigSchema>;
@@ -1,4 +1,5 @@
1
1
  import type { Effort } from "@gajae-code/ai/model-thinking";
2
+ import type { ModelSelectorValue } from "./model-selector-value";
2
3
  import { type SkillDiscoverySettings } from "./skill-settings-defaults";
3
4
  /** Unified settings schema - single source of truth for all settings.
4
5
  *
@@ -10,7 +11,7 @@ import { type SkillDiscoverySettings } from "./skill-settings-defaults";
10
11
  * settings.get("compaction.enabled") // => boolean
11
12
  * settings.set("theme.dark", "red-claw") // sync, saves in background
12
13
  */
13
- export type SettingTab = "appearance" | "model" | "interaction" | "context" | "memory" | "editing" | "tools" | "tasks" | "providers";
14
+ export type SettingTab = "appearance" | "model" | "interaction" | "context" | "memory" | "editing" | "tools" | "tasks" | "providers" | "notifications";
14
15
  /** Tab display metadata - icon is resolved via theme.symbol() */
15
16
  export type TabMetadata = {
16
17
  label: string;
@@ -37,6 +38,11 @@ interface UiBase {
37
38
  description: string;
38
39
  /** Condition function name - setting only shown when true */
39
40
  condition?: string;
41
+ /**
42
+ * Persistence owner for settings which must not use the generic immediate
43
+ * settings-list write path.
44
+ */
45
+ editing?: "notification-atomic";
40
46
  }
41
47
  interface UiBoolean extends UiBase {
42
48
  }
@@ -91,9 +97,13 @@ interface ArrayDef<T> {
91
97
  };
92
98
  ui?: UiBase;
93
99
  }
100
+ interface RecordValueDef {
101
+ type: "model-selector-value";
102
+ }
94
103
  interface RecordDef<T> {
95
104
  type: "record";
96
105
  default: Record<string, T>;
106
+ valueSchema?: RecordValueDef;
97
107
  ui?: UiBase;
98
108
  }
99
109
  type SettingDef = BooleanDef | StringDef | NumberDef | EnumDef<readonly string[]> | ArrayDef<unknown> | RecordDef<unknown>;
@@ -130,13 +140,29 @@ export declare const SETTINGS_SCHEMA: {
130
140
  readonly type: "string";
131
141
  readonly default: undefined;
132
142
  };
143
+ readonly "notifications.telegram.activation": {
144
+ readonly type: "record";
145
+ readonly default: Record<string, unknown>;
146
+ };
133
147
  readonly "notifications.telegram.rich.enabled": {
134
148
  readonly type: "boolean";
135
149
  readonly default: true;
150
+ readonly ui: {
151
+ readonly tab: "notifications";
152
+ readonly label: "Telegram Rich Messages";
153
+ readonly description: "Format Telegram notifications with rich message content.";
154
+ readonly editing: "notification-atomic";
155
+ };
136
156
  };
137
157
  readonly "notifications.telegram.richDraft.enabled": {
138
158
  readonly type: "boolean";
139
159
  readonly default: false;
160
+ readonly ui: {
161
+ readonly tab: "notifications";
162
+ readonly label: "Telegram Rich Drafts";
163
+ readonly description: "Include rich draft updates in Telegram notifications.";
164
+ readonly editing: "notification-atomic";
165
+ };
140
166
  };
141
167
  readonly "notifications.telegram.topics.nameTemplate": {
142
168
  readonly type: "string";
@@ -146,7 +172,15 @@ export declare const SETTINGS_SCHEMA: {
146
172
  readonly type: "string";
147
173
  readonly default: undefined;
148
174
  };
149
- readonly "notifications.discord.channelId": {
175
+ readonly "notifications.discord.applicationId": {
176
+ readonly type: "string";
177
+ readonly default: undefined;
178
+ };
179
+ readonly "notifications.discord.guildId": {
180
+ readonly type: "string";
181
+ readonly default: undefined;
182
+ };
183
+ readonly "notifications.discord.parentChannelId": {
150
184
  readonly type: "string";
151
185
  readonly default: undefined;
152
186
  };
@@ -154,23 +188,71 @@ export declare const SETTINGS_SCHEMA: {
154
188
  readonly type: "string";
155
189
  readonly default: undefined;
156
190
  };
191
+ readonly "notifications.slack.appToken": {
192
+ readonly type: "string";
193
+ readonly default: undefined;
194
+ };
195
+ readonly "notifications.slack.workspaceId": {
196
+ readonly type: "string";
197
+ readonly default: undefined;
198
+ };
157
199
  readonly "notifications.slack.channelId": {
158
200
  readonly type: "string";
159
201
  readonly default: undefined;
160
202
  };
203
+ readonly "notifications.slack.authorizedUserId": {
204
+ readonly type: "string";
205
+ readonly default: undefined;
206
+ };
161
207
  readonly "notifications.redact": {
162
208
  readonly type: "boolean";
163
209
  readonly default: false;
210
+ readonly ui: {
211
+ readonly tab: "notifications";
212
+ readonly label: "Redact Notification Content";
213
+ readonly description: "Redact sensitive content before notifications are delivered.";
214
+ readonly editing: "notification-atomic";
215
+ };
164
216
  };
165
217
  readonly "notifications.verbosity": {
166
218
  readonly type: "string";
167
219
  readonly default: "lean";
168
220
  readonly validate: (value: string) => value is "lean" | "verbose";
221
+ readonly ui: {
222
+ readonly tab: "notifications";
223
+ readonly label: "Notification Verbosity";
224
+ readonly description: "Choose concise or detailed notification messages.";
225
+ readonly options: readonly [{
226
+ readonly value: "lean";
227
+ readonly label: "Lean";
228
+ readonly description: "Send concise notification messages";
229
+ }, {
230
+ readonly value: "verbose";
231
+ readonly label: "Verbose";
232
+ readonly description: "Send detailed notification messages";
233
+ }];
234
+ readonly editing: "notification-atomic";
235
+ };
169
236
  };
170
237
  readonly "notifications.sessionScope": {
171
238
  readonly type: "string";
172
239
  readonly default: "all";
173
240
  readonly validate: (value: string) => value is "all" | "primary";
241
+ readonly ui: {
242
+ readonly tab: "notifications";
243
+ readonly label: "Notification Session Scope";
244
+ readonly description: "Send notifications from all sessions or only the primary session.";
245
+ readonly options: readonly [{
246
+ readonly value: "all";
247
+ readonly label: "All Sessions";
248
+ readonly description: "Allow eligible sessions";
249
+ }, {
250
+ readonly value: "primary";
251
+ readonly label: "Primary Session";
252
+ readonly description: "Limit automatic notifications to the primary session";
253
+ }];
254
+ readonly editing: "notification-atomic";
255
+ };
174
256
  };
175
257
  readonly "notifications.daemon.idleTimeoutMs": {
176
258
  readonly type: "number";
@@ -285,7 +367,10 @@ export declare const SETTINGS_SCHEMA: {
285
367
  };
286
368
  readonly modelRoles: {
287
369
  readonly type: "record";
288
- readonly default: Record<string, string>;
370
+ readonly default: Record<string, ModelSelectorValue>;
371
+ readonly valueSchema: {
372
+ readonly type: "model-selector-value";
373
+ };
289
374
  };
290
375
  readonly "modelProfile.default": {
291
376
  readonly type: "string";
@@ -1240,6 +1325,11 @@ export declare const SETTINGS_SCHEMA: {
1240
1325
  }];
1241
1326
  };
1242
1327
  };
1328
+ readonly "fallback.maxAttempts": {
1329
+ readonly type: "number";
1330
+ readonly default: 3;
1331
+ readonly validate: (value: number) => boolean;
1332
+ };
1243
1333
  readonly "retry.enabled": {
1244
1334
  readonly type: "boolean";
1245
1335
  readonly default: true;
@@ -2802,6 +2892,34 @@ export declare const SETTINGS_SCHEMA: {
2802
2892
  readonly description: "Directory to save screenshots. If unset, screenshots go to a temp file. Supports ~. Examples: ~/Downloads, ~/Desktop, /sdcard/Download (Android)";
2803
2893
  };
2804
2894
  };
2895
+ readonly "browser.profileReuse": {
2896
+ readonly type: "string";
2897
+ readonly default: "auto";
2898
+ readonly validate: (value: string) => value is "auto" | "opt-in";
2899
+ readonly ui: {
2900
+ readonly tab: "tools";
2901
+ readonly label: "Profile reuse posture";
2902
+ readonly description: "'auto' (default): when a usable real Chrome profile is available, the browser tool uses an isolated copy of it (cookies/session/cache) for stronger stealth, warns, and falls back to synthetic. 'opt-in': stay synthetic unless a real profile is explicitly requested.";
2903
+ };
2904
+ };
2905
+ readonly "browser.geo.timezone": {
2906
+ readonly type: "string";
2907
+ readonly default: undefined;
2908
+ readonly ui: {
2909
+ readonly tab: "tools";
2910
+ readonly label: "Geo timezone override";
2911
+ readonly description: "Optional IANA timezone (e.g. 'America/New_York') for headless sessions. Default unset preserves the real timezone. Only set this to a value coherent with your egress (e.g. a proxy region); an incoherent timezone increases bot detection.";
2912
+ };
2913
+ };
2914
+ readonly "browser.geo.locale": {
2915
+ readonly type: "string";
2916
+ readonly default: undefined;
2917
+ readonly ui: {
2918
+ readonly tab: "tools";
2919
+ readonly label: "Geo locale override";
2920
+ readonly description: "Optional UI locale (e.g. 'en-US') for headless sessions. Default unset preserves the real locale. Only set this coherently with your egress region.";
2921
+ };
2922
+ };
2805
2923
  readonly "browser.gc.enabled": {
2806
2924
  readonly type: "boolean";
2807
2925
  readonly default: true;
@@ -3337,7 +3455,10 @@ export declare const SETTINGS_SCHEMA: {
3337
3455
  };
3338
3456
  readonly "task.agentModelOverrides": {
3339
3457
  readonly type: "record";
3340
- readonly default: Record<string, string>;
3458
+ readonly default: Record<string, ModelSelectorValue>;
3459
+ readonly valueSchema: {
3460
+ readonly type: "model-selector-value";
3461
+ };
3341
3462
  };
3342
3463
  readonly "tasks.todoClearDelay": {
3343
3464
  readonly type: "number";
@@ -3909,13 +4030,19 @@ export interface NotificationsSettings {
3909
4030
  };
3910
4031
  discord: {
3911
4032
  botToken: string | undefined;
3912
- channelId: string | undefined;
4033
+ applicationId: string | undefined;
4034
+ guildId: string | undefined;
4035
+ parentChannelId: string | undefined;
3913
4036
  };
3914
4037
  slack: {
3915
4038
  botToken: string | undefined;
4039
+ appToken: string | undefined;
4040
+ workspaceId: string | undefined;
3916
4041
  channelId: string | undefined;
3917
4042
  };
3918
4043
  redact: boolean;
4044
+ verbosity: "lean" | "verbose";
4045
+ sessionScope: "all" | "primary";
3919
4046
  daemon: {
3920
4047
  idleTimeoutMs: number;
3921
4048
  };
@@ -3934,7 +4061,7 @@ export interface GroupTypeMap {
3934
4061
  statusLine: StatusLineSettings;
3935
4062
  thinkingBudgets: ThinkingBudgetsSettings;
3936
4063
  stt: SttSettings;
3937
- modelRoles: Record<string, string>;
4064
+ modelRoles: Record<string, ModelSelectorValue>;
3938
4065
  modelTags: ModelTagsSettings;
3939
4066
  cycleOrder: string[];
3940
4067
  shellMinimizer: ShellMinimizerSettings;
@@ -1,19 +1,10 @@
1
- /**
2
- * Settings singleton with sync get/set and background persistence.
3
- *
4
- * Usage:
5
- * import { settings } from "./settings";
6
- *
7
- * const enabled = settings.get("compaction.enabled"); // sync read
8
- * settings.set("theme.dark", "red-claw"); // sync write, saves in background
9
- *
10
- * For tests:
11
- * const isolated = Settings.isolated({ "compaction.enabled": false });
12
- */
13
1
  import { procmgr } from "@gajae-code/utils";
14
2
  import type { ModelRole } from "../config/model-registry";
3
+ import type { NotificationSettingsReader, NotificationSettingsSnapshot } from "../sdk/bus/config";
15
4
  import { AgentStorage } from "../session/agent-storage";
16
5
  import { type EditMode } from "../utils/edit-mode";
6
+ import { type CasReceipt } from "./atomic-yaml-patch";
7
+ import { type ModelSelectorValue } from "./model-selector-value";
17
8
  import { type BashInterceptorRule, type GroupPrefix, type GroupTypeMap, type SettingPath, type SettingValue } from "./settings-schema";
18
9
  export type * from "./settings-schema";
19
10
  export * from "./settings-schema";
@@ -21,6 +12,22 @@ export * from "./settings-schema";
21
12
  export interface RawSettings {
22
13
  [key: string]: unknown;
23
14
  }
15
+ export type SettingsAtomicPatch = {
16
+ path: SettingPath;
17
+ op: "set";
18
+ value: unknown;
19
+ } | {
20
+ path: SettingPath;
21
+ op: "unset";
22
+ };
23
+ export type SettingsAtomicReceipt = CasReceipt;
24
+ export interface GlobalDefaultModelRoleCommit {
25
+ readonly previousDefault: ModelSelectorValue | undefined;
26
+ readonly previousModelRolesExisted: boolean;
27
+ readonly committedDefault: ModelSelectorValue | undefined;
28
+ readonly committedConfigVersion?: string;
29
+ readonly defaultRevision: number;
30
+ }
24
31
  export interface SettingsOptions {
25
32
  /** Current working directory for project settings discovery */
26
33
  cwd?: string;
@@ -31,7 +38,17 @@ export interface SettingsOptions {
31
38
  /** Initial overrides */
32
39
  overrides?: Partial<Record<SettingPath, unknown>>;
33
40
  }
34
- export declare class Settings {
41
+ /** Additional layer setup for {@link Settings.isolated}. */
42
+ export interface IsolatedSettingsOptions {
43
+ /** Initial runtime overrides. Notification paths are rejected. */
44
+ overrides?: Partial<Record<SettingPath, unknown>>;
45
+ }
46
+ /** Raised when an ephemeral override attempts to change global-only notification settings. */
47
+ export declare class NotificationSettingsOverrideError extends Error {
48
+ readonly path: SettingPath;
49
+ constructor(path: SettingPath);
50
+ }
51
+ export declare class Settings implements NotificationSettingsReader {
35
52
  #private;
36
53
  private constructor();
37
54
  /**
@@ -40,10 +57,10 @@ export declare class Settings {
40
57
  */
41
58
  static init(options?: SettingsOptions): Promise<Settings>;
42
59
  /**
43
- * Create an isolated instance for testing.
60
+ * Create an isolated instance for testing with explicit user/global settings.
44
61
  * Does not affect the global singleton.
45
62
  */
46
- static isolated(overrides?: Partial<Record<SettingPath, unknown>>): Settings;
63
+ static isolated(globalSettings?: Partial<Record<SettingPath, unknown>>, options?: IsolatedSettingsOptions): Settings;
47
64
  /**
48
65
  * Get the global singleton.
49
66
  * Throws if not initialized.
@@ -61,14 +78,32 @@ export declare class Settings {
61
78
  * activated by project-scoped config files.
62
79
  */
63
80
  getGlobal<P extends SettingPath>(path: P): SettingValue<P> | undefined;
81
+ /**
82
+ * Read the remote-notification settings from the user/global layer only.
83
+ * Schema defaults are applied per path; project settings and runtime overrides
84
+ * are deliberately excluded from this trust boundary.
85
+ */
86
+ getNotificationSettingsSnapshot(): NotificationSettingsSnapshot;
64
87
  /** Check whether a setting is present in loaded settings/overrides rather than coming from schema defaults. */
65
88
  has(path: SettingPath): boolean;
66
89
  /**
67
90
  * Set a setting value (sync).
68
- * Updates global settings and queues a background save.
69
- * Triggers hooks for settings that have side effects.
91
+ * Updates global settings and reserves its background persistence slot before
92
+ * returning, so later durable batches cannot overtake this mutation.
70
93
  */
71
- set<P extends SettingPath>(path: P, value: SettingValue<P>): void;
94
+ set<P extends SettingPath>(path: P, value: SettingValue<P> | undefined): void;
95
+ /**
96
+ * Delete a global setting (sync), rather than serializing an ambiguous YAML
97
+ * `undefined` value. Defaults/project settings become visible immediately.
98
+ */
99
+ unset<P extends SettingPath>(path: P): void;
100
+ /**
101
+ * Persist a tagged batch as one atomic YAML replacement. Unlike ordinary
102
+ * {@link set}, canonical state and hooks change only after the rename succeeds.
103
+ */
104
+ commitAtomicBatch(patches: readonly SettingsAtomicPatch[]): Promise<CasReceipt>;
105
+ /** Build a durable batch from the current on-disk YAML under the shared queue and file lock. */
106
+ commitAtomicBatchWithCurrent(buildPatches: (current: Readonly<RawSettings>) => Promise<readonly SettingsAtomicPatch[]> | readonly SettingsAtomicPatch[]): Promise<CasReceipt>;
72
107
  /**
73
108
  * Apply runtime overrides (not persisted).
74
109
  */
@@ -77,17 +112,9 @@ export declare class Settings {
77
112
  * Clear a runtime override.
78
113
  */
79
114
  clearOverride(path: SettingPath): void;
80
- /**
81
- * Flush any pending saves to disk.
82
- * Call before exit to ensure all changes are persisted.
83
- */
115
+ /** Flush a reserved debounced save without allowing it to be overtaken. */
84
116
  flush(): Promise<void>;
85
- /**
86
- * Like {@link flush}, but rejects if the durable save fails instead of
87
- * swallowing the error. Use where the caller must confirm persistence before
88
- * reporting success (e.g. the Telegram `/rich` toggle). In-memory instances
89
- * ({@link isolated}) short-circuit in {@link #saveNow} and never throw.
90
- */
117
+ /** Like {@link flush}, but reports a durable save failure to the caller. */
91
118
  flushOrThrow(): Promise<void>;
92
119
  cloneForCwd(cwd: string): Promise<Settings>;
93
120
  getStorage(): AgentStorage | null;
@@ -114,9 +141,10 @@ export declare class Settings {
114
141
  /**
115
142
  * Set a model role (helper for modelRoles record).
116
143
  */
117
- setModelRole(role: ModelRole | string, modelId: string): void;
118
- setGlobalModelRole(role: ModelRole | string, modelId: string | undefined): void;
119
- setGlobalModelRoleAndFlush(role: ModelRole | string, modelId: string | undefined): Promise<void>;
144
+ setModelRole(role: ModelRole | string, modelId: ModelSelectorValue): void;
145
+ setGlobalModelRole(role: ModelRole | string, modelId: ModelSelectorValue | undefined): void;
146
+ setGlobalModelRoleAndFlush(role: ModelRole | string, modelId: ModelSelectorValue | undefined): Promise<GlobalDefaultModelRoleCommit>;
147
+ restoreGlobalDefaultModelRoleIfCurrent(commit: GlobalDefaultModelRoleCommit): Promise<boolean>;
120
148
  /**
121
149
  * Set an agent model override while keeping any live runtime override aligned.
122
150
  *
@@ -124,16 +152,16 @@ export declare class Settings {
124
152
  * session. A user-selected role assignment must win immediately in that same
125
153
  * session, but only the explicit agent change should be persisted.
126
154
  */
127
- setAgentModelOverride(agentName: string, modelId: string): void;
155
+ setAgentModelOverride(agentName: string, modelId: ModelSelectorValue): void;
128
156
  /**
129
157
  * Get a model role (helper for modelRoles record).
130
158
  */
131
- getModelRole(role: ModelRole | string): string | undefined;
159
+ getModelRole(role: ModelRole | string): ModelSelectorValue | undefined;
132
160
  /**
133
161
  * Get all model roles (helper for modelRoles record).
134
162
  */
135
- getModelRoles(): ReadOnlyDict<string>;
136
- overrideModelRoles(roles: ReadOnlyDict<string>): void;
163
+ getModelRoles(): Readonly<Record<string, ModelSelectorValue>>;
164
+ overrideModelRoles(roles: Readonly<Record<string, ModelSelectorValue>>): void;
137
165
  /**
138
166
  * Set disabled providers (for compatibility with discovery system).
139
167
  */
@@ -1,11 +1,12 @@
1
- import { type ModelProfileDefinition } from "../config/model-profiles";
1
+ export interface CoordinatorModelProfile {
2
+ name: string;
3
+ }
2
4
  /**
3
- * Loads the merged built-in + custom model-profile registry the way the `gjc`
4
- * CLI resolves `--mpreset`, so coordinator MCP launches select the same
5
- * authoritative profile the spawned child will activate. Custom profiles live
6
- * in the shared models config, which the child inherits, so both sides agree.
5
+ * Loads the merged built-in + custom model-profile names from `models.yml`
6
+ * without loading the session-host model registry. The child still owns
7
+ * profile activation; this validates the selection before session creation.
7
8
  */
8
- export type CoordinatorModelProfileLoader = () => Map<string, ModelProfileDefinition> | Promise<Map<string, ModelProfileDefinition>>;
9
+ export type CoordinatorModelProfileLoader = () => Map<string, CoordinatorModelProfile> | Promise<Map<string, CoordinatorModelProfile>>;
9
10
  /**
10
11
  * Thrown by the default loader when `models.yml` exists but is invalid or
11
12
  * unreadable. This lets the resolver fail closed with a distinct, stable reason