@gajae-code/coding-agent 0.10.2 → 0.11.1

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 (476) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/async/job-manager.d.ts +46 -7
  4. package/dist/types/cli/args.d.ts +4 -5
  5. package/dist/types/cli/daemon-cli.d.ts +12 -1
  6. package/dist/types/cli/notify-cli.d.ts +21 -1
  7. package/dist/types/cli.d.ts +3 -0
  8. package/dist/types/commands/daemon.d.ts +39 -0
  9. package/dist/types/commands/launch.d.ts +3 -0
  10. package/dist/types/commands/notify.d.ts +28 -1
  11. package/dist/types/commands/sdk.d.ts +33 -0
  12. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  13. package/dist/types/config/model-profile-activation.d.ts +35 -15
  14. package/dist/types/config/model-profiles.d.ts +11 -5
  15. package/dist/types/config/model-registry.d.ts +3 -3
  16. package/dist/types/config/model-resolver.d.ts +39 -6
  17. package/dist/types/config/model-selector-value.d.ts +17 -0
  18. package/dist/types/config/models-config-schema.d.ts +10 -6
  19. package/dist/types/config/settings-schema.d.ts +133 -6
  20. package/dist/types/config/settings.d.ts +63 -35
  21. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  22. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  23. package/dist/types/daemon/builtin.d.ts +6 -5
  24. package/dist/types/daemon/control-types.d.ts +1 -1
  25. package/dist/types/discovery/mcp-json.d.ts +12 -1
  26. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  27. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  28. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  31. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  32. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  33. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  34. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  35. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  37. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  38. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  39. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
  40. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  41. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  42. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  43. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  44. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  45. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  46. package/dist/types/harness-control-plane/types.d.ts +3 -4
  47. package/dist/types/lsp/index.d.ts +1 -1
  48. package/dist/types/main.d.ts +32 -38
  49. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  50. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  51. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  52. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  53. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  54. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  55. package/dist/types/modes/components/model-selector.d.ts +1 -0
  56. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  57. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  58. package/dist/types/modes/components/welcome.d.ts +1 -1
  59. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  60. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
  61. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  62. package/dist/types/modes/index.d.ts +0 -4
  63. package/dist/types/modes/interactive-mode.d.ts +5 -2
  64. package/dist/types/modes/runtime-init.d.ts +2 -2
  65. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  66. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  67. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  68. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  69. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  72. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  73. package/dist/types/modes/types.d.ts +7 -2
  74. package/dist/types/runtime-mcp/client.d.ts +2 -0
  75. package/dist/types/runtime-mcp/config.d.ts +5 -1
  76. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  77. package/dist/types/runtime-mcp/types.d.ts +4 -0
  78. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  79. package/dist/types/sdk/acp/index.d.ts +2 -0
  80. package/dist/types/sdk/broker/broker.d.ts +53 -0
  81. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  82. package/dist/types/sdk/broker/ensure.d.ts +42 -0
  83. package/dist/types/sdk/broker/identity.d.ts +3 -0
  84. package/dist/types/sdk/broker/index.d.ts +8 -0
  85. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  86. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  87. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  88. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  89. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  90. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  91. package/dist/types/sdk/broker/transport.d.ts +9 -0
  92. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  93. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  94. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  95. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  96. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  97. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  98. package/dist/types/sdk/bus/config.d.ts +274 -0
  99. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  100. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  101. package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
  102. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  103. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  104. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  105. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  107. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  108. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  109. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  110. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  111. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  112. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  113. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  114. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  115. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  116. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  117. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  118. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  119. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  121. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
  122. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  123. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  124. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  125. package/dist/types/sdk/cli/index.d.ts +1 -0
  126. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  127. package/dist/types/sdk/client/client.d.ts +1 -0
  128. package/dist/types/sdk/client/discovery.d.ts +27 -0
  129. package/dist/types/sdk/client/index.d.ts +2 -0
  130. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  131. package/dist/types/sdk/host/control/index.d.ts +2 -0
  132. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  133. package/dist/types/sdk/host/events.d.ts +35 -0
  134. package/dist/types/sdk/host/host.d.ts +35 -0
  135. package/dist/types/sdk/host/index.d.ts +4 -0
  136. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  137. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  138. package/dist/types/sdk/host/query/index.d.ts +3 -0
  139. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  140. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  141. package/dist/types/sdk/host/types.d.ts +32 -0
  142. package/dist/types/sdk/index.d.ts +6 -0
  143. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  144. package/dist/types/sdk/mcp/index.d.ts +1 -0
  145. package/dist/types/sdk/mcp/server.d.ts +37 -0
  146. package/dist/types/sdk/models.d.ts +44 -0
  147. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  148. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  149. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  150. package/dist/types/sdk/startup-capability.d.ts +50 -0
  151. package/dist/types/session/agent-session.d.ts +114 -21
  152. package/dist/types/session/default-model-selection.d.ts +25 -0
  153. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  154. package/dist/types/session/session-manager.d.ts +58 -1
  155. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  156. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  157. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  158. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  159. package/dist/types/tools/browser/launch.d.ts +22 -0
  160. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  161. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  162. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  163. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  164. package/dist/types/tools/browser/registry.d.ts +19 -0
  165. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  166. package/dist/types/tools/index.d.ts +8 -8
  167. package/dist/types/tools/subagent-render.d.ts +1 -0
  168. package/dist/types/tools/subagent.d.ts +6 -1
  169. package/package.json +34 -13
  170. package/scripts/build-sdk-package-smoke.ts +99 -0
  171. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  172. package/scripts/compile-args.ts +4 -2
  173. package/scripts/g005-daemon-smoke.ts +4 -5
  174. package/scripts/g011-daemon-path-smoke.ts +5 -5
  175. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  176. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  177. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  178. package/scripts/manifest-schema.ts +124 -0
  179. package/scripts/run-test-manifest.ts +153 -0
  180. package/scripts/run-threat-model-check.ts +157 -0
  181. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  182. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  183. package/src/append-only-mode.ts +1 -1
  184. package/src/async/job-manager.ts +406 -63
  185. package/src/cli/args.ts +43 -12
  186. package/src/cli/auth-gateway-cli.ts +2 -2
  187. package/src/cli/config-cli.ts +2 -1
  188. package/src/cli/daemon-cli.ts +63 -14
  189. package/src/cli/list-models.ts +1 -1
  190. package/src/cli/notify-cli.ts +288 -286
  191. package/src/cli.ts +21 -2
  192. package/src/commands/daemon.ts +50 -6
  193. package/src/commands/harness.ts +93 -36
  194. package/src/commands/launch.ts +5 -2
  195. package/src/commands/mcp-serve.ts +19 -12
  196. package/src/commands/notify.ts +36 -3
  197. package/src/commands/sdk.ts +426 -0
  198. package/src/commit/agentic/agent.ts +1 -0
  199. package/src/config/atomic-yaml-patch.ts +423 -0
  200. package/src/config/model-profile-activation.ts +240 -89
  201. package/src/config/model-profiles.ts +18 -15
  202. package/src/config/model-registry.ts +51 -26
  203. package/src/config/model-resolver.ts +138 -51
  204. package/src/config/model-selector-value.ts +50 -0
  205. package/src/config/models-config-schema.ts +14 -21
  206. package/src/config/settings-schema.ts +128 -10
  207. package/src/config/settings.ts +1120 -158
  208. package/src/coordinator-mcp/model-preset.ts +74 -20
  209. package/src/coordinator-mcp/server.ts +1597 -3052
  210. package/src/daemon/builtin.ts +8 -5
  211. package/src/daemon/control-types.ts +1 -1
  212. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  213. package/src/discovery/mcp-json.ts +327 -20
  214. package/src/extensibility/custom-tools/types.ts +1 -1
  215. package/src/extensibility/extensions/compact-handler.ts +3 -3
  216. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  217. package/src/extensibility/extensions/loader.ts +69 -5
  218. package/src/extensibility/extensions/runner.ts +112 -4
  219. package/src/extensibility/extensions/types.ts +176 -17
  220. package/src/extensibility/hooks/types.ts +1 -1
  221. package/src/gjc-runtime/launch-tmux.ts +170 -86
  222. package/src/gjc-runtime/psmux-detect.ts +82 -4
  223. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  224. package/src/gjc-runtime/team-runtime.ts +54 -35
  225. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  226. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  227. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  228. package/src/gjc-runtime/ultragoal-guard.ts +108 -14
  229. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
  230. package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
  231. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  232. package/src/harness-control-plane/operate.ts +9 -9
  233. package/src/harness-control-plane/owner.ts +283 -39
  234. package/src/harness-control-plane/receipts.ts +0 -1
  235. package/src/harness-control-plane/sdk-transport.ts +395 -0
  236. package/src/harness-control-plane/session-transport.ts +94 -0
  237. package/src/harness-control-plane/types.ts +1 -1
  238. package/src/internal-urls/docs-index.generated.ts +34 -35
  239. package/src/lsp/client.ts +42 -6
  240. package/src/lsp/index.ts +2 -2
  241. package/src/main.ts +299 -204
  242. package/src/modes/DESIGN.md +258 -0
  243. package/src/modes/acp/acp-agent.ts +1228 -2612
  244. package/src/modes/acp/acp-client-bridge.ts +2 -20
  245. package/src/modes/acp/acp-event-mapper.ts +18 -2
  246. package/src/modes/acp/acp-mode.ts +8 -36
  247. package/src/modes/acp/permission-mode.ts +25 -0
  248. package/src/modes/acp/startup-options.ts +6 -0
  249. package/src/modes/components/agent-dashboard.ts +37 -17
  250. package/src/modes/components/model-selector.ts +93 -35
  251. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  252. package/src/modes/components/settings-selector.ts +60 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +10 -17
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +396 -28
  257. package/src/modes/controllers/selector-controller.ts +674 -36
  258. package/src/modes/index.ts +0 -22
  259. package/src/modes/interactive-mode.ts +87 -36
  260. package/src/modes/runtime-init.ts +298 -6
  261. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  262. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  263. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  264. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  265. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  266. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
  267. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  268. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  269. package/src/modes/types.ts +7 -2
  270. package/src/runtime-mcp/client.ts +94 -19
  271. package/src/runtime-mcp/config.ts +27 -15
  272. package/src/runtime-mcp/manager.ts +343 -105
  273. package/src/runtime-mcp/oauth-flow.ts +42 -12
  274. package/src/runtime-mcp/transports/http.ts +49 -19
  275. package/src/runtime-mcp/transports/stdio.ts +47 -28
  276. package/src/runtime-mcp/types.ts +10 -0
  277. package/src/sdk/acp/adapter.ts +418 -0
  278. package/src/sdk/acp/index.ts +2 -0
  279. package/src/sdk/broker/broker.ts +642 -0
  280. package/src/sdk/broker/discovery.ts +113 -0
  281. package/src/sdk/broker/ensure.ts +307 -0
  282. package/src/sdk/broker/identity.ts +42 -0
  283. package/src/sdk/broker/index.ts +8 -0
  284. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  285. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  286. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  287. package/src/sdk/broker/lifecycle.ts +2157 -0
  288. package/src/sdk/broker/process-incarnation.ts +159 -0
  289. package/src/sdk/broker/runtime.ts +164 -0
  290. package/src/sdk/broker/session-index.ts +318 -0
  291. package/src/sdk/broker/state-version.ts +23 -0
  292. package/src/sdk/broker/transport.ts +125 -0
  293. package/src/sdk/bus/chat-command-policy.ts +107 -0
  294. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  295. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  296. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  297. package/src/sdk/bus/chat-effect-journal.ts +355 -0
  298. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  299. package/src/sdk/bus/config.ts +433 -0
  300. package/src/sdk/bus/conversation-store.ts +391 -0
  301. package/src/sdk/bus/discord-conversation.ts +85 -0
  302. package/src/sdk/bus/discord-daemon.ts +2292 -0
  303. package/src/sdk/bus/discord-live-provider.ts +521 -0
  304. package/src/sdk/bus/discord-provider.ts +56 -0
  305. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  306. package/src/sdk/bus/index.ts +3979 -0
  307. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  309. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  310. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  311. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  312. package/src/sdk/bus/natives-augment.d.ts +38 -0
  313. package/src/sdk/bus/notification-orchestration.ts +535 -0
  314. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  315. package/src/sdk/bus/session-control.ts +333 -0
  316. package/src/sdk/bus/slack-conversation.ts +74 -0
  317. package/src/sdk/bus/slack-daemon.ts +2144 -0
  318. package/src/sdk/bus/slack-live-provider.ts +380 -0
  319. package/src/sdk/bus/slack-provider.ts +76 -0
  320. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  321. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  322. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  323. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  324. package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
  325. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  326. package/src/sdk/bus/telegram-setup.ts +663 -0
  327. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  328. package/src/sdk/cli/index.ts +1 -0
  329. package/src/sdk/cli/session-cli.ts +275 -0
  330. package/src/sdk/client/client.ts +1 -0
  331. package/src/sdk/client/discovery.ts +108 -0
  332. package/src/sdk/client/index.ts +2 -0
  333. package/src/sdk/host/control/dispatch.ts +367 -0
  334. package/src/sdk/host/control/index.ts +10 -0
  335. package/src/sdk/host/control/operations.ts +63 -0
  336. package/src/sdk/host/events.ts +91 -0
  337. package/src/sdk/host/host.ts +296 -0
  338. package/src/sdk/host/index.ts +4 -0
  339. package/src/sdk/host/query/cursor.ts +189 -0
  340. package/src/sdk/host/query/handlers.ts +533 -0
  341. package/src/sdk/host/query/index.ts +3 -0
  342. package/src/sdk/host/query/revision-store.ts +1126 -0
  343. package/src/sdk/host/reverse-leases.ts +325 -0
  344. package/src/sdk/host/types.ts +29 -0
  345. package/src/sdk/index.ts +13 -0
  346. package/src/sdk/lifecycle-session.ts +39 -0
  347. package/src/sdk/mcp/index.ts +1 -0
  348. package/src/sdk/mcp/server.ts +332 -0
  349. package/src/sdk/models.ts +168 -0
  350. package/src/sdk/protocol/adapter-validation.ts +48 -0
  351. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  352. package/src/sdk/protocol/operation-registry.ts +312 -0
  353. package/src/{sdk.ts → sdk/session.ts} +339 -212
  354. package/src/sdk/startup-capability.ts +189 -0
  355. package/src/session/agent-session.ts +2650 -944
  356. package/src/session/default-model-selection.ts +93 -0
  357. package/src/session/fallback-chain-controller.ts +136 -0
  358. package/src/session/session-manager.ts +438 -11
  359. package/src/session/session-storage.ts +8 -1
  360. package/src/setup/credential-auto-import.ts +290 -35
  361. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  362. package/src/slash-commands/builtin-registry.ts +2 -1
  363. package/src/task/executor.ts +62 -13
  364. package/src/task/index.ts +26 -16
  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/subagent-render.ts +19 -8
  384. package/src/tools/subagent.ts +84 -32
  385. package/src/tools/telegram-send.ts +2 -2
  386. package/vendor/insane-search/MANIFEST.json +2 -1
  387. package/vendor/insane-search/engine/bias_check.py +4 -1
  388. package/vendor/insane-search/engine/phase0.py +26 -1
  389. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  390. package/dist/types/modes/bridge/auth.d.ts +0 -12
  391. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  392. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  393. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  394. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  395. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  396. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  397. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  398. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  399. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  400. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  401. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  402. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  403. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  404. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  405. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  406. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  407. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  408. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  409. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  410. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  411. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  412. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  413. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  414. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  415. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  416. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  417. package/dist/types/notifications/config.d.ts +0 -132
  418. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  419. package/src/modes/bridge/auth.ts +0 -41
  420. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  421. package/src/modes/bridge/bridge-mode.ts +0 -675
  422. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  423. package/src/modes/bridge/event-stream.ts +0 -70
  424. package/src/modes/rpc/host-tools.ts +0 -1
  425. package/src/modes/rpc/host-uris.ts +0 -1
  426. package/src/modes/rpc/rpc-client.ts +0 -1166
  427. package/src/modes/rpc/rpc-mode.ts +0 -1029
  428. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  429. package/src/modes/rpc/rpc-types.ts +0 -637
  430. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  431. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  432. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  433. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  434. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  435. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  436. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  437. package/src/modes/shared/agent-wire/responses.ts +0 -17
  438. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  439. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  440. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  441. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  442. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  443. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  444. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  445. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  446. package/src/notifications/config.ts +0 -219
  447. package/src/notifications/index.ts +0 -1835
  448. package/src/notifications/telegram-daemon-cli.ts +0 -243
  449. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  450. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  462. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  463. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  475. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  476. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -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;
