@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,83 @@
1
+ import { type NotificationConfig } from "./config";
2
+ /** Minimal session-manager surface shared by extension, TUI, and headless hosts. */
3
+ export interface NotificationSessionContext {
4
+ sessionManager: {
5
+ getCwd(): string;
6
+ getSessionId(): string;
7
+ };
8
+ }
9
+ /** A snapshot of the current session, resolved from the session manager per operation. */
10
+ export interface BoundNotificationSession<Context extends NotificationSessionContext = NotificationSessionContext> {
11
+ readonly context: Context;
12
+ readonly cwd: string;
13
+ readonly sessionId: string;
14
+ unbind(): void;
15
+ }
16
+ export type NotificationEndpointStartResult = "started" | "already" | "disabled" | "failed";
17
+ export type TelegramDaemonPreflightResult = "ready" | "blocked_identity";
18
+ /**
19
+ * The endpoint implementation is deliberately injected. The controller owns
20
+ * policy and session-local state while the extension continues to own its
21
+ * concrete NotificationServer resources.
22
+ */
23
+ export interface NotificationSessionRuntime<Context extends NotificationSessionContext = NotificationSessionContext> {
24
+ isRunning(binding: BoundNotificationSession<Context>): boolean;
25
+ start(binding: BoundNotificationSession<Context>): Promise<NotificationEndpointStartResult>;
26
+ stop(binding: BoundNotificationSession<Context>): Promise<boolean>;
27
+ /**
28
+ * Proves the complete Telegram owner identity before a generic endpoint can
29
+ * emit a frame. `blocked_identity` is fail-closed and starts nothing.
30
+ */
31
+ ensureTelegramDaemon?(binding: BoundNotificationSession<Context>): Promise<TelegramDaemonPreflightResult>;
32
+ }
33
+ export interface NotificationSessionStatus {
34
+ eligible: boolean;
35
+ locallyEnabled: boolean;
36
+ effectiveEnabled: boolean;
37
+ running: boolean;
38
+ environment: "off" | "explicit" | "token" | "default";
39
+ }
40
+ export interface NotificationSessionReconcileResult {
41
+ outcome: NotificationEndpointStartResult | "stopped";
42
+ status: NotificationSessionStatus;
43
+ }
44
+ export interface NotificationSessionControllerOptions {
45
+ /** Gate A result, resolved once by the SDK from the canonical host predicate. */
46
+ eligible: boolean;
47
+ /** Reads the global-only, schema-default-resolved notification configuration. */
48
+ getConfig(): NotificationConfig;
49
+ /** Kept as a reference so test and embedding hosts can supply their own environment. */
50
+ env?: NodeJS.ProcessEnv;
51
+ }
52
+ /**
53
+ * Shared owner of notification session policy.
54
+ *
55
+ * Gate A is captured at creation. Gate B is evaluated for each session
56
+ * operation with `isSessionNotificationsEnabled`. Gate C verifies complete
57
+ * Telegram ownership before a generic endpoint is allowed to start.
58
+ */
59
+ export declare class NotificationSessionController {
60
+ #private;
61
+ constructor(options: NotificationSessionControllerOptions);
62
+ /** Attach the concrete generic endpoint implementation used by this host. */
63
+ attachRuntime<Context extends NotificationSessionContext>(runtime: NotificationSessionRuntime<Context>): () => void;
64
+ /**
65
+ * Bind a fresh session snapshot. Callers should not cache it: cwd and session
66
+ * id may change on `/new`, fork, or resume.
67
+ */
68
+ bind<Context extends NotificationSessionContext>(context: Context): BoundNotificationSession<Context>;
69
+ /** Preserve session-local safety state and pending-operation ownership across a session rekey. */
70
+ rekeySession(previousSessionId: string, nextSessionId: string): void;
71
+ query<Context extends NotificationSessionContext>(context: Context): NotificationSessionStatus;
72
+ /** Stop the current endpoint during host shutdown without changing local preference. */
73
+ stopCurrentSession<Context extends NotificationSessionContext>(context: Context): Promise<boolean>;
74
+ /**
75
+ * Hold this session's endpoint inactive after a foreign-daemon identity race.
76
+ * The block remains until an explicit same-identity reconnect or CAS restore clears it.
77
+ */
78
+ enterBlockedRuntime<Context extends NotificationSessionContext>(context: Context): Promise<boolean>;
79
+ /** Clear a block only after the caller has verified a safe same-identity reconnect or restore. */
80
+ clearBlockedRuntime<Context extends NotificationSessionContext>(context: Context): Promise<void>;
81
+ setLocalEnabled<Context extends NotificationSessionContext>(context: Context, enabled: boolean): Promise<NotificationSessionReconcileResult>;
82
+ reconcileCurrentSession<Context extends NotificationSessionContext>(context: Context): Promise<NotificationSessionReconcileResult>;
83
+ }
@@ -0,0 +1,56 @@
1
+ import { type ConversationRecord } from "./conversation-store";
2
+ export interface SlackInboundDispatchReceipt {
3
+ key: string;
4
+ eventId: string;
5
+ interactionId: string;
6
+ retryKey: string;
7
+ eventContext?: string;
8
+ kind: "action" | "command";
9
+ actionId?: string;
10
+ /** The endpoint generation and SDK effect captured before Socket Mode ACK. */
11
+ endpointGeneration: number;
12
+ /** Identifier of the protected journal payload; mappings never retain message bodies. */
13
+ effectId: string;
14
+ idempotencyKey: string;
15
+ }
16
+ export type SlackConversationState = "absent" | "posting_root" | "active" | "closed_marker" | "resumed_root" | "error";
17
+ /** Durable Slack mapping. It contains identifiers and receipt metadata only; protected journal effects own message bodies. */
18
+ export interface SlackConversation extends ConversationRecord {
19
+ state: SlackConversationState;
20
+ teamId: string;
21
+ channelId: string;
22
+ rootTs?: string;
23
+ sessionId?: string;
24
+ endpointGeneration?: number;
25
+ clientMsgId?: string;
26
+ /** Exclusive, expiring authority for provider reconciliation/publication of the root intent. */
27
+ rootPublicationOwner?: string;
28
+ rootPublicationLeaseExpiresAt?: number;
29
+ /** Monotonic fencing token; stale root publishers may not commit after takeover. */
30
+ rootPublicationFence?: number;
31
+ /** Exclusive, expiring authority for provider reconciliation/publication of the outbound action intent. */
32
+ outboundActionOwner?: string;
33
+ outboundActionLeaseExpiresAt?: number;
34
+ /** Monotonic fencing token; stale action publishers may not commit after takeover. */
35
+ outboundActionFence?: number;
36
+ /** Action authority only; action bodies and endpoint credentials are never persisted. */
37
+ pendingActionId?: string;
38
+ /** Durable, unpublished action intent. The action body is supplied only by the caller. */
39
+ outboundActionId?: string;
40
+ outboundActionClientMsgId?: string;
41
+ lastError?: string;
42
+ updatedAt: number;
43
+ seenEventIds: string[];
44
+ seenContextIds: string[];
45
+ seenRetryKeys: string[];
46
+ seenInteractionIds: string[];
47
+ /** Durable inbound effect identifiers. The protected journal owns replay payloads. */
48
+ inboundDispatches?: SlackInboundDispatchReceipt[];
49
+ }
50
+ export declare function slackConversationKey(input: {
51
+ teamId: string;
52
+ channelId: string;
53
+ rootTs: string;
54
+ }): string;
55
+ export declare function normalizeSlackConversation(record: SlackConversation): SlackConversation;
56
+ export declare function acceptsSlackInbound(record: SlackConversation, rootTs: string, endpointGeneration: number): boolean;
@@ -0,0 +1,60 @@
1
+ import { type SdkSessionEndpoint } from "../client/discovery";
2
+ import { ConversationStore } from "./conversation-store";
3
+ import { type SlackConversation } from "./slack-conversation";
4
+ export declare class SlackEndpointBindingError extends Error {
5
+ constructor(message?: string);
6
+ }
7
+ import type { SlackProvider, SlackSocketEnvelope } from "./slack-provider";
8
+ export interface SlackEndpoint extends SdkSessionEndpoint {
9
+ generation: number;
10
+ }
11
+ export interface SlackSdkClient {
12
+ send(frame: Record<string, unknown>): void;
13
+ }
14
+ export interface SlackNotificationDaemonOptions {
15
+ agentDir: string;
16
+ repo: string;
17
+ teamId: string;
18
+ channelId: string;
19
+ provider: SlackProvider;
20
+ botUserId?: string;
21
+ /** Fail-closed authorization for the paired Slack principal. */
22
+ authorizeActor?: (actorId: string) => boolean | Promise<boolean>;
23
+ store?: ConversationStore<SlackConversation>;
24
+ now?: () => number;
25
+ randomId?: () => string;
26
+ /** Stable identity for the process attempting durable provider publication. */
27
+ publicationOwnerId?: string;
28
+ publicationLeaseMs?: number;
29
+ resolveEndpoint?: (sessionId: string) => Promise<SlackEndpoint | null>;
30
+ createClient: (endpoint: SlackEndpoint) => SlackSdkClient;
31
+ onCommand?: (sessionId: string, content: string, endpoint: SlackEndpoint, idempotencyKey: string) => Promise<boolean>;
32
+ }
33
+ /**
34
+ * Slack Socket Mode notification daemon. Accepted inbound SDK effects are
35
+ * persisted before acknowledgement, including their replay payload and captured
36
+ * endpoint generation; endpoint credentials and Socket Mode cursors are never
37
+ * written to disk.
38
+ */
39
+ export declare class SlackNotificationDaemon {
40
+ #private;
41
+ private readonly options;
42
+ readonly store: ConversationStore<SlackConversation>;
43
+ constructor(options: SlackNotificationDaemonOptions);
44
+ start(): Promise<void>;
45
+ stop(): Promise<void>;
46
+ /** Accepted inbound effects are durably claimed before their Socket Mode ACK. */
47
+ handleEnvelope(envelope: SlackSocketEnvelope): Promise<boolean>;
48
+ postRoot(sessionId: string, body: string, endpointGeneration?: number): Promise<SlackConversation>;
49
+ /** Deliver a notification into the mapped root thread, creating that root once. */
50
+ notify(sessionId: string, body: string, actionId?: string, endpointGeneration?: number): Promise<SlackConversation>;
51
+ /** Posts a safe command outcome to the active mapped root thread. */
52
+ postCommandResult(sessionId: string, content: string): Promise<boolean>;
53
+ resolveAction(sessionId: string, actionId: string): Promise<void>;
54
+ close(sessionId: string, marker?: string): Promise<boolean>;
55
+ resume(sessionId: string, body: string, endpointGeneration?: number): Promise<SlackConversation>;
56
+ findSession(sessionId: string, includeInactive: boolean): Promise<{
57
+ key: string;
58
+ record: SlackConversation;
59
+ } | undefined>;
60
+ }
@@ -0,0 +1,59 @@
1
+ import type { SlackMessageSearchResult, SlackPostedMessage, SlackProviderClient, SlackSocketEnvelope } from "./slack-provider";
2
+ export type SlackProviderErrorCode = "connection" | "protocol" | "web_api" | "rate_limited";
3
+ /** A Slack transport failure whose fields are safe to surface without credentials. */
4
+ export declare class SlackProviderError extends Error {
5
+ readonly code: SlackProviderErrorCode;
6
+ readonly operation: string;
7
+ readonly status?: number | undefined;
8
+ readonly retryAfterMs?: number | undefined;
9
+ /** The server may have accepted the request before its response became unusable. */
10
+ readonly mayHaveBeenAccepted: boolean;
11
+ readonly retryable: boolean;
12
+ constructor(code: SlackProviderErrorCode, operation: string, status?: number | undefined, retryAfterMs?: number | undefined,
13
+ /** The server may have accepted the request before its response became unusable. */
14
+ mayHaveBeenAccepted?: boolean);
15
+ }
16
+ export interface SlackWebSocket {
17
+ readonly readyState: number;
18
+ onopen: ((event: Event) => void) | null;
19
+ onmessage: ((event: MessageEvent) => void) | null;
20
+ onclose: ((event: CloseEvent) => void) | null;
21
+ onerror: ((event: Event) => void) | null;
22
+ send(data: string): void;
23
+ close(): void;
24
+ }
25
+ export interface SlackLiveProviderOptions {
26
+ appToken: string;
27
+ botToken: string;
28
+ fetch?: (input: string, init?: RequestInit) => Promise<Response>;
29
+ webSocket?: (url: string) => SlackWebSocket;
30
+ now?: () => number;
31
+ sleep?: (milliseconds: number) => Promise<void>;
32
+ reconnectDelayMs?: number;
33
+ maxRateLimitRetries?: number;
34
+ maxRetryAfterMs?: number;
35
+ activityTimeoutMs?: number;
36
+ }
37
+ /**
38
+ * Production Socket Mode and Web API client. It keeps all connection state in
39
+ * memory and deliberately never maintains a Slack cursor.
40
+ */
41
+ export declare class SlackLiveProvider implements SlackProviderClient {
42
+ #private;
43
+ get transportHealthy(): boolean;
44
+ constructor(options: SlackLiveProviderOptions);
45
+ start(onEnvelope: (envelope: SlackSocketEnvelope) => void | Promise<void>): Promise<void>;
46
+ stop(): Promise<void>;
47
+ ack(envelopeId: string): Promise<void>;
48
+ postMessage(input: {
49
+ channel: string;
50
+ text: string;
51
+ threadTs?: string;
52
+ clientMsgId: string;
53
+ }): Promise<SlackPostedMessage>;
54
+ findMessageByClientMsgId(input: {
55
+ channel: string;
56
+ clientMsgId: string;
57
+ threadTs?: string;
58
+ }): Promise<SlackMessageSearchResult | null>;
59
+ }
@@ -0,0 +1,55 @@
1
+ export interface SlackSocketEnvelope {
2
+ envelope_id: string;
3
+ payload: unknown;
4
+ }
5
+ export interface SlackPostedMessage {
6
+ channel: string;
7
+ ts: string;
8
+ client_msg_id?: string;
9
+ }
10
+ export interface SlackMessageSearchResult {
11
+ channel: string;
12
+ ts: string;
13
+ client_msg_id?: string;
14
+ }
15
+ /** Minimal Socket Mode + Web API seam. Implementations may wrap the official Slack SDK. */
16
+ export interface SlackProviderClient {
17
+ start(onEnvelope: (envelope: SlackSocketEnvelope) => void | Promise<void>): Promise<void>;
18
+ stop?(): Promise<void>;
19
+ ack(envelopeId: string): Promise<void>;
20
+ postMessage(input: {
21
+ channel: string;
22
+ text: string;
23
+ threadTs?: string;
24
+ clientMsgId: string;
25
+ }): Promise<SlackPostedMessage>;
26
+ findMessageByClientMsgId?(input: {
27
+ channel: string;
28
+ clientMsgId: string;
29
+ threadTs?: string;
30
+ }): Promise<SlackMessageSearchResult | null>;
31
+ readonly transportHealthy?: boolean;
32
+ }
33
+ /**
34
+ * Transport wrapper deliberately limited to Slack SDK operations. Keeping it injectable
35
+ * makes Socket Mode acknowledgement and Web API failure cases deterministic in tests.
36
+ */
37
+ export declare class SlackProvider {
38
+ private readonly client;
39
+ constructor(client: SlackProviderClient);
40
+ start(onEnvelope: (envelope: SlackSocketEnvelope) => void | Promise<void>): Promise<void>;
41
+ get transportHealthy(): boolean;
42
+ stop(): Promise<void>;
43
+ ack(envelopeId: string): Promise<void>;
44
+ postMessage(input: {
45
+ channel: string;
46
+ text: string;
47
+ threadTs?: string;
48
+ clientMsgId: string;
49
+ }): Promise<SlackPostedMessage>;
50
+ findMessageByClientMsgId(input: {
51
+ channel: string;
52
+ clientMsgId: string;
53
+ threadTs?: string;
54
+ }): Promise<SlackMessageSearchResult | null>;
55
+ }
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env bun
2
2
  /**
3
- * Reference CLI for the notifications SDK Telegram client.
3
+ * Reference CLI for the Gajae-Code SDK Telegram client.
4
4
  *
5
5
  * Bridges a running GJC session's notification endpoint to a Telegram bot so you
6
6
  * can answer asks / see idle pings from your phone — no RPC mode required. This
7
- * is an EXAMPLE/template (the SDK contract is in `docs/notifications-sdk.md`);
7
+ * is an EXAMPLE/template (the SDK contract is in `docs/sdk.md`);
8
8
  * Discord/Slack clients are written the same way.
9
9
  *
10
10
  * Usage:
11
- * bun run packages/coding-agent/src/notifications/telegram-cli.ts \
11
+ * bun run packages/coding-agent/src/sdk/bus/telegram-cli.ts \
12
12
  * --bot-token <token> [--chat-id <id>] [--endpoint-file <path> | --session-id <id>] [--repo <dir>]
13
13
  *
14
14
  * Env fallbacks: GJC_TG_BOT_TOKEN, GJC_TG_CHAT_ID.
15
15
  * If --chat-id is omitted it is auto-resolved from getUpdates (message the bot once).
16
16
  * If neither --endpoint-file nor --session-id is given, the newest endpoint file
17
- * under <repo>/.gjc/state/notifications/ is used.
17
+ * under <repo>/.gjc/state/sdk/ is used.
18
18
  */
