@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
@@ -3,13 +3,13 @@
3
3
  *
4
4
  * Hosts a per-session loopback WebSocket notification server (the Rust core via
5
5
  * N-API) and bridges GJC session events + the `ask` tool to it so a remote client
6
- * (e.g. a Telegram bot) can both see action-needed signals and ANSWER them —
7
- * without requiring RPC/unattended mode:
6
+ * (e.g. a Telegram bot) can both see action-needed signals and answer them
7
+ * through SDK-native session capabilities:
8
8
  *
9
9
  * - `ask` (interactive): registers an {@link AskAnswerSource}; the ask tool races
10
10
  * the local UI against a remote reply. First valid answer wins; a local answer
11
11
  * aborts the remote wait (and broadcasts `action_resolved` resolvedBy=local).
12
- * - `ask` (unattended/RPC): observes emitted workflow gates and resolves the real
12
+ * - `ask` (workflow gate): observes emitted workflow gates and resolves the real
13
13
  * gate on a remote reply via `ctx.workflowGate`.
14
14
  * - `turn_end` -> `action_needed` (kind `idle`, deduped per turn).
15
15
  * - `session_shutdown` -> `session_closed` frame, stop server, deregister answer source.
@@ -17,8 +17,13 @@
17
17
  * Enable with Settings notifications config, `GJC_NOTIFICATIONS=1` (a token is
18
18
  * generated), or `GJC_NOTIFICATIONS_TOKEN`.
19
19
  */
20
- import { Settings } from "../config/settings";
21
- import type { ExtensionAPI, ExtensionContext } from "../extensibility/extensions";
20
+ import { NotificationServer } from "@gajae-code/natives";
21
+ import { Settings } from "../../config/settings";
22
+ import type { ExtensionAPI, ExtensionContext } from "../../extensibility/extensions";
23
+ import type { WorkflowGateTerminalProof } from "../../modes/shared/agent-wire/workflow-gate-broker";
24
+ import type { AskRemoteControl } from "../../tools";
25
+ import { NotificationSessionController } from "./session-control";
26
+ import { type EnsureDaemonResult } from "./telegram-daemon";
22
27
  /** Where a `session_create` should run. Discriminated by `kind`. */