@@ -212,17 +230,40 @@ export declare class TelegramBotTransport implements BotApi {
212
230
  }): Promise<unknown>;
213
231
  }
214
232
  export type TelegramUpdateOutcome = "consumed" | "retry";
233
+ export type TelegramPollResult = {
234
+ kind: "success";
235
+ updateCount: number;
236
+ } | {
237
+ kind: "aborted";
238
+ } | {
239
+ kind: "getUpdates_failed";
240
+ error: string;
241
+ } | {
242
+ kind: "api_failure";
243
+ errorCode?: number;
244
+ description: string;
245
+ } | {
246
+ kind: "conflict";
247
+ description: string;
248
+ backoffMs: number;
249
+ };
215
250
  export interface TelegramUpdatePollerOptions {
216
251
  botApi: BotApi;
217
252
  runtime: NotificationOperatorRuntime;
218
253
  backoff: OperatorBackoffPolicy;
219
254
  processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
255
+ health?: TelegramPollHealth;
256
+ }
257
+ export declare class TelegramPollHealth {
258
+ #private;
259
+ record(result: TelegramPollResult): void;
220
260
  }
221
261
  /** Owns getUpdates offset, conflict backoff, and per-update error isolation. */
222
262
  export declare class TelegramUpdatePoller {
223
263
  #private;
224
264
  constructor(opts: TelegramUpdatePollerOptions);
225
265
  pollOnce(signal?: AbortSignal): Promise<number>;
266
+ pollOnceResult(signal?: AbortSignal): Promise<TelegramPollResult>;
226
267
  }
