@gajae-code/coding-agent 0.10.2 → 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 (465) hide show
  1. package/CHANGELOG.md +50 -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/model-selector.d.ts +1 -0
  54. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  55. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  56. package/dist/types/modes/components/welcome.d.ts +1 -1
  57. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  58. package/dist/types/modes/index.d.ts +0 -4
  59. package/dist/types/modes/interactive-mode.d.ts +3 -0
  60. package/dist/types/modes/runtime-init.d.ts +2 -2
  61. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  62. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  63. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  64. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  65. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  66. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  67. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  68. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  69. package/dist/types/modes/types.d.ts +5 -0
  70. package/dist/types/runtime-mcp/client.d.ts +2 -0
  71. package/dist/types/runtime-mcp/config.d.ts +5 -1
  72. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  73. package/dist/types/runtime-mcp/types.d.ts +4 -0
  74. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  75. package/dist/types/sdk/acp/index.d.ts +2 -0
  76. package/dist/types/sdk/broker/broker.d.ts +53 -0
  77. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  78. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  79. package/dist/types/sdk/broker/identity.d.ts +3 -0
  80. package/dist/types/sdk/broker/index.d.ts +8 -0
  81. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  82. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  83. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  84. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  85. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  86. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  87. package/dist/types/sdk/broker/transport.d.ts +9 -0
  88. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  89. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  90. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  91. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  92. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  93. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  94. package/dist/types/sdk/bus/config.d.ts +274 -0
  95. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  96. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  97. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  98. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  99. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  100. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  101. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  102. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  103. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  104. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  105. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  106. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  107. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  108. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  109. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  110. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  111. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  112. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  113. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  114. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  115. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  118. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  119. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  120. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  121. package/dist/types/sdk/cli/index.d.ts +1 -0
  122. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  123. package/dist/types/sdk/client/client.d.ts +1 -0
  124. package/dist/types/sdk/client/discovery.d.ts +27 -0
  125. package/dist/types/sdk/client/index.d.ts +2 -0
  126. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  127. package/dist/types/sdk/host/control/index.d.ts +2 -0
  128. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  129. package/dist/types/sdk/host/events.d.ts +35 -0
  130. package/dist/types/sdk/host/host.d.ts +35 -0
  131. package/dist/types/sdk/host/index.d.ts +4 -0
  132. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  133. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  134. package/dist/types/sdk/host/query/index.d.ts +3 -0
  135. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  136. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  137. package/dist/types/sdk/host/types.d.ts +32 -0
  138. package/dist/types/sdk/index.d.ts +6 -0
  139. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  140. package/dist/types/sdk/mcp/index.d.ts +1 -0
  141. package/dist/types/sdk/mcp/server.d.ts +37 -0
  142. package/dist/types/sdk/models.d.ts +44 -0
  143. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  144. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  145. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  146. package/dist/types/sdk/startup-capability.d.ts +50 -0
  147. package/dist/types/session/agent-session.d.ts +114 -21
  148. package/dist/types/session/default-model-selection.d.ts +25 -0
  149. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  150. package/dist/types/session/session-manager.d.ts +58 -1
  151. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  152. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  153. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  154. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  155. package/dist/types/tools/browser/launch.d.ts +22 -0
  156. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  157. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  158. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  159. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  160. package/dist/types/tools/browser/registry.d.ts +19 -0
  161. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  162. package/dist/types/tools/index.d.ts +8 -8
  163. package/package.json +34 -13
  164. package/scripts/build-sdk-package-smoke.ts +94 -0
  165. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  166. package/scripts/compile-args.ts +4 -2
  167. package/scripts/g005-daemon-smoke.ts +4 -5
  168. package/scripts/g011-daemon-path-smoke.ts +5 -5
  169. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  170. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  171. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  172. package/scripts/manifest-schema.ts +124 -0
  173. package/scripts/run-test-manifest.ts +153 -0
  174. package/scripts/run-threat-model-check.ts +157 -0
  175. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  176. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  177. package/src/append-only-mode.ts +1 -1
  178. package/src/cli/args.ts +43 -12
  179. package/src/cli/auth-gateway-cli.ts +2 -2
  180. package/src/cli/config-cli.ts +2 -1
  181. package/src/cli/daemon-cli.ts +63 -14
  182. package/src/cli/list-models.ts +1 -1
  183. package/src/cli/notify-cli.ts +288 -286
  184. package/src/cli.ts +21 -2
  185. package/src/commands/daemon.ts +50 -6
  186. package/src/commands/harness.ts +93 -36
  187. package/src/commands/launch.ts +5 -2
  188. package/src/commands/mcp-serve.ts +19 -12
  189. package/src/commands/notify.ts +36 -3
  190. package/src/commands/sdk.ts +426 -0
  191. package/src/commit/agentic/agent.ts +1 -0
  192. package/src/config/atomic-yaml-patch.ts +423 -0
  193. package/src/config/model-profile-activation.ts +240 -89
  194. package/src/config/model-profiles.ts +18 -15
  195. package/src/config/model-registry.ts +51 -26
  196. package/src/config/model-resolver.ts +138 -51
  197. package/src/config/model-selector-value.ts +50 -0
  198. package/src/config/models-config-schema.ts +14 -21
  199. package/src/config/settings-schema.ts +128 -10
  200. package/src/config/settings.ts +1120 -158
  201. package/src/coordinator-mcp/model-preset.ts +74 -20
  202. package/src/coordinator-mcp/server.ts +1597 -3052
  203. package/src/daemon/builtin.ts +8 -5
  204. package/src/daemon/control-types.ts +1 -1
  205. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  206. package/src/discovery/mcp-json.ts +327 -20
  207. package/src/extensibility/custom-tools/types.ts +1 -1
  208. package/src/extensibility/extensions/compact-handler.ts +3 -3
  209. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  210. package/src/extensibility/extensions/loader.ts +69 -5
  211. package/src/extensibility/extensions/runner.ts +112 -4
  212. package/src/extensibility/extensions/types.ts +176 -17
  213. package/src/extensibility/hooks/types.ts +1 -1
  214. package/src/gjc-runtime/launch-tmux.ts +170 -86
  215. package/src/gjc-runtime/psmux-detect.ts +82 -4
  216. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  217. package/src/gjc-runtime/team-runtime.ts +54 -35
  218. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  219. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  220. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  221. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  222. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  223. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  224. package/src/harness-control-plane/operate.ts +9 -9
  225. package/src/harness-control-plane/owner.ts +283 -39
  226. package/src/harness-control-plane/receipts.ts +0 -1
  227. package/src/harness-control-plane/sdk-transport.ts +395 -0
  228. package/src/harness-control-plane/session-transport.ts +94 -0
  229. package/src/harness-control-plane/types.ts +1 -1
  230. package/src/internal-urls/docs-index.generated.ts +34 -35
  231. package/src/lsp/client.ts +42 -6
  232. package/src/lsp/index.ts +2 -2
  233. package/src/main.ts +299 -204
  234. package/src/modes/DESIGN.md +258 -0
  235. package/src/modes/acp/acp-agent.ts +1228 -2612
  236. package/src/modes/acp/acp-client-bridge.ts +2 -20
  237. package/src/modes/acp/acp-event-mapper.ts +18 -2
  238. package/src/modes/acp/acp-mode.ts +8 -36
  239. package/src/modes/acp/permission-mode.ts +25 -0
  240. package/src/modes/acp/startup-options.ts +6 -0
  241. package/src/modes/components/agent-dashboard.ts +37 -17
  242. package/src/modes/components/model-selector.ts +93 -35
  243. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  244. package/src/modes/components/settings-selector.ts +60 -11
  245. package/src/modes/components/welcome.ts +4 -4
  246. package/src/modes/controllers/command-controller.ts +1 -2
  247. package/src/modes/controllers/event-controller.ts +11 -16
  248. package/src/modes/controllers/extension-ui-controller.ts +348 -4
  249. package/src/modes/controllers/selector-controller.ts +674 -36
  250. package/src/modes/index.ts +0 -22
  251. package/src/modes/interactive-mode.ts +59 -20
  252. package/src/modes/runtime-init.ts +298 -6
  253. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  254. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  255. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  256. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  257. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  258. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  259. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  260. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  261. package/src/modes/types.ts +5 -0
  262. package/src/runtime-mcp/client.ts +94 -19
  263. package/src/runtime-mcp/config.ts +27 -15
  264. package/src/runtime-mcp/manager.ts +343 -105
  265. package/src/runtime-mcp/oauth-flow.ts +42 -12
  266. package/src/runtime-mcp/transports/http.ts +49 -19
  267. package/src/runtime-mcp/transports/stdio.ts +47 -28
  268. package/src/runtime-mcp/types.ts +10 -0
  269. package/src/sdk/acp/adapter.ts +418 -0
  270. package/src/sdk/acp/index.ts +2 -0
  271. package/src/sdk/broker/broker.ts +642 -0
  272. package/src/sdk/broker/discovery.ts +94 -0
  273. package/src/sdk/broker/ensure.ts +249 -0
  274. package/src/sdk/broker/identity.ts +42 -0
  275. package/src/sdk/broker/index.ts +8 -0
  276. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  277. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  278. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  279. package/src/sdk/broker/lifecycle.ts +2157 -0
  280. package/src/sdk/broker/process-incarnation.ts +159 -0
  281. package/src/sdk/broker/runtime.ts +164 -0
  282. package/src/sdk/broker/session-index.ts +318 -0
  283. package/src/sdk/broker/state-version.ts +23 -0
  284. package/src/sdk/broker/transport.ts +125 -0
  285. package/src/sdk/bus/chat-command-policy.ts +107 -0
  286. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  287. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  288. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  289. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  290. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  291. package/src/sdk/bus/config.ts +433 -0
  292. package/src/sdk/bus/conversation-store.ts +391 -0
  293. package/src/sdk/bus/discord-conversation.ts +85 -0
  294. package/src/sdk/bus/discord-daemon.ts +2275 -0
  295. package/src/sdk/bus/discord-live-provider.ts +521 -0
  296. package/src/sdk/bus/discord-provider.ts +56 -0
  297. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  298. package/src/sdk/bus/index.ts +3943 -0
  299. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  300. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  301. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  302. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  303. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  304. package/src/sdk/bus/natives-augment.d.ts +38 -0
  305. package/src/sdk/bus/notification-orchestration.ts +535 -0
  306. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  307. package/src/sdk/bus/session-control.ts +333 -0
  308. package/src/sdk/bus/slack-conversation.ts +74 -0
  309. package/src/sdk/bus/slack-daemon.ts +2144 -0
  310. package/src/sdk/bus/slack-live-provider.ts +380 -0
  311. package/src/sdk/bus/slack-provider.ts +76 -0
  312. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  313. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  314. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  315. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  316. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  317. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  318. package/src/sdk/bus/telegram-setup.ts +663 -0
  319. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  320. package/src/sdk/cli/index.ts +1 -0
  321. package/src/sdk/cli/session-cli.ts +275 -0
  322. package/src/sdk/client/client.ts +1 -0
  323. package/src/sdk/client/discovery.ts +108 -0
  324. package/src/sdk/client/index.ts +2 -0
  325. package/src/sdk/host/control/dispatch.ts +367 -0
  326. package/src/sdk/host/control/index.ts +10 -0
  327. package/src/sdk/host/control/operations.ts +63 -0
  328. package/src/sdk/host/events.ts +91 -0
  329. package/src/sdk/host/host.ts +296 -0
  330. package/src/sdk/host/index.ts +4 -0
  331. package/src/sdk/host/query/cursor.ts +189 -0
  332. package/src/sdk/host/query/handlers.ts +533 -0
  333. package/src/sdk/host/query/index.ts +3 -0
  334. package/src/sdk/host/query/revision-store.ts +1126 -0
  335. package/src/sdk/host/reverse-leases.ts +325 -0
  336. package/src/sdk/host/types.ts +29 -0
  337. package/src/sdk/index.ts +13 -0
  338. package/src/sdk/lifecycle-session.ts +39 -0
  339. package/src/sdk/mcp/index.ts +1 -0
  340. package/src/sdk/mcp/server.ts +332 -0
  341. package/src/sdk/models.ts +168 -0
  342. package/src/sdk/protocol/adapter-validation.ts +48 -0
  343. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  344. package/src/sdk/protocol/operation-registry.ts +312 -0
  345. package/src/{sdk.ts → sdk/session.ts} +339 -212
  346. package/src/sdk/startup-capability.ts +189 -0
  347. package/src/session/agent-session.ts +2453 -894
  348. package/src/session/default-model-selection.ts +93 -0
  349. package/src/session/fallback-chain-controller.ts +136 -0
  350. package/src/session/session-manager.ts +438 -11
  351. package/src/session/session-storage.ts +8 -1
  352. package/src/setup/credential-auto-import.ts +290 -35
  353. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  354. package/src/slash-commands/builtin-registry.ts +2 -1
  355. package/src/task/executor.ts +62 -13
  356. package/src/tools/ask-answer-registry.ts +1 -1
  357. package/src/tools/ask.ts +13 -8
  358. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  359. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  360. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  361. package/src/tools/browser/launch.ts +124 -19
  362. package/src/tools/browser/profile-discovery.ts +63 -0
  363. package/src/tools/browser/profile-posture.ts +59 -0
  364. package/src/tools/browser/profile-reuse.ts +102 -0
  365. package/src/tools/browser/profile-warmup.ts +109 -0
  366. package/src/tools/browser/registry.ts +87 -11
  367. package/src/tools/browser/tab-protocol.ts +1 -0
  368. package/src/tools/browser/tab-supervisor.ts +1 -0
  369. package/src/tools/browser/tab-worker.ts +1 -1
  370. package/src/tools/browser.ts +6 -0
  371. package/src/tools/index.ts +8 -8
  372. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  373. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  374. package/src/tools/telegram-send.ts +2 -2
  375. package/vendor/insane-search/MANIFEST.json +2 -1
  376. package/vendor/insane-search/engine/bias_check.py +4 -1
  377. package/vendor/insane-search/engine/phase0.py +26 -1
  378. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  379. package/dist/types/modes/bridge/auth.d.ts +0 -12
  380. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  381. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  382. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  383. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  384. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  385. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  386. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  387. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  388. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  389. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  390. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  391. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  392. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  393. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  394. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  395. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  396. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  397. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  398. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  399. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  400. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  401. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  402. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  403. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  404. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  405. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  406. package/dist/types/notifications/config.d.ts +0 -132
  407. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  408. package/src/modes/bridge/auth.ts +0 -41
  409. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  410. package/src/modes/bridge/bridge-mode.ts +0 -675
  411. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  412. package/src/modes/bridge/event-stream.ts +0 -70
  413. package/src/modes/rpc/host-tools.ts +0 -1
  414. package/src/modes/rpc/host-uris.ts +0 -1
  415. package/src/modes/rpc/rpc-client.ts +0 -1166
  416. package/src/modes/rpc/rpc-mode.ts +0 -1029
  417. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  418. package/src/modes/rpc/rpc-types.ts +0 -637
  419. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  420. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  421. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  422. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  423. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  424. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  425. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  426. package/src/modes/shared/agent-wire/responses.ts +0 -17
  427. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  428. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  429. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  430. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  431. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  432. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  433. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  434. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  435. package/src/notifications/config.ts +0 -219
  436. package/src/notifications/index.ts +0 -1835
  437. package/src/notifications/telegram-daemon-cli.ts +0 -243
  438. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  439. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  440. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  441. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  442. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  443. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  444. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  445. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  446. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  447. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  448. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  453. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  454. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  455. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  456. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  457. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  458. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  459. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  460. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  461. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,433 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as path from "node:path";
