@gajae-code/coding-agent 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/CHANGELOG.md +70 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/cli/args.d.ts +4 -5
  4. package/dist/types/cli/daemon-cli.d.ts +12 -1
  5. package/dist/types/cli/notify-cli.d.ts +21 -1
  6. package/dist/types/cli.d.ts +3 -0
  7. package/dist/types/commands/daemon.d.ts +39 -0
  8. package/dist/types/commands/launch.d.ts +3 -0
  9. package/dist/types/commands/notify.d.ts +28 -1
  10. package/dist/types/commands/sdk.d.ts +33 -0
  11. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  12. package/dist/types/config/model-profile-activation.d.ts +35 -15
  13. package/dist/types/config/model-profiles.d.ts +11 -5
  14. package/dist/types/config/model-registry.d.ts +3 -3
  15. package/dist/types/config/model-resolver.d.ts +39 -6
  16. package/dist/types/config/model-selector-value.d.ts +17 -0
  17. package/dist/types/config/models-config-schema.d.ts +10 -6
  18. package/dist/types/config/settings-schema.d.ts +133 -6
  19. package/dist/types/config/settings.d.ts +63 -35
  20. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  21. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  22. package/dist/types/daemon/builtin.d.ts +6 -5
  23. package/dist/types/daemon/control-types.d.ts +1 -1
  24. package/dist/types/discovery/mcp-json.d.ts +12 -1
  25. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  27. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  28. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  29. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  30. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  31. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  32. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  33. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  35. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  36. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  37. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  38. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  39. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  40. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  41. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  42. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  43. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  44. package/dist/types/harness-control-plane/types.d.ts +3 -4
  45. package/dist/types/lsp/index.d.ts +1 -1
  46. package/dist/types/main.d.ts +32 -38
  47. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  48. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  49. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  50. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  51. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  52. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  53. package/dist/types/modes/components/gajae-pet-widget.d.ts +1 -0
  54. package/dist/types/modes/components/model-selector.d.ts +1 -0
  55. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  56. package/dist/types/modes/components/pet-capability.d.ts +37 -0
  57. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  58. package/dist/types/modes/components/settings-selector.d.ts +15 -4
  59. package/dist/types/modes/components/welcome.d.ts +1 -1
  60. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  61. package/dist/types/modes/index.d.ts +0 -4
  62. package/dist/types/modes/interactive-mode.d.ts +5 -1
  63. package/dist/types/modes/runtime-init.d.ts +2 -2
  64. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  66. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  67. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  68. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  69. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  72. package/dist/types/modes/types.d.ts +16 -1
  73. package/dist/types/runtime-mcp/client.d.ts +2 -0
  74. package/dist/types/runtime-mcp/config.d.ts +5 -1
  75. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  76. package/dist/types/runtime-mcp/types.d.ts +4 -0
  77. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  78. package/dist/types/sdk/acp/index.d.ts +2 -0
  79. package/dist/types/sdk/broker/broker.d.ts +53 -0
  80. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  81. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  82. package/dist/types/sdk/broker/identity.d.ts +3 -0
  83. package/dist/types/sdk/broker/index.d.ts +8 -0
  84. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  85. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  86. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  87. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  88. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  89. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  90. package/dist/types/sdk/broker/transport.d.ts +9 -0
  91. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  92. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  93. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  94. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  95. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  96. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  97. package/dist/types/sdk/bus/config.d.ts +274 -0
  98. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  99. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  100. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  101. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  102. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  103. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  104. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  105. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  107. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  108. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  109. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  110. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  111. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  112. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  113. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  114. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  115. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  118. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  119. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  121. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  122. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  123. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  124. package/dist/types/sdk/cli/index.d.ts +1 -0
  125. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  126. package/dist/types/sdk/client/client.d.ts +1 -0
  127. package/dist/types/sdk/client/discovery.d.ts +27 -0
  128. package/dist/types/sdk/client/index.d.ts +2 -0
  129. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  130. package/dist/types/sdk/host/control/index.d.ts +2 -0
  131. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  132. package/dist/types/sdk/host/events.d.ts +35 -0
  133. package/dist/types/sdk/host/host.d.ts +35 -0
  134. package/dist/types/sdk/host/index.d.ts +4 -0
  135. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  136. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  137. package/dist/types/sdk/host/query/index.d.ts +3 -0
  138. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  139. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  140. package/dist/types/sdk/host/types.d.ts +32 -0
  141. package/dist/types/sdk/index.d.ts +6 -0
  142. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  143. package/dist/types/sdk/mcp/index.d.ts +1 -0
  144. package/dist/types/sdk/mcp/server.d.ts +37 -0
  145. package/dist/types/sdk/models.d.ts +44 -0
  146. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  147. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  148. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  149. package/dist/types/sdk/startup-capability.d.ts +50 -0
  150. package/dist/types/session/agent-session.d.ts +114 -21
  151. package/dist/types/session/default-model-selection.d.ts +25 -0
  152. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  153. package/dist/types/session/session-manager.d.ts +58 -1
  154. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  155. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  156. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  157. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  158. package/dist/types/tools/browser/launch.d.ts +22 -0
  159. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  160. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  161. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  162. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  163. package/dist/types/tools/browser/registry.d.ts +19 -0
  164. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  165. package/dist/types/tools/index.d.ts +8 -8
  166. package/package.json +34 -13
  167. package/scripts/build-sdk-package-smoke.ts +94 -0
  168. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  169. package/scripts/compile-args.ts +4 -2
  170. package/scripts/g005-daemon-smoke.ts +4 -5
  171. package/scripts/g011-daemon-path-smoke.ts +5 -5
  172. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  173. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  174. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  175. package/scripts/manifest-schema.ts +124 -0
  176. package/scripts/run-test-manifest.ts +153 -0
  177. package/scripts/run-threat-model-check.ts +157 -0
  178. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  179. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  180. package/src/append-only-mode.ts +1 -1
  181. package/src/cli/args.ts +43 -12
  182. package/src/cli/auth-gateway-cli.ts +2 -2
  183. package/src/cli/config-cli.ts +2 -1
  184. package/src/cli/daemon-cli.ts +63 -14
  185. package/src/cli/list-models.ts +1 -1
  186. package/src/cli/notify-cli.ts +288 -286
  187. package/src/cli.ts +21 -2
  188. package/src/commands/daemon.ts +50 -6
  189. package/src/commands/harness.ts +93 -36
  190. package/src/commands/launch.ts +5 -2
  191. package/src/commands/mcp-serve.ts +19 -12
  192. package/src/commands/notify.ts +36 -3
  193. package/src/commands/sdk.ts +426 -0
  194. package/src/commit/agentic/agent.ts +1 -0
  195. package/src/config/atomic-yaml-patch.ts +423 -0
  196. package/src/config/model-profile-activation.ts +240 -89
  197. package/src/config/model-profiles.ts +37 -34
  198. package/src/config/model-registry.ts +51 -26
  199. package/src/config/model-resolver.ts +138 -51
  200. package/src/config/model-selector-value.ts +50 -0
  201. package/src/config/models-config-schema.ts +14 -21
  202. package/src/config/settings-schema.ts +128 -10
  203. package/src/config/settings.ts +1120 -158
  204. package/src/coordinator-mcp/model-preset.ts +74 -20
  205. package/src/coordinator-mcp/server.ts +1597 -3052
  206. package/src/daemon/builtin.ts +8 -5
  207. package/src/daemon/control-types.ts +1 -1
  208. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  209. package/src/discovery/mcp-json.ts +327 -20
  210. package/src/extensibility/custom-tools/types.ts +1 -1
  211. package/src/extensibility/extensions/compact-handler.ts +3 -3
  212. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  213. package/src/extensibility/extensions/loader.ts +69 -5
  214. package/src/extensibility/extensions/runner.ts +112 -4
  215. package/src/extensibility/extensions/types.ts +176 -17
  216. package/src/extensibility/hooks/types.ts +1 -1
  217. package/src/extensibility/slash-commands.ts +3 -3
  218. package/src/gjc-runtime/launch-tmux.ts +170 -86
  219. package/src/gjc-runtime/psmux-detect.ts +82 -4
  220. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  221. package/src/gjc-runtime/team-runtime.ts +54 -35
  222. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  223. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -2
  224. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  225. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  226. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  227. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  228. package/src/harness-control-plane/operate.ts +9 -9
  229. package/src/harness-control-plane/owner.ts +283 -39
  230. package/src/harness-control-plane/receipts.ts +0 -1
  231. package/src/harness-control-plane/sdk-transport.ts +395 -0
  232. package/src/harness-control-plane/session-transport.ts +94 -0
  233. package/src/harness-control-plane/types.ts +1 -1
  234. package/src/internal-urls/docs-index.generated.ts +36 -37
  235. package/src/lsp/client.ts +42 -6
  236. package/src/lsp/index.ts +2 -2
  237. package/src/main.ts +299 -204
  238. package/src/modes/DESIGN.md +258 -0
  239. package/src/modes/acp/acp-agent.ts +1228 -2612
  240. package/src/modes/acp/acp-client-bridge.ts +2 -20
  241. package/src/modes/acp/acp-event-mapper.ts +18 -2
  242. package/src/modes/acp/acp-mode.ts +8 -36
  243. package/src/modes/acp/permission-mode.ts +25 -0
  244. package/src/modes/acp/startup-options.ts +6 -0
  245. package/src/modes/components/agent-dashboard.ts +37 -17
  246. package/src/modes/components/custom-editor.ts +1 -0
  247. package/src/modes/components/gajae-pet-widget.ts +169 -20
  248. package/src/modes/components/model-selector.ts +93 -35
  249. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  250. package/src/modes/components/pet-capability.ts +115 -0
  251. package/src/modes/components/pet-selector.ts +4 -6
  252. package/src/modes/components/settings-selector.ts +86 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +1 -2
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +357 -12
  257. package/src/modes/controllers/input-controller.ts +43 -13
  258. package/src/modes/controllers/selector-controller.ts +671 -44
  259. package/src/modes/index.ts +0 -22
  260. package/src/modes/interactive-mode.ts +108 -24
  261. package/src/modes/runtime-init.ts +298 -6
  262. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  263. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  264. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  265. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  266. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  267. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  268. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  269. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  270. package/src/modes/types.ts +16 -1
  271. package/src/runtime-mcp/client.ts +94 -19
  272. package/src/runtime-mcp/config.ts +27 -15
  273. package/src/runtime-mcp/manager.ts +343 -105
  274. package/src/runtime-mcp/oauth-flow.ts +42 -12
  275. package/src/runtime-mcp/transports/http.ts +49 -19
  276. package/src/runtime-mcp/transports/stdio.ts +47 -28
  277. package/src/runtime-mcp/types.ts +10 -0
  278. package/src/sdk/acp/adapter.ts +418 -0
  279. package/src/sdk/acp/index.ts +2 -0
  280. package/src/sdk/broker/broker.ts +642 -0
  281. package/src/sdk/broker/discovery.ts +94 -0
  282. package/src/sdk/broker/ensure.ts +249 -0
  283. package/src/sdk/broker/identity.ts +42 -0
  284. package/src/sdk/broker/index.ts +8 -0
  285. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  286. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  287. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  288. package/src/sdk/broker/lifecycle.ts +2157 -0
  289. package/src/sdk/broker/process-incarnation.ts +159 -0
  290. package/src/sdk/broker/runtime.ts +164 -0
  291. package/src/sdk/broker/session-index.ts +318 -0
  292. package/src/sdk/broker/state-version.ts +23 -0
  293. package/src/sdk/broker/transport.ts +125 -0
  294. package/src/sdk/bus/chat-command-policy.ts +107 -0
  295. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  296. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  297. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  298. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  299. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  300. package/src/sdk/bus/config.ts +433 -0
  301. package/src/sdk/bus/conversation-store.ts +391 -0
  302. package/src/sdk/bus/discord-conversation.ts +85 -0
  303. package/src/sdk/bus/discord-daemon.ts +2275 -0
  304. package/src/sdk/bus/discord-live-provider.ts +521 -0
  305. package/src/sdk/bus/discord-provider.ts +56 -0
  306. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  307. package/src/sdk/bus/index.ts +3943 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  309. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  310. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  311. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  312. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  313. package/src/sdk/bus/natives-augment.d.ts +38 -0
  314. package/src/sdk/bus/notification-orchestration.ts +535 -0
  315. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  316. package/src/sdk/bus/session-control.ts +333 -0
  317. package/src/sdk/bus/slack-conversation.ts +74 -0
  318. package/src/sdk/bus/slack-daemon.ts +2144 -0
  319. package/src/sdk/bus/slack-live-provider.ts +380 -0
  320. package/src/sdk/bus/slack-provider.ts +76 -0
  321. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  322. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  323. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  324. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  325. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  326. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  327. package/src/sdk/bus/telegram-setup.ts +663 -0
  328. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  329. package/src/sdk/cli/index.ts +1 -0
  330. package/src/sdk/cli/session-cli.ts +275 -0
  331. package/src/sdk/client/client.ts +1 -0
  332. package/src/sdk/client/discovery.ts +108 -0
  333. package/src/sdk/client/index.ts +2 -0
  334. package/src/sdk/host/control/dispatch.ts +367 -0
  335. package/src/sdk/host/control/index.ts +10 -0
  336. package/src/sdk/host/control/operations.ts +63 -0
  337. package/src/sdk/host/events.ts +91 -0
  338. package/src/sdk/host/host.ts +296 -0
  339. package/src/sdk/host/index.ts +4 -0
  340. package/src/sdk/host/query/cursor.ts +189 -0
  341. package/src/sdk/host/query/handlers.ts +533 -0
  342. package/src/sdk/host/query/index.ts +3 -0
  343. package/src/sdk/host/query/revision-store.ts +1126 -0
  344. package/src/sdk/host/reverse-leases.ts +325 -0
  345. package/src/sdk/host/types.ts +29 -0
  346. package/src/sdk/index.ts +13 -0
  347. package/src/sdk/lifecycle-session.ts +39 -0
  348. package/src/sdk/mcp/index.ts +1 -0
  349. package/src/sdk/mcp/server.ts +332 -0
  350. package/src/sdk/models.ts +168 -0
  351. package/src/sdk/protocol/adapter-validation.ts +48 -0
  352. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  353. package/src/sdk/protocol/operation-registry.ts +312 -0
  354. package/src/{sdk.ts → sdk/session.ts} +339 -212
  355. package/src/sdk/startup-capability.ts +189 -0
  356. package/src/session/agent-session.ts +2470 -866
  357. package/src/session/default-model-selection.ts +93 -0
  358. package/src/session/fallback-chain-controller.ts +136 -0
  359. package/src/session/session-manager.ts +447 -13
  360. package/src/session/session-storage.ts +8 -1
  361. package/src/setup/credential-auto-import.ts +290 -35
  362. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  363. package/src/slash-commands/builtin-registry.ts +33 -30
  364. package/src/task/executor.ts +62 -13
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/telegram-send.ts +2 -2
  384. package/vendor/insane-search/MANIFEST.json +2 -1
  385. package/vendor/insane-search/engine/bias_check.py +4 -1
  386. package/vendor/insane-search/engine/phase0.py +26 -1
  387. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  388. package/dist/types/modes/bridge/auth.d.ts +0 -12
  389. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  390. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  391. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  392. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  393. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  394. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  395. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  396. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  397. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  398. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  399. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  400. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  401. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  402. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  403. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  404. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  405. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  406. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  407. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  408. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  409. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  410. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  411. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  412. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  413. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  414. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  415. package/dist/types/notifications/config.d.ts +0 -132
  416. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  417. package/src/modes/bridge/auth.ts +0 -41
  418. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  419. package/src/modes/bridge/bridge-mode.ts +0 -675
  420. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  421. package/src/modes/bridge/event-stream.ts +0 -70
  422. package/src/modes/rpc/host-tools.ts +0 -1
  423. package/src/modes/rpc/host-uris.ts +0 -1
  424. package/src/modes/rpc/rpc-client.ts +0 -1166
  425. package/src/modes/rpc/rpc-mode.ts +0 -1029
  426. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  427. package/src/modes/rpc/rpc-types.ts +0 -637
  428. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  429. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  430. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  431. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  432. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  433. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  434. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  435. package/src/modes/shared/agent-wire/responses.ts +0 -17
  436. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  437. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  438. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  439. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  440. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  441. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  442. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  443. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  444. package/src/notifications/config.ts +0 -219
  445. package/src/notifications/index.ts +0 -1835
  446. package/src/notifications/telegram-daemon-cli.ts +0 -243
  447. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  448. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,85 @@