227
268
  /** Mutable dispatch state shared by session frames and inbound Telegram updates. */
228
269
  export declare class TelegramEventDispatchState {
@@ -271,6 +312,16 @@ export interface TelegramDaemonOptions {
271
312
  * default applies (e.g. lifecycle control disabled), no control server starts.
272
313
  */
273
314
  createLifecycleControlServer?: LifecycleControlServerFactory | null;
315
+ /**
316
+ * Test seam for observing the exact production lifecycle dependency input.
317
+ * Production defaults to {@link buildOrchestratorDeps}.
318
+ */
319
+ createLifecycleOrchestratorDeps?: (input: {
320
+ pairedChatId: string;
321
+ agentNotificationsDir: string;
322
+ sessionsRoot: string;
323
+ auditRedactionKey: Uint8Array;
324
+ }) => OrchestratorDeps;
274
325
  /** Rich text promotion (enabled by default; see rich-render.ts). */
275
326
  rich?: {
276
327
  enabled: boolean;
@@ -289,7 +340,10 @@ export interface TelegramDaemonOptions {
289
340
  };
290
341
  }
291
342
  interface SessionSocket {
343
+ /** Immutable key of the transport endpoint that owns this socket. */
292
344
  sessionId: string;
345
+ /** Current logical session carried by valid threaded frames on this transport. */
346
+ logicalSessionId: string;
293
347
  token: string;
294
348
  endpointKey: string;
295
349
  ws: WebSocket;
@@ -305,8 +359,14 @@ interface SessionSocket {
305
359
  awaitingNonce: string | undefined;
306
360
  /** Per-session liveness interval handle (only set for capable sessions). */
307
361
  pingTimer: ReturnType<typeof setInterval> | undefined;
362
+ /** Correlation id for the startup replay barrier. */
363
+ replayId: string;
364
+ /** Queues live frames until startup replay is applied. */
365
+ replayPending: boolean;
366
+ replayQueue: Record<string, unknown>[];
308
367
  }
309
368
  export declare class TelegramNotificationDaemon {
369
+ #private;
310
370
  private readonly opts;
311
371
  readonly aliasTable: AliasTable;
312
372
  readonly messageRoutes: Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>;
@@ -416,6 +476,7 @@ export declare class TelegramNotificationDaemon {
416
476
  persistSeenUpdateIds(): Promise<void>;
417
477
  private pruneSeenUpdateIds;
418
478
  private rememberSeenUpdateId;
479
+ private rememberSeenUpdateIdForUnavailableNotice;
419
480
  scanRoots(): Promise<void>;
420
481
  connectSession(sessionId: string, url: string, token: string): void;
421
482
  /**
@@ -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
  *
@@ -0,0 +1,128 @@
1
+ export declare const DEFAULT_TELEGRAM_SETUP_API_BASE = "https://api.telegram.org";
2
+ export declare const DEFAULT_TELEGRAM_SETUP_POLL_TIMEOUT_MS = 60000;
3
+ export declare const DEFAULT_TELEGRAM_SETUP_POLL_INTERVAL_MS = 1000;
4
+ export type TelegramThreadedModeState = "enabled" | "disabled" | "unknown";
5
+ export type TelegramThreadedModeLabel = "verified" | "unverified" | "unknown";
6
+ export type TelegramSetupPairingSource = "discovered" | "provided" | "reused";
7
+ export type TelegramSetupFailureStatus = "error" | "cancelled" | "requires_explicit_chat" | "ownership_lost" | "aborted";
8
+ export interface TelegramSetupTimers {
9
+ now(): number;
10
+ sleep(ms: number, signal?: AbortSignal): Promise<void>;
11
+ }
12
+ export interface TelegramSetupDeps {
13
+ fetchImpl: typeof fetch;
14
+ apiBase?: string;
15
+ timers?: TelegramSetupTimers;
16
+ }
17
+ /** Current daemon ownership facts collected by the caller before setup starts. */
18
+ export interface TelegramSetupPreflight {
19
+ storedChatId?: string;
20
+ daemon?: {
21
+ live: boolean;
22
+ tokenFingerprint?: string;
23
+ /** Required with a live daemon so reuse verifies the complete token/chat identity. */
24
+ chatId?: string;
25
+ };
26
+ }
27
+ export type TelegramSetupPollingPolicy = {
28
+ kind: "discover";
29
+ } | {
30
+ kind: "reuse_stored_chat";
31
+ chatId: string;
32
+ } | {
33
+ kind: "validate_explicit_chat";
34
+ chatId: string;
35
+ } | {
36
+ kind: "requires_explicit_chat";
37
+ } | {
38
+ kind: "cancel_foreign_or_unknown_owner";
39
+ identity: "foreign" | "unknown";
40
+ };
41
+ export type TelegramSetupEvent = {
42
+ kind: "token_validated";
43
+ message: string;
44
+ } | {
45
+ kind: "threaded_mode_guidance";
46
+ message: string;
47
+ } | {
48
+ kind: "rejected_chat";
49
+ message: string;
50
+ };
51
+ export interface TelegramSetupSuccess {
52
+ ok: true;
53
+ chatId: string;
54
+ tokenFingerprint: string;
55
+ threadedMode: TelegramThreadedModeState;
56
+ threadedLabel: TelegramThreadedModeLabel;
57
+ pairingSource: TelegramSetupPairingSource;
58
+ }
59
+ export interface TelegramSetupFailure {
60
+ ok: false;
61
+ status: TelegramSetupFailureStatus;
62
+ detail: string;
63
+ }
64
+ export type TelegramSetupResult = TelegramSetupSuccess | TelegramSetupFailure;
65
+ export interface TelegramBot {
66
+ id: number;
67
+ isBot?: boolean;
68
+ firstName?: string;
69
+ username?: string;
70
+ hasTopicsEnabled?: boolean;
71
+ allowsUsersToCreateTopics?: boolean;
72
+ }
73
+ export type TelegramTokenValidationResult = {
74
+ ok: true;
75
+ bot: TelegramBot;
76
+ threadedMode: TelegramThreadedModeState;
77
+ } | TelegramSetupFailure;
78
+ export type TelegramPrivateChatValidationResult = {
79
+ ok: true;
80
+ chatId: string;
81
+ } | TelegramSetupFailure;
82
+ export interface RunTelegramSetupInput {
83
+ token: string;
84
+ preflight: TelegramSetupPreflight;
85
+ /**
86
+ * Re-reads daemon ownership immediately before any `getUpdates` call. It is
87
+ * mandatory for discovery because an earlier preflight cannot own Telegram's
88
+ * single-poller slot.
89
+ */
90
+ revalidatePreflight?: (signal?: AbortSignal) => Promise<TelegramSetupPreflight>;
91
+ chatId?: string;
92
+ interactive: boolean;
93
+ threadedModePrompt?: (message: string) => Promise<string>;
94
+ pollTimeoutMs?: number;
95
+ pollIntervalMs?: number;
96
+ signal?: AbortSignal;
97
+ onEvent?: (event: TelegramSetupEvent) => void;
98
+ deps: TelegramSetupDeps;
99
+ }
100
+ export declare function withTelegramSetupLease<T>(token: string, operation: () => Promise<T>): Promise<T>;
101
+ /** Validate a token with getMe without exposing it in diagnostics or results. */
102
+ export declare function validateTelegramBotToken(input: {
103
+ token: string;
104
+ deps: TelegramSetupDeps;
105
+ signal?: AbortSignal;
106
+ }): Promise<TelegramTokenValidationResult>;
107
+ /** Validate that a supplied or stored chat is an actual Telegram private chat. */
108
+ export declare function validateTelegramPrivateChat(input: {
109
+ token: string;
110
+ chatId: string;
111
+ deps: TelegramSetupDeps;
112
+ signal?: AbortSignal;
113
+ }): Promise<TelegramPrivateChatValidationResult>;
114
+ /**
115
+ * Decide whether setup may call getUpdates. Any live daemon is a hard polling
116
+ * boundary: only a verified complete token/chat identity may reuse the stored
117
+ * chat; setup never polls while any live owner exists.
118
+ */
119
+ export declare function resolveTelegramSetupPollingPolicy(input: {
120
+ token: string;
121
+ preflight: TelegramSetupPreflight;
122
+ chatId?: string;
123
+ }): TelegramSetupPollingPolicy;
124
+ /**
125
+ * Validate a token, assess Threaded Mode, and obtain a private chat according
126
+ * to the daemon poller-contention policy. No settings are written here.
127
+ */
128
+ export declare function runTelegramSetup(input: RunTelegramSetupInput): Promise<TelegramSetupResult>;
@@ -30,6 +30,10 @@ export interface TopicRecord {
30
30
  userNameUpdateId?: number;
31
31
  /** Stable repo/branch identity used when topic names are user-owned or customized. */
32
32
  identityKey?: string;
33
+ /** Last SDK event generation durably consumed by the notification daemon. */
34
+ replayGeneration?: number;
35
+ /** Last SDK event sequence durably consumed within replayGeneration. */
36
+ replaySeq?: number;
33
37
  }
34
38
  /** Serialisable shape persisted to disk. */
35
39
  export interface TopicRegistryState {
@@ -68,6 +72,13 @@ export declare class TopicRegistry {
68
72
  needsIdentity(sessionId: string): boolean;
69
73
  /** Remember stable repo/branch identity independently of the displayed name. */
70
74
  markIdentityKey(sessionId: string, identityKey: string): boolean;
75
+ /** Last durably consumed SDK event cursor for reconnect replay. */
76
+ replayCursor(sessionId: string): {
77
+ generation: number;
78
+ seq: number;
79
+ } | undefined;
80
+ /** Advance the durable reconnect cursor without allowing stale responses to move it backwards. */
81
+ markReplayCursor(sessionId: string, generation: number, seq: number): boolean;
71
82
  /** Whether daemon identity reconciliation should apply `name`. */
72
83
  needsRename(sessionId: string, name: string): boolean;
73
84
  /** The user-owned name that must be preserved, when one exists. */
@@ -0,0 +1 @@
1
+ export * from "./session-cli";
@@ -0,0 +1,19 @@
1
+ export type SdkSessionCliAction = "list" | "control" | "query" | "global";
2
+ export interface SdkSessionCliArgs {
3
+ action?: string;
4
+ sessionId?: string;
5
+ operation?: string;
6
+ query?: string;
7
+ jsonInput?: string;
8
+ jsonInputFile?: string;
9
+ idempotencyKey?: string;
10
+ jsonInputStdin?: boolean;
11
+ confirm?: boolean;
12
+ cursor?: string;
13
+ showEndpointCredential?: boolean;
14
+ yes?: boolean;
15
+ repo?: string;
16
+ agentDir?: string;
17
+ }
18
+ /** Runs the pure-SDK `gjc daemon session` command family. */
19
+ export declare function runSdkSessionCli(args: SdkSessionCliArgs, writeOutput?: (value: unknown) => void, setExitCode?: (exitCode: 1 | 2) => void): Promise<void>;
@@ -0,0 +1 @@
1
+ export * from "@gajae-code/bridge-client";