@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
@@ -0,0 +1,435 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import {
4
+ NOTIFICATIONS_SETTINGS_SHOWCASE_ENTRIES,
5
+ NOTIFICATIONS_SETTINGS_SHOWCASE_EXPECTED_ENTRY_COUNT,
6
+ NOTIFICATIONS_SETTINGS_SHOWCASE_STATE_IDS,
7
+ NOTIFICATIONS_SETTINGS_SHOWCASE_TARGETED_UNICODE_VARIANTS,
8
+ NOTIFICATIONS_SETTINGS_SHOWCASE_VIEWPORTS,
9
+ type NotificationsSettingsShowcaseEntry,
10
+ renderNotificationsSettingsShowcase,
11
+ } from "../test/fixtures/tui/notifications-settings-showcase";
12
+
13
+ const CANONICAL_COMMAND =
14
+ "bun packages/coding-agent/scripts/capture-notifications-settings-showcase.ts --output .gjc/qa/issue-2050-notifications";
15
+ const DETERMINISTIC_CAPTURE_TIMESTAMP = "1970-01-01T00:00:00.000Z";
16
+ const CAPTURE_TOOL_VERSION = "notifications-settings-showcase-live-settings-selector-v3";
17
+
18
+ interface ArtifactFile {
19
+ path: string;
20
+ sha256: string;
21
+ byte_length: number;
22
+ }
23
+
24
+ interface ManifestEntry {
25
+ key: string;
26
+ state_id: string;
27
+ viewport: {
28
+ id: string;
29
+ columns: number;
30
+ rows: number;
31
+ };
32
+ render_mode: string;
33
+ capture_mode: "live-settings-selector";
34
+ files: ArtifactFile[];
35
+ }
36
+
37
+ interface VisualReviewInput {
38
+ schema_version: 1;
39
+ manifest_sha256: string;
40
+ expected_manifest_entries: number;
41
+ evidence_scope: {
42
+ component_surface: string;
43
+ operations_boundary: string;
44
+ external_effects: string;
45
+ };
46
+ reviewer_output_file: "independent-review.json";
47
+ review_requirements: string[];
48
+ required_feature_cases: Array<{
49
+ id: string;
50
+ entry_key: string;
51
+ focus: string;
52
+ }>;
53
+ }
54
+
55
+ function usage(): never {
56
+ throw new Error(`Usage: ${CANONICAL_COMMAND}`);
57
+ }
58
+
59
+ function parseOutputPath(args: string[]): string {
60
+ if (args.length !== 2 || args[0] !== "--output" || !args[1]) usage();
61
+ return args[1];
62
+ }
63
+
64
+ function json(value: unknown): string {
65
+ return `${JSON.stringify(value, null, 2)}\n`;
66
+ }
67
+
68
+ function sha256(text: string): string {
69
+ return new Bun.CryptoHasher("sha256").update(text).digest("hex");
70
+ }
71
+
72
+ function escapeHtml(text: string): string {
73
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
74
+ }
75
+
76
+ type AnsiStyle = {
77
+ foreground?: string;
78
+ background?: string;
79
+ bold?: boolean;
80
+ dim?: boolean;
81
+ italic?: boolean;
82
+ underline?: boolean;
83
+ inverse?: boolean;
84
+ };
85
+
86
+ const ANSI_COLORS: Record<number, string> = {
87
+ 30: "#000000",
88
+ 31: "#cc0000",
89
+ 32: "#4e9a06",
90
+ 33: "#c4a000",
91
+ 34: "#3465a4",
92
+ 35: "#75507b",
93
+ 36: "#06989a",
94
+ 37: "#d3d7cf",
95
+ 90: "#555753",
96
+ 91: "#ef2929",
97
+ 92: "#8ae234",
98
+ 93: "#fce94f",
99
+ 94: "#729fcf",
100
+ 95: "#ad7fa8",
101
+ 96: "#34e2e2",
102
+ 97: "#eeeeec",
103
+ };
104
+
105
+ function ansi256Color(index: number): string {
106
+ if (index < 16) return ANSI_COLORS[index < 8 ? index + 30 : index + 82] ?? "#ffffff";
107
+ if (index >= 232) {
108
+ const value = (index - 232) * 10 + 8;
109
+ return `rgb(${value},${value},${value})`;
110
+ }
111
+ const value = index - 16;
112
+ const red = Math.floor(value / 36);
113
+ const green = Math.floor((value % 36) / 6);
114
+ const blue = value % 6;
115
+ const channel = (component: number) => (component === 0 ? 0 : component * 40 + 55);
116
+ return `rgb(${channel(red)},${channel(green)},${channel(blue)})`;
117
+ }
118
+
119
+ function styleAttribute(style: AnsiStyle): string {
120
+ const declarations: string[] = [];
121
+ if (style.foreground) declarations.push(`color:${style.foreground}`);
122
+ if (style.background) declarations.push(`background-color:${style.background}`);
123
+ if (style.bold) declarations.push("font-weight:700");
124
+ if (style.dim) declarations.push("opacity:.65");
125
+ if (style.italic) declarations.push("font-style:italic");
126
+ if (style.underline) declarations.push("text-decoration:underline");
127
+ if (style.inverse) declarations.push("filter:invert(1)");
128
+ return declarations.join(";");
129
+ }
130
+
131
+ const NON_VISUAL_TERMINAL_CONTROL = /\x1b_[^\x1b\x07]*(?:\x07|\x1b\\)/g;
132
+
133
+ /** Render the SGR styles emitted by the live editor without retaining raw control codes in HTML. */
134
+ function ansiToHtml(text: string): string {
135
+ const visibleText = text.replace(NON_VISUAL_TERMINAL_CONTROL, "");
136
+ const sgr = /\x1b\[([0-9;]*)m/g;
137
+ let html = "";
138
+ let offset = 0;
139
+ let spanOpen = false;
140
+ let style: AnsiStyle = {};
141
+ const close = () => {
142
+ if (!spanOpen) return;
143
+ html += "</span>";
144
+ spanOpen = false;
145
+ };
146
+ const open = () => {
147
+ const attribute = styleAttribute(style);
148
+ if (!attribute) return;
149
+ html += `<span style="${attribute}">`;
150
+ spanOpen = true;
151
+ };
152
+
153
+ for (const match of visibleText.matchAll(sgr)) {
154
+ html += escapeHtml(visibleText.slice(offset, match.index));
155
+ offset = (match.index ?? 0) + match[0].length;
156
+ close();
157
+ const codes = (match[1] || "0").split(";").map(Number);
158
+ for (let index = 0; index < codes.length; index += 1) {
159
+ const code = codes[index];
160
+ if (code === 0) style = {};
161
+ else if (code === 1) style.bold = true;
162
+ else if (code === 2) style.dim = true;
163
+ else if (code === 3) style.italic = true;
164
+ else if (code === 4) style.underline = true;
165
+ else if (code === 7) style.inverse = true;
166
+ else if (code === 22) {
167
+ style.bold = false;
168
+ style.dim = false;
169
+ } else if (code === 23) style.italic = false;
170
+ else if (code === 24) style.underline = false;
171
+ else if (code === 27) style.inverse = false;
172
+ else if (code === 39) style.foreground = undefined;
173
+ else if (code === 49) style.background = undefined;
174
+ else if (code in ANSI_COLORS) style.foreground = ANSI_COLORS[code];
175
+ else if (code >= 40 && code <= 47) style.background = ANSI_COLORS[code - 10];
176
+ else if (code >= 100 && code <= 107) style.background = ANSI_COLORS[code - 10];
177
+ else if (code === 38 || code === 48) {
178
+ const colorMode = codes[index + 1];
179
+ if (colorMode === 2) {
180
+ const red = codes[index + 2];
181
+ const green = codes[index + 3];
182
+ const blue = codes[index + 4];
183
+ if ([red, green, blue].every(Number.isInteger)) {
184
+ if (code === 38) style.foreground = `rgb(${red},${green},${blue})`;
185
+ else style.background = `rgb(${red},${green},${blue})`;
186
+ }
187
+ index += 4;
188
+ } else if (colorMode === 5 && Number.isInteger(codes[index + 2])) {
189
+ if (code === 38) style.foreground = ansi256Color(codes[index + 2]!);
190
+ else style.background = ansi256Color(codes[index + 2]!);
191
+ index += 2;
192
+ }
193
+ }
194
+ }
195
+ open();
196
+ }
197
+ close();
198
+ html += escapeHtml(visibleText.slice(offset));
199
+ return `<!doctype html>
200
+ <html lang="en">
201
+ <head>
202
+ <meta charset="utf-8">
203
+ <meta name="color-scheme" content="dark">
204
+ <title>Notifications settings showcase</title>
205
+ <style>body{margin:0;background:#110b0b;color:#ffe7dc}pre{margin:0;padding:1em;white-space:pre-wrap;font-family:ui-monospace,monospace;line-height:1.2}</style>
206
+ </head>
207
+ <body><pre>${html}</pre></body>
208
+ </html>
209
+ `;
210
+ }
211
+
212
+ const TELEGRAM_TOKEN_CANARY = /\d{6,}:[A-Za-z0-9_-]{20,}/;
213
+
214
+ function assertNoSecretCanary(artifacts: Readonly<Record<string, string>>): void {
215
+ for (const [name, content] of Object.entries(artifacts)) {
216
+ if (TELEGRAM_TOKEN_CANARY.test(content)) throw new Error(`Secret-shaped Telegram token found in ${name}`);
217
+ }
218
+ }
219
+
220
+ function validateShowcaseMatrix(entries: readonly NotificationsSettingsShowcaseEntry[]): void {
221
+ const expectedBaselineCount =
222
+ NOTIFICATIONS_SETTINGS_SHOWCASE_STATE_IDS.length * NOTIFICATIONS_SETTINGS_SHOWCASE_VIEWPORTS.length;
223
+ if (expectedBaselineCount !== 102) {
224
+ throw new Error(`Baseline matrix changed: expected 102 entries, received ${expectedBaselineCount}`);
225
+ }
226
+ if (entries.length !== NOTIFICATIONS_SETTINGS_SHOWCASE_EXPECTED_ENTRY_COUNT) {
227
+ throw new Error(
228
+ `Showcase matrix changed: expected ${NOTIFICATIONS_SETTINGS_SHOWCASE_EXPECTED_ENTRY_COUNT} entries, received ${entries.length}`,
229
+ );
230
+ }
231
+ const keys = new Set(entries.map(entry => entry.key));
232
+ if (keys.size !== entries.length) throw new Error("Showcase matrix contains duplicate entry keys");
233
+
234
+ for (const stateId of NOTIFICATIONS_SETTINGS_SHOWCASE_STATE_IDS) {
235
+ for (const viewport of NOTIFICATIONS_SETTINGS_SHOWCASE_VIEWPORTS) {
236
+ const key = `${stateId}/${viewport.id}/unicode-color`;
237
+ if (!keys.has(key)) throw new Error(`Showcase matrix is missing ${key}`);
238
+ }
239
+ }
240
+
241
+ const expectedAsciiKeys = new Set([
242
+ "home-configured-inactive/80x24/ascii-no-color",
243
+ "health-warning/80x24/ascii-no-color",
244
+ "foreign-blocked/120x36/ascii-no-color",
245
+ "confirmation-remove/80x24/ascii-no-color",
246
+ ]);
247
+ const actualAsciiKeys = entries.filter(entry => entry.renderMode === "ascii-no-color").map(entry => entry.key);
248
+ if (actualAsciiKeys.length !== expectedAsciiKeys.size || actualAsciiKeys.some(key => !expectedAsciiKeys.has(key))) {
249
+ throw new Error("Showcase matrix does not contain the required ASCII/no-color variants");
250
+ }
251
+
252
+ const expectedNarrowKeys = new Set(
253
+ NOTIFICATIONS_SETTINGS_SHOWCASE_TARGETED_UNICODE_VARIANTS.map(
254
+ variant => `${variant.stateId}/${variant.viewport.id}/unicode-color`,
255
+ ),
256
+ );
257
+ const actualNarrowKeys = entries
258
+ .filter(entry => entry.viewport.id === "48x36" && entry.renderMode === "unicode-color")
259
+ .map(entry => entry.key);
260
+ if (
261
+ actualNarrowKeys.length !== expectedNarrowKeys.size ||
262
+ actualNarrowKeys.some(key => !expectedNarrowKeys.has(key))
263
+ ) {
264
+ throw new Error("Showcase matrix does not contain the required narrow CJK and scroll variants");
265
+ }
266
+ }
267
+
268
+ async function writeArtifact(filePath: string, content: string, outputRoot: string): Promise<ArtifactFile> {
269
+ await Bun.write(filePath, content);
270
+ return {
271
+ path: path.relative(outputRoot, filePath).split(path.sep).join("/"),
272
+ sha256: sha256(content),
273
+ byte_length: Buffer.byteLength(content, "utf8"),
274
+ };
275
+ }
276
+
277
+ async function captureEntry(entry: NotificationsSettingsShowcaseEntry, outputRoot: string): Promise<ManifestEntry> {
278
+ const rendered = await renderNotificationsSettingsShowcase(entry);
279
+ const entryDirectory = path.join(outputRoot, entry.stateId, entry.viewport.id, entry.renderMode);
280
+ await fs.mkdir(entryDirectory, { recursive: true });
281
+
282
+ const terminalHtml = ansiToHtml(rendered.terminalAnsiText);
283
+ const metadata = json({
284
+ schema_version: 1,
285
+ entry_key: entry.key,
286
+ state_id: entry.stateId,
287
+ viewport: entry.viewport,
288
+ render_mode: entry.renderMode,
289
+ capture_mode: rendered.captureMode,
290
+ capture_timestamp: DETERMINISTIC_CAPTURE_TIMESTAMP,
291
+ command_or_replay_source: CANONICAL_COMMAND,
292
+ fixture_source: "packages/coding-agent/test/fixtures/tui/notifications-settings-showcase.ts",
293
+ tool_version: CAPTURE_TOOL_VERSION,
294
+ terminal: {
295
+ columns: entry.viewport.columns,
296
+ rows: entry.viewport.rows,
297
+ font_rendering_assumptions:
298
+ "Embedded red-claw theme at deterministic truecolor; HTML uses a monospace terminal fallback stack.",
299
+ wrapping_policy:
300
+ "SettingsSelectorComponent renders the Notifications tab; status labels remain on one line and status guidance wraps with ANSI-aware terminal-cell width handling.",
301
+ ansi_control_semantics:
302
+ "terminal-ansi.txt preserves emitted SGR sequences; terminal.txt and ascii-no-color captures strip them.",
303
+ },
304
+ selector_render: {
305
+ component: "SettingsSelectorComponent",
306
+ active_tab: rendered.selectorTab,
307
+ notifications_editor: "NotificationsSettingsEditorComponent",
308
+ operations: "deterministic in-memory NotificationsEditorOperations adapter; live components only",
309
+ fixed_clock_timestamp: rendered.fixedClockTimestamp,
310
+ navigation: rendered.navigation,
311
+ state: rendered.state,
312
+ },
313
+ });
314
+ assertNoSecretCanary({
315
+ "terminal.txt": rendered.terminalText,
316
+ "terminal-ansi.txt": rendered.terminalAnsiText,
317
+ "terminal.html": terminalHtml,
318
+ "metadata.json": metadata,
319
+ });
320
+
321
+ const files = await Promise.all([
322
+ writeArtifact(path.join(entryDirectory, "terminal.txt"), rendered.terminalText, outputRoot),
323
+ writeArtifact(path.join(entryDirectory, "terminal-ansi.txt"), rendered.terminalAnsiText, outputRoot),
324
+ writeArtifact(path.join(entryDirectory, "terminal.html"), terminalHtml, outputRoot),
325
+ writeArtifact(path.join(entryDirectory, "metadata.json"), metadata, outputRoot),
326
+ ]);
327
+
328
+ return {
329
+ key: entry.key,
330
+ state_id: entry.stateId,
331
+ viewport: entry.viewport,
332
+ render_mode: entry.renderMode,
333
+ capture_mode: rendered.captureMode,
334
+ files,
335
+ };
336
+ }
337
+
338
+ function visualReviewInput(manifestSha256: string): VisualReviewInput {
339
+ return {
340
+ schema_version: 1,
341
+ manifest_sha256: manifestSha256,
342
+ expected_manifest_entries: NOTIFICATIONS_SETTINGS_SHOWCASE_EXPECTED_ENTRY_COUNT,
343
+ evidence_scope: {
344
+ component_surface:
345
+ "Live SettingsSelectorComponent and NotificationsSettingsEditorComponent rendering and input routing.",
346
+ operations_boundary:
347
+ "Deterministic in-memory NotificationsEditorOperations adapter with fixed clock and no fixture filesystem I/O.",
348
+ external_effects: "No network, daemon, settings-file, or provider operation is invoked by this capture.",
349
+ },
350
+ reviewer_output_file: "independent-review.json",
351
+ review_requirements: [
352
+ "Inspect every manifest entry at its recorded viewport and render mode.",
353
+ "Confirm CJK wrapping, action-list position, and selected-row visibility in both 48x36 entries.",
354
+ "Confirm blocked restore/retain remains visible without resolving it in the rendered evidence.",
355
+ "Confirm no terminal, HTML, or metadata artifact contains a secret-shaped Telegram token.",
356
+ ],
357
+ required_feature_cases: [
358
+ {
359
+ id: "chat-entry",
360
+ entry_key: "setup-chat-entry/80x24/unicode-color",
361
+ focus: "Optional private-chat entry is focused before masked token entry.",
362
+ },
363
+ {
364
+ id: "preferences",
365
+ entry_key: "preferences/80x24/unicode-color",
366
+ focus: "Safe scalar preferences remain an unsaved draft until explicit save.",
367
+ },
368
+ {
369
+ id: "blocked-restore-retain",
370
+ entry_key: "blocked-restore-retain/120x36/unicode-color",
371
+ focus: "Both explicit CAS restore and retain-inactive choices remain visible.",
372
+ },
373
+ {
374
+ id: "no-health-load",
375
+ entry_key: "no-health-load/80x24/unicode-color",
376
+ focus: "Initial status/health failure is rendered with recovery controls still available.",
377
+ },
378
+ {
379
+ id: "narrow-cjk",
380
+ entry_key: "narrow-cjk/48x36/unicode-color",
381
+ focus: "Korean, Japanese, and Chinese guidance wraps without clipping wide characters.",
382
+ },
383
+ {
384
+ id: "narrow-scroll",
385
+ entry_key: "narrow-scroll/48x36/unicode-color",
386
+ focus: "The final home action and 11/11 list position remain visible in a narrow viewport.",
387
+ },
388
+ ],
389
+ };
390
+ }
391
+
392
+ async function main(): Promise<void> {
393
+ const outputRoot = path.resolve(parseOutputPath(process.argv.slice(2)));
394
+ validateShowcaseMatrix(NOTIFICATIONS_SETTINGS_SHOWCASE_ENTRIES);
395
+ await fs.mkdir(outputRoot, { recursive: true });
396
+
397
+ const entries: ManifestEntry[] = [];
398
+ for (const entry of NOTIFICATIONS_SETTINGS_SHOWCASE_ENTRIES) {
399
+ entries.push(await captureEntry(entry, outputRoot));
400
+ }
401
+
402
+ const manifest = json({
403
+ schema_version: 1,
404
+ capture_tool: CAPTURE_TOOL_VERSION,
405
+ capture_mode: "live-settings-selector",
406
+ command: CANONICAL_COMMAND,
407
+ expected_entry_count: NOTIFICATIONS_SETTINGS_SHOWCASE_EXPECTED_ENTRY_COUNT,
408
+ entry_count: entries.length,
409
+ matrix: {
410
+ canonical_state_ids: NOTIFICATIONS_SETTINGS_SHOWCASE_STATE_IDS,
411
+ viewports: NOTIFICATIONS_SETTINGS_SHOWCASE_VIEWPORTS,
412
+ baseline_render_mode: "unicode-color",
413
+ ascii_no_color_variant_count: 4,
414
+ targeted_unicode_variants: NOTIFICATIONS_SETTINGS_SHOWCASE_TARGETED_UNICODE_VARIANTS,
415
+ },
416
+ evidence_scope: {
417
+ component_surface:
418
+ "Live SettingsSelectorComponent and NotificationsSettingsEditorComponent rendering and input routing.",
419
+ operations_boundary:
420
+ "Deterministic in-memory NotificationsEditorOperations adapter with fixed clock and no fixture filesystem I/O.",
421
+ external_effects: "No network, daemon, settings-file, or provider operation is invoked by this capture.",
422
+ },
423
+ review_input_file: "visual-review-input.json",
424
+ entries,
425
+ });
426
+ const manifestSha256 = sha256(manifest);
427
+ await Bun.write(path.join(outputRoot, "manifest.json"), manifest);
428
+ await Bun.write(path.join(outputRoot, "visual-review-input.json"), json(visualReviewInput(manifestSha256)));
429
+
430
+ process.stdout.write(
431
+ `Captured ${entries.length} deterministic Notifications settings-selector showcase entries to ${outputRoot}\nmanifest.json sha256: ${manifestSha256}\nreview input: visual-review-input.json\n`,
432
+ );
433
+ }
434
+
435
+ await main();
@@ -26,7 +26,8 @@ export const releaseEntrypoints = [
26
26
  "./packages/coding-agent/src/tools/browser/tab-worker-entry.ts",
27
27
  "./packages/coding-agent/src/eval/js/worker-entry.ts",
28
28
  "./packages/natives/native/index.js",
29
- "./packages/coding-agent/src/notifications/telegram-daemon-cli.ts",
29
+ "./packages/coding-agent/src/sdk/bus/telegram-daemon-cli.ts",
30
+ "./packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts",
30
31
  // NOTE: models.json must NOT be listed here — `bun build --compile` does not
31
32
  // emit `.json` extra entrypoints into the bunfs. It is embedded via the
32
33
  // `with { type: "file" }` import in packages/ai/src/models.ts instead.
@@ -41,7 +42,8 @@ export const devEntrypoints = [
41
42
  "../stats/src/sync-worker.ts",
42
43
  "./src/tools/browser/tab-worker-entry.ts",
43
44
  "./src/eval/js/worker-entry.ts",
44
- "./src/notifications/telegram-daemon-cli.ts",
45
+ "./src/sdk/bus/telegram-daemon-cli.ts",
46
+ "./src/sdk/bus/chat-daemon-cli.ts",
45
47
  ];
46
48
 
47
49
  export function buildReleaseCompileArgs(target: string, outfile: string): string[] {
@@ -7,7 +7,6 @@
7
7
  // GJC-tagged tmux session and a `session_close` frame into a real hard-close,
8
8
  // with idempotent re-ack. Not part of the unit suite.
9
9
  import assert from "node:assert";
10
- import * as crypto from "node:crypto";
11
10
  import * as fs from "node:fs";
12
11
  import * as os from "node:os";
13
12
  import * as path from "node:path";
@@ -18,14 +17,14 @@ import {
18
17
  resolveGjcTmuxCommand,
19
18
  } from "../src/gjc-runtime/tmux-common";
20
19
  import { forceCloseGjcTmuxSession, statusGjcTmuxSession } from "../src/gjc-runtime/tmux-sessions";
21
- import type { SessionCloseFrame, SessionCreateFrame } from "../src/notifications/index";
20
+ import type { SessionCloseFrame, SessionCreateFrame } from "../src/sdk/bus/index";
22
21
  import {
23
22
  type AuditEvent,
24
23
  handleLifecycleRequest,
25
24
  type LedgerDoc,
26
25
  type LedgerStore,
27
26
  type OrchestratorDeps,
28
- } from "../src/notifications/lifecycle-orchestrator";
27
+ } from "../src/sdk/bus/lifecycle-orchestrator";
29
28
 
30
29
  const tmux = resolveGjcTmuxCommand(process.env);
31
30
  const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "gjc-g005-"));
