@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,84 @@
1
+ import { type ConversationRecord, type ConversationStoreFs } from "./conversation-store";
2
+ export declare const CHAT_EFFECT_JOURNAL_VERSION = 1;
3
+ export declare const MAX_TERMINAL_CHAT_EFFECTS = 128;
4
+ export declare function chatEffectJournalPath(agentDir: string, transport: "discord" | "slack"): string;
5
+ export type ChatEffectState = "pending" | "leased" | "accepted" | "uncertain" | "terminal";
6
+ /** Provider receipts are identifiers/status only. Never put request or response bodies here. */
7
+ export interface ChatEffectReceipt {
8
+ provider?: string;
9
+ messageId?: string;
10
+ channelId?: string;
11
+ threadId?: string;
12
+ timestamp?: string;
13
+ status?: string;
14
+ }
15
+ /**
16
+ * A protected, generation-bound provider-visible effect. Payload is deliberately
17
+ * owned by this journal; conversation mappings may retain only `effectId`.
18
+ */
19
+ export interface ChatEffect<TPayload = unknown> extends ConversationRecord {
20
+ id: string;
21
+ kind: string;
22
+ transport: "discord" | "slack";
23
+ sessionId?: string;
24
+ endpointGeneration: number;
25
+ payload: TPayload;
26
+ state: ChatEffectState;
27
+ owner?: string;
28
+ leaseExpiresAt?: number;
29
+ epoch: number;
30
+ createdAt: number;
31
+ updatedAt: number;
32
+ receipt?: ChatEffectReceipt;
33
+ }
34
+ export interface EnqueueChatEffect<TPayload> {
35
+ id: string;
36
+ kind: string;
37
+ transport: "discord" | "slack";
38
+ sessionId?: string;
39
+ endpointGeneration: number;
40
+ payload: TPayload;
41
+ receipt?: ChatEffectReceipt;
42
+ }
43
+ export interface ChatEffectLease {
44
+ owner: string;
45
+ epoch: number;
46
+ }
47
+ /**
48
+ * One journal per transport. It uses the same 0600, fsynced atomic persistence
49
+ * and cross-process exclusive locking as mappings, but stores payloads in a
50
+ * separate protected file (`effects.json`). Terminal history is compacted only
51
+ * after terminal state is durably recorded; nonterminal effects are never evicted.
52
+ */
53
+ export declare class ChatEffectJournal {
54
+ #private;
55
+ constructor(input: {
56
+ agentDir: string;
57
+ transport: "discord" | "slack";
58
+ fs?: ConversationStoreFs;
59
+ now?: () => number;
60
+ pid?: number;
61
+ pidAlive?: (pid: number) => boolean;
62
+ pidIncarnation?: (pid: number) => string | undefined;
63
+ sleep?: (ms: number) => Promise<void>;
64
+ lockTimeoutMs?: number;
65
+ });
66
+ get filePath(): string;
67
+ read<TPayload = unknown>(id: string): Promise<ChatEffect<TPayload> | undefined>;
68
+ list(): Promise<ChatEffect[]>;
69
+ replayable(transport: "discord" | "slack", endpointGeneration: number): Promise<ChatEffect[]>;
70
+ enqueue<TPayload>(input: EnqueueChatEffect<TPayload>): Promise<ChatEffect<TPayload>>;
71
+ /**
72
+ * Inserts an effect directly into a live lease. Recovery can never observe a
73
+ * newly persisted effect as claimable before its owner has authority to act.
74
+ * Existing effects are left untouched and report no acquired lease.
75
+ */
76
+ enqueueAndClaim<TPayload>(input: EnqueueChatEffect<TPayload>, owner: string, leaseMs: number): Promise<ChatEffect<TPayload> | undefined>;
77
+ claim<TPayload = unknown>(id: string, owner: string, leaseMs: number): Promise<ChatEffect<TPayload> | undefined>;
78
+ renew<TPayload = unknown>(id: string, lease: ChatEffectLease, leaseMs: number): Promise<ChatEffect<TPayload> | undefined>;
79
+ /** Persists provider progress without releasing the owner/epoch fence. */
80
+ recordReceipt<TPayload = unknown>(id: string, lease: ChatEffectLease, receipt: ChatEffectReceipt): Promise<ChatEffect<TPayload> | undefined>;
81
+ record<TPayload = unknown>(id: string, lease: ChatEffectLease, state: Exclude<ChatEffectState, "pending" | "leased">, receipt?: ChatEffectReceipt): Promise<ChatEffect<TPayload> | undefined>;
82
+ /** Irreversibly rejects an effect whose mapping never accepted its authority. */
83
+ terminalize(id: string, receipt: ChatEffectReceipt, lease?: ChatEffectLease): Promise<ChatEffect | undefined>;
84
+ }
@@ -18,11 +18,12 @@ export interface ConfigCommandChange {
18
18
  verbosity?: "lean" | "verbose";
19
19
  redact?: boolean;
20
20
  }