23
28
  export type SessionCreateTarget = {
24
29
  kind: "existing_path";
@@ -59,7 +64,7 @@ export interface SessionCreateFrame {
59
64
  /** Control-endpoint token authorizing this frame. */
60
65
  token: string;
61
66
  target: SessionCreateTarget;
62
- /** Reference to the daemon-written, once-consumed startup-prompt file. */
67
+ /** Reserved for a future capability transport; any supplied value is rejected before lifecycle acceptance. */
63
68
  startupPromptRef?: string;
64
69
  /** Model profile preset to activate for the spawned session (--mpreset). */
65
70
  modelPreset?: string;
@@ -83,6 +88,7 @@ export interface SessionResumeFrame {
83
88
  chatId: string;
84
89
  token: string;
85
90
  target: SessionResumeTarget;
91
+ /** Reserved for a future capability transport; any supplied value is rejected before lifecycle acceptance. */
86
92
  startupPromptRef?: string;
87
93
  }
88
94
  /** Any client -> ingress lifecycle request frame. */
@@ -136,7 +142,7 @@ export interface SessionResumeResponseFrame {
136
142
  topic: LifecycleTopic;
137
143
  }
138
144
  /** Machine-readable reason a lifecycle request failed. */
139
- export type LifecycleErrorReason = "unauthorized" | "rate_limited" | "duplicate_conflict" | "invalid_target" | "ambiguous_target" | "spawn_failed" | "discovery_timeout" | "readiness_timeout" | "close_refused" | "not_found" | "terminal_uncertain";
145
+ export type LifecycleErrorReason = "unauthorized" | "rate_limited" | "duplicate_conflict" | "invalid_target" | "ambiguous_target" | "spawn_failed" | "discovery_timeout" | "readiness_timeout" | "close_refused" | "not_found" | "terminal_uncertain" | "unsupported_platform";
140
146
  /** A candidate returned with an `ambiguous_target` resume error. */
141
147
  export interface ResumeCandidate {
142
148
  sessionId: string;
@@ -175,8 +181,86 @@ export interface SessionReadyFrame {
175
181
  * instead of the worktree directory (e.g. `feat-foo-01047f11`).
176
182
  */
177
183
  export declare function readGitRepoName(cwd: string): string | undefined;
184
+ interface UnattendedGatePresentation {
185
+ gateId: string;
186
+ sessionId: string;
187
+ question: string;
188
+ options: string[];
189
+ controls: readonly AskRemoteControl[];
190
+ multi: boolean;
191
+ allowEmpty: boolean;
192
+ navigationLabel?: "Next" | "Done";
193
+ selectedOptions: string[];
194
+ workflowGateId?: string;
195
+ onActivated?: (actionId: string, lease: {
196
+ actionId: string;
197
+ registrationEpoch: number;
198
+ }) => void;
199
+ onClosed?: () => void;
200
+ }
201
+ type RetireStatus = "retired" | "already_terminal" | "claimed" | "stale";
202
+ type DirectControlOutcome = "accepted" | "rejected" | "unknown";
203
+ export declare class PresentationArbiter {
204
+ #private;
205
+ private readonly server;
206
+ private readonly redact;
207
+ private readonly tag;
208
+ private readonly presentations;
209
+ private readonly routes;
210
+ private active;
211
+ private readonly queue;
212
+ private readonly retries;
213
+ private readonly retiredProofs;
214
+ private readonly directControls;
215
+ /** Explicit terminal proof for a direct control fenced before native publication. */
216
+ private readonly queuedDirectControls;
217
+ private retryTimer;
218
+ private retryTimerGateId;
219
+ private retryTimerGeneration;
220
+ private readonly terminalCancellationTimers;
221
+ private headGeneration;
222
+ private observedHead;
223
+ static readonly maxRegistrationAttempts = 3;
224
+ static readonly retryBaseDelayMs = 50;
225
+ static readonly retryMaxDelayMs = 1000;
226
+ /** Bound an unavailable interactive answer source without discarding its head silently. */
227
+ static readonly terminalCancellationDelayMs = 250;
228
+ /** Revalidates the live endpoint queue head before bounded recovery. */
229
+ reconcile(): void;
230
+ /** Explicit production recovery for a previously exhausted endpoint queue head. */
231
+ recover(gateId?: string): void;
232
+ hasActivePresentation(): boolean;
233
+ retireForDirectControl(gateId: string): RetireStatus;
234
+ prepareDirectControl(gateId: string): {
235
+ status: "retired" | "queued";
236
+ ordinal: number;
237
+ } | {
238
+ status: "claimed" | "stale";
239
+ };
240
+ finishDirectControl(gateId: string, prepared: {
241
+ status: "retired" | "queued";
242
+ ordinal: number;
243
+ }, outcome: DirectControlOutcome): void;
244
+ constructor(server: NotificationServer, redact: () => boolean, tag: string);
245
+ retain(presentation: UnattendedGatePresentation): void;
246
+ routeFor(actionId: string): string | undefined;
247
+ presentationFor(actionId: string): UnattendedGatePresentation | undefined;
248
+ /** The native generic claim has already resolved this old action. */
249
+ toggle(actionId: string, label: string): boolean;
250
+ /** Clears an interactive route only when it is still the route that settled. */
251
+ completeInteractive(gateId: string, actionId: string): void;
252
+ /** Clears an interactive presentation after its route was retired for direct control. */
253
+ completeDirect(gateId: string): void;
254
+ reissueAfterFailure(actionId: string): void;
255
+ reissue(gateId: string): string | undefined;
256
+ closeInteraction(actionId: string, reason: string): boolean;
257
+ complete(gateId: string): WorkflowGateTerminalProof;
258
+ cancelInteractive(): void;
259
+ cancel(gateId: string, reason: string): void;
260
+ dispose(): void;
261
+ }
178
262
  export declare function notificationsEnabled(): boolean;
179
- /** Workflow-gate answer shape (unattended mode). */
263
+ /** Workflow-gate answer shape. */
180
264
  interface GateAnswer {
181
265
  selected: string[];
182
266
  other?: boolean;
@@ -195,11 +279,11 @@ type GateAnswerResult = {
195
279
  reason: string;
196
280
  };
197
281
  /**
198
- * Map a client answer to the workflow-gate answer shape (unattended mode).
282
+ * Map a client answer to the workflow-gate answer shape.
199
283
  *
200
284
  * The protocol defines a numeric reply as an option index, so a number outside
201
- * `options` is invalid (issue #2030): it must NOT be converted into a free-text
202
- * `Other` that passes the ask schema and triggers a misleading success ack.
285
+ * `options` is invalid: it must NOT be converted into free text that passes the
286
+ * ask schema and triggers a misleading success acknowledgement.
203
287
  * Only JSON strings enter the free-text/Other path.
204
288
  */
205
289
  export declare function mapAnswerToGate(answerJson: string, options: string[]): GateAnswerResult;
@@ -207,13 +291,29 @@ interface NotificationControlCommandPayload {
207
291
  name?: unknown;
208
292
  action?: unknown;
209
293
  level?: unknown;
294
+ global?: unknown;
295
+ selector?: unknown;
210
296
  instructions?: unknown;
211
297
  }
212
- export declare function executeNotificationControlCommand(command: NotificationControlCommandPayload | undefined, ctx: ExtensionContext, api: ExtensionAPI): Promise<{
298
+ export interface NotificationControlCommandResult {
213
299
  status: "ok" | "error" | "unavailable";
214
300
  message: string;
215
- }>;
301
+ modelChoices?: Array<{
302
+ selector: string;
303
+ label: string;
304
+ }>;
305
+ }
306
+ export declare function executeNotificationControlCommand(command: NotificationControlCommandPayload | undefined, ctx: ExtensionContext, api: ExtensionAPI, expectedSessionId?: string): Promise<NotificationControlCommandResult>;
216
307
  export declare function createNotificationsExtension(api: ExtensionAPI, options?: {
217
308
  settings?: Settings;
309
+ ensureTelegramDaemon?: (input: {
310
+ settings: Settings;
311
+ cwd: string;
312
+ sessionId: string;
313
+ }) => Promise<EnsureDaemonResult>;
314
+ /** Suppress auto-delivery for a GJC-spawned child under `sessionScope=primary`. */
315
+ spawnedByGjc?: boolean;
316
+ controller?: NotificationSessionController;
317
+ onSdkRequest?: (kind: "control" | "query", connectionId: string, frame: Record<string, unknown>) => void;
218
318
  }): void;
219
319
  export {};
@@ -1,5 +1,5 @@
1
- import { type OwnerIsolationProbe } from "../gjc-runtime/tmux-owner-isolation";
2
- import { type GjcTmuxSessionStatus } from "../gjc-runtime/tmux-sessions";
1
+ import { type OwnerIsolationProbe } from "../../gjc-runtime/tmux-owner-isolation";
2
+ import { type GjcTmuxSessionStatus } from "../../gjc-runtime/tmux-sessions";
3
3
  import type { ResumeCandidate, SessionCreateFrame, SessionLifecycleRequest, SessionLifecycleResponse } from "./index";
4
4
  import { type AuditEvent, type CreateEffectResult, type LedgerStore, type LifecycleOutcome, type OrchestratorDeps, type ResumeEffectResult } from "./lifecycle-orchestrator";
5
5
  /** Minimal view of the native control server this runtime depends on. */
@@ -96,6 +96,8 @@ export declare function attachLifecycleControl(server: ControlServerLike, deps:
96
96
  export declare function buildOrchestratorDeps(input: {
97
97
  pairedChatId: string;
98
98
  agentNotificationsDir: string;
99
+ /** Required in-memory, 32-byte audit-v2 redaction key. */
100
+ auditRedactionKey: Uint8Array;
99
101
  /** Root of saved session histories (`<agentDir>/sessions`), for resume resolution. */
100
102
  sessionsRoot?: string;
101
103
  env?: NodeJS.ProcessEnv;
@@ -19,6 +19,7 @@ export interface LedgerEntry {
19
19
  /** Close effect outcome: whether the tmux process is confirmed gone. */
20
20
  processGone?: boolean;
21
21
  reason?: LifecycleErrorReason;
22
+ resumeMode?: ResumeEffectResult["mode"];
22
23
  }
23
24
  /** The full on-disk ledger document. */
24
25
  export interface LedgerDoc {
@@ -31,23 +32,18 @@ export interface LedgerStore {
31
32
  /** Write atomically (temp + fsync + rename) under a per-ledger lock. */
32
33
  write(doc: LedgerDoc): Promise<void>;
33
34
  }
34
- /** One audit line. Tokens and raw prompts are NEVER included. */
35
+ /** Redacted audit-v2 event. */
35
36
  export interface AuditEvent {
37
+ schemaVersion: 2;
36
38
  ts: string;
37
39
  event: "accepted" | "rejected" | "duplicate_reack" | "rate_limited" | "spawn_started" | "recovered_in_progress" | "success" | "failure" | "terminal_uncertain";
38
- chatId: string;
40
+ chatRef: string;
39
41
  updateId: number;
40
- requestId: string;
41
- requestHash: string;
42
+ requestRef: string;
42
43
  verb: SessionLifecycleRequest["type"];
43
- targetSummary: Record<string, unknown>;
44
- sessionId?: string;
45
- tmuxSession?: string;
44
+ targetKind: CanonicalTargetKind;
45
+ targetRef: string;
46
46
  reason?: LifecycleErrorReason;
47
- /** Prompt byte length only (never the prompt text). */
48
- promptBytes?: number;
49
- /** Prompt content hash only (never the prompt text). */
50
- promptHash?: string;
51
47
  }
52
48
  export interface CreateEffectResult {
53
49
  sessionId: string;
@@ -63,13 +59,17 @@ export interface ResumeEffectResult extends CreateEffectResult {
63
59
  export interface OrchestratorDeps {
64
60
  /** The single paired chat id. Anything else is rejected before parsing. */
65
61
  pairedChatId: string;
62
+ /** In-memory, derived 32-byte audit-v2 HMAC key. */
63
+ auditRedactionKey: Uint8Array;
66
64
  now: () => number;
67
65
  store: LedgerStore;
68
66
  audit: (event: AuditEvent) => Promise<void> | void;
67
+ /** Resolves the returned tmux provider once per request for psmux preflight. */
68
+ isPsmuxProvider: () => boolean;
69
69
  /** Per-chat create rate limiter: returns true when allowed. */
70
70
  allowCreate: (chatId: string, nowMs: number) => boolean;
71
- /** Persist the once-consumed 0600 startup-prompt file; returns its ref. */
72
- writeStartupPrompt: (requestId: string, prompt: string | undefined) => Promise<string | undefined>;
71
+ /** Persist the once-consumed 0600 startup-prompt file after durably recording its ref. */
72
+ writeStartupPrompt: (requestId: string, prompt: string | undefined, persistRef: (ref: string) => Promise<void>) => Promise<string | undefined>;
73
73
  /** Spawn a session for a create/cold-restart. */
74
74
  spawnCreate: (frame: SessionCreateFrame, ids: {
75
75
  lifecycleRequestId: string;
@@ -91,16 +91,13 @@ export interface OrchestratorDeps {
91
91
  } | {
92
92
  notFound: true;
93
93
  }>;
94
- newLifecycleRequestId: () => string;
95
- newSessionId: () => string;
96
94
  }
97
- /** A redaction-safe summary of a request target (never includes the token). */
98
- export declare function summarizeTarget(frame: SessionLifecycleRequest): Record<string, unknown>;
99
- /**
100
- * Stable request hash over the meaningful (non-token) request content. Used to
101
- * detect a duplicate update id reused with a DIFFERENT body (conflict).
102
- */
95
+ export type CanonicalTargetKind = "existing_path" | "worktree" | "plain_dir" | "session_close" | "session_resume";
96
+ export declare function canonicalTarget(frame: SessionLifecycleRequest): string;
97
+ export declare function canonicalRequest(frame: SessionLifecycleRequest): string;
103
98
  export declare function requestHash(frame: SessionLifecycleRequest): string;
99
+ export declare function auditRedactionRef(key: Uint8Array, domain: string, value: string): string;
100
+ export declare function summarizeTarget(frame: SessionLifecycleRequest): Record<string, unknown>;
104
101
  export declare function ledgerKey(chatId: string, updateId: number): string;
105
102
  /** How a freshly-arrived request relates to the durable ledger. */
106
103
  export type DuplicateClass = {
@@ -1,4 +1,4 @@
1
- import type { Settings } from "../config/settings";
1
+ import type { Settings } from "../../config/settings";
2
2
  import { RateLimitPool } from "./rate-limit-pool";
3
3
  import { type ThreadedSend } from "./threaded-render";
4
4
  export interface ManagedNotificationDaemonFs {
@@ -0,0 +1,13 @@
1
+ export declare class NativeRuntimeCompatibilityError extends Error {
2
+ readonly runtimeVersion: string;
3
+ readonly nativeVersion: string;
4
+ readonly workflowArbitrationAvailable: boolean;
5
+ readonly code = "native_runtime_incompatible";
6
+ readonly retryable = false;
7
+ constructor(runtimeVersion: string, nativeVersion: string, workflowArbitrationAvailable: boolean);
8
+ }
9
+ export declare function assertNativeRuntimeCompatibility(input: {
10
+ runtimeVersion: string;
11
+ nativeVersion: string;
12
+ notificationServer: unknown;
13
+ }): void;
@@ -0,0 +1,170 @@
1
+ import type { RawSettings, SettingsAtomicPatch, SettingsAtomicReceipt } from "../../config/settings";
2
+ import { type NotificationSettingsReader, type TelegramActivationMarker, type TelegramActivationMarkers, type TelegramActivationReason, type TelegramActivationState, telegramActivationIdentity } from "./config";
3
+ import { type EnsureTelegramDaemonDetailedResult, type TelegramDaemonFs } from "./telegram-daemon";
4
+ export type { TelegramActivationMarker, TelegramActivationMarkers, TelegramActivationReason, TelegramActivationState };
5
+ export { telegramActivationIdentity };
6
+ /** The identity relationship between a proposed Telegram configuration and a live daemon owner. */
7
+ export type ProposedTelegramIdentityStatus = "absent" | "same" | "foreign" | "unknown";
8
+ /**
9
+ * Non-secret metadata about a daemon owner. Token fingerprints and the owner's
10
+ * chat ID intentionally never cross this boundary. `chatDisplay`, when present,
11
+ * is supplied by the caller from an already-approved proposed-chat display.
12
+ */
13
+ export interface TelegramDaemonOwnerMetadata {
14
+ ownerId: string;
15
+ pid: number;
16
+ generation?: number;
17
+ chatDisplay?: string;
18
+ }
19
+ /** Secret-safe proposed-identity preflight outcome. */
20
+ export interface ProposedTelegramIdentity {
21
+ status: ProposedTelegramIdentityStatus;
22
+ owner?: TelegramDaemonOwnerMetadata;
23
+ }
24
+ export interface ProposedTelegramIdentityPreflightInput {
25
+ settings: NotificationSettingsReader;
26
+ botToken: string;
27
+ chatId: string;
28
+ /** A UI-approved display value for the proposed chat; never inferred from a foreign daemon state. */
29
+ chatDisplay?: string;
30
+ deps?: {
31
+ fs?: TelegramDaemonFs;
32
+ pidAlive?: (pid: number) => boolean;
33
+ };
34
+ }
35
+ /**
36
+ * Compare a proposed identity with the current daemon owner without exposing a
37
+ * token or token fingerprint. Invalid/unreadable state is deliberately
38
+ * `unknown`, which callers must treat as cancel-by-default.
39
+ */
40
+ export declare function proposedTelegramIdentity(input: ProposedTelegramIdentityPreflightInput): Promise<ProposedTelegramIdentity>;
41
+ export interface NotificationConfigurationWriter extends NotificationSettingsReader {
42
+ commitAtomicBatch(patches: readonly SettingsAtomicPatch[]): Promise<SettingsAtomicReceipt>;
43
+ commitAtomicBatchWithCurrent?(buildPatches: (current: Readonly<RawSettings>) => Promise<readonly SettingsAtomicPatch[]> | readonly SettingsAtomicPatch[]): Promise<SettingsAtomicReceipt>;
44
+ }
45
+ export declare function createTelegramActivationMarker(input: {
46
+ botToken: string;
47
+ chatId: string;
48
+ state: TelegramActivationState;
49
+ reason?: TelegramActivationReason;
50
+ now?: Date;
51
+ }): TelegramActivationMarker;
52
+ export declare function observedTelegramActivationMarker(settings: NotificationSettingsReader, botToken: string, chatId: string): TelegramActivationMarker | undefined;
53
+ /** Persist one durable marker without discarding markers for other identities. */
54
+ export declare function persistTelegramActivationMarker(settings: NotificationConfigurationWriter, marker: TelegramActivationMarker): Promise<SettingsAtomicReceipt>;
55
+ /** Clear only the exact marker that was safely reconciled. */
56
+ export declare function clearTelegramActivationMarker(settings: NotificationConfigurationWriter, marker: TelegramActivationMarker): Promise<void>;
57
+ export type CompleteNonTelegramAdapter = "discord" | "slack";
58
+ export type SaveTelegramInactiveAvailability = {
59
+ available: true;
60
+ };
61
+ /**
62
+ * Telegram-specific activation markers let Save inactive preserve globally
63
+ * enabled Discord and Slack adapters, so the action is always available.
64
+ */
65
+ export declare function getSaveTelegramInactiveAvailability(_settings: NotificationSettingsReader): SaveTelegramInactiveAvailability;
66
+ export type SaveTelegramInactiveResult = {
67
+ status: "saved_inactive";
68
+ receipt: SettingsAtomicReceipt;
69
+ };
70
+ /**
71
+ * Atomically persist Telegram credentials with a non-secret inactive marker.
72
+ * Global notifications are disabled only when Telegram is the sole complete adapter.
73
+ */
74
+ export declare function saveTelegramInactive(input: {
75
+ settings: NotificationConfigurationWriter;
76
+ botToken: string;
77
+ chatId: string;
78
+ }): Promise<SaveTelegramInactiveResult>;
79
+ export interface TelegramRemovalRuntime {
80
+ /** Stops the local endpoint, unregisters its root, and stops an unreferenced old daemon. */
81
+ stopAndUnregister(): Promise<void>;
82
+ }
83
+ /**
84
+ * Remove Telegram credentials without disturbing other adapters. Runtime
85
+ * teardown is intentionally first: a failed teardown leaves durable credentials
86
+ * untouched rather than orphaning an old daemon/root behind a successful delete.
87
+ */
88
+ export declare function removeTelegramConfiguration(input: {
89
+ settings: NotificationConfigurationWriter;
90
+ removal: TelegramRemovalRuntime;
91
+ }): Promise<{
92
+ receipt: SettingsAtomicReceipt;
93
+ globallyDisabled: boolean;
94
+ }>;
95
+ /** Detailed outcome of checking or reconnecting the Telegram daemon after a durable commit. */
96
+ export type TelegramDaemonReconnectOutcome = EnsureTelegramDaemonDetailedResult;
97
+ /**
98
+ * The session controller must not resolve `enterBlockedRuntime` until its
99
+ * current endpoint has stopped and been removed. This lets callers report a
100
+ * blocked save only after no further frames can reach the foreign owner.
101
+ */
102
+ export interface NotificationRuntimeController {
103
+ /** Resolves only after the current endpoint is stopped and removed. */
104
+ enterBlockedRuntime(): Promise<unknown>;
105
+ clearBlockedRuntime(): Promise<unknown>;
106
+ reconcileCurrentSession(): Promise<unknown>;
107
+ }
108
+ export interface TelegramPostCommitActivation {
109
+ controller: NotificationRuntimeController;
110
+ reconnect: () => Promise<TelegramDaemonReconnectOutcome>;
111
+ /** Durable Telegram-only marker write after the endpoint has stopped. */
112
+ persistInactive(marker: TelegramActivationMarker): Promise<SettingsAtomicReceipt>;
113
+ /** Remove the exact activation marker only after a safe reconnect. */
114
+ clearInactive(marker: TelegramActivationMarker): Promise<void>;
115
+ marker: TelegramActivationMarker;
116
+ }
117
+ export type PostCommitTelegramActivationResult = {
118
+ status: "activated";
119
+ reconnect: Exclude<TelegramDaemonReconnectOutcome, "blocked_identity">;
120
+ } | {
121
+ status: "blocked_identity";
122
+ message: string;
123
+ restore(): Promise<BlockedTelegramRestoreResult>;
124
+ retainCommitted(): void;
125
+ };
126
+ export type BlockedTelegramRestoreResult = {
127
+ status: "restored";
128
+ reconnect: TelegramDaemonReconnectOutcome;
129
+ } | {
130
+ status: "conflict";
131
+ paths: readonly string[];
132
+ } | {
133
+ status: "discarded";
134
+ } | {
135
+ status: "still_blocked";
136
+ };
137
+ /**
138
+ * Complete a committed Telegram update in the required order: identity
139
+ * reconnect first, normal session reconciliation second. A post-commit foreign
140
+ * owner race stops the endpoint, durably marks only that Telegram identity
141
+ * inactive, then exposes an ordered CAS restore/retain choice.
142
+ */
143
+ export declare function reconcileCommittedTelegramConfiguration(input: {
144
+ receipt: SettingsAtomicReceipt;
145
+ activation: TelegramPostCommitActivation;
146
+ inactiveMarkerToClear?: TelegramActivationMarker;
147
+ }): Promise<PostCommitTelegramActivationResult>;
148
+ export type SaveTelegramConfigurationResult = {
149
+ status: "cancelled";
150
+ preflight: ProposedTelegramIdentity;
151
+ guidance: string;
152
+ } | SaveTelegramInactiveResult | {
153
+ status: "saved";
154
+ receipt: SettingsAtomicReceipt;
155
+ preflight: ProposedTelegramIdentity;
156
+ } | PostCommitTelegramActivationResult;
157
+ /**
158
+ * Guard a Telegram setup commit with proposed-identity preflight. Foreign and
159
+ * unreadable ownership are cancel-by-default and make no configuration changes.
160
+ */
161
+ export declare function saveTelegramConfiguration(input: {
162
+ settings: NotificationConfigurationWriter;
163
+ botToken: string;
164
+ chatId: string;
165
+ chatDisplay?: string;
166
+ /** Explicitly persist credentials disabled after a foreign/unknown preflight; otherwise cancel remains the default. */
167
+ saveInactive: boolean;
168
+ preflight?: (input: Omit<ProposedTelegramIdentityPreflightInput, "settings">) => Promise<ProposedTelegramIdentity>;
169
+ activation?: TelegramPostCommitActivation;
170
+ }): Promise<SaveTelegramConfigurationResult>;
@@ -1,4 +1,4 @@
1
- import type { Settings } from "../config/settings";
1
+ import type { Settings } from "../../config/settings";
2
2
  /**
3
3
  * Strip secrets from a human-facing diagnostic string. Redacts the configured
4
4
  * bot token (exact match) and any token-shaped substring so health/test details
@@ -60,7 +60,13 @@ export interface DaemonHealth {
60
60
  heartbeatFresh: boolean;
61
61
  identityMatches: boolean;
62
62
  stopped: boolean;
63
+ heartbeatAt: number | undefined;
64
+ heartbeatAgeMs: number | undefined;
65
+ generation: number | undefined;
66
+ currentGeneration: number;
67
+ generationRelation: DaemonGenerationRelation;
63
68
  }
69
+ export type DaemonGenerationRelation = "pre_generation" | "older" | "current" | "newer" | "unknown";
64
70
  export interface EndpointHealth {
65
71
  total: number;
66
72
  live: number;
@@ -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;