@@ -62,6 +61,8 @@ const store: LedgerStore = {
62
61
  const auditLines: AuditEvent[] = [];
63
62
  const deps: OrchestratorDeps = {
64
63
  pairedChatId: "42",
64
+ auditRedactionKey: new Uint8Array(32).fill(5),
65
+ isPsmuxProvider: () => false,
65
66
  now: () => Date.now(),
66
67
  store,
67
68
  audit: e => {
@@ -104,8 +105,6 @@ const deps: OrchestratorDeps = {
104
105
  return { processGone: !exists(target.tmuxSession ?? "") };
105
106
  },
106
107
  resumeSession: async () => ({ ambiguous: [] }),
107
- newLifecycleRequestId: () => `lc-${crypto.randomUUID()}`,
108
- newSessionId: () => `s${crypto.randomUUID().slice(0, 8)}`,
109
108
  };
110
109
 
111
110
  const createFrame: SessionCreateFrame = {
@@ -18,9 +18,9 @@ import WebSocket from "ws";
18
18
  // Import the WORKTREE native build directly (not @gajae-code/natives, which can
19
19
  // resolve to a different checkout in this dev environment).
20
20
  import { NotificationControlServer } from "../../natives/native/index.js";
21
- import { parseLifecycleCommand } from "../src/notifications/lifecycle-commands";
22
- import { attachLifecycleControl, fileAudit, fileLedgerStore } from "../src/notifications/lifecycle-control-runtime";
23
- import type { OrchestratorDeps } from "../src/notifications/lifecycle-orchestrator";
21
+ import { parseLifecycleCommand } from "../src/sdk/bus/lifecycle-commands";
22
+ import { attachLifecycleControl, fileAudit, fileLedgerStore } from "../src/sdk/bus/lifecycle-control-runtime";
23
+ import type { OrchestratorDeps } from "../src/sdk/bus/lifecycle-orchestrator";
24
24
 
25
25
  const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gjc-g011-"));
26
26
  const token = crypto.randomBytes(32).toString("base64url");
@@ -30,6 +30,8 @@ const closed: string[] = [];
30
30
  function deps(): OrchestratorDeps {
31
31
  return {
32
32
  pairedChatId: "42",
33
+ auditRedactionKey: new Uint8Array(32).fill(11),
34
+ isPsmuxProvider: () => false,
33
35
  now: () => Date.now(),
34
36
  store: fileLedgerStore(path.join(tmp, "idempotency.json")),
35
37
  audit: fileAudit(path.join(tmp, "audit.jsonl")),
@@ -47,8 +49,6 @@ function deps(): OrchestratorDeps {
47
49
  return { processGone: true };
48
50
  },
49
51
  resumeSession: async () => ({ ambiguous: [] }),
50
- newLifecycleRequestId: () => `lc-${crypto.randomUUID()}`,
51
- newSessionId: () => `s${crypto.randomUUID().slice(0, 8)}`,
52
52
  };
53
53
  }
54
54
 
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import * as path from "node:path";
4
+ import { type Adapter, type AdapterDisposition, OPERATIONS } from "../src/sdk/protocol/operation-registry";
5
+ import { type Manifest, type ManifestAdapterRow, validateManifest } from "./manifest-schema";
6
+
7
+ const repoRoot = path.resolve(import.meta.dir, "..", "..", "..");
8
+ const manifestPath = path.join(repoRoot, "packages/coding-agent/test/manifests/sdk-adapter-parity-v1.json");
9
+ const adapterTests: Record<Adapter, string[]> = {
10
+ telegram: ["packages/coding-agent/test/sdk-adapter-dispositions.test.ts"],
11
+ discord: ["packages/coding-agent/test/sdk-adapter-dispositions.test.ts"],
12
+ slack: ["packages/coding-agent/test/sdk-adapter-dispositions.test.ts"],
13
+ mcp: [
14
+ "packages/coding-agent/test/sdk-mcp-adapter.test.ts",
15
+ "packages/coding-agent/test/sdk-mcp-entrypoint-e2e.test.ts",
16
+ "packages/coding-agent/test/sdk-adapter-dispositions.test.ts",
17
+ ],
18
+ acp: [
19
+ "packages/coding-agent/test/sdk-acp-adapter.test.ts",
20
+ "packages/coding-agent/test/sdk-acp-two-client-race.test.ts",
21
+ "packages/coding-agent/test/sdk-acp-provider-reconnect.test.ts",
22
+ "packages/coding-agent/test/sdk-adapter-dispositions.test.ts",
23
+ ],
24
+ daemonCli: [
25
+ "packages/coding-agent/test/sdk-daemon-cli-e2e.test.ts",
26
+ "packages/coding-agent/test/sdk-client.test.ts",
27
+ "packages/coding-agent/test/sdk-adapter-dispositions.test.ts",
28
+ ],
29
+ };
30
+ const dispositionTestFile = "packages/coding-agent/test/sdk-adapter-dispositions.test.ts";
31
+ const commandFiles = [
32
+ ...new Set([...Object.values(adapterTests).flat(), "packages/coding-agent/test/sdk-host-wiring.test.ts"]),
33
+ ].sort();
34
+ const commands: Manifest["commands"] = commandFiles.flatMap(file =>
35
+ file === dispositionTestFile
36
+ ? ["^AD-M-", "^AD-A-", "^AD-L-", "^AD-(T|D|S)-"].map(pattern => ({
37
+ argv: ["bun", "test", file, "--test-name-pattern", pattern],
38
+ }))
39
+ : [{ argv: ["bun", "test", file] }],
40
+ );
41
+ const required = [...commandFiles];
42
+ const excluded: Manifest["excluded"] = [];
43
+ const adapters = ["telegram", "discord", "slack", "mcp", "acp", "daemonCli"] as const;
44
+
45
+ function expectedOutcome(disposition: AdapterDisposition): ManifestAdapterRow["expected"] {
46
+ return disposition === "prohibited"
47
+ ? "rejected_before_send"
48
+ : disposition === "machine_only" || disposition === "provider_only"
49
+ ? "internal_only"
50
+ : "forwarded";
51
+ }
52
+
53
+ function adapterTestPrefix(adapter: Adapter): string {
54
+ return adapter === "telegram"
55
+ ? "T"
56
+ : adapter === "discord"
57
+ ? "D"
58
+ : adapter === "slack"
59
+ ? "S"
60
+ : adapter === "daemonCli"
61
+ ? "L"
62
+ : adapter === "mcp"
63
+ ? "M"
64
+ : "A";
65
+ }
66
+ function row(adapter: Adapter, operation: (typeof OPERATIONS)[number], secret = false): ManifestAdapterRow {
67
+ const suffix = secret ? "-secret" : "";
68
+ return {
69
+ adapterTestId: `AD-${adapterTestPrefix(adapter)}-${operation.id}${suffix}`,
70
+ sdkId: operation.sdkId,
71
+ adapter,
72
+ disposition: operation.adapterDispositions[adapter],
73
+ testFile: dispositionTestFile,
74
+ testNamePattern: `AD-${adapterTestPrefix(adapter)}-${operation.id}${suffix}`,
75
+ argv: [
76
+ "bun",
77
+ "test",
78
+ dispositionTestFile,
79
+ "--test-name-pattern",
80
+ `^AD-${adapterTestPrefix(adapter)}-${operation.id}${suffix}:`,
81
+ ],
82
+ expected: secret ? "rejected_before_send" : expectedOutcome(operation.adapterDispositions[adapter]),
83
+ };
84
+ }
85
+
86
+ function generateRows(): ManifestAdapterRow[] {
87
+ return OPERATIONS.flatMap(operation =>
88
+ adapters.flatMap(adapter => [
89
+ row(adapter, operation),
90
+ ...(operation.id === "C36" ? [row(adapter, operation, true)] : []),
91
+ ]),
92
+ );
93
+ }
94
+
95
+ function generateManifest(): Manifest {
96
+ return {
97
+ version: 1,
98
+ commands,
99
+ excluded,
100
+ required,
101
+ rows: generateRows(),
102
+ };
103
+ }
104
+
105
+ async function checkCoverage(manifest: Manifest): Promise<void> {
106
+ const rows = manifest.rows ?? [];
107
+ const expectedRows = generateRows();
108
+ const rowKeys = new Set(rows.map(row => row.adapterTestId));
109
+ for (const row of expectedRows) {
110
+ if (!rowKeys.has(row.adapterTestId))
111
+ throw new Error(`${row.adapterTestId} has no adapter-disposition manifest row.`);
112
+ }
113
+ if (rows.length !== expectedRows.length) throw new Error("SDK adapter parity manifest has unexpected rows.");
114
+ const adapterTestIds = new Set<string>();
115
+ for (const row of rows) {
116
+ if (adapterTestIds.has(row.adapterTestId)) throw new Error(`Duplicate adapter test ID: ${row.adapterTestId}`);
117
+ adapterTestIds.add(row.adapterTestId);
118
+ if (/placeholder|todo|tbd|example/i.test(row.testNamePattern))
119
+ throw new Error(`${row.adapterTestId} uses a placeholder test name pattern.`);
120
+ if (
121
+ row.argv.length !== 5 ||
122
+ row.argv[0] !== "bun" ||
123
+ row.argv[1] !== "test" ||
124
+ row.argv[2] !== row.testFile ||
125
+ row.argv[3] !== "--test-name-pattern"
126
+ )
127
+ throw new Error(`${row.adapterTestId} must execute its exact test-name pattern.`);
128
+ const testPath = path.join(repoRoot, row.testFile);
129
+ const testFile = Bun.file(testPath);
130
+ if (!(await testFile.exists())) throw new Error(`${row.adapterTestId} test file does not exist: ${row.testFile}`);
131
+ const testText = await testFile.text();
132
+ // The disposition suite deliberately generates names from registry IDs. This source check
133
+ // confirms its name template and the concrete row ID are both present in the registry.
134
+ if (!testText.includes("AD-$" + "{adapterPrefix[adapter]}-$" + "{operation.id}"))
135
+ throw new Error(`${row.adapterTestId} test name template was not found in ${row.testFile}.`);
136
+ if (!OPERATIONS.some(operation => row.sdkId === operation.sdkId))
137
+ throw new Error(`${row.adapterTestId} references an unknown SDK ID.`);
138
+ }
139
+ if (manifest.excluded.length !== 0) throw new Error("SDK adapter parity manifest must include all six adapters.");
140
+ }
141
+
142
+ async function checkManifest(expected: Manifest): Promise<void> {
143
+ const actual = validateManifest(await Bun.file(manifestPath).json());
144
+ if (JSON.stringify(actual) !== JSON.stringify(expected))
145
+ throw new Error(`SDK adapter parity manifest is stale: ${path.relative(repoRoot, manifestPath)}`);
146
+ await checkCoverage(actual);
147
+ }
148
+
149
+ const expected = validateManifest(generateManifest());
150
+ if (process.argv.slice(2).includes("--check")) {
151
+ try {
152
+ await checkManifest(expected);
153
+ } catch (error) {
154
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
155
+ process.exit(1);
156
+ }
157
+ } else {
158
+ await Bun.write(manifestPath, `${JSON.stringify(expected, null, "\t")}\n`);
159
+ await checkCoverage(expected);
160
+ process.stderr.write(
161
+ `Generated ${path.relative(repoRoot, manifestPath)} (${expected.rows?.length ?? 0} row receipts)\n`,
162
+ );
163
+ }