@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
@@ -252,6 +252,7 @@ export type IrcSidebarThemeSource = IrcSidebarTheme | (() => IrcSidebarTheme);
252
252
  export class IrcSplitViewComponent implements ViewportAnchorProvider {
253
253
  #visible = false;
254
254
  #themeGeneration = 0;
255
+ #renderRevision = 0n;
255
256
  #styledMemo:
256
257
  | { token: string; width: number; themeGeneration: number; theme: IrcSidebarTheme; lines: string[] }
257
258
  | undefined;
@@ -261,6 +262,13 @@ export class IrcSplitViewComponent implements ViewportAnchorProvider {
261
262
  private readonly ledger: IrcObservationLedger,
262
263
  private readonly componentTheme: IrcSidebarThemeSource,
263
264
  ) {}
265
+ getRenderRevision(): bigint {
266
+ return this.#renderRevision + (this.leftPane.getRenderRevision?.() ?? 0n);
267
+ }
268
+
269
+ #advanceRenderRevision(): void {
270
+ this.#renderRevision += 1n;
271
+ }
264
272
  get visible(): boolean {
265
273
  return this.#visible;
266
274
  }
@@ -276,10 +284,12 @@ export class IrcSplitViewComponent implements ViewportAnchorProvider {
276
284
  invalidateTheme(): void {
277
285
  this.#themeGeneration++;
278
286
  this.#styledMemo = undefined;
287
+ this.#advanceRenderRevision();
279
288
  }
280
289
  resetSource(): void {
281
290
  projectionMemo.delete(this.ledger);
282
291
  this.#styledMemo = undefined;
292
+ this.#advanceRenderRevision();
283
293
  }
284
294
  render(width: number): string[] {
285
295
  return this.renderWithViewportAnchors(width).lines;
@@ -345,5 +355,6 @@ export class IrcSplitViewComponent implements ViewportAnchorProvider {
345
355
  }
346
356
  invalidate(): void {
347
357
  this.leftPane.invalidate?.();
358
+ this.#advanceRenderRevision();
348
359
  }
349
360
  }
@@ -0,0 +1,585 @@
1
+ /** Protocol-correct direct and managed iTerm2 Pet capability transport. */
2
+ import { isUnderTerminalMultiplexer, parseITerm2CapabilityReply, wrapITerm2RecordForTmux } from "@gajae-code/tui";
3
+ import { resolveGjcTmuxCommand } from "../../gjc-runtime/tmux-common";
4
+ export const PET_CAPABILITY_DRAIN_MAX_MS = 100;
5
+ export const PET_CAPABILITY_QUIESCENCE_MS = 25;
6
+ export const PET_CAPABILITY_QUERY_TIMEOUT_MS = 1000;
7
+ export const PET_TOPOLOGY_POLL_MS = 250;
8
+ export type PetTransportMode = "direct" | "managed";
9
+ export type PetUnavailableReason =
10
+ | "not-iterm2"
11
+ | "tty-unavailable"
12
+ | "missing-f"
13
+ | "invalid-f"
14
+ | "probe-timeout"
15
+ | "topology-ineligible"
16
+ | "topology-lost"
17
+ | "zero-client-recovery"
18
+ | "cleanup-failed";
19
+ export type PetTransportAvailability = Readonly<{
20
+ available: boolean;
21
+ mode: PetTransportMode;
22
+ reason?: PetUnavailableReason;
23
+ epoch: number;
24
+ }>;
25
+ export type PetTransportClock = Readonly<{
26
+ now(): number;
27
+ setTimeout(callback: () => void, ms: number): unknown;
28
+ clearTimeout(handle: unknown): void;
29
+ }>;
30
+ export type PetTransportInput = Readonly<{
31
+ drain(maxMs: number, quiescenceMs: number): Promise<void>;
32
+ onData(callback: (data: Uint8Array | string) => PetInputResult | undefined): () => void;
33
+ }>;
34
+ export type PetInputResult = Readonly<{ consume?: true; data?: string }>;
35
+ export type NativePetUi = Readonly<{
36
+ drainPetProbeInput?(maxMs: number, quiescenceMs: number): Promise<void>;
37
+ drainInput(maxMs: number, quiescenceMs: number): Promise<void>;
38
+ addInputListener(callback: (data: string | Uint8Array) => unknown): () => void;
39
+ submitTerminalOutput(
40
+ request: Readonly<{ operation: Readonly<{ type: "raster-probe"; bytes: Uint8Array }> }>,
41
+ ): Promise<Readonly<{ status?: string; written?: number }>>;
42
+ notifyTerminalLifecycle(
43
+ event: Readonly<{
44
+ kind: "availability-restored" | "explicit-cleanup";
45
+ source: "transport";
46
+ terminalGeneration: number;
47
+ }>,
48
+ ): Promise<unknown>;
49
+ readonly terminalGeneration: number;
50
+ }>;
51
+ export type PetTransportOutput = Readonly<{
52
+ write(bytes: Uint8Array): Promise<Readonly<{ status: "written" | "failed" }>>;
53
+ notifyLifecycle?(
54
+ event: Readonly<{ kind: "availability-restored" | "explicit-cleanup"; terminalGeneration: number }>,
55
+ ): Promise<unknown>;
56
+ }>;
57
+ export type PetTmuxResult = Readonly<{ status: number; stdout: string; stderr?: string }>;
58
+ export type PetTmuxRunner = (argv: readonly string[]) => Promise<PetTmuxResult | string>;
59
+ export type PetTmuxTopology = Readonly<{
60
+ clients: number;
61
+ paneId?: string;
62
+ ownedPaneId?: string;
63
+ clientId?: string;
64
+ clientVersion?: string;
65
+ }>;
66
+ const text = (v: Uint8Array | string) => (typeof v === "string" ? v : new TextDecoder().decode(v));
67
+ export function hasItermFileCapability(v: Uint8Array | string): boolean {
68
+ return parseITerm2CapabilityReply(v) === "complete-f";
69
+ }
70
+ export function consumeCapabilityInput(callback: (data: Uint8Array | string) => void) {
71
+ const marker = "\x1b]1337;Capabilities";
72
+ const maxFragment = 8192;
73
+ let fragment = "";
74
+ return (data: string | Uint8Array): PetInputResult | undefined => {
75
+ const combined = fragment + text(data);
76
+ fragment = "";
77
+ let offset = 0;
78
+ let consumed = false;
79
+ let passthrough = "";
80
+ while (offset < combined.length) {
81
+ const start = combined.indexOf(marker, offset);
82
+ if (start < 0) {
83
+ const suffixLength = Math.min(marker.length - 1, combined.length - offset);
84
+ let keep = "";
85
+ for (let len = suffixLength; len >= 1; len--) {
86
+ const candidate = combined.slice(combined.length - len);
87
+ if (marker.startsWith(candidate)) {
88
+ keep = candidate;
89
+ break;
90
+ }
91
+ }
92
+ passthrough += combined.slice(offset, combined.length - keep.length);
93
+ fragment = keep;
94
+ break;
95
+ }
96
+ passthrough += combined.slice(offset, start);
97
+ const end = combined.slice(start + marker.length).search(/(?:\x07|\x1b\\)/);
98
+ if (end < 0) {
99
+ const pending = combined.slice(start);
100
+ if (pending.length <= maxFragment) fragment = pending;
101
+ else passthrough += pending;
102
+ consumed = true;
103
+ break;
104
+ }
105
+ const terminator = combined[start + marker.length + end];
106
+ const length = marker.length + end + (terminator === "\x1b" ? 2 : 1);
107
+ callback(combined.slice(start, start + length));
108
+ consumed = true;
109
+ offset = start + length;
110
+ }
111
+ if (passthrough) return { data: passthrough };
112
+ return consumed || fragment ? { consume: true } : undefined;
113
+ };
114
+ }
115
+ export function capabilityProbe() {
116
+ return new TextEncoder().encode("\x1b]1337;Capabilities\x07");
117
+ }
118
+ const result = (r: PetTmuxResult | string): PetTmuxResult => (typeof r === "string" ? { status: 0, stdout: r } : r);
119
+ export function isItermCandidate(
120
+ env: NodeJS.ProcessEnv = Bun.env,
121
+ tty = Boolean(process.stdin.isTTY && process.stdout.isTTY),
122
+ ): boolean {
123
+ const v = env.TERM_PROGRAM_VERSION?.split(".").map(Number);
124
+ return env.TERM_PROGRAM === "iTerm.app" && tty && !!v && v[0] >= 3 && (v[0] > 3 || (v[1] ?? 0) >= 5);
125
+ }
126
+ export function createNativePetTransport(o: {
127
+ ui: NativePetUi;
128
+ env?: NodeJS.ProcessEnv;
129
+ topology?: () => Promise<PetTmuxTopology>;
130
+ }): ItermPetTransport | undefined {
131
+ const env = o.env ?? Bun.env;
132
+ const managed = Boolean(
133
+ env.GJC_TMUX_ACTIVE_SESSION?.trim() && env.TMUX_PANE?.trim() && env.GJC_MANAGED_OWNER_RUN_ID?.trim(),
134
+ );
135
+ if (isUnderTerminalMultiplexer(env) && !managed) return undefined;
136
+ if (!isItermCandidate(env, true)) return undefined;
137
+ const clock: PetTransportClock = { now: Date.now, setTimeout, clearTimeout };
138
+ const input: PetTransportInput = {
139
+ drain: (a, b) => o.ui.drainPetProbeInput?.(a, b) ?? o.ui.drainInput(a, b),
140
+ onData: cb => {
141
+ const consume = consumeCapabilityInput(cb);
142
+ return o.ui.addInputListener((d: string | Uint8Array) => consume(d));
143
+ },
144
+ };
145
+ const output: PetTransportOutput = {
146
+ write: async bytes => {
147
+ const r = await o.ui.submitTerminalOutput({ operation: { type: "raster-probe", bytes } });
148
+ return { status: r?.status === "written" || (r?.written ?? 0) > 0 ? "written" : "failed" };
149
+ },
150
+ notifyLifecycle: e =>
151
+ o.ui.notifyTerminalLifecycle({ ...e, source: "transport", terminalGeneration: o.ui.terminalGeneration }),
152
+ };
153
+ const tmuxCommand = managed ? resolveGjcTmuxCommand(env) : undefined;
154
+ const tmux: PetTmuxRunner | undefined = managed
155
+ ? async argv => {
156
+ const p = Bun.spawn([tmuxCommand!, ...argv], { stdout: "pipe", stderr: "pipe" });
157
+ return {
158
+ status: await p.exited,
159
+ stdout: await new Response(p.stdout).text(),
160
+ stderr: await new Response(p.stderr).text(),
161
+ };
162
+ }
163
+ : undefined;
164
+ return new ItermPetTransport({
165
+ mode: managed ? "managed" : "direct",
166
+ ttyCandidate: true,
167
+ clock,
168
+ input,
169
+ output,
170
+ tmux,
171
+ paneId: env.TMUX_PANE,
172
+ sessionTarget: env.GJC_TMUX_ACTIVE_SESSION,
173
+ topology: o.topology,
174
+ });
175
+ }
176
+
177
+ export class ItermPetTransport {
178
+ #epoch = 0;
179
+ #available = false;
180
+ #reason?: PetUnavailableReason;
181
+ #pending = false;
182
+ #unsubscribe?: () => void;
183
+ #timeout?: unknown;
184
+ #disposed = false;
185
+ #poll?: unknown;
186
+ #listeners = new Set<(a: PetTransportAvailability) => void>();
187
+ #snapshot?: "unset" | { value: string };
188
+ #restored = false;
189
+ #restoreInFlight?: Promise<void>;
190
+ #paneTransaction: Promise<void> = Promise.resolve();
191
+ readonly #clock;
192
+ readonly #input;
193
+ readonly #output;
194
+ readonly #tmux;
195
+ readonly #ttyCandidate;
196
+ readonly #paneId?: string;
197
+ readonly #sessionTarget?: string;
198
+ readonly #topology?: () => Promise<PetTmuxTopology>;
199
+ readonly #mode: PetTransportMode;
200
+ readonly #expectedClientId?: string;
201
+ #observedClientId?: string;
202
+ #pendingResolve?: (availability: PetTransportAvailability) => void;
203
+ constructor(
204
+ o: Readonly<{
205
+ mode?: PetTransportMode;
206
+ ttyCandidate?: boolean;
207
+ clock: PetTransportClock;
208
+ input: PetTransportInput;
209
+ output: PetTransportOutput;
210
+ tmux?: PetTmuxRunner;
211
+ ownedPaneId?: string;
212
+ paneId?: string;
213
+ sessionTarget?: string;
214
+ topology?: () => Promise<PetTmuxTopology>;
215
+ expectedClientId?: string;
216
+ }>,
217
+ ) {
218
+ this.#mode = o.mode ?? "direct";
219
+ this.#ttyCandidate = o.ttyCandidate ?? true;
220
+ this.#clock = o.clock;
221
+ this.#input = o.input;
222
+ this.#output = o.output;
223
+ this.#tmux = o.tmux;
224
+ this.#paneId = o.ownedPaneId ?? o.paneId;
225
+ this.#sessionTarget = o.sessionTarget;
226
+ this.#topology = o.topology;
227
+ this.#expectedClientId = o.expectedClientId;
228
+ }
229
+ #notifyLifecycle(
230
+ event: Readonly<{ kind: "availability-restored" | "explicit-cleanup"; terminalGeneration: number }>,
231
+ ) {
232
+ try {
233
+ const notification = this.#output.notifyLifecycle?.(event);
234
+ if (notification !== undefined) void notification.catch(() => undefined);
235
+ } catch {}
236
+ }
237
+ get availability() {
238
+ return { available: this.#available, mode: this.#mode, reason: this.#reason, epoch: this.#epoch };
239
+ }
240
+ async refreshManagedClient(row: number, column: number): Promise<boolean> {
241
+ if (this.#mode === "direct") return true;
242
+ if (!Number.isInteger(row) || row < 0 || !Number.isInteger(column) || column < 0) return false;
243
+ if (!this.#available || !this.#tmux || this.#observedClientId === undefined || this.#paneId === undefined)
244
+ return false;
245
+ if (this.#expectedClientId !== undefined && this.#expectedClientId !== this.#observedClientId) return false;
246
+ const clientId = this.#observedClientId;
247
+ const epoch = this.#epoch;
248
+ const deadline = this.#clock.now() + 250;
249
+ const isCurrent = () =>
250
+ !this.#disposed &&
251
+ this.#available &&
252
+ this.#tmux !== undefined &&
253
+ this.#epoch === epoch &&
254
+ this.#observedClientId === clientId &&
255
+ (this.#expectedClientId === undefined || this.#expectedClientId === clientId);
256
+ while (this.#clock.now() <= deadline) {
257
+ if (!isCurrent()) return false;
258
+ try {
259
+ const pane = result(
260
+ await this.#tmux(["display-message", "-p", "-t", this.#paneId, "#{cursor_y}\t#{cursor_x}"]),
261
+ );
262
+ if (!isCurrent() || pane.status !== 0) return false;
263
+ const match = /^([0-9]+)\t([0-9]+)$/.exec(pane.stdout.trim());
264
+ if (!match) return false;
265
+ const observedRow = Number(match[1]);
266
+ const observedColumn = Number(match[2]);
267
+ if (!Number.isSafeInteger(observedRow) || !Number.isSafeInteger(observedColumn)) return false;
268
+ if (observedRow === row && observedColumn === column)
269
+ return result(await this.#tmux(["refresh-client", "-t", clientId])).status === 0 && isCurrent();
270
+ } catch {
271
+ return false;
272
+ }
273
+ const { promise, resolve } = Promise.withResolvers<void>();
274
+ this.#clock.setTimeout(resolve, 10);
275
+ await promise;
276
+ }
277
+ return false;
278
+ }
279
+ subscribe(cb: (a: PetTransportAvailability) => void) {
280
+ this.#listeners.add(cb);
281
+ return () => this.#listeners.delete(cb);
282
+ }
283
+ #emit() {
284
+ for (const cb of this.#listeners) {
285
+ try {
286
+ cb(this.availability);
287
+ } catch {}
288
+ }
289
+ }
290
+ async probe() {
291
+ if (this.#disposed || this.#pending) return this.availability;
292
+ if (this.#mode === "managed") return this.inspectManagedTopology();
293
+ return this.#probeAfterEligibility();
294
+ }
295
+ async #probeAfterEligibility() {
296
+ if (this.#disposed || this.#pending) return this.availability;
297
+ this.#pending = true;
298
+ const epoch = ++this.#epoch;
299
+ this.#available = false;
300
+ this.#emit();
301
+ if (this.#mode === "managed") {
302
+ let prepared = false;
303
+ try {
304
+ prepared = await this.#queuePaneTransaction(() => this.#prepareManagedPane(epoch));
305
+ } catch {
306
+ prepared = false;
307
+ }
308
+ if (!prepared) {
309
+ if (epoch !== this.#epoch || this.#disposed) return this.availability;
310
+ this.#finish("topology-ineligible");
311
+ await this.#restore(epoch);
312
+ return this.availability;
313
+ }
314
+ }
315
+ if (epoch !== this.#epoch || this.#disposed) return this.availability;
316
+ try {
317
+ await this.#input.drain(PET_CAPABILITY_DRAIN_MAX_MS, PET_CAPABILITY_QUIESCENCE_MS);
318
+ } catch {
319
+ if (epoch !== this.#epoch || this.#disposed) return this.availability;
320
+ this.#finish("probe-timeout");
321
+ await this.#restore(epoch);
322
+ return this.availability;
323
+ }
324
+ if (epoch !== this.#epoch || this.#disposed) return this.availability;
325
+ if (!this.#ttyCandidate) return this.#finish("tty-unavailable");
326
+ const probe = capabilityProbe();
327
+ const bytes =
328
+ this.#mode === "managed"
329
+ ? new TextEncoder().encode(wrapITerm2RecordForTmux(new TextDecoder().decode(probe)))
330
+ : probe;
331
+ const { promise, resolve } = Promise.withResolvers<PetTransportAvailability>();
332
+ this.#pendingResolve = resolve;
333
+ let buffer = "";
334
+ let acknowledged = false;
335
+ const cleanup = () => {
336
+ this.#clock.clearTimeout(this.#timeout);
337
+ this.#timeout = undefined;
338
+ this.#unsubscribe?.();
339
+ this.#unsubscribe = undefined;
340
+ };
341
+ const finish = (reason?: PetUnavailableReason) => {
342
+ if (!this.#pending || epoch !== this.#epoch || this.#disposed) return;
343
+ cleanup();
344
+ this.#pendingResolve = undefined;
345
+ this.#finish(reason);
346
+ if (reason) void this.#restore(epoch);
347
+ resolve(this.availability);
348
+ };
349
+ this.#unsubscribe = this.#input.onData(d => {
350
+ if (!acknowledged) return;
351
+ buffer += text(d);
352
+ const reply = parseITerm2CapabilityReply(buffer);
353
+ if (reply === "complete-f") finish();
354
+ else if (reply === "missing-f" || reply === "invalid-f") finish(reply);
355
+ if (buffer.length > 8192) buffer = buffer.slice(-4096);
356
+ });
357
+ let writeResult: Promise<Readonly<{ status: "written" | "failed" }>>;
358
+ try {
359
+ writeResult = this.#output.write(bytes);
360
+ } catch {
361
+ finish("probe-timeout");
362
+ return promise;
363
+ }
364
+ Promise.resolve(writeResult)
365
+ .then(written => {
366
+ if (epoch !== this.#epoch || this.#disposed) {
367
+ cleanup();
368
+ return;
369
+ }
370
+ if (written.status !== "written") {
371
+ finish("probe-timeout");
372
+ return;
373
+ }
374
+ acknowledged = true;
375
+ this.#timeout = this.#clock.setTimeout(() => finish("probe-timeout"), PET_CAPABILITY_QUERY_TIMEOUT_MS);
376
+ })
377
+ .catch(() => finish("probe-timeout"));
378
+ return promise;
379
+ }
380
+ retry() {
381
+ return this.#mode === "managed" ? this.inspectManagedTopology() : this.probe();
382
+ }
383
+ #finish(reason?: PetUnavailableReason) {
384
+ this.#pending = false;
385
+ this.#available = !reason;
386
+ this.#reason = reason;
387
+ this.#emit();
388
+ if (this.#available && !reason)
389
+ this.#notifyLifecycle({ kind: "availability-restored", terminalGeneration: this.#epoch });
390
+ return this.availability;
391
+ }
392
+ async revoke(reason: PetUnavailableReason = "topology-lost"): Promise<PetTransportAvailability> {
393
+ if (!this.#available && this.#reason === reason) return this.availability;
394
+ this.#epoch++;
395
+ this.#clock.clearTimeout(this.#timeout);
396
+ this.#timeout = undefined;
397
+ this.#unsubscribe?.();
398
+ this.#unsubscribe = undefined;
399
+ this.#pending = false;
400
+ this.#available = false;
401
+ this.#reason = reason;
402
+ this.#observedClientId = undefined;
403
+ const availability = this.availability;
404
+ const resolve = this.#pendingResolve;
405
+ this.#pendingResolve = undefined;
406
+ this.#emit();
407
+ resolve?.(availability);
408
+ await this.#restore(this.#epoch);
409
+ return availability;
410
+ }
411
+ #queuePaneTransaction<T>(transaction: () => Promise<T>): Promise<T> {
412
+ const queued = this.#paneTransaction.then(transaction, transaction);
413
+ this.#paneTransaction = queued.then(
414
+ () => undefined,
415
+ () => undefined,
416
+ );
417
+ return queued;
418
+ }
419
+ async #restoreManagedPane(epoch?: number) {
420
+ if (
421
+ this.#mode !== "managed" ||
422
+ !this.#tmux ||
423
+ !this.#paneId ||
424
+ this.#snapshot === undefined ||
425
+ this.#restored ||
426
+ (epoch !== undefined && (epoch !== this.#epoch || this.#disposed))
427
+ )
428
+ return;
429
+ if (this.#restoreInFlight) return this.#restoreInFlight;
430
+ const snapshot = this.#snapshot;
431
+ const argv =
432
+ snapshot === "unset"
433
+ ? ["set-option", "-u", "-p", "-t", this.#paneId, "allow-passthrough"]
434
+ : ["set-option", "-p", "-t", this.#paneId, "allow-passthrough", snapshot.value];
435
+ this.#restoreInFlight = (async () => {
436
+ let r: PetTmuxResult;
437
+ try {
438
+ r = result(await this.#tmux!(argv));
439
+ } catch {
440
+ this.#reason = "cleanup-failed";
441
+ this.#available = false;
442
+ this.#emit();
443
+ return;
444
+ }
445
+ if (r.status !== 0) {
446
+ this.#reason = "cleanup-failed";
447
+ this.#available = false;
448
+ this.#emit();
449
+ return;
450
+ }
451
+ if (this.#snapshot === snapshot) {
452
+ this.#restored = true;
453
+ this.#snapshot = undefined;
454
+ if (this.#reason === "cleanup-failed") this.#reason = undefined;
455
+ this.#notifyLifecycle({ kind: "explicit-cleanup", terminalGeneration: this.#epoch });
456
+ }
457
+ })();
458
+ try {
459
+ await this.#restoreInFlight;
460
+ } finally {
461
+ this.#restoreInFlight = undefined;
462
+ }
463
+ }
464
+ async #restore(epoch?: number) {
465
+ return this.#queuePaneTransaction(() => this.#restoreManagedPane(epoch));
466
+ }
467
+ async #prepareManagedPane(epoch: number): Promise<boolean> {
468
+ if (!this.#tmux || !this.#paneId) return false;
469
+ const isCurrent = () => epoch === this.#epoch && !this.#disposed;
470
+ if (this.#snapshot !== undefined) {
471
+ const current = result(
472
+ await this.#tmux(["show-options", "-A", "-p", "-v", "-t", this.#paneId, "allow-passthrough"]),
473
+ );
474
+ if (!isCurrent()) return false;
475
+ if (current.status === 0 && current.stdout.replace(/\r?\n$/, "") === "on") return true;
476
+ await this.#restoreManagedPane();
477
+ if (this.#snapshot !== undefined) return false;
478
+ }
479
+ const q = result(await this.#tmux(["show-options", "-q", "-p", "-v", "-t", this.#paneId, "allow-passthrough"]));
480
+ if (!isCurrent() || q.status !== 0) return false;
481
+ const snapshot = q.stdout.replace(/\r?\n$/, "") === "" ? "unset" : { value: q.stdout.replace(/\r?\n$/, "") };
482
+ this.#snapshot = snapshot;
483
+ this.#restored = false;
484
+ const set = result(await this.#tmux(["set-option", "-p", "-t", this.#paneId, "allow-passthrough", "on"]));
485
+ if (!isCurrent() || set.status !== 0) {
486
+ await this.#restoreManagedPane(epoch);
487
+ return false;
488
+ }
489
+ const verify = result(
490
+ await this.#tmux(["show-options", "-A", "-p", "-v", "-t", this.#paneId, "allow-passthrough"]),
491
+ );
492
+ if (
493
+ epoch !== this.#epoch ||
494
+ this.#disposed ||
495
+ verify.status !== 0 ||
496
+ verify.stdout.replace(/\r?\n$/, "") !== "on"
497
+ ) {
498
+ await this.#restoreManagedPane(epoch);
499
+ return false;
500
+ }
501
+ return true;
502
+ }
503
+ async inspectManagedTopology() {
504
+ if (this.#disposed) return this.availability;
505
+ const epoch = this.#epoch;
506
+ const isCurrent = () => epoch === this.#epoch && !this.#disposed;
507
+ if (this.#topology) {
508
+ let t: PetTmuxTopology;
509
+ try {
510
+ t = await this.#topology();
511
+ } catch {
512
+ if (!isCurrent()) return this.availability;
513
+ return this.#finish("topology-ineligible");
514
+ }
515
+ if (!isCurrent()) return this.availability;
516
+ if (
517
+ t.clients === 1 &&
518
+ ((t.paneId !== undefined && t.paneId !== this.#paneId) ||
519
+ (t.ownedPaneId !== undefined && t.ownedPaneId !== this.#paneId) ||
520
+ (t.clientId !== undefined && t.clientId !== (this.#expectedClientId ?? this.#observedClientId)))
521
+ )
522
+ return this.revoke("topology-ineligible");
523
+ if (t.clients === 1 && t.clientId !== undefined && this.#observedClientId === undefined)
524
+ this.#observedClientId = t.clientId;
525
+ if (t.clients === 0) return this.revoke("zero-client-recovery");
526
+ if (t.clients !== 1) return this.revoke("topology-ineligible");
527
+ if (this.#available) return this.availability;
528
+ return this.#probeAfterEligibility();
529
+ }
530
+ if (!this.#tmux || !this.#paneId) return this.#finish("topology-ineligible");
531
+ let r: PetTmuxResult;
532
+ try {
533
+ r = result(
534
+ await this.#tmux(["list-clients", "-t", this.#sessionTarget ?? "=", "-F", "#{client_name}\t#{client_tty}"]),
535
+ );
536
+ } catch {
537
+ if (!isCurrent()) return this.availability;
538
+ return this.#finish("topology-ineligible");
539
+ }
540
+ if (!isCurrent()) return this.availability;
541
+ if (r.status !== 0) return this.revoke("topology-ineligible");
542
+ const rows = r.stdout.split(/\r?\n/).filter(x => x.length > 0);
543
+ if (rows.length !== 1) return this.revoke(rows.length === 0 ? "zero-client-recovery" : "topology-ineligible");
544
+ const [clientId] = rows[0].split("\t");
545
+ if (!clientId) return this.revoke("topology-ineligible");
546
+ let pane: PetTmuxResult;
547
+ try {
548
+ pane = result(await this.#tmux(["display-message", "-p", "-c", clientId, "#{pane_id}"]));
549
+ } catch {
550
+ if (!isCurrent()) return this.availability;
551
+ return this.#finish("topology-ineligible");
552
+ }
553
+ if (!isCurrent()) return this.availability;
554
+ if (
555
+ pane.status !== 0 ||
556
+ pane.stdout.trim() !== this.#paneId ||
557
+ ((this.#expectedClientId ?? this.#observedClientId) !== undefined &&
558
+ (this.#expectedClientId ?? this.#observedClientId) !== clientId)
559
+ )
560
+ return this.revoke("topology-ineligible");
561
+ if (this.#observedClientId === undefined) this.#observedClientId = clientId;
562
+ if (this.#available) return this.availability;
563
+ return this.#probeAfterEligibility();
564
+ }
565
+ startManagedPolling() {
566
+ if (this.#mode !== "managed" || this.#poll) return;
567
+ const tick = async () => {
568
+ if (this.#disposed) return;
569
+ await this.inspectManagedTopology();
570
+ if (!this.#disposed) this.#poll = this.#clock.setTimeout(() => void tick(), PET_TOPOLOGY_POLL_MS);
571
+ };
572
+ void tick();
573
+ }
574
+ stopManagedPolling() {
575
+ if (this.#poll !== undefined) this.#clock.clearTimeout(this.#poll);
576
+ this.#poll = undefined;
577
+ }
578
+ async dispose() {
579
+ if (this.#disposed) return;
580
+ this.stopManagedPolling();
581
+ await this.revoke("topology-lost");
582
+ this.#disposed = true;
583
+ this.#listeners.clear();
584
+ }
585
+ }