21
- export type TelegramControlCommandName = "reasoning" | "usage" | "context" | "compact";
21
+ export type TelegramControlCommandName = "reasoning" | "usage" | "context" | "compact" | "model";
22
22
  export type TelegramControlCommand = {
23
23
  name: "reasoning";
24
- action: "cycle" | "status" | "set";
24
+ action: "cycle" | "status" | "set" | "show" | "hide";
25
25
  level?: string;
26
+ global?: boolean;
26
27
  } | {
27
28
  name: "usage";
28
29
  } | {
@@ -30,6 +31,10 @@ export type TelegramControlCommand = {
30
31
  } | {
31
32
  name: "compact";
32
33
  instructions?: string;
34
+ } | {
35
+ name: "model";
36
+ action: "list" | "set";
37
+ selector?: string;
33
38
  };
34
39
  export type TelegramControlCommandParseResult = {
35
40
  kind: "none";
@@ -0,0 +1,274 @@
1
+ import * as z from "zod/v4";
2
+ import { type LoadResult } from "../../config/config-file";
3
+ /**
4
+ * Env marker set by GJC's own programmatic separate-process child spawn sites
5
+ * (team workers, harness RPC owners) and carrying the spawning session id.
6
+ *
7
+ * Presence — not the value — marks a session as GJC-spawned. It is consumed
8
+ * (read once, then deleted from the child's own env) at startup so it is
9
+ * per-spawn rather than dynastic: a grandchild is marked only if its own spawn
10
+ * site marks it, never by inheriting a marked ancestor's environment.
11
+ */
12
+ export declare const SPAWN_PROVENANCE_ENV = "GJC_SPAWNED_BY_SESSION";
13
+ export type TelegramActivationState = "inactive" | "blocked";
14
+ export type TelegramActivationReason = "saved_inactive" | "identity_mismatch";
15
+ /** Non-secret, identity-specific durable Telegram activation state. */
16
+ export interface TelegramActivationMarker {
17
+ identity: string;
18
+ state: TelegramActivationState;
19
+ updatedAt: string;
20
+ reason?: TelegramActivationReason;
21
+ }
22
+ export type TelegramActivationMarkers = Record<string, TelegramActivationMarker>;
23
+ /** Validate and clone activation markers crossing the settings boundary. */
24
+ export declare function readTelegramActivationMarkers(value?: unknown): TelegramActivationMarkers;
25
+ export interface NotificationSettingsSnapshot {
26
+ enabled: boolean;
27
+ telegram: {
28
+ botToken?: string;
29
+ chatId?: string;
30
+ activation?: Record<string, unknown>;
31
+ rich: {
32
+ enabled: boolean;
33
+ };
34
+ richDraft: {
35
+ enabled: boolean;
36
+ };
37
+ topics: {
38
+ nameTemplate?: string;
39
+ };
40
+ };
41
+ discord: {
42
+ botToken?: string;
43
+ applicationId?: string;
44
+ guildId?: string;
45
+ parentChannelId?: string;
46
+ };
47
+ slack: {
48
+ botToken?: string;
49
+ appToken?: string;
50
+ workspaceId?: string;
51
+ channelId?: string;
52
+ authorizedUserId?: string;
53
+ };
54
+ redact: boolean;
55
+ verbosity: "lean" | "verbose";
56
+ sessionScope: "all" | "primary";
57
+ idleTimeoutMs: number;
58
+ }
59
+ /**
60
+ * Narrow settings boundary for remote notification identity and behavior.
61
+ * Implementations must return only user-global values, with schema defaults
62
+ * applied; project settings and runtime overrides are intentionally excluded.
63
+ */
64
+ export interface NotificationSettingsReader {
65
+ getNotificationSettingsSnapshot(): NotificationSettingsSnapshot;
66
+ getAgentDir(): string;
67
+ }
68
+ export interface NotificationConfig {
69
+ enabled: boolean;
70
+ botToken?: string;
71
+ activation?: TelegramActivationMarkers;
72
+ chatId?: string;
73
+ discord: {
74
+ botToken?: string;
75
+ applicationId?: string;
76
+ guildId?: string;
77
+ parentChannelId?: string;
78
+ };
79
+ slack: {
80
+ botToken?: string;
81
+ appToken?: string;
82
+ workspaceId?: string;
83
+ channelId?: string;
84
+ authorizedUserId?: string;
85
+ };
86
+ redact: boolean;
87
+ verbosity: "lean" | "verbose";
88
+ /**
89
+ * Which sessions may register a notification endpoint. `all` (default)
90
+ * preserves historical behavior; `primary` suppresses GJC-spawned children
91
+ * (those carrying {@link SPAWN_PROVENANCE_ENV}) unless they explicitly opt in.
92
+ */
93
+ sessionScope: "all" | "primary";
94
+ idleTimeoutMs: number;
95
+ rich: {
96
+ enabled: boolean;
97
+ };
98
+ richDraft: {
99
+ enabled: boolean;
100
+ };
101
+ topics: {
102
+ /**
103
+ * Optional Telegram forum-topic name template with `{repo}`, `{branch}`,
104
+ * and `{title}` placeholders. Unset preserves the built-in
105
+ * `{repo}/{branch} - {title}` composition (with its title/repo/branch
106
+ * fallbacks).
107
+ */
108
+ nameTemplate?: string;
109
+ };
110
+ }
111
+ /** Read typed global-only notification config from a narrow settings reader. */
112
+ export declare function getNotificationConfig(settings: NotificationSettingsReader): NotificationConfig;
113
+ declare const notificationConfigSchema: z.ZodObject<{
114
+ notifications: z.ZodOptional<z.ZodObject<{
115
+ enabled: z.ZodOptional<z.ZodBoolean>;
116
+ discord: z.ZodOptional<z.ZodObject<{
117
+ botToken: z.ZodOptional<z.ZodString>;
118
+ applicationId: z.ZodOptional<z.ZodString>;
119
+ guildId: z.ZodOptional<z.ZodString>;
120
+ parentChannelId: z.ZodOptional<z.ZodString>;
121
+ }, z.core.$loose>>;
122
+ slack: z.ZodOptional<z.ZodObject<{
123
+ botToken: z.ZodOptional<z.ZodString>;
124
+ appToken: z.ZodOptional<z.ZodString>;
125
+ workspaceId: z.ZodOptional<z.ZodString>;
126
+ channelId: z.ZodOptional<z.ZodString>;
127
+ authorizedUserId: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$loose>>;
129
+ redact: z.ZodOptional<z.ZodBoolean>;
130
+ verbosity: z.ZodOptional<z.ZodEnum<{
131
+ lean: "lean";
132
+ verbose: "verbose";
133
+ }>>;
134
+ }, z.core.$loose>>;
135
+ }, z.core.$loose>;
136
+ type NotificationConfigFile = z.infer<typeof notificationConfigSchema>;
137
+ /** Read daemon settings through the canonical validated config-file boundary. */
138
+ export declare function loadNotificationConfigFile(agentDir: string): LoadResult<NotificationConfigFile>;
139
+ export declare function notificationConfigFromFile(value: NotificationConfigFile): Pick<NotificationConfig, "enabled" | "discord" | "slack" | "redact" | "verbosity">;
140
+ export declare function hasNonBlankValue(value: string | undefined): boolean;
141
+ /** Is Telegram configured with usable non-blank boundary credentials? */
142
+ export declare function isTelegramConfigured(cfg: NotificationConfig): cfg is NotificationConfig & {
143
+ botToken: string;
144
+ chatId: string;
145
+ };
146
+ /** Is Discord configured with all credentials and routing identifiers required by its daemon. */
147
+ export declare function isDiscordConfigured(cfg: NotificationConfig): cfg is NotificationConfig & {
148
+ discord: {
149
+ botToken: string;
150
+ applicationId: string;
151
+ guildId: string;
152
+ parentChannelId: string;
153
+ };
154
+ };
155
+ /** Is Slack configured with both SDK tokens and its workspace/channel routing identifiers. */
156
+ export declare function isSlackConfigured(cfg: NotificationConfig): cfg is NotificationConfig & {
157
+ slack: {
158
+ botToken: string;
159
+ appToken: string;
160
+ workspaceId: string;
161
+ channelId: string;
162
+ };
163
+ };
164
+ /** Is global config sufficient for auto-on (enabled + at least one configured adapter)? */
165
+ export declare function isGloballyConfigured(cfg: NotificationConfig): boolean;
166
+ /**
167
+ * Per-run opt-out for completion notifications, honored before settings lookups.
168
+ *
169
+ * `GJC_NOTIFY=off` (also `0` / `false`, case-insensitive) suppresses the
170
+ * completion notification surface for this process only. `config.yml` is
171
+ * untouched and child processes inherit the env var, which lets non-interactive
172
+ * fleet runs (`gjc -p --no-session`) stay silent even when a user-level/global
173
+ * completion notification configuration is enabled.
174
+ */
175
+ export declare function completionNotifyDisabledByEnv(env: NodeJS.ProcessEnv): boolean;
176
+ /** Canonical host eligibility for the dormant notification session surface. */
177
+ export interface NotificationHostEligibilityInput {
178
+ env: NodeJS.ProcessEnv;
179
+ /** False for host modes that cannot own a notification session endpoint. */
180
+ hostModeSupported?: boolean;
181
+ /** Task recursion depth; helper/subagent sessions must not own remote surfaces. */
182
+ taskDepth?: number;
183
+ /** Parent subagent id/prefix; present for helper/subagent sessions even when depth is omitted. */
184
+ parentTaskPrefix?: string;
185
+ /** Role-agent type/name; present for task sessions even if depth metadata is lost. */
186
+ currentAgentType?: string;
187
+ /** Canonical global session scope; absent preserves the default `all` behavior. */
188
+ sessionScope?: NotificationConfig["sessionScope"];
189
+ /** Whether this process was spawned by one of GJC's marked child spawn sites. */
190
+ spawnedByGjc?: boolean;
191
+ }
192
+ /**
193
+ * Resolve whether this host may receive the dormant notification controller.
194
+ * This intentionally says nothing about whether an adapter is configured: an
195
+ * eligible unconfigured host still gets a zero-side-effect control surface.
196
+ */
197
+ export declare function isNotificationHostEligible(input: NotificationHostEligibilityInput): boolean;
198
+ /**
199
+ * Legacy compatibility helper for callers that require both host eligibility
200
+ * and a currently configured or explicit notification runtime.
201
+ */
202
+ export declare function shouldRegisterNotificationsExtension(input: {
203
+ env: NodeJS.ProcessEnv;
204
+ cfg?: NotificationConfig;
205
+ /** Task recursion depth; helper/subagent sessions must not spawn remote surfaces. */
206
+ taskDepth?: number;
207
+ /** Parent subagent id/prefix; present for helper/subagent sessions even when depth is omitted. */
208
+ parentTaskPrefix?: string;
209
+ /** Role-agent type/name; present for task sessions even if depth metadata is lost. */
210
+ currentAgentType?: string;
211
+ /**
212
+ * True when this session was launched by one of GJC's own programmatic
213
+ * separate-process child spawn sites (marked via {@link SPAWN_PROVENANCE_ENV}).
214
+ * Under `notifications.sessionScope = "primary"` such children are suppressed
215
+ * unless they explicitly opt in, so an interactive parent that fans out work
216
+ * does not flood the paired chat with topics for children the user never
217
+ * asked for. User-opened sessions (CLI/tmux/headless) never carry the marker.
218
+ */
219
+ spawnedByGjc?: boolean;
220
+ }): boolean;
221
+ /**
222
+ * Resolve whether THIS session should run notifications.
223
+ * Precedence (highest first):
224
+ * 1) env.GJC_NOTIFICATIONS === "0" -> false (hard opt-out)
225
+ * 2) sessionDisabled === true -> false (local /notify off)
226
+ * 3) env.GJC_NOTIFICATIONS === "1" || env.GJC_NOTIFICATIONS_TOKEN present -> true (legacy explicit)
227
+ * 4) spawned GJC child with `sessionScope=primary` -> false
228
+ * 5) isGloballyConfigured(cfg) -> true (global auto-on)
229
+ * 6) otherwise false
230
+ */
231
+ export declare function isSessionNotificationsEnabled(input: {
232
+ cfg: NotificationConfig;
233
+ env: NodeJS.ProcessEnv;
234
+ sessionDisabled: boolean;
235
+ /** This process was programmatically spawned by GJC (consumed at SDK startup). */
236
+ spawnedByGjc?: boolean;
237
+ }): boolean;
238
+ /** Mask a bot token for display: first 4 chars + "…" + "(len N)"; "(unset)" when undefined/empty. Never reveal full token. */
239
+ export declare function maskToken(token: string | undefined): string;
240
+ /** Stable non-reversible fingerprint of a token: sha256 hex, first 12 chars. */
241
+ export declare function tokenFingerprint(token: string): string;
242
+ /** Deterministic non-secret key for one Telegram token/chat identity. */
243
+ export declare function telegramActivationIdentity(botToken: string, chatId: string): string;
244
+ /** Return the durable marker for the currently configured Telegram identity, if any. */
245
+ export declare function getCurrentTelegramActivationMarker(cfg: NotificationConfig): TelegramActivationMarker | undefined;
246
+ /** Short session tag for display, e.g. last 6 chars of sessionId. */
247
+ export declare function sessionTag(sessionId: string): string;
248
+ export interface RedactableAction {
249
+ id: string;
250
+ kind: string;
251
+ sessionId: string;
252
+ /** Durable workflow-gate correlation metadata; never generic reply authority. */
253
+ workflowGateId?: string;
254
+ question?: string;
255
+ options?: string[];
256
+ summary?: string;
257
+ }
258
+ /**
259
+ * When redact is true, strip sensitive content for remote delivery:
260
+ * - ask: NOT redacted. An ask is an interactive prompt the human must read and
261
+ * answer on the remote surface; redacting its question/options would make it
262
+ * unanswerable, defeating remote answering. Asks are returned unchanged.
263
+ * - idle: summary removed, (no question/options).
264
+ * When redact is false, return the action unchanged.
265
+ *
266
+ * Redaction still applies to streamed content frames (turn_stream, context_update,
267
+ * image_attachment) which are suppressed at their emit sites, not here. Explicit
268
+ * `telegram_send` file attachments are rejected before the file is read or forwarded.
269
+ */
270
+ export declare function buildRedactedAction(action: RedactableAction, opts: {
271
+ redact: boolean;
272
+ sessionTag: string;
273
+ }): RedactableAction;
274
+ export {};
@@ -0,0 +1,72 @@
1
+ export declare const CONVERSATION_STORE_VERSION = 1;
2
+ export declare const MAX_DEDUPE_IDS = 128;
3
+ export interface ConversationRecord {
4
+ generation: number;
5
+ }
6
+ export interface ConversationStoreDocument<T extends ConversationRecord> {
7
+ version: typeof CONVERSATION_STORE_VERSION;
8
+ conversations: Record<string, T>;
9
+ }
10
+ export interface ConversationStoreFileHandle {
11
+ sync(): Promise<void>;
12
+ close(): Promise<void>;
13
+ writeFile(data: string, encoding: "utf8"): Promise<void>;
14
+ }
15
+ /** Minimal persistence seam; callers can inject it to make durability failures deterministic. */
16
+ export interface ConversationStoreFs {
17
+ mkdir(directory: string, options: {
18
+ recursive: true;
19
+ mode: number;
20
+ }): Promise<unknown>;
21
+ chmod(target: string, mode: number): Promise<void>;
22
+ readFile(file: string, encoding: "utf8"): Promise<string>;
23
+ writeFile(file: string, data: string, options: {
24
+ mode: number;
25
+ }): Promise<void>;
26
+ rename(from: string, to: string): Promise<void>;
27
+ unlink(file: string): Promise<void>;
28
+ open(file: string, flags: string): Promise<ConversationStoreFileHandle>;
29
+ stat?(file: string): Promise<{
30
+ mtimeMs: number;
31
+ }>;
32
+ }
33
+ export declare class ConversationLockTimeoutError extends Error {
34
+ readonly lockFile: string;
35
+ readonly timeoutMs: number;
36
+ constructor(lockFile: string, timeoutMs: number);
37
+ }
38
+ export declare function conversationStorePath(agentDir: string, kind: string, fileName?: string): string;
39
+ export declare function boundedDedupe(ids: readonly string[], limit?: number): string[];
40
+ /**
41
+ * Durable, per-transport mapping store. Every mutation takes an exclusive
42
+ * lock file shared across processes and reloads the on-disk document before
43
+ * applying its monotonic-generation compare-and-swap, preventing either stale
44
+ * writers or unrelated-key updates from replacing newer mappings.
45
+ */
46
+ export declare class ConversationStore<T extends ConversationRecord> {
47
+ #private;
48
+ constructor(input: {
49
+ agentDir: string;
50
+ kind: string;
51
+ fileName?: string;
52
+ fs?: ConversationStoreFs;
53
+ now?: () => number;
54
+ pid?: number;
55
+ pidIncarnation?: (pid: number) => string | undefined;
56
+ pidAlive?: (pid: number) => boolean;
57
+ sleep?: (ms: number) => Promise<void>;
58
+ lockTimeoutMs?: number;
59
+ });
60
+ get filePath(): string;
61
+ load(): Promise<ConversationStoreDocument<T>>;
62
+ read(key: string): Promise<T | undefined>;
63
+ /**
64
+ * Atomically write one mapping when its observed generation still matches.
65
+ * `undefined` only creates an absent mapping; successful writes must advance
66
+ * the generation by exactly one.
67
+ */
68
+ write(key: string, expectedGeneration: number | undefined, record: T): Promise<boolean>;
69
+ delete(key: string, expectedGeneration: number): Promise<boolean>;
70
+ /** Apply a synchronous update under the mapping lock, retrying no stale state. */
71
+ transact(key: string, update: (current: T | undefined) => T | undefined): Promise<T | undefined>;
72
+ }
@@ -0,0 +1,58 @@
1
+ import { type ConversationRecord } from "./conversation-store";
2
+ /** Identifier-only reference to an inbound effect whose payload and lifecycle live in ChatEffectJournal. */
3
+ export interface DiscordInboundDispatchReceipt {
4
+ key: string;
5
+ eventId: string;
6
+ interactionId?: string;
7
+ kind: "action" | "command";
8
+ actionId?: string;
9
+ actionNonce?: string;
10
+ endpointGeneration: number;
11
+ effectId: string;
12
+ idempotencyKey: string;
13
+ }
14
+ export type DiscordConversationState = "absent" | "creating" | "active" | "archived" | "resuming" | "closed" | "error";
15
+ /** Durable Discord mapping. It deliberately contains identifiers only: never endpoint tokens or message bodies. */
16
+ export interface DiscordConversation extends ConversationRecord {
17
+ state: DiscordConversationState;
18
+ appId: string;
19
+ guildId: string;
20
+ parentChannelId: string;
21
+ threadId?: string;
22
+ sessionId?: string;
23
+ createNonce?: string;
24
+ /** A lease makes thread creation exclusive across daemon processes. */
25
+ createOwner?: string;
26
+ createLeaseExpiresAt?: number;
27
+ endpointGeneration?: number;
28
+ /** Immutable lineage for archive and resume provider effects. */
29
+ effectIncarnationId?: string;
30
+ /** Current archive operation authority. */
31
+ archiveOccurrenceId?: string;
32
+ archiveEffectId?: string;
33
+ /** Current resume operation authority. */
34
+ resumeOccurrenceId?: string;
35
+ resumeEffectId?: string;
36
+ /** Action authority only; action bodies and endpoint credentials are never persisted. */
37
+ pendingActionId?: string;
38
+ /** Immutable per-publication action authority, bound to component routes and inbound effects. */
39
+ pendingActionNonce?: string;
40
+ /** Durable journal identity for the immutable outbound action publication intent. */
41
+ pendingActionEffectId?: string;
42
+ /** Replayable durable receipts for acknowledged inbound effects. */
43
+ inboundDispatches?: DiscordInboundDispatchReceipt[];
44
+ updatedAt: number;
45
+ archivedAt?: number;
46
+ closedAt?: number;
47
+ supersededByThreadId?: string;
48
+ seenEventIds: string[];
49
+ seenInteractionIds: string[];
50
+ }
51
+ export declare function discordConversationKey(input: {
52
+ appId: string;
53
+ guildId: string;
54
+ parentChannelId: string;
55
+ threadId: string;
56
+ }): string;
57
+ export declare function normalizeDiscordConversation(record: DiscordConversation): DiscordConversation;
58
+ export declare function acceptsDiscordInbound(record: DiscordConversation, threadId: string, endpointGeneration: number): boolean;
@@ -0,0 +1,45 @@
1
+ import { type DiscordConversation } from "./discord-conversation";
2
+ import type { DiscordInboundEvent, DiscordProvider } from "./discord-provider";
3
+ export declare class DiscordEndpointBindingError extends Error {
4
+ constructor(message?: string);
5
+ }
6
+ /** A captured live SDK transport. `isCurrent` must fail closed after replacement or removal. */
7
+ export interface DiscordEndpointBinding {
8
+ generation: number;
9
+ isCurrent(): boolean;
10
+ send(frame: Record<string, unknown>): void | Promise<void>;
11
+ }
12
+ export interface DiscordNotificationDaemonOptions {
13
+ agentDir: string;
14
+ repo: string;
15
+ guildId: string;
16
+ parentChannelId: string;
17
+ provider: DiscordProvider;
18
+ now?: () => number;
19
+ resolveEndpoint: (sessionId: string, expectedGeneration?: number) => Promise<DiscordEndpointBinding | null>;
20
+ onCommand?: (sessionId: string, content: string, endpoint: DiscordEndpointBinding, idempotencyKey: string) => Promise<boolean>;
21
+ }
22
+ export interface DiscordNotificationInput {
23
+ sessionId: string;
24
+ endpointGeneration: number;
25
+ content: string;
26
+ threadName?: string;
27
+ actionId?: string;
28
+ options?: string[];
29
+ }
30
+ /** SDK-only Discord threaded notification daemon. It owns no AgentSession and never retains endpoint credentials. */
31
+ export declare class DiscordNotificationDaemon {
32
+ #private;
33
+ private readonly options;
34
+ constructor(options: DiscordNotificationDaemonOptions);
35
+ start(): Promise<void>;
36
+ stop(): Promise<void>;
37
+ notify(input: DiscordNotificationInput): Promise<DiscordConversation>;
38
+ /** Posts a safe command outcome to the active mapped conversation. */
39
+ postCommandResult(sessionId: string, content: string): Promise<boolean>;
40
+ close(sessionId: string): Promise<void>;
41
+ archive(sessionId: string): Promise<void>;
42
+ resume(sessionId: string, endpointGeneration: number): Promise<DiscordConversation | undefined>;
43
+ resolveAction(sessionId: string, actionId: string): Promise<void>;
44
+ handleInbound(event: DiscordInboundEvent): Promise<void>;
45
+ }
@@ -0,0 +1,70 @@
1
+ import type { DiscordInboundEvent, DiscordMessageComponent, DiscordProvider, DiscordThread } from "./discord-provider";
2
+ export interface DiscordGatewaySocket {
3
+ readonly readyState: number;
4
+ send(data: string): void;
5
+ close(code?: number, reason?: string): void;
6
+ addEventListener(type: "open" | "message" | "close" | "error", listener: (event: Event) => void): void;
7
+ }
8
+ export interface DiscordTimer {
9
+ cancel(): void;
10
+ }
11
+ type DiscordFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
12
+ export interface DiscordLiveProviderOptions {
13
+ applicationId: string;
14
+ botToken: string;
15
+ fetchImpl?: DiscordFetch;
16
+ WebSocketImpl?: (url: string) => DiscordGatewaySocket;
17
+ now?: () => number;
18
+ sleep?: (milliseconds: number) => Promise<void>;
19
+ setIntervalImpl?: (callback: () => void, milliseconds: number) => DiscordTimer;
20
+ setTimeoutImpl?: (callback: () => void, milliseconds: number) => DiscordTimer;
21
+ apiBaseUrl?: string;
22
+ }
23
+ /** Discord REST/Gateway implementation. The only credential is held privately and is never emitted. */
24
+ export declare class DiscordLiveProvider implements DiscordProvider {
25
+ #private;
26
+ readonly applicationId: string;
27
+ constructor(options: DiscordLiveProviderOptions);
28
+ get botUserId(): string;
29
+ get transportHealthy(): boolean;
30
+ get gatewayError(): Error | undefined;
31
+ createThread(input: {
32
+ guildId: string;
33
+ parentId: string;
34
+ name: string;
35
+ nonce: string;
36
+ }): Promise<DiscordThread>;
37
+ findThreadByNonce(input: {
38
+ guildId: string;
39
+ parentId: string;
40
+ nonce: string;
41
+ }): Promise<DiscordThread | null>;
42
+ postMessage(input: {
43
+ threadId: string;
44
+ content: string;
45
+ nonce?: string;
46
+ components?: DiscordMessageComponent[];
47
+ }): Promise<{
48
+ id: string;
49
+ }>;
50
+ deferInteraction(input: {
51
+ id: string;
52
+ token: string;
53
+ }): Promise<void>;
54
+ archiveThread(input: {
55
+ threadId: string;
56
+ locked?: boolean;
57
+ }): Promise<void>;
58
+ unarchiveThread(input: {
59
+ threadId: string;
60
+ }): Promise<void>;
61
+ findMessageByNonce(input: {
62
+ threadId: string;
63
+ nonce: string;
64
+ }): Promise<{
65
+ id: string;
66
+ } | null>;
67
+ start(onEvent: (event: DiscordInboundEvent) => Promise<void>): Promise<void>;
68
+ stop(): Promise<void>;
69
+ }
70
+ export {};