19
19
  export {};
@@ -1,25 +1,34 @@
1
- import type { Settings } from "../config/settings";
2
- import type { TelegramDaemonOptions } from "./telegram-daemon";
1
+ import type { Settings } from "../../config/settings";
2
+ import { type NotificationSettingsReader } from "./config";
3
+ import { type DaemonState, type TelegramDaemonOptions } from "./telegram-daemon";
3
4
  type TelegramDaemonRunner = {
4
5
  run(): Promise<void>;
5
6
  requestStop(reason?: "reload" | "signal" | "stop"): void;
6
7
  };
7
8
  type TelegramDaemonConstructor = new (opts: TelegramDaemonOptions) => TelegramDaemonRunner;
9
+ export type LightweightDaemonSettings = Pick<Settings, "get" | "getAgentDir" | "set" | "flush"> & NotificationSettingsReader;
8
10
  export interface RunDaemonInternalDeps {
9
11
  SettingsImpl?: {
10
12
  init: (options?: {
11
13
  agentDir?: string;
12
- }) => Promise<Pick<Settings, "get" | "getAgentDir" | "set" | "flush">>;
14
+ }) => Promise<LightweightDaemonSettings>;
13
15
  };
14
16
  DaemonImpl?: TelegramDaemonConstructor;
15
17
  processPid?: number;
