@gajae-code/coding-agent 0.13.3 → 0.14.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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +1 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -0,0 +1,345 @@
1
+ /**
2
+ * Herdr agent lifecycle reporter.
3
+ *
4
+ * When gjc runs inside a Herdr pane (`HERDR_ENV=1`), report semantic agent
5
+ * state through Herdr's documented custom-integration API so the pane is
6
+ * recognized as the "gjc" agent in Herdr's sidebar and workspace rollups:
7
+ *
8
+ * - `idle` — waiting at the input prompt (also reported at startup)
9
+ * - `working` — agent turn in progress
10
+ * - `blocked` — waiting on a user decision (ask tool)
11
+ *
12
+ * The session title is reported through the same API as display-only pane
13
+ * metadata, so a pane shows what it is working on instead of a bare agent
14
+ * label. Herdr renders that title on the pane border and exposes it to the
15
+ * sidebar as the `pane` token.
16
+ *
17
+ * Reporting is strictly best-effort and never blocks or fails a turn. Outside
18
+ * a Herdr pane every entry point is a no-op. Herdr also clears the authority
19
+ * when the pane's foreground process exits, so a hard kill still recovers.
20
+ *
21
+ * Original implementation contributed by @ox8884 (#4318).
22
+ */
23
+ import { logger } from "@gajae-code/utils";
24
+
25
+ const HERDR_ENV = "HERDR_ENV";
26
+ const HERDR_PANE_ID_ENV = "HERDR_PANE_ID";
27
+ const HERDR_BIN_PATH_ENV = "HERDR_BIN_PATH";
28
+ const HERDR_COMMAND = "herdr";
29
+ const AGENT_LABEL = "gjc";
30
+ const SOURCE = "custom:gjc";
31
+ /** A report is a fire-and-forget status ping; a hung herdr CLI must never accumulate. */
32
+ const HERDR_REPORT_TIMEOUT_MS = 1500;
33
+ /** Release runs on the shutdown path, so it is bounded even tighter. */
34
+ const HERDR_RELEASE_TIMEOUT_MS = 1000;
35
+ const CONTROL_CHARS = /[\u0000-\u001f\u007f-\u009f]/g;
36
+ /** Herdr truncates to the pane width anyway; this only bounds the argv. */
37
+ const MAX_PANE_TITLE_CHARS = 120;
38
+
39
+ /**
40
+ * Metadata reports carry their own per-source sequence in Herdr, independent of
41
+ * the lifecycle-state sequence, so title updates need a counter of their own.
42
+ * Module scope because the title is a property of the process, not of one
43
+ * reporter instance: `setSessionTerminalTitle` is called from controllers that
44
+ * never see the reporter.
45
+ */
46
+ let metadataSeq = 0;
47
+
48
+ function nextMetadataSeq(): number {
49
+ metadataSeq += 1;
50
+ return metadataSeq;
51
+ }
52
+
53
+ export type HerdrAgentState = "idle" | "working" | "blocked";
54
+
55
+ export interface HerdrPaneEnvironment {
56
+ paneId: string;
57
+ binPath: string;
58
+ }
59
+
60
+ export interface HerdrReportProcess {
61
+ exited: Promise<number>;
62
+ kill(): void;
63
+ unref(): void;
64
+ }
65
+
66
+ export interface HerdrReporterOptions {
67
+ env?: NodeJS.ProcessEnv;
68
+ which?: (command: string) => string | null;
69
+ spawn?: (
70
+ command: string[],
71
+ options: { env: NodeJS.ProcessEnv; stdin: "ignore"; stdout: "ignore"; stderr: "ignore" },
72
+ ) => HerdrReportProcess;
73
+ }
74
+
75
+ /** Session event shape consumed by the reporter. Narrow on purpose: the state
76
+ * machine is driven only by lifecycle transitions, never by message content. */
77
+ export interface HerdrSessionEvent {
78
+ type: string;
79
+ toolName?: string;
80
+ }
81
+
82
+ export interface HerdrReporter {
83
+ /** Report a new agent state. Deduplicated against the last reported state. */
84
+ report(state: HerdrAgentState): void;
85
+ /** Release this pane's lifecycle authority and stop listening. Idempotent. */
86
+ release(): void;
87
+ /** Current reported state, for tests and diagnostics. */
88
+ readonly state: HerdrAgentState | null;
89
+ }
90
+
91
+ function defaultSpawn(
92
+ command: string[],
93
+ options: { env: NodeJS.ProcessEnv; stdin: "ignore"; stdout: "ignore"; stderr: "ignore" },
94
+ ): HerdrReportProcess {
95
+ return Bun.spawn(command, options);
96
+ }
97
+
98
+ /**
99
+ * Resolve the pane environment. Returns null unless gjc is demonstrably inside
100
+ * a Herdr pane AND a herdr binary is resolvable.
101
+ *
102
+ * `HERDR_BIN_PATH` is honored first because Herdr sets it for its own panes;
103
+ * otherwise the binary is resolved from PATH. No home-directory guessing: an
104
+ * unverified path scavenged from an install layout is a command this process
105
+ * would execute, and PATH/`HERDR_BIN_PATH` are the trust boundary Herdr itself
106
+ * documents.
107
+ */
108
+ export function resolveHerdrPaneEnvironment(options: HerdrReporterOptions = {}): HerdrPaneEnvironment | null {
109
+ const env = options.env ?? process.env;
110
+ if (env[HERDR_ENV]?.trim() !== "1") return null;
111
+
112
+ const paneId = env[HERDR_PANE_ID_ENV]?.trim();
113
+ // A pane id is forwarded verbatim as an argv element; reject anything that is
114
+ // not an opaque identifier rather than trusting the surrounding environment.
115
+ // The leading character must be alphanumeric so a pane id can never be parsed
116
+ // by the herdr CLI as an option.
117
+ if (!paneId || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(paneId)) return null;
118
+
119
+ const configured = env[HERDR_BIN_PATH_ENV]?.trim();
120
+ if (configured) return { paneId, binPath: configured };
121
+
122
+ const which = options.which ?? Bun.which;
123
+ try {
124
+ const resolved = which(HERDR_COMMAND);
125
+ return resolved ? { paneId, binPath: resolved } : null;
126
+ } catch (error) {
127
+ logger.debug("herdr binary lookup failed", { error: String(error) });
128
+ return null;
129
+ }
130
+ }
131
+
132
+ /** Build the argv for a state report. Exported for tests. */
133
+ export function buildHerdrReportArgs(paneId: string, state: HerdrAgentState, seq: number): string[] {
134
+ return [
135
+ "pane",
136
+ "report-agent",
137
+ paneId,
138
+ "--source",
139
+ SOURCE,
140
+ "--agent",
141
+ AGENT_LABEL,
142
+ "--state",
143
+ state,
144
+ "--seq",
145
+ String(seq),
146
+ ];
147
+ }
148
+
149
+ /** Build the argv for an authority release. Exported for tests. */
150
+ export function buildHerdrReleaseArgs(paneId: string, seq: number): string[] {
151
+ return ["pane", "release-agent", paneId, "--source", SOURCE, "--agent", AGENT_LABEL, "--seq", String(seq)];
152
+ }
153
+
154
+ /**
155
+ * Collapse a session name into a single-line pane title. Control characters are
156
+ * removed rather than escaped: the value reaches a terminal surface, and a
157
+ * model-generated session name must never be able to inject escapes.
158
+ */
159
+ export function sanitizeHerdrPaneTitle(title: string | undefined): string | undefined {
160
+ if (!title) return undefined;
161
+ const sanitized = title.replace(CONTROL_CHARS, " ").replace(/\s+/g, " ").trim();
162
+ if (!sanitized) return undefined;
163
+ if (sanitized.length <= MAX_PANE_TITLE_CHARS) return sanitized;
164
+ // Truncate by UTF-16 code units (the Herdr argv is a string), then step back
165
+ // if the cut lands on the high surrogate of a pair so the title never ends
166
+ // with a lone surrogate.
167
+ let bound = MAX_PANE_TITLE_CHARS;
168
+ const last = sanitized.charCodeAt(bound - 1);
169
+ if (last >= 0xd800 && last <= 0xdbff) bound -= 1;
170
+ return sanitized.slice(0, bound).trimEnd();
171
+ }
172
+
173
+ /** Build the argv for a pane title report. Exported for tests. */
174
+ export function buildHerdrTitleArgs(paneId: string, title: string, seq: number): string[] {
175
+ return [
176
+ "pane",
177
+ "report-metadata",
178
+ paneId,
179
+ "--source",
180
+ SOURCE,
181
+ "--agent",
182
+ AGENT_LABEL,
183
+ "--title",
184
+ title,
185
+ "--seq",
186
+ String(seq),
187
+ ];
188
+ }
189
+
190
+ /** Build the argv that retracts a previously reported pane title. Exported for tests. */
191
+ export function buildHerdrClearTitleArgs(paneId: string, seq: number): string[] {
192
+ return ["pane", "report-metadata", paneId, "--source", SOURCE, "--clear-title", "--seq", String(seq)];
193
+ }
194
+
195
+ /**
196
+ * Spawn a detached, timeout-bounded herdr CLI invocation. Every failure mode is
197
+ * swallowed: a status ping must never surface in a session.
198
+ */
199
+ function runHerdrCommand(binPath: string, args: string[], timeoutMs: number, options: HerdrReporterOptions): void {
200
+ const env = options.env ?? process.env;
201
+ const spawn = options.spawn ?? defaultSpawn;
202
+
203
+ let proc: HerdrReportProcess;
204
+ try {
205
+ proc = spawn([binPath, ...args], {
206
+ env,
207
+ stdin: "ignore",
208
+ stdout: "ignore",
209
+ stderr: "ignore",
210
+ });
211
+ } catch (error) {
212
+ // Missing/unexecutable binary: reporting is best-effort, never fatal.
213
+ logger.debug("herdr report failed to start", { error: String(error) });
214
+ return;
215
+ }
216
+ proc.unref();
217
+ const timer = setTimeout(() => {
218
+ try {
219
+ proc.kill();
220
+ } catch {}
221
+ }, timeoutMs);
222
+ timer.unref?.();
223
+ // Bun.spawn surfaces spawn failure through `exited` rejection, so this
224
+ // handler is what keeps an ENOENT from becoming an unhandled rejection.
225
+ void proc.exited
226
+ .then(exitCode => {
227
+ clearTimeout(timer);
228
+ if (exitCode !== 0) logger.debug("herdr report exited non-zero", { exitCode });
229
+ })
230
+ .catch(error => {
231
+ clearTimeout(timer);
232
+ logger.debug("herdr report failed", { error: String(error) });
233
+ });
234
+ }
235
+
236
+ /**
237
+ * Report the current session title for this pane. No-op outside a Herdr pane or
238
+ * when the session has no usable name, so a pane keeps the last real title
239
+ * instead of flickering to a placeholder during startup or a rename.
240
+ */
241
+ export function syncHerdrPaneTitle(sessionName: string | undefined, options: HerdrReporterOptions = {}): void {
242
+ const title = sanitizeHerdrPaneTitle(sessionName);
243
+ if (!title) return;
244
+
245
+ const paneEnv = resolveHerdrPaneEnvironment(options);
246
+ if (!paneEnv) return;
247
+
248
+ runHerdrCommand(
249
+ paneEnv.binPath,
250
+ buildHerdrTitleArgs(paneEnv.paneId, title, nextMetadataSeq()),
251
+ HERDR_REPORT_TIMEOUT_MS,
252
+ options,
253
+ );
254
+ }
255
+
256
+ /**
257
+ * Create a reporter bound to a pane. `subscribe` supplies the session event
258
+ * stream and is parameterized so the state machine is testable without a live
259
+ * session.
260
+ */
261
+ export function createHerdrReporter(
262
+ paneEnv: HerdrPaneEnvironment,
263
+ subscribe: (listener: (event: HerdrSessionEvent) => void) => () => void,
264
+ options: HerdrReporterOptions = {},
265
+ ): HerdrReporter {
266
+ let seq = 0;
267
+ let currentState: HerdrAgentState | null = null;
268
+ let released = false;
269
+ /** Nesting depth of blocking ask calls; a nested ask must not unblock early. */
270
+ let askDepth = 0;
271
+
272
+ const run = (args: string[], timeoutMs: number): void => {
273
+ runHerdrCommand(paneEnv.binPath, args, timeoutMs, options);
274
+ };
275
+
276
+ const report = (state: HerdrAgentState): void => {
277
+ if (released || state === currentState) return;
278
+ currentState = state;
279
+ seq += 1;
280
+ run(buildHerdrReportArgs(paneEnv.paneId, state, seq), HERDR_REPORT_TIMEOUT_MS);
281
+ };
282
+
283
+ let unsubscribe: (() => void) | null = subscribe(event => {
284
+ switch (event.type) {
285
+ case "agent_start":
286
+ askDepth = 0;
287
+ report("working");
288
+ break;
289
+ case "agent_end":
290
+ askDepth = 0;
291
+ report("idle");
292
+ break;
293
+ case "tool_execution_start":
294
+ if (event.toolName === "ask") {
295
+ askDepth += 1;
296
+ report("blocked");
297
+ }
298
+ break;
299
+ case "tool_execution_end":
300
+ if (event.toolName === "ask" && askDepth > 0) {
301
+ askDepth -= 1;
302
+ if (askDepth === 0) report("working");
303
+ }
304
+ break;
305
+ }
306
+ });
307
+
308
+ // A freshly started agent is idle at the prompt.
309
+ report("idle");
310
+
311
+ return {
312
+ report,
313
+ release() {
314
+ if (released) return;
315
+ released = true;
316
+ unsubscribe?.();
317
+ unsubscribe = null;
318
+ seq += 1;
319
+ run(buildHerdrReleaseArgs(paneEnv.paneId, seq), HERDR_RELEASE_TIMEOUT_MS);
320
+ // The pane outlives gjc, so a session title left behind would label a
321
+ // plain shell with the work of a session that already ended.
322
+ run(buildHerdrClearTitleArgs(paneEnv.paneId, nextMetadataSeq()), HERDR_RELEASE_TIMEOUT_MS);
323
+ },
324
+ get state() {
325
+ return currentState;
326
+ },
327
+ };
328
+ }
329
+
330
+ /**
331
+ * Install the Herdr reporter for a running session. No-op outside a Herdr pane.
332
+ * Returns the reporter so callers can release it deterministically, or null.
333
+ */
334
+ export function installHerdrReporter(
335
+ subscribe: (listener: (event: HerdrSessionEvent) => void) => () => void,
336
+ options: HerdrReporterOptions = {},
337
+ ): HerdrReporter | null {
338
+ const paneEnv = resolveHerdrPaneEnvironment(options);
339
+ if (!paneEnv) return null;
340
+
341
+ const reporter = createHerdrReporter(paneEnv, subscribe, options);
342
+ // `exit` handlers must be synchronous; release() only spawns and returns.
343
+ process.once("exit", reporter.release);
344
+ return reporter;
345
+ }
@@ -10,6 +10,7 @@ import { resolveRoleSelection } from "../config/model-resolver";
10
10
  import type { Settings } from "../config/settings";
