@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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * AgentSession - Core abstraction for agent lifecycle and session management.
3
3
  *
4
- * This class is shared between all run modes (interactive, print, rpc).
4
+ * This class is shared by interactive, print, ACP, and SDK-hosted session callers.
5
5
  * It encapsulates:
6
6
  * - Agent state access
7
7
  * - Event subscription with automatic session persistence
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * Modes use this class and add their own I/O layer on top.
14
14
  */
15
- import { type Agent, type AgentEvent, type AgentMessage, type AgentState, type AgentTool, type ResolvedThinkingLevel, type StablePrefixSnapshot, ThinkingLevel } from "@gajae-code/agent-core";
15
+ import { type Agent, type AgentContext, type AgentEvent, type AgentLoopConfig, type AgentMessage, type AgentState, type AgentTool, type MidRunMaintenanceOutcome, type StablePrefixSnapshot, ThinkingLevel } from "@gajae-code/agent-core";
16
16
  import { type CompactionResult, type EmergencyCompactionSample } from "@gajae-code/agent-core/compaction";
17
17
  import type { AssistantMessage, Effort, ImageContent, Message, MessageAttribution, Model, ProviderSessionState, ServiceTier, SimpleStreamOptions, TextContent, ToolCall, ToolChoice, Usage, UsageReport } from "@gajae-code/ai";