16
18
  pidAlive?: (pid: number) => boolean;
19
+ /** Clock used by the ownership-progress watchdog; defaults to `Date.now`. */
20
+ now?: () => number;
21
+ /** Timer pair backing the ownership-progress watchdog; defaults to globals. */
22
+ setInterval?: (callback: () => void, ms: number) => Timer;
23
+ clearInterval?: (timer: Timer) => void;
24
+ /** Reads persisted daemon ownership state; defaults to the real reader. */
25
+ readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
17
26
  }
18
27
  export declare function createLightweightDaemonSettings(input: {
19
28
  agentDir: string;
20
29
  rawConfig?: unknown;
21
- }): Pick<Settings, "get" | "getAgentDir" | "set" | "flush">;
22
- export declare function loadLightweightDaemonSettings(agentDir: string): Promise<Pick<Settings, "get" | "getAgentDir" | "set" | "flush">>;
30
+ }): LightweightDaemonSettings;
31
+ export declare function loadLightweightDaemonSettings(agentDir: string): Promise<LightweightDaemonSettings>;
23
32
  export declare function ownerPidFromOwnerId(ownerId: string): number | undefined;
24
33
  export declare function runDaemonSmoke(opts?: {
25
34
  agentDir?: string;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lightweight daemon protocol contract for consumers that need generation
3
+ * metadata without loading the Telegram daemon runtime.
4
+ */
5
+ /** Protocol version the daemon advertises in its ClientHello. */
6
+ export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
7
+ /**
8
+ * Operational generation the current daemon build speaks. It is tied to the
9
+ * wire protocol version so a freshly-upgraded host can identify an older,
10
+ * still-live daemon without coupling status readers to the daemon runtime.
11
+ */
12
+ export declare const DAEMON_GENERATION = 3;
@@ -7,8 +7,8 @@
7
7
  * keeps the single-poller invariant (no Telegram getUpdates 409 overlap) and
8
8
  * never steals a still-live owner.
9
9
  */
10
- import type { Settings } from "../config/settings";
11
- import type { BuiltInDaemonController, DaemonOperationOptions, DaemonOperationResult, DaemonStatus } from "../daemon/control-types";
10
+ import type { Settings } from "../../config/settings";
11
+ import type { BuiltInDaemonController, DaemonOperationOptions, DaemonOperationResult, DaemonStatus } from "../../daemon/control-types";
12
12
  import { type TelegramDaemonDeps, type TelegramDaemonFs } from "./telegram-daemon";
13
13
  export interface TelegramDaemonControlRequest {
14
14
  version: 1;
@@ -1,11 +1,15 @@
1
1
  import * as fs from "node:fs";
2
- import type { Settings } from "../config/settings";
3
- import type { DaemonRuntimeInfo } from "../daemon/control-types";
2
+ import type { Settings } from "../../config/settings";
3
+ import type { DaemonRuntimeInfo } from "../../daemon/control-types";
4
4
  import { HEARTBEAT_TTL_MS } from "./daemon-paths";
5
+ export { DAEMON_GENERATION, NOTIFICATION_PROTOCOL_VERSION } from "./telegram-daemon-contract";
5
6
  import { type ControlServerLike, type LifecycleControlServerFactory } from "./lifecycle-control-runtime";
7
+ import type { OrchestratorDeps } from "./lifecycle-orchestrator";
6
8
  import { NotificationOperatorRuntime, OperatorBackoffPolicy } from "./operator-runtime";
7
9
  import { type AliasTable, type CallbackRoute } from "./telegram-reference";
8
10
  export type EnsureDaemonResult = "owner_spawned" | "attached" | "disabled" | "blocked";
11
+ /** Detailed result for orchestration that must distinguish a #2028 handoff from a fresh spawn. */
12
+ export type EnsureTelegramDaemonDetailedResult = "spawned" | "reloaded" | "attached" | "disabled" | "blocked_identity";
9
13
  export interface DaemonState {
10
14
  pid: number;
11
15
  ownerId: string;
@@ -66,22 +70,11 @@ export { HEARTBEAT_TTL_MS };
66
70
  export declare const DAEMON_VERSION = 1;
67
71
  /** Capability token advertised when the server supports app-level ping/pong. */
68
72
  export declare const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
69
- /** Protocol version the daemon advertises in its ClientHello. */
70
- export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
71
73
  /** Capability required for typed controls and semantic Selected acknowledgement frames. */
72
74
  export declare const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
73
75
  export declare const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
74
- /**
75
- * Operational generation the current daemon build speaks, persisted into
76
- * {@link DaemonState.generation} on ownership acquisition. It is tied to the
77
- * wire {@link NOTIFICATION_PROTOCOL_VERSION} so any protocol bump (which is what
78
- * gates capabilities like {@link ASK_SELECTED_ACK_CAPABILITY}) also bumps the
79
- * generation, letting a freshly-upgraded host recognise an older, still-live
80
- * daemon and reload it instead of silently attaching to it. Distinct from the
81
- * persisted schema {@link DAEMON_VERSION}, which did not change across #1999.
82
- */
83
- export declare const DAEMON_GENERATION = 3;
84
76
  export { type DaemonPaths, daemonPaths } from "./daemon-paths";
77
+ export declare function deriveLifecycleAuditRedactionKey(botToken: string): Uint8Array;
85
78
  /**
86
79
  * Attach session-lifecycle control (create/close/resume) to the running daemon.
87
80
  *
@@ -96,14 +89,26 @@ export declare function startDaemonLifecycleControl(input: {
96
89
  controlServer: ControlServerLike;
97
90
  pairedChatId: string;
98
91
  agentDir: string;
92
+ auditRedactionKey: Uint8Array;
99
93
  env?: NodeJS.ProcessEnv;
100
- }): void;
94
+ }): OrchestratorDeps;
101
95
  export declare function registerNotificationRoot(input: {
102
96
  settings: Settings;
103
97
  cwd: string;
104
98
  sessionId: string;
105
99
  fs?: TelegramDaemonFs;
106
100
  }): Promise<string>;
101
+ export interface UnregisterNotificationRootResult {
102
+ root: string;
103
+ remainingRoots: number;
104
+ }
105
+ /** Remove one session's Telegram scan root without disturbing other live session roots. */
106
+ export declare function unregisterNotificationRoot(input: {
107
+ settings: Settings;
108
+ cwd: string;
109
+ sessionId: string;
110
+ fs?: TelegramDaemonFs;
111
+ }): Promise<UnregisterNotificationRootResult>;
107
112
  export declare function isFreshLiveOwner(input: {
108
113
  state: DaemonState | undefined;
109
114
  now: number;
@@ -143,9 +148,9 @@ export declare function releaseDaemonOwnership(input: {
143
148
  now?: () => number;
144
149
  }): Promise<void>;
145
150
  /** Read the persisted daemon ownership state (or undefined when absent). */
146
- export declare function readDaemonState(settings: Settings, fs?: TelegramDaemonFs): Promise<DaemonState | undefined>;
151
+ export declare function readDaemonState(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<DaemonState | undefined>;
147
152
  /** Read the persisted notification roots list. */
148
- export declare function readDaemonRoots(settings: Settings, fs?: TelegramDaemonFs): Promise<string[]>;
153
+ export declare function readDaemonRoots(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<string[]>;
149
154
  export interface TelegramSpawnOwnerInput {
150
155
  settings: Settings;
151
156
  roots?: string[];
@@ -185,6 +190,19 @@ export declare function buildTelegramDaemonSpawnArgs(input: {
185
190
  * already-persisted roots.
186
191
  */
187
192
  export declare function spawnTelegramDaemonOwner(input: TelegramSpawnOwnerInput, deps?: TelegramDaemonDeps): Promise<TelegramSpawnOwnerResult>;
193
+ /**
194
+ * Ensure a configured daemon owns this session root, preserving ownership safety
195
+ * while exposing whether a #2028 generation handoff was required.
196
+ */
197
+ export declare function ensureTelegramDaemonRunningDetailed(input: {
198
+ settings: Settings;
199
+ cwd: string;
200
+ sessionId: string;
201
+ }, deps?: TelegramDaemonDeps): Promise<EnsureTelegramDaemonDetailedResult>;
202
+ /**
203
+ * Legacy compatibility mapping for callers that only distinguish ownership from
204
+ * attachment. New orchestration should use {@link ensureTelegramDaemonRunningDetailed}.
205
+ */
188
206
  export declare function ensureTelegramDaemonRunning(input: {
189
207
  settings: Settings;
190
208
  cwd: string;
@@ -271,6 +289,16 @@ export interface TelegramDaemonOptions {
271
289
  * default applies (e.g. lifecycle control disabled), no control server starts.
272
290
  */
273
291
  createLifecycleControlServer?: LifecycleControlServerFactory | null;
292
+ /**
293
+ * Test seam for observing the exact production lifecycle dependency input.
294
+ * Production defaults to {@link buildOrchestratorDeps}.
295
+ */
296
+ createLifecycleOrchestratorDeps?: (input: {
297
+ pairedChatId: string;
298
+ agentNotificationsDir: string;
299
+ sessionsRoot: string;
300
+ auditRedactionKey: Uint8Array;
301
+ }) => OrchestratorDeps;
274
302
  /** Rich text promotion (enabled by default; see rich-render.ts). */
275
303
  rich?: {
276
304
  enabled: boolean;
@@ -289,7 +317,10 @@ export interface TelegramDaemonOptions {
289
317
  };
290
318
  }
291
319
  interface SessionSocket {
320
+ /** Immutable key of the transport endpoint that owns this socket. */
292
321
  sessionId: string;
322
+ /** Current logical session carried by valid threaded frames on this transport. */
323
+ logicalSessionId: string;
293
324
  token: string;
294
325
  endpointKey: string;
295
326
  ws: WebSocket;
@@ -305,8 +336,14 @@ interface SessionSocket {
305
336
  awaitingNonce: string | undefined;
306
337
  /** Per-session liveness interval handle (only set for capable sessions). */
307
338
  pingTimer: ReturnType<typeof setInterval> | undefined;
339
+ /** Correlation id for the startup replay barrier. */
340
+ replayId: string;
341
+ /** Queues live frames until startup replay is applied. */
342
+ replayPending: boolean;
343
+ replayQueue: Record<string, unknown>[];
308
344
  }
309
345
  export declare class TelegramNotificationDaemon {
346
+ #private;
310
347
  private readonly opts;
311
348
  readonly aliasTable: AliasTable;
312
349
  readonly messageRoutes: Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>;
@@ -416,6 +453,7 @@ export declare class TelegramNotificationDaemon {
416
453
  persistSeenUpdateIds(): Promise<void>;
417
454
  private pruneSeenUpdateIds;
418
455
  private rememberSeenUpdateId;
456
+ private rememberSeenUpdateIdForUnavailableNotice;
419
457
  scanRoots(): Promise<void>;
420
458
  connectSession(sessionId: string, url: string, token: string): void;
421
459
  /**
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Telegram **reference** client for the notifications SDK.
2
+ * Telegram **reference** client for the Gajae-Code SDK.
3
3
  *
4
4
  * This is an example/template, NOT an upstream-owned integration: it implements
5
- * the documented WS protocol (see `docs/notifications-sdk.md`) so you can copy it
5
+ * the documented WS protocol (see `docs/sdk.md`) so you can copy it
6
6
  * to build Discord/Slack/etc. clients with zero upstream changes. The Bot API
7
7
  * transport shape is salvaged from the removed `telegram-remote` package.
8
8
  *