3
+ import * as z from "zod/v4";
4
+ import { ConfigFile, type LoadResult } from "../../config/config-file";
5
+
6
+ /**
7
+ * Env marker set by GJC's own programmatic separate-process child spawn sites
8
+ * (team workers, harness RPC owners) and carrying the spawning session id.
9
+ *
10
+ * Presence — not the value — marks a session as GJC-spawned. It is consumed
11
+ * (read once, then deleted from the child's own env) at startup so it is
12
+ * per-spawn rather than dynastic: a grandchild is marked only if its own spawn
13
+ * site marks it, never by inheriting a marked ancestor's environment.
14
+ */
15
+ export const SPAWN_PROVENANCE_ENV = "GJC_SPAWNED_BY_SESSION";
16
+
17
+ export type TelegramActivationState = "inactive" | "blocked";
18
+ export type TelegramActivationReason = "saved_inactive" | "identity_mismatch";
19
+
20
+ /** Non-secret, identity-specific durable Telegram activation state. */
21
+ export interface TelegramActivationMarker {
22
+ identity: string;
23
+ state: TelegramActivationState;
24
+ updatedAt: string;
25
+ reason?: TelegramActivationReason;
26
+ }
27
+
28
+ export type TelegramActivationMarkers = Record<string, TelegramActivationMarker>;
29
+
30
+ function isTelegramActivationMarker(value: unknown): value is TelegramActivationMarker {
31
+ if (!value || typeof value !== "object") return false;
32
+ const marker = value as Partial<TelegramActivationMarker>;
33
+ return (
34
+ (marker.state === "inactive" || marker.state === "blocked") &&
35
+ typeof marker.identity === "string" &&
36
+ marker.identity.length > 0 &&
37
+ typeof marker.updatedAt === "string" &&
38
+ (marker.reason === undefined || marker.reason === "saved_inactive" || marker.reason === "identity_mismatch")
39
+ );
40
+ }
41
+
42
+ /** Validate and clone activation markers crossing the settings boundary. */
43
+ export function readTelegramActivationMarkers(value?: unknown): TelegramActivationMarkers {
44
+ const markers: TelegramActivationMarkers = {};
45
+ if (!value || typeof value !== "object" || Array.isArray(value)) return markers;
46
+ for (const [identity, marker] of Object.entries(value)) {
47
+ if (isTelegramActivationMarker(marker) && identity === marker.identity) markers[identity] = { ...marker };
48
+ }
49
+ return markers;
50
+ }
51
+
52
+ export interface NotificationSettingsSnapshot {
53
+ enabled: boolean;
54
+ telegram: {
55
+ botToken?: string;
56
+ chatId?: string;
57
+ activation?: Record<string, unknown>;
58
+ rich: {
59
+ enabled: boolean;
60
+ };
61
+ richDraft: {
62
+ enabled: boolean;
63
+ };
64
+ topics: {
65
+ nameTemplate?: string;
66
+ };
67
+ };
68
+ discord: {
69
+ botToken?: string;
70
+ applicationId?: string;
71
+ guildId?: string;
72
+ parentChannelId?: string;
73
+ };
74
+ slack: {
75
+ botToken?: string;
76
+ appToken?: string;
77
+ workspaceId?: string;
78
+ channelId?: string;
79
+ authorizedUserId?: string;
80
+ };
81
+ redact: boolean;
82
+ verbosity: "lean" | "verbose";
83
+ sessionScope: "all" | "primary";
84
+ idleTimeoutMs: number;
85
+ }
86
+
87
+ /**
88
+ * Narrow settings boundary for remote notification identity and behavior.
89
+ * Implementations must return only user-global values, with schema defaults
90
+ * applied; project settings and runtime overrides are intentionally excluded.
91
+ */
92
+ export interface NotificationSettingsReader {
93
+ getNotificationSettingsSnapshot(): NotificationSettingsSnapshot;
94
+ getAgentDir(): string;
95
+ }
96
+
97
+ export interface NotificationConfig {
98
+ enabled: boolean;
99
+ botToken?: string;
100
+ activation?: TelegramActivationMarkers;
101
+ chatId?: string;
102
+ discord: {
103
+ botToken?: string;
104
+ applicationId?: string;
105
+ guildId?: string;
106
+ parentChannelId?: string;
107
+ };
108
+ slack: {
109
+ botToken?: string;
110
+ appToken?: string;
111
+ workspaceId?: string;
112
+ channelId?: string;
113
+ authorizedUserId?: string;
114
+ };
115
+ redact: boolean;
116
+ verbosity: "lean" | "verbose";
117
+ /**
118
+ * Which sessions may register a notification endpoint. `all` (default)
119
+ * preserves historical behavior; `primary` suppresses GJC-spawned children
120
+ * (those carrying {@link SPAWN_PROVENANCE_ENV}) unless they explicitly opt in.
121
+ */
122
+ sessionScope: "all" | "primary";
123
+ idleTimeoutMs: number;
124
+ rich: {
125
+ enabled: boolean;
126
+ };
127
+ richDraft: {
128
+ enabled: boolean;
129
+ };
130
+ topics: {
131
+ /**
132
+ * Optional Telegram forum-topic name template with `{repo}`, `{branch}`,
133
+ * and `{title}` placeholders. Unset preserves the built-in
134
+ * `{repo}/{branch} - {title}` composition (with its title/repo/branch
135
+ * fallbacks).
136
+ */
137
+ nameTemplate?: string;
138
+ };
139
+ }
140
+
141
+ /** Read typed global-only notification config from a narrow settings reader. */
142
+ export function getNotificationConfig(settings: NotificationSettingsReader): NotificationConfig {
143
+ const snapshot = settings.getNotificationSettingsSnapshot();
144
+ const activation = readTelegramActivationMarkers(snapshot.telegram.activation);
145
+ return {
146
+ enabled: snapshot.enabled,
147
+ botToken: snapshot.telegram.botToken,
148
+ ...(Object.keys(activation).length === 0 ? {} : { activation }),
149
+ chatId: snapshot.telegram.chatId,
150
+ discord: snapshot.discord,
151
+ slack: snapshot.slack,
152
+ redact: snapshot.redact,
153
+ verbosity: snapshot.verbosity,
154
+ sessionScope: snapshot.sessionScope,
155
+ idleTimeoutMs: snapshot.idleTimeoutMs,
156
+ rich: snapshot.telegram.rich,
157
+ richDraft: snapshot.telegram.richDraft,
158
+ topics: snapshot.telegram.topics,
159
+ };
160
+ }
161
+
162
+ const notificationConfigSchema = z
163
+ .object({
164
+ notifications: z
165
+ .object({
166
+ enabled: z.boolean().optional(),
167
+ discord: z
168
+ .object({
169
+ botToken: z.string().optional(),
170
+ applicationId: z.string().optional(),
171
+ guildId: z.string().optional(),
172
+ parentChannelId: z.string().optional(),
173
+ })
174
+ .passthrough()
175
+ .optional(),
176
+ slack: z
177
+ .object({
178
+ botToken: z.string().optional(),
179
+ appToken: z.string().optional(),
180
+ workspaceId: z.string().optional(),
181
+ channelId: z.string().optional(),
182
+ authorizedUserId: z.string().optional(),
183
+ })
184
+ .passthrough()
185
+ .optional(),
186
+ redact: z.boolean().optional(),
187
+ verbosity: z.enum(["lean", "verbose"]).optional(),
188
+ })
189
+ .passthrough()
190
+ .optional(),
191
+ })
192
+ .passthrough();
193
+
194
+ type NotificationConfigFile = z.infer<typeof notificationConfigSchema>;
195
+
196
+ /** Read daemon settings through the canonical validated config-file boundary. */
197
+ export function loadNotificationConfigFile(agentDir: string): LoadResult<NotificationConfigFile> {
198
+ return new ConfigFile("config", notificationConfigSchema, path.join(agentDir, "config.yml")).tryLoad();
199
+ }
200
+
201
+ export function notificationConfigFromFile(
202
+ value: NotificationConfigFile,
203
+ ): Pick<NotificationConfig, "enabled" | "discord" | "slack" | "redact" | "verbosity"> {
204
+ const notifications = value.notifications;
205
+ return {
206
+ enabled: notifications?.enabled ?? false,
207
+ discord: notifications?.discord ?? {},
208
+ slack: notifications?.slack ?? {},
209
+ redact: notifications?.redact ?? false,
210
+ verbosity: notifications?.verbosity ?? "lean",
211
+ };
212
+ }
213
+
214
+ export function hasNonBlankValue(value: string | undefined): boolean {
215
+ return typeof value === "string" && value.trim().length > 0;
216
+ }
217
+
218
+ /** Is Telegram configured with usable non-blank boundary credentials? */
219
+ export function isTelegramConfigured(
220
+ cfg: NotificationConfig,
221
+ ): cfg is NotificationConfig & { botToken: string; chatId: string } {
222
+ return cfg.enabled && hasNonBlankValue(cfg.botToken) && hasNonBlankValue(cfg.chatId);
223
+ }
224
+
225
+ /** Is Discord configured with all credentials and routing identifiers required by its daemon. */
226
+ export function isDiscordConfigured(cfg: NotificationConfig): cfg is NotificationConfig & {
227
+ discord: { botToken: string; applicationId: string; guildId: string; parentChannelId: string };
228
+ } {
229
+ return (
230
+ cfg.enabled &&
231
+ hasNonBlankValue(cfg.discord.botToken) &&
232
+ hasNonBlankValue(cfg.discord.applicationId) &&
233
+ hasNonBlankValue(cfg.discord.guildId) &&
234
+ hasNonBlankValue(cfg.discord.parentChannelId)
235
+ );
236
+ }
237
+
238
+ /** Is Slack configured with both SDK tokens and its workspace/channel routing identifiers. */
239
+ export function isSlackConfigured(cfg: NotificationConfig): cfg is NotificationConfig & {
240
+ slack: { botToken: string; appToken: string; workspaceId: string; channelId: string };
241
+ } {
242
+ return (
243
+ cfg.enabled &&
244
+ hasNonBlankValue(cfg.slack.botToken) &&
245
+ hasNonBlankValue(cfg.slack.appToken) &&
246
+ hasNonBlankValue(cfg.slack.workspaceId) &&
247
+ hasNonBlankValue(cfg.slack.channelId)
248
+ );
249
+ }
250
+
251
+ /** Is global config sufficient for auto-on (enabled + at least one configured adapter)? */
252
+ export function isGloballyConfigured(cfg: NotificationConfig): boolean {
253
+ return cfg.enabled && (isTelegramConfigured(cfg) || isDiscordConfigured(cfg) || isSlackConfigured(cfg));
254
+ }
255
+
256
+ /**
257
+ * Per-run opt-out for completion notifications, honored before settings lookups.
258
+ *
259
+ * `GJC_NOTIFY=off` (also `0` / `false`, case-insensitive) suppresses the
260
+ * completion notification surface for this process only. `config.yml` is
261
+ * untouched and child processes inherit the env var, which lets non-interactive
262
+ * fleet runs (`gjc -p --no-session`) stay silent even when a user-level/global
263
+ * completion notification configuration is enabled.
264
+ */
265
+ export function completionNotifyDisabledByEnv(env: NodeJS.ProcessEnv): boolean {
266
+ const v = env.GJC_NOTIFY?.trim().toLowerCase();
267
+ return v === "off" || v === "0" || v === "false";
268
+ }
269
+
270
+ /** Canonical host eligibility for the dormant notification session surface. */
271
+ export interface NotificationHostEligibilityInput {
272
+ env: NodeJS.ProcessEnv;
273
+ /** False for host modes that cannot own a notification session endpoint. */
274
+ hostModeSupported?: boolean;
275
+ /** Task recursion depth; helper/subagent sessions must not own remote surfaces. */
276
+ taskDepth?: number;
277
+ /** Parent subagent id/prefix; present for helper/subagent sessions even when depth is omitted. */
278
+ parentTaskPrefix?: string;
279
+ /** Role-agent type/name; present for task sessions even if depth metadata is lost. */
280
+ currentAgentType?: string;
281
+ /** Canonical global session scope; absent preserves the default `all` behavior. */
282
+ sessionScope?: NotificationConfig["sessionScope"];
283
+ /** Whether this process was spawned by one of GJC's marked child spawn sites. */
284
+ spawnedByGjc?: boolean;
285
+ }
286
+
287
+ /**
288
+ * Resolve whether this host may receive the dormant notification controller.
289
+ * This intentionally says nothing about whether an adapter is configured: an
290
+ * eligible unconfigured host still gets a zero-side-effect control surface.
291
+ */
292
+ export function isNotificationHostEligible(input: NotificationHostEligibilityInput): boolean {
293
+ if (completionNotifyDisabledByEnv(input.env)) return false;
294
+ if (input.hostModeSupported === false) return false;
295
+ if ((input.taskDepth ?? 0) > 0 || input.parentTaskPrefix || input.currentAgentType) return false;
296
+ if (input.env.GJC_NOTIFICATIONS === "0") return false;
297
+ if (input.env.GJC_NOTIFICATIONS === "1" || input.env.GJC_NOTIFICATIONS_TOKEN) return true;
298
+ if (input.spawnedByGjc && input.sessionScope === "primary") return false;
299
+ return true;
300
+ }
301
+
302
+ /**
303
+ * Legacy compatibility helper for callers that require both host eligibility
304
+ * and a currently configured or explicit notification runtime.
305
+ */
306
+ export function shouldRegisterNotificationsExtension(input: {
307
+ env: NodeJS.ProcessEnv;
308
+ cfg?: NotificationConfig;
309
+ /** Task recursion depth; helper/subagent sessions must not spawn remote surfaces. */
310
+ taskDepth?: number;
311
+ /** Parent subagent id/prefix; present for helper/subagent sessions even when depth is omitted. */
312
+ parentTaskPrefix?: string;
313
+ /** Role-agent type/name; present for task sessions even if depth metadata is lost. */
314
+ currentAgentType?: string;
315
+ /**
316
+ * True when this session was launched by one of GJC's own programmatic
317
+ * separate-process child spawn sites (marked via {@link SPAWN_PROVENANCE_ENV}).
318
+ * Under `notifications.sessionScope = "primary"` such children are suppressed
319
+ * unless they explicitly opt in, so an interactive parent that fans out work
320
+ * does not flood the paired chat with topics for children the user never
321
+ * asked for. User-opened sessions (CLI/tmux/headless) never carry the marker.
322
+ */
323
+ spawnedByGjc?: boolean;
324
+ }): boolean {
325
+ if (
326
+ !isNotificationHostEligible({
327
+ env: input.env,
328
+ taskDepth: input.taskDepth,
329
+ parentTaskPrefix: input.parentTaskPrefix,
330
+ currentAgentType: input.currentAgentType,
331
+ sessionScope: input.cfg?.sessionScope,
332
+ spawnedByGjc: input.spawnedByGjc,
333
+ })
334
+ ) {
335
+ return false;
336
+ }
337
+ return (
338
+ input.env.GJC_NOTIFICATIONS === "1" ||
339
+ Boolean(input.env.GJC_NOTIFICATIONS_TOKEN) ||
340
+ Boolean(input.cfg && isGloballyConfigured(input.cfg))
341
+ );
342
+ }
343
+
344
+ /**
345
+ * Resolve whether THIS session should run notifications.
346
+ * Precedence (highest first):
347
+ * 1) env.GJC_NOTIFICATIONS === "0" -> false (hard opt-out)
348
+ * 2) sessionDisabled === true -> false (local /notify off)
349
+ * 3) env.GJC_NOTIFICATIONS === "1" || env.GJC_NOTIFICATIONS_TOKEN present -> true (legacy explicit)
350
+ * 4) spawned GJC child with `sessionScope=primary` -> false
351
+ * 5) isGloballyConfigured(cfg) -> true (global auto-on)
352
+ * 6) otherwise false
353
+ */
354
+ export function isSessionNotificationsEnabled(input: {
355
+ cfg: NotificationConfig;
356
+ env: NodeJS.ProcessEnv;
357
+ sessionDisabled: boolean;
358
+ /** This process was programmatically spawned by GJC (consumed at SDK startup). */
359
+ spawnedByGjc?: boolean;
360
+ }): boolean {
361
+ if (input.env.GJC_NOTIFICATIONS === "0") return false;
362
+ if (input.sessionDisabled) return false;
363
+ if (input.env.GJC_NOTIFICATIONS === "1" || input.env.GJC_NOTIFICATIONS_TOKEN) return true;
364
+ if (input.spawnedByGjc && input.cfg.sessionScope === "primary") return false;
365
+ return isGloballyConfigured(input.cfg);
366
+ }
367
+
368
+ /** Mask a bot token for display: first 4 chars + "…" + "(len N)"; "(unset)" when undefined/empty. Never reveal full token. */
369
+ export function maskToken(token: string | undefined): string {
370
+ if (!token) return "(unset)";
371
+ if (token.length <= 4) return `…(len ${token.length})`;
372
+ return `${token.slice(0, 4)}…(len ${token.length})`;
373
+ }
374
+
375
+ /** Stable non-reversible fingerprint of a token: sha256 hex, first 12 chars. */
376
+ export function tokenFingerprint(token: string): string {
377
+ return crypto.createHash("sha256").update(token).digest("hex").slice(0, 12);
378
+ }
379
+
380
+ /** Deterministic non-secret key for one Telegram token/chat identity. */
381
+ export function telegramActivationIdentity(botToken: string, chatId: string): string {
382
+ return `${tokenFingerprint(botToken)}:${tokenFingerprint(chatId)}`;
383
+ }
384
+
385
+ /** Return the durable marker for the currently configured Telegram identity, if any. */
386
+ export function getCurrentTelegramActivationMarker(cfg: NotificationConfig): TelegramActivationMarker | undefined {
387
+ const botToken = cfg.botToken;
388
+ const chatId = cfg.chatId;
389
+ if (typeof botToken !== "string" || botToken.trim().length === 0) return undefined;
390
+ if (typeof chatId !== "string" || chatId.trim().length === 0) return undefined;
391
+ return cfg.activation?.[telegramActivationIdentity(botToken, chatId)];
392
+ }
393
+
394
+ /** Short session tag for display, e.g. last 6 chars of sessionId. */
395
+ export function sessionTag(sessionId: string): string {
396
+ return sessionId.slice(-6);
397
+ }
398
+
399
+ export interface RedactableAction {
400
+ id: string;
401
+ kind: string;
402
+ sessionId: string;
403
+ /** Durable workflow-gate correlation metadata; never generic reply authority. */
404
+ workflowGateId?: string;
405
+ question?: string;
406
+ options?: string[];
407
+ summary?: string;
408
+ }
409
+
410
+ /**
411
+ * When redact is true, strip sensitive content for remote delivery:
412
+ * - ask: NOT redacted. An ask is an interactive prompt the human must read and
413
+ * answer on the remote surface; redacting its question/options would make it
414
+ * unanswerable, defeating remote answering. Asks are returned unchanged.
415
+ * - idle: summary removed, (no question/options).
416
+ * When redact is false, return the action unchanged.
417
+ *
418
+ * Redaction still applies to streamed content frames (turn_stream, context_update,
419
+ * image_attachment) which are suppressed at their emit sites, not here. Explicit
420
+ * `telegram_send` file attachments are rejected before the file is read or forwarded.
421
+ */
422
+ export function buildRedactedAction(
423
+ action: RedactableAction,
424
+ opts: { redact: boolean; sessionTag: string },
425
+ ): RedactableAction {
426
+ if (!opts.redact) return action;
427
+
428
+ // Asks stay fully readable/answerable even under redaction.
429
+ if (action.kind === "ask") return action;
430
+
431
+ const { summary: _summary, question: _question, options: _options, ...base } = action;
432
+ return base;
433
+ }