18
18
  export interface ForkContextSeedMetadata {
@@ -60,23 +60,26 @@ import type { LoadedCustomCommand } from "../extensibility/custom-commands";
60
60
  import type { CustomTool } from "../extensibility/custom-tools/types";
61
61
  import type { ExtensionRunner } from "../extensibility/extensions";
62
62
  import type { CompactOptions, ContextUsage } from "../extensibility/extensions/types";
63
- import type { Skill, SkillWarning } from "../extensibility/skills";
63
+ import { type Skill, type SkillWarning } from "../extensibility/skills";
64
64
  import { type FileSlashCommand } from "../extensibility/slash-commands";
65
65
  import { GoalRuntime } from "../goals/runtime";
66
66
  import type { Goal, GoalModeState } from "../goals/state";
67
67
  import type { HindsightSessionState } from "../hindsight/state";
68
- import type { WorkflowGateEmitter } from "../modes/shared/agent-wire/unattended-session";
68
+ import { type WorkflowGateEmitter } from "../modes/shared/agent-wire/workflow-gate-broker";
69
69
  import type { PlanModeState } from "../plan-mode/state";
70
70
  import { type AgentRegistry } from "../registry/agent-registry";
71
71
  import { type DiscoverableMCPSearchIndex, type DiscoverableMCPTool } from "../runtime-mcp/discoverable-tool-metadata";
72
72
  import { MCPManager } from "../runtime-mcp/manager";
73
+ import type { NotificationSessionController } from "../sdk/bus/session-control";
73
74
  import { type SecretObfuscator } from "../secrets/obfuscator";
74
75
  import { type DiscoverableTool, type DiscoverableToolSearchIndex } from "../tool-discovery/tool-index";
75
76
  import type { AskAnswerSource, ToolSession } from "../tools";
76
77
  import type { CheckpointState } from "../tools/checkpoint";
77
78
  import { type TodoItem, type TodoPhase } from "../tools/todo-write";
78
79
  import { type WorkspaceTree } from "../workspace-tree";
79
- import type { ClientBridge } from "./client-bridge";
80
+ import { type DefaultModelSelectionResult } from "./default-model-selection";
81
+ export { DefaultModelSelectionRecoveryError } from "./default-model-selection";
82
+ import type { ClientBridge, ClientBridgePermissionOption, ClientBridgePermissionOutcome, ClientBridgePermissionToolCall } from "./client-bridge";
80
83
  import { type ContributionPrepOptions, type ContributionPrepResult } from "./contribution-prep";
81
84
  import { type CustomMessage } from "./messages";
82
85
  import type { BranchSummaryEntry, CompactionEntry, NewSessionOptions, SessionContext, SessionManager, SessionManagerCloseOutcome } from "./session-manager";
@@ -111,14 +114,16 @@ export type AgentSessionEvent = AgentEvent | {
111
114
  attempt: number;
112
115
  finalError?: string;
113
116
  } | {
114
- type: "retry_fallback_applied";
117
+ type: "model_fallback_switched";
118
+ eventId: string;
115
119
  from: string;
116
120
  to: string;
121
+ reason: string;
117
122
  role: string;
118
- } | {
119
- type: "retry_fallback_succeeded";
120
- model: string;
121
- role: string;
123
+ scope: string;
124
+ activeIndex: number;
125
+ chainLength: number;
126
+ attemptsUsed: number;
122
127
  } | {
123
128
  type: "ttsr_triggered";
124
129
  rules: Rule[];
@@ -164,6 +169,8 @@ export interface AgentSessionConfig {
164
169
  agent: Agent;
165
170
  sessionManager: SessionManager;
166
171
  settings: Settings;
172
+ /** Shared Gate-A-eligible notification session controller, when this host supports it. */
173
+ notificationSessionController?: NotificationSessionController;
167
174
  /** Models to cycle through with Alt+N (from --models flag) */
168
175
  scopedModels?: ScopedModelSelection[];
169
176
  /** Initial session thinking selector. */
@@ -202,7 +209,7 @@ export interface AgentSessionConfig {
202
209
  /** Current session message-to-LLM conversion pipeline */
203
210
  convertToLlm?: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;
204
211
  /** System prompt builder that can consider tool availability. Returns ordered provider-facing blocks. */
205
- rebuildSystemPrompt?: (toolNames: string[], tools: Map<string, AgentTool>) => Promise<{
212
+ rebuildSystemPrompt?: (toolNames: string[], tools: Map<string, AgentTool>, candidateModel?: Model) => Promise<{
206
213
  systemPrompt: string[];
207
214
  }>;
208
215
  /** Initial workspace tree snapshot used for the first volatile per-turn context message. */
@@ -268,6 +275,7 @@ export interface AgentSessionConfig {
268
275
  /** Optional provider-facing cache identity, distinct from logical session identity. */
269
276
  providerCacheSessionId?: string;
270
277
  }
278
+ type MidRunMaintenanceLifecycle = Parameters<NonNullable<AgentLoopConfig["maintainContext"]>>[1];
271
279
  /** Options for AgentSession.prompt() */
272
280
  export interface PromptOptions {
273
281
  /** Whether to expand file-based prompt templates (default: true) */
@@ -286,6 +294,11 @@ export interface PromptOptions {
286
294
  attribution?: MessageAttribution;
287
295
  /** Skip pre-send compaction checks for this prompt (internal use for maintenance flows). */
288
296
  skipCompactionCheck?: boolean;
297
+ /**
298
+ * Invoked after all prompt preflight checks pass and immediately before agent execution begins.
299
+ * Cancellation before this callback rejects the prompt.
300
+ */
301
+ onPreflightAccepted?: () => void;
289
302
  }
290
303
  /** Result from a handoff operation. */
291
304
  export interface HandoffResult {
@@ -303,17 +316,18 @@ export interface ModelCycleResult {
303
316
  /** Whether cycling through scoped models (--models flag) or all available */
304
317
  isScoped: boolean;
305
318
  }
319
+ export type ModelChangeCause = "user-selection" | "profile-activation" | "fallback-switch" | "restore" | "rollback" | "startup-override" | "temporary-operation";
320
+ export type TemporaryModelReason = "plan-mode" | "context-promotion" | "temporary-cycle" | "profile-preview" | "extension-temporary" | "other";
321
+ /** Opaque handle for a non-destructive temporary provider-session scope. */
322
+ export interface TemporaryProviderSessionScope {
323
+ readonly reason: TemporaryModelReason;
324
+ }
306
325
  /** Result from cycleRoleModels() */
307
326
  export interface RoleModelCycleResult {
308
327
  model: Model;
309
328
  thinkingLevel: ThinkingLevel | undefined;
310
329
  role: string;
311
330
  }
312
- export interface DefaultModelSelectionResult {
313
- readonly provider: string;
314
- readonly modelId: string;
315
- readonly thinkingLevel: ResolvedThinkingLevel;
316
- }
317
331
  /** Session statistics for /session command */
318
332
  export interface SessionStats {
319
333
  sessionFile: string | undefined;
@@ -394,6 +408,7 @@ export declare class AgentSession {
394
408
  readonly agent: Agent;
395
409
  readonly sessionManager: SessionManager;
396
410
  readonly settings: Settings;
411
+ readonly notificationSessionController: NotificationSessionController | undefined;
397
412
  readonly taskDepth: number;
398
413
  readonly yieldQueue: YieldQueue;
399
414
  readonly configWarnings: string[];
@@ -435,6 +450,12 @@ export declare class AgentSession {
435
450
  setStandingResolveHandler(handler: ((input: unknown) => Promise<unknown> | unknown) | null): void;
436
451
  /** Provider-scoped mutable state store for transport/session caches. */
437
452
  get providerSessionState(): Map<string, ProviderSessionState>;
453
+ /** Suspend provider state without closing it while a temporary model is active. */
454
+ beginTemporaryProviderSessionScope(reason: TemporaryModelReason): TemporaryProviderSessionScope;
455
+ /** Restore a temporary scope, unwinding any auto-owned scopes above it. */
456
+ restoreTemporaryProviderSessionScope(token: TemporaryProviderSessionScope): boolean;
457
+ /** Promote a temporary scope. The suspended provider state is permanently closed. */
458
+ commitTemporaryProviderSessionScope(token: TemporaryProviderSessionScope): boolean;
438
459
  buildForkContextSeed(options: ForkContextSeedOptions): Promise<ForkContextSeed>;
439
460
  getHindsightSessionState(): HindsightSessionState | undefined;
440
461
  setHindsightSessionState(state: HindsightSessionState | undefined): HindsightSessionState | undefined;
@@ -567,6 +588,12 @@ export declare class AgentSession {
567
588
  * no fold target exists.
568
589
  */
569
590
  hasForegroundBashBackgroundRequestHandler(): boolean;
591
+ /** Set the SDK permission policy used by guarded ACP tool execution. */
592
+ setSdkPermissionMode(mode: "prompt" | "allow" | "deny"): void;
593
+ /** Current SDK permission policy for guarded ACP tool execution. */
594
+ get sdkPermissionMode(): "prompt" | "allow" | "deny";
595
+ /** Register or clear the SDK reverse permission provider for this session. */
596
+ setSdkPermissionProvider(provider: ((toolCall: ClientBridgePermissionToolCall, options: ClientBridgePermissionOption[], signal?: AbortSignal) => Promise<ClientBridgePermissionOutcome>) | undefined): void;
570
597
  /**
571
598
  * Ask the active managed foreground bash call to return as a background job.
572
599
  * Returns false when no supported foreground tool is currently backgroundable.
@@ -613,10 +640,6 @@ export declare class AgentSession {
613
640
  * This allows /mcp add/remove/reauth to take effect without restarting the session.
614
641
  */
615
642
  refreshMCPTools(mcpTools: CustomTool[]): Promise<void>;
616
- /**
617
- * Replace RPC host-owned tools and refresh the active tool set before the next model call.
618
- */
619
- refreshRpcHostTools(rpcTools: AgentTool[]): Promise<void>;
620
643
  /**
621
644
  * Refresh plugin sub-skill tools after workflow/sub-skill activation or phase changes.
622
645
  */
@@ -657,7 +680,25 @@ export declare class AgentSession {
657
680
  get scopedModels(): ReadonlyArray<ScopedModelSelection>;
658
681
  /** Prompt templates */
659
682
  getPlanModeState(): PlanModeState | undefined;
683
+ /** Live SDK configuration values exposed through the session query surface. */
684
+ getSdkConfigItems(): Record<string, string>;
660
685
  setPlanModeState(state: PlanModeState | undefined): void;
686
+ invokeSkill(name: string, args?: string): Promise<{
687
+ name: string;
688
+ path: string;
689
+ args?: string;
690
+ lineCount?: number;
691
+ }>;
692
+ setSdkPlanMode(on: boolean): PlanModeState | undefined;
693
+ operateGoal(op: "create" | "get" | "resume" | "pause" | "complete" | "drop", objective?: string): Promise<unknown>;
694
+ getTranscript(): Array<{
695
+ id: string;
696
+ role: string;
697
+ textSummary: string;
698
+ ts: string;
699
+ body: string;
700
+ }>;
701
+ getTranscriptBody(entryId: string): string | undefined;
661
702
  getGoalModeState(): GoalModeState | undefined;
662
703
  setGoalModeState(state: GoalModeState | undefined): void;
663
704
  getWorkflowGateEmitter(): WorkflowGateEmitter | undefined;
@@ -738,6 +779,7 @@ export declare class AgentSession {
738
779
  */
739
780
  sendUserMessage(content: string | (TextContent | ImageContent)[], options?: {
740
781
  deliverAs?: "steer" | "followUp";
782
+ onPreflightAccepted?: () => void;
741
783
  }): Promise<void>;
742
784
  /**
743
785
  * Clear queued messages and return them.
@@ -749,6 +791,12 @@ export declare class AgentSession {
749
791
  };
750
792
  /** Number of pending messages (includes steering, follow-up, and next-turn messages) */
751
793
  get queuedMessageCount(): number;
794
+ /** Typed pending-message counts per queue (steering, follow-up, next-turn). */
795
+ get pendingMessageCounts(): {
796
+ steering: number;
797
+ followUp: number;
798
+ nextTurn: number;
799
+ };
752
800
  /** Whether the agent has queued steering messages that a `user_interrupt`
753
801
  * abort would resume into (steer-on-interrupt). Drives the Esc-on-steer UX:
754
802
  * the first Esc consumes the steer and auto-continues, a second Esc aborts. */
@@ -779,6 +827,14 @@ export declare class AgentSession {
779
827
  getTodoPhases(): TodoPhase[];
780
828
  setTodoPhases(phases: TodoPhase[]): void;
781
829
  applyCompactionPostAppendForTests(compactionEntryId: string, firstKeptEntryId: string, fromExtension?: boolean): Promise<CompactionEntry | undefined>;
830
+ /** Read-only test seam for active mid-run EventStream drain barriers. */
831
+ get activeMidRunBarrierCountForTests(): number;
832
+ /** Read-only test seam for active mid-run maintenance invocations. */
833
+ get activeMidRunMaintenanceCountForTests(): number;
834
+ /** Test seam: drive the cooperative mid-run maintenance checkpoint directly. */
835
+ runMidRunMaintenanceForTests(context: AgentContext, lifecycle?: MidRunMaintenanceLifecycle): Promise<MidRunMaintenanceOutcome>;
836
+ /** Test seam: estimate mid-run context tokens for a given context view. */
837
+ estimateMidRunContextTokensForTests(messages: readonly AgentMessage[]): number;
782
838
  /**
783
839
  * Abort current operation and wait for agent to become idle.
784
840
  */
@@ -824,9 +880,28 @@ export declare class AgentSession {
824
880
  setModel(model: Model, role?: string, options?: {
825
881
  selector?: string;
826
882
  thinkingLevel?: ThinkingLevel;
883
+ cause?: ModelChangeCause;
827
884
  }): Promise<void>;
828
885
  setActiveModelProfile(name: string | undefined): void;
829
886
  getActiveModelProfile(): string | undefined;
887
+ /** Return the persisted configured fallback selectors for a model role. */
888
+ getConfiguredModelChain(role: string): readonly string[] | undefined;
889
+ /** Persist the configured fallback selectors for a model role. */
890
+ setConfiguredModelChain(role: string, entries: readonly string[], origin: string, identity?: string, explicitHead?: boolean): void;
891
+ /**
892
+ * Replace only the in-memory default fallback controller. Used when startup
893
+ * falls through an unavailable persisted chain to the global default, which
894
+ * must not mutate the persisted configured intent.
895
+ */
896
+ setDefaultFallbackRuntimeModel(selector: string): void;
897
+ /**
898
+ * Seed default fallback state after guarded auth-aware model resolution skips chain entries.
899
+ * The configured chain's role, origin, and identity are retained by the controller.
900
+ */
901
+ seedDefaultFallbackResolution(activeIndex: number, skips: Array<{
902
+ selector: string;
903
+ reason: string;
904
+ }>): void;
830
905
  /**
831
906
  * The model selector ("provider/id") that resume restores as the session
832
907
  * default — the latest session-log `model_change` with role="default".
@@ -858,7 +933,13 @@ export declare class AgentSession {
858
933
  */
859
934
  setModelTemporary(model: Model, thinkingLevel?: ThinkingLevel, options?: {
860
935
  persistAsSessionDefault?: boolean;
861
- }): Promise<void>;
936
+ cause?: ModelChangeCause;
937
+ reason?: TemporaryModelReason;
938
+ providerSessionScope?: TemporaryProviderSessionScope;
939
+ signal?: AbortSignal;
940
+ }): Promise<TemporaryProviderSessionScope | void>;
941
+ /** Set a durable per-session model from a control surface without exposing credential errors. */
942
+ setModelTemporaryForControl(model: Model, expectedSessionId?: string): Promise<boolean>;
862
943
  setDefaultModelSelection(model: Model, thinkingLevel: ThinkingLevel | undefined): Promise<DefaultModelSelectionResult>;
863
944
  /**
864
945
  * Cycle to next/previous model.
@@ -885,6 +966,17 @@ export declare class AgentSession {
885
966
  * Saves the effective metadata-clamped level to the session, and to settings when requested.
886
967
  */
887
968
  setThinkingLevel(level: ThinkingLevel | undefined, persist?: boolean): void;
969
+ /**
970
+ * Set thinking level from a control surface. Global changes are durable or rolled back.
971
+ */
972
+ setThinkingLevelForControl(level: ThinkingLevel, persist: boolean): Promise<void>;
973
+ getThinkingScopeForControl(): "session" | "global config";
974
+ getThinkingVisibility(): "visible" | "hidden";
975
+ setThinkingVisibility(visibility: "visible" | "hidden", persist?: boolean): void;
976
+ /**
977
+ * Set thinking visibility from a control surface. Global changes are durable or rolled back.
978
+ */
979
+ setThinkingVisibilityForControl(visibility: "visible" | "hidden", persist: boolean): Promise<void>;
888
980
  /**
889
981
  * Cycle to next thinking level.
890
982
  * @returns New level, or undefined if model doesn't support thinking
@@ -1190,6 +1282,7 @@ export declare class AgentSession {
1190
1282
  estimateCount: number;
1191
1283
  };
1192
1284
  fetchUsageReports(signal?: AbortSignal): Promise<UsageReport[] | null>;
1285
+ fetchUsageReportsForControl(): Promise<UsageReport[] | null>;
1193
1286
  /**
1194
1287
  * Export session to HTML.
1195
1288
  * @param outputPath Optional output path (defaults to session directory)
@@ -0,0 +1,25 @@
1
+ import type { ResolvedThinkingLevel } from "@gajae-code/agent-core";
2
+ export type DefaultModelSelectionRollbackStage = "durable" | "session" | "live";
3
+ export declare const DEFAULT_MODEL_SELECTION_RECOVERY_MESSAGE = "Default model selection could not be completed after durable selection.";
4
+ export type DefaultModelSelectionRecovery = {
5
+ readonly message: string;
6
+ readonly rollback: {
7
+ readonly disposition: "restored" | "partial" | "unknown";
8
+ readonly failures: readonly {
9
+ readonly stage: DefaultModelSelectionRollbackStage;
10
+ readonly message: string;
11
+ }[];
12
+ };
13
+ };
14
+ export interface DefaultModelSelectionResult {
15
+ readonly provider: string;
16
+ readonly modelId: string;
17
+ readonly thinkingLevel: ResolvedThinkingLevel;
18
+ }
19
+ export declare function parseDefaultModelSelectionRecovery(value: unknown): DefaultModelSelectionRecovery | undefined;
20
+ export declare class DefaultModelSelectionRecoveryError extends Error {
21
+ readonly name = "DefaultModelSelectionRecoveryError";
22
+ readonly code = "default_model_selection_recovery";
23
+ readonly recovery: DefaultModelSelectionRecovery;
24
+ constructor(_message: string, recovery: DefaultModelSelectionRecovery);
25
+ }
@@ -0,0 +1,52 @@
1
+ export type FallbackTriggerClass = "rate_limit" | "quota" | "auth" | "server" | "other";
2
+ /** Immutable configured fallback intent. Transient attempt state never belongs here. */
3
+ export interface ConfiguredFallbackChain {
4
+ role: string;
5
+ entries: readonly string[];
6
+ origin: string;
7
+ identity?: string;
8
+ explicitHead: boolean;
9
+ }
10
+ export interface FallbackFailure {
11
+ selector: string;
12
+ triggerClass: FallbackTriggerClass;
13
+ reason: string;
14
+ }
15
+ export type FallbackFailureResult = "retry" | "advance" | "exhausted";
16
+ /**
17
+ * In-memory policy state for one fallback-chain scope. A controller is deliberately
18
+ * not serializable: configured chain intent is durable, current position is not.
19
+ */
20
+ export declare class FallbackChainController {
21
+ #private;
22
+ readonly chain: ConfiguredFallbackChain;
23
+ readonly maxAttempts: number;
24
+ activeIndex: number;
25
+ attemptsUsed: number;
26
+ tried: FallbackFailure[];
27
+ skips: Array<{
28
+ selector: string;
29
+ reason: string;
30
+ }>;
31
+ exhaustedForTurn: boolean;
32
+ constructor(chain: ConfiguredFallbackChain, maxAttempts: number);
33
+ currentSelector(): string | undefined;
34
+ onResolutionSkip(reason: string): boolean;
35
+ /** Charge an upstream request at its concrete transport boundary. */
36
+ onAttemptStarted(): void;
37
+ /** Start a logically new request without losing its sticky selected entry. */
38
+ resetAttemptBudget(): void;
39
+ /** Seed a controller from auth-aware resolution without charging requests. */
40
+ seedResolution(activeIndex: number, skips: Array<{
41
+ selector: string;
42
+ reason: string;
43
+ }>): void;
44
+ onAttemptFailure(triggerClass: FallbackTriggerClass, reason: string): FallbackFailureResult;
45
+ advance(): boolean;
46
+ isExhausted(): boolean;
47
+ resetForNewTurn(): void;
48
+ resetSticky(): void;
49
+ }
50
+ export declare function cappedExponentialWithFullJitter(baseDelayMs: number, maxDelayMs: number, attemptK: number, random?: () => number): number;
51
+ /** Retry-After is intentionally uncapped. */
52
+ export declare function effectiveFallbackDelay(baseDelayMs: number, maxDelayMs: number, attemptK: number, retryAfterMs: number | undefined, random?: () => number): number;
@@ -1,4 +1,5 @@
1
1
  import { type AgentMessage } from "@gajae-code/agent-core";
2
+ import type { ConfiguredModelChainEntry as SharedConfiguredModelChainEntry } from "@gajae-code/agent-core/compaction";
2
3
  import type { ImageContent, Message, MessageAttribution, ServiceTier, TextContent } from "@gajae-code/ai";
3
4
  import type { TtsrInjectionRecord } from "../export/ttsr";
4
5
  import { ArtifactManager } from "./artifacts";
@@ -97,6 +98,9 @@ export interface ModelChangeEntry extends SessionEntryBase {
97
98
  /** Effective thinking level when the change was recorded. */
98
99
  thinkingLevel?: string | null;
99
100
  }
101
+ /** Persisted configured fallback chain for one model role. */
102
+ export type ConfiguredModelChainEntry = SharedConfiguredModelChainEntry;
103
+ export type ConfiguredModelChain = Pick<ConfiguredModelChainEntry, "role" | "entries" | "origin" | "identity" | "explicitHead" | "cleared">;
100
104
  export interface ServiceTierChangeEntry extends SessionEntryBase {
101
105
  type: "service_tier_change";
102
106
  serviceTier: ServiceTier | null;
@@ -206,9 +210,27 @@ export interface CustomMessageEntry<T = unknown> extends SessionEntryBase {
206
210
  evictedContent?: EvictedContentMarker;
207
211
  }
208
212
  /** Session entry - has id/parentId for tree structure (returned by "read" methods in SessionManager) */
209
- export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ServiceTierChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | TtsrInjectionEntry | MCPToolSelectionEntry | SessionInitEntry | ModeChangeEntry;
213
+ export type SessionEntry = SessionMessageEntry | ThinkingLevelChangeEntry | ModelChangeEntry | ServiceTierChangeEntry | CompactionEntry | BranchSummaryEntry | CustomEntry | CustomMessageEntry | LabelEntry | TtsrInjectionEntry | MCPToolSelectionEntry | SessionInitEntry | ModeChangeEntry | ConfiguredModelChainEntry;
210
214
  /** Raw file entry (includes header) */
211
215
  export type FileEntry = SessionHeader | SessionEntry;
216
+ export type DefaultModelSelectionStage = {
217
+ readonly entryRevision: number;
218
+ readonly headerExportRevision: number;
219
+ readonly sessionId: string;
220
+ readonly sessionFile: string | undefined;
221
+ readonly entries: readonly FileEntry[];
222
+ readonly tempPath: string | undefined;
223
+ readonly persistsToExistingFile: boolean;
224
+ };
225
+ export type DefaultModelSelectionPromotion = {
226
+ readonly kind: "promoted";
227
+ } | {
228
+ readonly kind: "not_promoted";
229
+ readonly error?: Error;
230
+ } | {
231
+ readonly kind: "unknown";
232
+ readonly error: Error;
233
+ };
212
234
  /** Tree node for getTree() - defensive copy of session structure */
213
235
  export interface SessionTreeNode {
214
236
  entry: SessionEntry;
@@ -222,6 +244,8 @@ export interface SessionContext {
222
244
  serviceTier?: ServiceTier;
223
245
  /** Model roles: { default: "provider/modelId", small: "provider/modelId", ... } */
224
246
  models: Record<string, string>;
247
+ /** Configured fallback chains for model roles on the active branch. */
248
+ configuredModelChains: Record<string, ConfiguredModelChain>;
225
249
  /** Names of TTSR rules that have been injected this session */
226
250
  injectedTtsrRules: string[];
227
251
  /** Rich TTSR rule injection records for repeat resume. */
@@ -269,6 +293,21 @@ export interface StrictSessionOpenFailure {
269
293
  kind: "error";
270
294
  reason: ResumeTailError["reason"] | "identity-mismatch";
271
295
  }
296
+ /** Exact transcript bytes and authority captured from one descriptor-bound read. */
297
+ export interface CapturedSessionTranscriptSnapshot {
298
+ sourcePath: string;
299
+ identity: ResumeSessionIdentity;
300
+ content: Uint8Array;
301
+ storage: SessionStorage;
302
+ }
303
+ export type StrictSessionCaptureResult = {
304
+ kind: "captured";
305
+ snapshot: CapturedSessionTranscriptSnapshot;
306
+ } | ResumeTailError;
307
+ export type StrictSessionForkResult = {
308
+ kind: "forked";
309
+ manager: SessionManager;
310
+ } | StrictSessionOpenFailure;
272
311
  /** Result of opening an inspected session without create-or-rewrite fallback. */
273
312
  export type StrictSessionOpenResult = StrictSessionOpenSuccess | StrictSessionOpenFailure;
274
313
  export interface SessionInfo {
@@ -410,6 +449,7 @@ interface SessionManagerStateSnapshot {
410
449
  titleSource: "auto" | "user" | undefined;
411
450
  sessionFile: string | undefined;
412
451
  flushed: boolean;
452
+ ensuredOnDisk: boolean;
413
453
  needsFullRewriteOnNextPersist: boolean;
414
454
  fileEntries: FileEntry[];
415
455
  materializedFileEntries: FileEntry[];
@@ -459,6 +499,11 @@ export declare class SessionManager {
459
499
  */
460
500
  moveTo(newCwd: string): Promise<void>;
461
501
  isPersisted(): boolean;
502
+ stageDefaultModelSelection(model: string, thinkingLevel: string | undefined, options?: {
503
+ readonly appendThinkingLevel: boolean;
504
+ }): Promise<DefaultModelSelectionStage>;
505
+ promoteDefaultModelSelection(stage: DefaultModelSelectionStage): DefaultModelSelectionPromotion;
506
+ discardDefaultModelSelectionStage(stage: DefaultModelSelectionStage): Promise<void>;
462
507
  /**
463
508
  * Force-persist all current entries to disk, even when no assistant message exists yet.
464
509
  * Used by ACP mode where session/new must create a discoverable session immediately.
@@ -543,6 +588,8 @@ export declare class SessionManager {
543
588
  */
544
589
  setSessionName(name: string, source?: "auto" | "user"): Promise<boolean>;
545
590
  _persist(entry: SessionEntry): void;
591
+ /** Append a configured fallback chain as child of current leaf, then advance leaf. Returns entry id. */
592
+ appendConfiguredModelChain(chain: ConfiguredModelChain): string;
546
593
  /** Append a message as child of current leaf, then advance leaf. Returns entry id.
547
594
  * Does not allow writing CompactionSummaryMessage and BranchSummaryMessage directly.
548
595
  * Reason: we want these to be top-level entries in the session, not message session entries,
@@ -713,6 +760,8 @@ export declare class SessionManager {
713
760
  * Resolve the canonical default session directory for a cwd.
714
761
  */
715
762
  static getDefaultSessionDir(cwd: string, agentDir?: string, storage?: SessionStorage): string;
763
+ /** Resolve the default session directory without creating or migrating storage. */
764
+ static getDefaultSessionDirReadOnly(cwd: string, agentDir?: string): string;
716
765
  /**
717
766
  * Create a new session.
718
767
  * @param cwd Working directory (stored in session header)
@@ -734,6 +783,14 @@ export declare class SessionManager {
734
783
  * List sessions for the resume picker without recovery or other maintenance writes.
735
784
  */
736
785
  static listForResumePickerReadOnly(cwd: string, sessionDir?: string, storage?: SessionStorage): Promise<SessionInfo[]>;
786
+ /** Capture exact source content for a strict fork without granting write ownership. */
787
+ static captureTranscriptStrict(filePath: string, storage?: SessionStorage): StrictSessionCaptureResult;
788
+ /**
789
+ * Fork strictly from captured source bytes. The source pathname is used only to
790
+ * revalidate captured authority before destination initialization and transcript
791
+ * persistence; destination history always comes from the captured bytes.
792
+ */
793
+ static forkFromCaptured(snapshot: CapturedSessionTranscriptSnapshot, cwd: string, sessionDir?: string): Promise<StrictSessionForkResult>;
737
794
  /** Inspect a selected session without acquiring write-capable ownership. */
738
795
  static inspectSessionTailReadOnly(filePath: string, storage?: SessionStorage): Promise<ResumeTailInspection>;
739
796
  /**
@@ -2,9 +2,40 @@ import type { AuthCredentialIfAbsentReason, AuthCredentialIfAbsentSnapshotResult
2
2
  import type { ModelRegistry } from "../config/model-registry";
3
3
  import { type CredentialDiscoveryResult, type CredentialOrigin, type DiscoveryOptions, type ImportableCredential } from "./credential-import";
4
4
  export declare const CREDENTIAL_AUTO_IMPORT_ROTATION_WARNING = "Refreshing in gjc may log out the Claude/Codex CLI because OAuth refresh tokens can rotate.";
5
+ export declare const CREDENTIAL_AUTO_IMPORT_PERSISTENCE_WARNING = "Credential import preference could not be saved; external credentials may be offered again.";
6
+ export declare const CREDENTIAL_AUTO_IMPORT_REFRESH_WARNING = "Imported credentials were saved, but provider availability could not be refreshed.";
7
+ export declare const CREDENTIAL_AUTO_IMPORT_DISCOVERY_WARNING = "External credential discovery could not be completed. Use /provider to import credentials manually.";
8
+ export declare const CREDENTIAL_AUTO_IMPORT_RETRY_WARNING = "Some external credentials could not be imported. Use /provider to retry.";
9
+ export declare const CREDENTIAL_AUTO_IMPORT_STATE_UNREADABLE_WARNING = "Credential import preference could not be read. External credential discovery was skipped; use /provider to import credentials manually.";
5
10
  export type CredentialAutoImportSourceLabel = "claude-code-file" | "claude-code-keychain" | "codex-file";
6
11
  export type CredentialAutoImportTrigger = "startup" | "bare-login" | "setup-cli";
12
+ export type InitialImportResolution = "accepted" | "declined";
13
+ export type CredentialAutoImportStateProblem = "invalid-initial-import-resolution" | "invalid-last-import-version" | "malformed-json" | "malformed-root";
14
+ export interface CredentialAutoImportStateFile {
15
+ lastImportVersion?: string;
16
+ initialImportResolution?: InitialImportResolution;
17
+ }
18
+ export interface CredentialAutoImportStateReadResult {
19
+ state: CredentialAutoImportStateFile;
20
+ problems: CredentialAutoImportStateProblem[];
21
+ unreadable: boolean;
22
+ }
23
+ export interface CredentialAutoImportStateMutation {
24
+ lastImportVersion?: string;
25
+ initialImportResolution?: InitialImportResolution;
26
+ }
27
+ export interface CredentialAutoImportStateStore {
28
+ read: () => Promise<CredentialAutoImportStateReadResult>;
29
+ write: (mutation: CredentialAutoImportStateMutation) => Promise<boolean>;
30
+ }
31
+ export interface CredentialAutoImportStateStoreDependencies {
32
+ withFileLock?: <T>(filePath: string, transaction: () => Promise<T>) => Promise<T>;
33
+ rename?: (oldPath: string, newPath: string) => Promise<void>;
34
+ }
7
35
  export declare function getCredentialAutoImportStatePath(agentDir?: string): string;
36
+ export declare function createCredentialAutoImportStateStore(agentDir?: string, dependencies?: CredentialAutoImportStateStoreDependencies): CredentialAutoImportStateStore;
37
+ export declare function readCredentialAutoImportState(agentDir?: string): Promise<CredentialAutoImportStateReadResult>;
38
+ export declare function isCredentialAutoImportStateResolvedForVersion(state: CredentialAutoImportStateFile, version: string): boolean;
8
39
  export declare function readCredentialImportMarker(agentDir?: string): Promise<string | undefined>;
9
40
  export declare function writeCredentialImportMarker(version: string, agentDir?: string): Promise<boolean>;
10
41
  export declare enum CredentialAutoImportFailureClass {
@@ -37,6 +68,9 @@ export interface CredentialAutoImportResult {
37
68
  discovery?: CredentialDiscoveryResult;
38
69
  globalDiscoveryFailure?: CredentialAutoImportFailure;
39
70
  }
71
+ export declare function formatCredentialAutoImportCandidateLabel(candidate: Pick<ImportableCredential, "provider" | "origin">): string;
72
+ export declare function formatCredentialAutoImportPrompt(candidates: readonly Pick<ImportableCredential, "provider" | "origin">[]): string;
73
+ export declare function logCredentialAutoImportFailures(trigger: CredentialAutoImportTrigger, failures: readonly Pick<CredentialAutoImportFailure, "failureClass">[]): void;
40
74
  export type CredentialAutoImportAuthStorage = Pick<AuthStorage, "importCredentialIfAbsent">;
41
75
  export interface CredentialAutoImportOptions {
42
76
  authStorage: CredentialAutoImportAuthStorage;
@@ -48,16 +82,12 @@ export interface CredentialAutoImportOptions {
48
82
  export declare function runExternalCredentialAutoImport({ authStorage, discover, discoveryOptions, }: CredentialAutoImportOptions): Promise<CredentialAutoImportResult>;
49
83
  export declare function buildCredentialAutoImportNotice(result: Pick<CredentialAutoImportResult, "imported">): string | undefined;
50
84
  export declare function formatCredentialAutoImportResult(result: CredentialAutoImportResult): string[];
51
- export interface CredentialImportMarkerStore {
52
- read: () => Promise<string | undefined> | string | undefined;
53
- write: (version: string) => Promise<boolean> | boolean;
54
- }
55
85
  export interface StartupCredentialAutoImportOptions {
56
86
  authStorage: CredentialAutoImportOptions["authStorage"];
57
87
  modelRegistry: Pick<ModelRegistry, "refresh">;
58
88
  discover?: CredentialAutoImportOptions["discover"];
59
89
  version?: string;
60
90
  agentDir?: string;
61
- markerStore?: CredentialImportMarkerStore;
91
+ stateStore?: CredentialAutoImportStateStore;
62
92
  }
63
- export declare function runStartupCredentialAutoImportIfNeeded({ authStorage: activeAuthStorage, modelRegistry: activeModelRegistry, discover, version, agentDir, markerStore, }: StartupCredentialAutoImportOptions): Promise<string | undefined>;
93
+ export declare function runStartupCredentialAutoImportIfNeeded({ authStorage: activeAuthStorage, modelRegistry: activeModelRegistry, discover, version, agentDir, stateStore, }: StartupCredentialAutoImportOptions): Promise<string | undefined>;
@@ -6,7 +6,7 @@
6
6
  * through the extension/runner/controller wiring. A session has at most one
7
7
  * source; registering returns a disposer.
8
8
  */
9
- import type { WorkflowGateEmitter } from "../modes/shared/agent-wire/unattended-session";
9
+ import type { WorkflowGateEmitter } from "../modes/shared/agent-wire/workflow-gate-broker";
10
10
  import type { AskAnswerSource } from "./index";
11
11
  /** Register `source` for `sessionId`. Returns a disposer that clears it. */
12
12
  export declare function registerAskAnswerSource(sessionId: string, source: AskAnswerSource): () => void;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Offline stealth-detector benchmark model.
3
+ *
4
+ * Pure, deterministic logic for the anti-detection benchmark suite: it converts
5
+ * a browser-collected fingerprint probe into a normalized per-detector verdict,
6
+ * implements the falsifiable CI gate (see plan Phase 1 / R-T3), and renders a
7
+ * before/after report. No browser or network access lives here so it can be
8
+ * unit-tested deterministically; the harness that drives the real browser tool
9
+ * against vendored detector fixtures feeds its output into these functions.
10
+ */
11
+ export type SignalStatus = "pass" | "fail";
12
+ /** A single boolean fingerprint signal, e.g. "navigator.webdriver is undefined". */
13
+ export interface DetectorSignal {
14
+ /** Stable identifier, used to diff across runs. */
15
+ id: string;
16
+ /** Human-readable label for the report. */
17
+ label: string;
18
+ /** `pass` means the signal looks human; `fail` means it leaks automation. */
19
+ status: SignalStatus;
20
+ /** Optional observed value for debugging. */
21
+ detail?: string;
22
+ }
23
+ export type AutomatedVerdict = "human" | "bot" | "unknown";
24
+ /** Normalized result for one detector (e.g. bot.sannysoft, CreepJS). */
25
+ export interface DetectorResult {
26
+ detector: string;
27
+ signals: DetectorSignal[];
28
+ /** Overall automated/not classification when the detector exposes one. */
29
+ automatedVerdict: AutomatedVerdict;
30
+ /** Absolute trust score (observability-only, never a hard gate). */
31
+ trustScore: number | null;
32
+ }
33
+ /** Shape emitted by the offline probe fixture on `window.__stealthProbe`. */
34
+ export interface RawProbe {
35
+ detector: string;
36
+ signals: Array<{
37
+ id: string;
38
+ label: string;
39
+ pass: boolean;
40
+ detail?: string;
41
+ }>;
42
+ automatedVerdict?: AutomatedVerdict;
43
+ trustScore?: number | null;
44
+ }
45
+ /** Convert a raw browser-collected probe into a normalized {@link DetectorResult}. */
46
+ export declare function parseProbe(raw: RawProbe): DetectorResult;
47
+ export interface GateOutcome {
48
+ pass: boolean;
49
+ reasons: string[];
50
+ }
51
+ /**
52
+ * Falsifiable CI gate (plan Phase 1 / R-T3, R-C1, R-C2):
53
+ * (a) zero failing signals in the current run, AND
54
+ * current pass-count >= baseline pass-count (no silent regression), AND
55
+ * (b) either at least one signal that failed at baseline now passes,
56
+ * OR the baseline was already all-green (empty-gap regression lock).
57
+ * The absolute `trustScore` is never consulted here; it is observability-only.
58
+ */
59
+ export declare function evaluateGate(baseline: DetectorResult, current: DetectorResult): GateOutcome;
60
+ /** Aggregate gate across every detector; passes only when all detectors pass. */
61
+ export declare function evaluateSuiteGate(baseline: readonly DetectorResult[], current: readonly DetectorResult[]): GateOutcome;
62
+ /** Render a deterministic before/after markdown report for one run. */
63
+ export declare function renderReport(baseline: readonly DetectorResult[], current: readonly DetectorResult[]): string;