11
11
  import titleSystemPrompt from "../prompts/system/title-system.md" with { type: "text" };
12
12
  import { syncCmuxWorkspaceTitle } from "./cmux-workspace";
13
+ import { syncHerdrPaneTitle } from "./herdr-pane";
13
14
 
14
15
  const TITLE_SYSTEM_PROMPT = prompt.render(titleSystemPrompt);
15
16
 
@@ -220,6 +221,7 @@ export function setTerminalTitle(title: string): void {
220
221
  export function setSessionTerminalTitle(sessionName: string | undefined, cwd?: string): void {
221
222
  setTerminalTitle(formatSessionTerminalTitle(sessionName, cwd));
222
223
  void syncCmuxWorkspaceTitle(sessionName);
224
+ syncHerdrPaneTitle(sessionName);
223
225
  }
224
226
 
225
227
  /**
@@ -161,13 +161,15 @@ export {
161
161
  handleYouTube,
162
162
  };
163
163
 
164
- export const specialHandlers: SpecialHandler[] = [
164
+ export const specialHandlers: SpecialHandler[] = [];
165
+
166
+ specialHandlers.push(
165
167
  // Git hosting
166
168
  handleGitHubGist,
167
169
  handleGitHub,
168
170
  handleGitLab,
169
171
  // Video/Media
170
- handleYouTube,
172
+ (url, timeout, signal) => handleYouTube(url, timeout, signal),
171
173
  handleVimeo,
172
174
  handleSpotify,
173
175
  handleDiscogs,
@@ -203,7 +205,7 @@ export const specialHandlers: SpecialHandler[] = [
203
205
  handleBrew,
204
206
  handlePyPI,
205
207
  handleCratesIo,
206
- handleDockerHub,
208
+ (url, timeout, signal) => handleDockerHub(url, timeout, signal),
207
209
  handleFdroid,
208
210
  handleFlathub,
209
211
  handleGoPkg,
@@ -249,4 +251,4 @@ export const specialHandlers: SpecialHandler[] = [
249
251
  handleSpdx,
250
252
  handleWikidata,
251
253
  handleWikipedia,
252
- ];
254
+ );
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,117 +0,0 @@
1
- import { type OwnerIsolationProbe } from "../../gjc-runtime/tmux-owner-isolation";
2
- import { type GjcTmuxSessionStatus } from "../../gjc-runtime/tmux-sessions";
3
- import type { ResumeCandidate, SessionCreateFrame, SessionLifecycleRequest, SessionLifecycleResponse } from "./index";
4
- import { type AuditEvent, type CreateEffectResult, type LedgerStore, type LifecycleOutcome, type OrchestratorDeps, type ResumeEffectResult } from "./lifecycle-orchestrator";
5
- /** Minimal view of the native control server this runtime depends on. */
6
- export interface ControlServerLike {
7
- onLifecycleRequest(cb: (err: Error | null, req: {
8
- kind: string;
9
- requestId: string;
10
- payloadJson: string;
11
- }) => void): void;
12
- respond(responseJson: string): void;
13
- }
14
- /**
15
- * A startable control server (the native NotificationControlServer, or a fake in
16
- * tests). Extends {@link ControlServerLike} with the start/stop lifecycle the
17
- * daemon owns.
18
- */
19
- export interface LifecycleControlServer extends ControlServerLike {
20
- start(): Promise<unknown>;
21
- stop(): void;
22
- }
23
- /** Factory the daemon uses to construct a control server bound to its ownership. */
24
- export type LifecycleControlServerFactory = (input: {
25
- token: string;
26
- ownerId: string;
27
- agentDir: string;
28
- }) => LifecycleControlServer;
29
- export declare function fileLedgerStore(idempotencyFile: string): LedgerStore;
30
- /** Append-only JSONL audit sink (0600). Never receives tokens or raw prompts. */
31
- export declare function fileAudit(auditPath: string): (e: AuditEvent) => void;
32
- /** Simple per-chat sliding-window create rate limiter. */
33
- export declare function createRateLimiter(maxPerWindow: number, windowMs: number): (chatId: string, nowMs: number) => boolean;
34
- /** Build the `gjc` argv for a create target (existing path / worktree / dir).
35
- *
36
- * The launched session id is carried via `GJC_SESSION_ID` in the child env (see
37
- * {@link daemonSpawnCreate}); the root `gjc` launcher has no `--session-id`
38
- * flag, so it must never appear in argv. Only flags the launch parser actually
39
- * supports are emitted (`--worktree <branch>` for worktree targets,
40
- * `--mpreset <profile>` for model presets). */
41
- export declare function buildCreateArgv(frame: SessionCreateFrame, _ids: {
42
- intendedSessionId: string;
43
- startupPromptRef?: string;
44
- }): {
45
- cwd: string;
46
- args: string[];
47
- };
48
- /** Real daemon-safe tmux launcher: canonical owner-isolation plan + GJC tags. */
49
- export declare function daemonSpawnCreate(env?: NodeJS.ProcessEnv, opts?: {
50
- ownerIsolationProbe?: OwnerIsolationProbe;
51
- platform?: NodeJS.Platform;
52
- processIncarnation?: (pid: number) => string | undefined;
53
- }): (frame: SessionCreateFrame, ids: {
54
- lifecycleRequestId: string;
55
- intendedSessionId: string;
56
- startupPromptRef?: string;
57
- }) => Promise<CreateEffectResult>;
58
- /** Real force-close effect (GJC-managed only, id-matched). */
59
- export declare function daemonCloseSession(env?: NodeJS.ProcessEnv, deps?: {
60
- forceClose?: (name: string, env: NodeJS.ProcessEnv, expectedSessionId?: string, sessionStateFile?: string) => Promise<void>;
61
- findSession?: (name: string, env: NodeJS.ProcessEnv) => GjcTmuxSessionStatus | undefined;
62
- }): (target: {
63
- sessionId: string;
64
- tmuxSession?: string;
65
- sessionStateFile?: string;
66
- }) => Promise<{
67
- processGone: boolean;
68
- }>;
69
- /** Real resume effect: reattach if a live GJC session matches; else resolve the
70
- * prefix against saved history and fail closed (`ambiguous`/`notFound`) before
71
- * cold-restarting exactly one resolved session via the daemon-safe launcher. */
72
- export declare function daemonResumeSession(env?: NodeJS.ProcessEnv, opts?: {
73
- agentDir?: string;
74
- /** Explicit managed root for isolated tests. */
75
- sessionsRoot?: string;
76
- listSessions?: (env: NodeJS.ProcessEnv) => GjcTmuxSessionStatus[];
77
- ownerIsolationProbe?: OwnerIsolationProbe;
78
- platform?: NodeJS.Platform;
79
- processIncarnation?: (pid: number) => string | undefined;
80
- }): (target: {
81
- sessionIdOrPrefix: string;
82
- path?: string;
83
- }) => Promise<ResumeEffectResult | {
84
- ambiguous: ResumeCandidate[];
85
- } | {
86
- notFound: true;
87
- }>;
88
- /** Translate an orchestrator outcome into a wire response frame. */
89
- export declare function outcomeToResponse(frame: SessionLifecycleRequest, outcome: LifecycleOutcome): SessionLifecycleResponse;
90
- /**
91
- * Wire a control server's lifecycle requests through the orchestrator.
92
- *
93
- * Handlers run on a single serial queue (a promise chain): the daemon owns the
94
- * one control endpoint, so serializing here makes each request's ledger
95
- * read -> classify -> write atomic with respect to every other request. Two
96
- * identical updates that arrive nearly simultaneously can no longer both
97
- * classify as `new` and both spawn — the second sees the first's persisted
98
- * `in_progress`/`success` entry and re-acks instead.
99
- */
100
- export declare function attachLifecycleControl(server: ControlServerLike, deps: OrchestratorDeps): void;
101
- /** Assemble real orchestrator deps for the daemon (ledger/audit under agentDir). */
102
- export declare function buildOrchestratorDeps(input: {
103
- pairedChatId: string;
104
- agentNotificationsDir: string;
105
- /** Required in-memory, 32-byte audit-v2 redaction key. */
106
- auditRedactionKey: Uint8Array;
107
- /** Root of saved session histories (`<agentDir>/sessions`), for resume resolution. */
108
- sessionsRoot?: string;
109
- /** Agent directory used for readonly managed-session resume resolution. */
110
- agentDir?: string;
111
- env?: NodeJS.ProcessEnv;
112
- }): OrchestratorDeps;
113
- /**
114
- * Default production factory: a real native NotificationControlServer bound to
115
- * the daemon's control token, owner id, and agent dir.
116
- */
117
- export declare const createNativeControlServer: LifecycleControlServerFactory;