1
+ /** Injectable Discord boundary. The daemon owns all persistence and SDK routing. */
2
+ export interface DiscordThread {
3
+ id: string;
4
+ guildId: string;
5
+ parentId: string;
6
+ archived: boolean;
7
+ locked?: boolean;
8
+ }
9
+ export interface DiscordInboundEvent {
10
+ id: string;
11
+ guildId: string;
12
+ parentId: string;
13
+ threadId: string;
14
+ authorId: string;
15
+ bot?: boolean;
16
+ content?: string;
17
+ interaction?: {
18
+ id: string;
19
+ token: string;
20
+ customId: string;
21
+ value?: string | number;
22
+ };
23
+ }
24
+ /** Discord API message components used for action-needed controls. */
25
+ export interface DiscordMessageComponent {
26
+ type: 1;
27
+ components: Array<{
28
+ type: 3;
29
+ customId: string;
30
+ placeholder?: string;
31
+ minValues?: number;
32
+ maxValues?: number;
33
+ options: Array<{
34
+ label: string;
35
+ value: string;
36
+ }>;
37
+ }>;
38
+ }
39
+ export interface DiscordProvider {
40
+ readonly applicationId: string;
41
+ readonly botUserId: string;
42
+ readonly transportHealthy?: boolean;
43
+ /** Starts a generic text-channel thread from a nonce-bearing parent starter message. */
44
+ createThread(input: {
45
+ guildId: string;
46
+ parentId: string;
47
+ name: string;
48
+ nonce: string;
49
+ }): Promise<DiscordThread>;
50
+ /** Finds a thread created with a caller-generated nonce after an uncertain create. */
51
+ findThreadByNonce(input: {
52
+ guildId: string;
53
+ parentId: string;
54
+ nonce: string;
55
+ }): Promise<DiscordThread | null>;
56
+ /** Finds a posted message by its caller-generated nonce after an uncertain post. */
57
+ findMessageByNonce(input: {
58
+ threadId: string;
59
+ nonce: string;
60
+ }): Promise<{
61
+ id: string;
62
+ } | null>;
63
+ postMessage(input: {
64
+ threadId: string;
65
+ content: string;
66
+ nonce?: string;
67
+ components?: DiscordMessageComponent[];
68
+ }): Promise<{
69
+ id: string;
70
+ }>;
71
+ /** Defers an accepted component interaction before SDK routing can exceed Discord's response deadline. */
72
+ deferInteraction(input: {
73
+ id: string;
74
+ token: string;
75
+ }): Promise<void>;
76
+ archiveThread(input: {
77
+ threadId: string;
78
+ locked?: boolean;
79
+ }): Promise<void>;
80
+ unarchiveThread(input: {
81
+ threadId: string;
82
+ }): Promise<void>;
83
+ start(onEvent: (event: DiscordInboundEvent) => Promise<void>, onError?: (error: unknown) => void): Promise<void>;
84
+ stop(): Promise<void>;
85
+ }
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Telegram HTML formatting helpers for the notifications SDK.
2
+ * Telegram HTML formatting helpers for the Gajae-Code SDK.
3
3
  *
4
- * All notifications-SDK Telegram output is sent with `parse_mode: "HTML"`. This
4
+ * All Gajae-Code SDK Telegram output is sent with `parse_mode: "HTML"`. This
5
5
  * module is the single source of truth for: escaping dynamic text, converting a
6
6
  * bounded markdown subset into Telegram HTML, safely truncating a finished
7
7
  * message to Telegram's 4096-char limit without breaking tags/entities, and
@@ -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;