@gajae-code/coding-agent 0.9.6 → 0.10.1

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 (226) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/types/cli/classify-install-target.d.ts +0 -10
  3. package/dist/types/cli/daemon-cli.d.ts +2 -0
  4. package/dist/types/cli/initial-message.d.ts +1 -1
  5. package/dist/types/cli/malloc-env-guard.d.ts +65 -0
  6. package/dist/types/cli/malloc-env-guard.test.d.ts +1 -0
  7. package/dist/types/cli/notify-cli.d.ts +3 -1
  8. package/dist/types/cli/session-picker.d.ts +4 -3
  9. package/dist/types/cli/update-cli.d.ts +22 -3
  10. package/dist/types/cli.d.ts +5 -0
  11. package/dist/types/commands/daemon.d.ts +6 -2
  12. package/dist/types/commands/launch.d.ts +1 -0
  13. package/dist/types/commands/notify.d.ts +6 -0
  14. package/dist/types/commit/analysis/conventional.d.ts +1 -1
  15. package/dist/types/commit/analysis/summary.d.ts +1 -1
  16. package/dist/types/commit/changelog/generate.d.ts +1 -1
  17. package/dist/types/commit/changelog/index.d.ts +2 -2
  18. package/dist/types/commit/map-reduce/map-phase.d.ts +1 -1
  19. package/dist/types/commit/map-reduce/reduce-phase.d.ts +1 -1
  20. package/dist/types/config/keybindings.d.ts +5 -0
  21. package/dist/types/config/model-profile-activation.d.ts +1 -0
  22. package/dist/types/config/settings-schema.d.ts +47 -7
  23. package/dist/types/config/settings.d.ts +2 -0
  24. package/dist/types/coordinator/contract.d.ts +1 -1
  25. package/dist/types/coordinator-mcp/model-preset.d.ts +45 -0
  26. package/dist/types/coordinator-mcp/policy.d.ts +3 -0
  27. package/dist/types/coordinator-mcp/server.d.ts +79 -6
  28. package/dist/types/coordinator-mcp/session-reaper.d.ts +53 -0
  29. package/dist/types/daemon/control-types.d.ts +10 -0
  30. package/dist/types/daemon/operator-contract.d.ts +47 -0
  31. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.d.ts +4 -0
  32. package/dist/types/discovery/helpers.d.ts +1 -1
  33. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -4
  34. package/dist/types/extensibility/extensions/types.d.ts +3 -1
  35. package/dist/types/gjc-runtime/launch-tmux.d.ts +26 -7
  36. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +34 -3
  37. package/dist/types/gjc-runtime/tmux-common.d.ts +6 -0
  38. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +5 -0
  39. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +309 -0
  40. package/dist/types/gjc-runtime/tmux-sessions.d.ts +49 -17
  41. package/dist/types/internal-urls/local-protocol.d.ts +13 -9
  42. package/dist/types/main.d.ts +66 -2
  43. package/dist/types/modes/acp/acp-agent.d.ts +19 -2
  44. package/dist/types/modes/acp/acp-mode.d.ts +12 -0
  45. package/dist/types/modes/components/assistant-message.d.ts +1 -1
  46. package/dist/types/modes/components/custom-editor.d.ts +2 -0
  47. package/dist/types/modes/components/gajae-pet-widget.d.ts +59 -0
  48. package/dist/types/modes/components/hook-selector.d.ts +5 -0
  49. package/dist/types/modes/components/irc-sidebar.d.ts +32 -0
  50. package/dist/types/modes/components/pet-selector.d.ts +11 -0
  51. package/dist/types/modes/components/session-selector.d.ts +22 -9
  52. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  53. package/dist/types/modes/components/status-line/types.d.ts +1 -1
  54. package/dist/types/modes/components/status-line.d.ts +0 -10
  55. package/dist/types/modes/components/tool-execution.d.ts +1 -0
  56. package/dist/types/modes/components/user-message.d.ts +2 -1
  57. package/dist/types/modes/controllers/event-controller.d.ts +4 -0
  58. package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
  59. package/dist/types/modes/interactive-mode.d.ts +24 -2
  60. package/dist/types/modes/irc-observation-ledger.d.ts +22 -0
  61. package/dist/types/modes/print-mode.d.ts +3 -4
  62. package/dist/types/modes/rpc/rpc-client.d.ts +7 -1
  63. package/dist/types/modes/rpc/rpc-mode.d.ts +2 -1
  64. package/dist/types/modes/rpc/rpc-types.d.ts +17 -1
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +8 -0
  66. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +5 -0
  67. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +45 -0
  68. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +42 -2
  69. package/dist/types/modes/theme/defaults/index.d.ts +568 -568
  70. package/dist/types/modes/types.d.ts +28 -2
  71. package/dist/types/modes/utils/abort-message.d.ts +1 -1
  72. package/dist/types/modes/utils/context-usage.d.ts +4 -19
  73. package/dist/types/modes/utils/irc-message.d.ts +38 -0
  74. package/dist/types/modes/utils/ui-helpers.d.ts +13 -4
  75. package/dist/types/notifications/config.d.ts +34 -0
  76. package/dist/types/notifications/daemon-paths.d.ts +7 -0
  77. package/dist/types/notifications/index.d.ts +27 -0
  78. package/dist/types/notifications/lifecycle-control-runtime.d.ts +12 -4
  79. package/dist/types/notifications/notification-service.d.ts +144 -0
  80. package/dist/types/notifications/rate-limit-pool.d.ts +27 -9
  81. package/dist/types/notifications/telegram-daemon-control.d.ts +6 -0
  82. package/dist/types/notifications/telegram-daemon.d.ts +130 -3
  83. package/dist/types/notifications/telegram-reference.d.ts +19 -2
  84. package/dist/types/notifications/topic-registry.d.ts +24 -4
  85. package/dist/types/registry/agent-registry.d.ts +2 -0
  86. package/dist/types/rlm/index.d.ts +1 -1
  87. package/dist/types/sdk.d.ts +2 -0
  88. package/dist/types/secrets/obfuscator.d.ts +1 -1
  89. package/dist/types/session/agent-session.d.ts +40 -3
  90. package/dist/types/session/cache-economics.d.ts +79 -0
  91. package/dist/types/session/context-estimation.d.ts +31 -0
  92. package/dist/types/session/provider-safety-stop.d.ts +5 -0
  93. package/dist/types/session/session-manager.d.ts +124 -4
  94. package/dist/types/session/session-storage.d.ts +155 -13
  95. package/dist/types/setup/credential-auto-import.d.ts +2 -2
  96. package/dist/types/task/executor.d.ts +3 -0
  97. package/dist/types/task/receipt.d.ts +3 -1
  98. package/dist/types/task/types.d.ts +8 -0
  99. package/dist/types/tools/ask-answer-registry.d.ts +5 -0
  100. package/dist/types/tools/ask.d.ts +25 -1
  101. package/dist/types/tools/bash.d.ts +1 -1
  102. package/dist/types/tools/browser/tab-supervisor.d.ts +6 -0
  103. package/dist/types/tools/index.d.ts +58 -6
  104. package/dist/types/tools/telegram-send.d.ts +7 -0
  105. package/dist/types/utils/external-editor.d.ts +2 -0
  106. package/package.json +9 -9
  107. package/scripts/g004-tmux-smoke.ts +196 -36
  108. package/src/cli/daemon-cli.ts +19 -29
  109. package/src/cli/malloc-env-guard.test.ts +104 -0
  110. package/src/cli/malloc-env-guard.ts +149 -0
  111. package/src/cli/notify-cli.ts +78 -14
  112. package/src/cli/session-picker.ts +23 -40
  113. package/src/cli/update-cli.ts +56 -37
  114. package/src/cli.ts +51 -10
  115. package/src/commands/daemon.ts +19 -5
  116. package/src/commands/harness.ts +515 -47
  117. package/src/commands/launch.ts +11 -3
  118. package/src/commands/notify.ts +5 -1
  119. package/src/commands/session.ts +6 -1
  120. package/src/config/keybindings.ts +5 -0
  121. package/src/config/model-profile-activation.ts +1 -1
  122. package/src/config/model-profiles.ts +14 -14
  123. package/src/config/settings-schema.ts +41 -1
  124. package/src/config/settings.ts +96 -45
  125. package/src/coordinator/contract.ts +1 -0
  126. package/src/coordinator-mcp/model-preset.ts +100 -0
  127. package/src/coordinator-mcp/policy.ts +30 -0
  128. package/src/coordinator-mcp/server.ts +2881 -425
  129. package/src/coordinator-mcp/session-reaper.ts +129 -0
  130. package/src/daemon/control-types.ts +11 -0
  131. package/src/daemon/operator-contract.ts +121 -0
  132. package/src/deep-interview/render-middleware.ts +67 -2
  133. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
  134. package/src/defaults/gjc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
  135. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
  136. package/src/extensibility/extensions/runner.ts +1 -1
  137. package/src/extensibility/extensions/types.ts +3 -1
  138. package/src/gjc-runtime/launch-tmux.ts +702 -135
  139. package/src/gjc-runtime/session-state-sidecar.ts +756 -135
  140. package/src/gjc-runtime/team-runtime.ts +6 -0
  141. package/src/gjc-runtime/tmux-common.ts +26 -7
  142. package/src/gjc-runtime/tmux-gc.ts +52 -9
  143. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +185 -0
  144. package/src/gjc-runtime/tmux-owner-isolation.ts +2060 -0
  145. package/src/gjc-runtime/tmux-sessions.ts +871 -68
  146. package/src/internal-urls/docs-index.generated.ts +12 -11
  147. package/src/internal-urls/local-protocol.ts +29 -10
  148. package/src/main.ts +301 -80
  149. package/src/modes/acp/acp-agent.ts +730 -100
  150. package/src/modes/acp/acp-mode.ts +29 -2
  151. package/src/modes/components/assistant-message.ts +32 -3
  152. package/src/modes/components/bash-execution.ts +43 -13
  153. package/src/modes/components/custom-editor.ts +5 -0
  154. package/src/modes/components/footer.ts +3 -3
  155. package/src/modes/components/gajae-pet-widget.ts +360 -0
  156. package/src/modes/components/hook-selector.ts +12 -0
  157. package/src/modes/components/irc-sidebar.ts +206 -0
  158. package/src/modes/components/pet-selector.ts +55 -0
  159. package/src/modes/components/session-selector.ts +222 -221
  160. package/src/modes/components/settings-selector.ts +10 -0
  161. package/src/modes/components/status-line/segments.ts +13 -6
  162. package/src/modes/components/status-line/types.ts +1 -1
  163. package/src/modes/components/status-line.ts +4 -171
  164. package/src/modes/components/tool-execution.ts +47 -6
  165. package/src/modes/components/user-message.ts +26 -9
  166. package/src/modes/controllers/command-controller.ts +28 -2
  167. package/src/modes/controllers/event-controller.ts +159 -36
  168. package/src/modes/controllers/extension-ui-controller.ts +37 -18
  169. package/src/modes/controllers/input-controller.ts +8 -2
  170. package/src/modes/controllers/selector-controller.ts +62 -15
  171. package/src/modes/interactive-mode.ts +199 -7
  172. package/src/modes/irc-observation-ledger.ts +127 -0
  173. package/src/modes/print-mode.ts +228 -92
  174. package/src/modes/rpc/rpc-client.ts +58 -1
  175. package/src/modes/rpc/rpc-mode.ts +286 -85
  176. package/src/modes/rpc/rpc-types.ts +15 -1
  177. package/src/modes/shared/agent-wire/command-dispatch.ts +33 -1
  178. package/src/modes/shared/agent-wire/command-validation.ts +10 -0
  179. package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
  180. package/src/modes/shared/agent-wire/scopes.ts +1 -0
  181. package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
  182. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
  183. package/src/modes/types.ts +34 -2
  184. package/src/modes/utils/context-usage.ts +56 -92
  185. package/src/modes/utils/hotkeys-markdown.ts +1 -0
  186. package/src/modes/utils/irc-message.ts +138 -0
  187. package/src/modes/utils/ui-helpers.ts +216 -50
  188. package/src/notifications/config.ts +44 -0
  189. package/src/notifications/daemon-paths.ts +8 -0
  190. package/src/notifications/index.ts +535 -75
  191. package/src/notifications/lifecycle-control-runtime.ts +930 -77
  192. package/src/notifications/notification-service.ts +710 -0
  193. package/src/notifications/rate-limit-pool.ts +46 -12
  194. package/src/notifications/telegram-daemon-cli.ts +2 -0
  195. package/src/notifications/telegram-daemon-control.ts +27 -2
  196. package/src/notifications/telegram-daemon.ts +635 -94
  197. package/src/notifications/telegram-reference.ts +73 -13
  198. package/src/notifications/topic-registry.ts +86 -9
  199. package/src/prompts/system/irc-peer-roster.md +1 -0
  200. package/src/prompts/system/subagent-system-prompt.md +1 -0
  201. package/src/prompts/system/system-prompt.md +1 -0
  202. package/src/prompts/tools/irc.md +1 -1
  203. package/src/registry/agent-registry.ts +3 -0
  204. package/src/sdk.ts +52 -1
  205. package/src/secrets/obfuscator.ts +4 -2
  206. package/src/session/agent-session.ts +670 -217
  207. package/src/session/cache-economics.ts +275 -0
  208. package/src/session/context-estimation.ts +91 -0
  209. package/src/session/provider-safety-stop.ts +9 -0
  210. package/src/session/session-dump-format.ts +6 -0
  211. package/src/session/session-manager.ts +809 -39
  212. package/src/session/session-storage.ts +582 -38
  213. package/src/slash-commands/builtin-registry.ts +153 -9
  214. package/src/slash-commands/helpers/context-report.ts +26 -4
  215. package/src/task/executor.ts +12 -3
  216. package/src/task/index.ts +8 -0
  217. package/src/task/receipt.ts +7 -2
  218. package/src/task/types.ts +26 -0
  219. package/src/tools/ask-answer-registry.ts +25 -0
  220. package/src/tools/ask.ts +355 -33
  221. package/src/tools/browser/tab-supervisor.ts +63 -6
  222. package/src/tools/browser.ts +8 -3
  223. package/src/tools/index.ts +81 -6
  224. package/src/tools/sqlite-reader.ts +8 -4
  225. package/src/tui/output-block.ts +18 -6
  226. package/src/utils/external-editor.ts +6 -1
package/CHANGELOG.md CHANGED
@@ -2,10 +2,68 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.10.1] - 2026-07-13
6
+
7
+ ### Added
8
+
9
+ - Added an owner-proof idle session reaper and `gjc_coordinator_stop_session` for ephemeral (delegate-created) coordinator sessions. Termination goes exclusively through the owner-proof `forceCloseGjcTmuxSession` path (pid, native session id, owner generation, server key, and start time all verified before SIGTERM) — never a raw `process.kill`. The reaper binds each close to the persisted runtime-state file, re-validates ephemeral and no-active-turn at kill time under the same per-session mutation lock as delegate reuse, and purges state only on verified termination (#2080).
10
+ - RPC clients can now durably select the machine-global default model and effective thinking level for subsequent messages, while project policy and resumed session history retain precedence.
11
+ - Context-usage tokens/% now use provider-reported usage as the single source of truth on every surface. `AgentSession.getContextUsage()` returns a source-tagged snapshot (`source: "provider_anchor" | "heuristic" | "unknown"`), and the status-line `context_pct` segment, inline model percentage, and `/context` totals consume that snapshot instead of recomputing an independent heuristic sum — so footer, status line, `/context`, ACP, and RPC can no longer disagree about the same session state. Heuristic estimation now applies only when no provider anchor exists (session start, aborted/error-only turns), and that fallback now includes the fixed system-prompt/tool/skill context it previously omitted. The pre-prompt compaction estimate honors the latest-compaction boundary (never anchors on stale pre-compaction usage totals), unknown post-compaction usage stays unknown (status line renders `?`; ACP omits the `usage_update` instead of reporting `used: 0`), and `/context` labels its total by provenance with a reconciliation line when the estimated category composition diverges from the provider-reported total.
12
+ ### Fixed
13
+
14
+ - IRC deliveries now accept their exchange batch in the recipient's volatile current-session queue before recipient/main UI observations or sender success. Awaited deliveries generate the reply first, then accept the ordered incoming + auto-reply pair and commit the IRC roster claim before observation; provider failures and sender aborts before acceptance leave no ghost exchange, while observer failures after acceptance are isolated. This is not a durability guarantee: durable history injection remains a later flush and no fsync, recovery, persistent IDs, or deduplication was added.
15
+ - Print mode now records terminal text-mode errors as exit status 1 (or 78 for context overflow) without bypassing output quiescence or session disposal. It retains JSON event delivery through disposal and suppresses `EPIPE` from its owned stdout; `ERR_STREAM_DESTROYED` is suppressed only after that `EPIPE` has latched, while other output failures remain errors.
16
+ - Extension contexts now receive a defensive copy from `getSystemPrompt()` instead of the live mutable system-prompt array, so an in-place mutation by an in-process extension can no longer bypass context-revision tracking and serve stale display-only context-usage estimates.
17
+
18
+ ## [0.10.0] - 2026-07-12
19
+
20
+ ### Added
21
+
22
+ - Added an opt-in `/pet on|off` composer companion with idle gaze, working claw motion, and occasional automatic flex animation on Sixel- and Kitty-graphics terminals.
23
+ - Added Grok 4.5 to the bundled Grok Build catalog with its published 500K context window, multimodal input and token pricing, normalized its official `grok-4.5-latest` and `grok-build-latest` aliases, and limited reasoning effort to the documented `low`, `medium`, and `high` levels.
24
+
25
+ - Added `notifications.sessionScope` (`all` default | `primary`). Under `primary`, the separate-process child sessions GJC spawns (team workers, harness RPC owners) no longer register their own Telegram forum topic / notification endpoint unless they explicitly opt in (`GJC_NOTIFICATIONS=1`, the `/session_create` path). The default `all` fully preserves current behavior, and user-opened CLI/tmux/headless sessions are never affected. The provenance marker is per-spawn and non-dynastic (consumed once at session startup, never inherited by grandchildren) (#1908).
26
+ - Coordinator MCP `gjc_coordinator_start_session` and the `gjc_delegate_plan`/`gjc_delegate_execute`/`gjc_delegate_team` tools now accept an optional `mpreset` argument that authoritatively activates a GJC model profile for a fresh session, with the same semantics as `gjc --mpreset <profile>` (#2003). The name is resolved through the merged built-in/custom profile registry before launch (so custom profiles keep working), legacy profile aliases are canonicalized exactly like the CLI (e.g. `codex-standard` → `codex-medium`), and the canonical profile is injected into the child startup command so the profile's default and per-role models apply from the first turn; unknown names are rejected with the available-profile listing and never reach a spawned command, and an unreadable/invalid `models.yml` fails closed with a distinct `model_profile_registry_error` rather than silently degrading to built-ins only. An explicit empty/whitespace `mpreset` is rejected rather than treated as omission. The effective profile is recorded on the session and surfaced in coordinator status/readback, reusing a session with a conflicting `mpreset` fails with a stable `mpreset_conflict` reason, and calls that omit `mpreset` keep their current behavior. The existing advisory `model` prompt hint is unchanged, and no machine-wide durable default is introduced (#2066 remains out of scope).
27
+
28
+ - `notifications.telegram.topics.nameTemplate` configures the Telegram forum-topic title, with `{repo}`, `{branch}`, and `{title}` placeholders, so operators can put the session title first (e.g. `"{title} · {repo}/{branch}"`) and keep concurrent sessions on the same checkout distinguishable in the topic sidebar. The template applies only when every placeholder it references resolves for the session; otherwise the daemon falls back to the built-in `{repo}/{branch} - {title}` composition (and its title/repo/branch fallbacks). Unset preserves the current naming exactly (#1909).
29
+ - Added the IRC chat-room surface: IRC messages persist in the main chat scrollback by default (no 10s TTL) with stable observation ids and a rebuild-aware ledger, and the agent is IRC-aware. Enabling `irc.sidebar.enabled` moves the persistent record into the opt-in `alt+i` sidebar split while inline display stays ephemeral. Message persistence and agent awareness are default-on; the sidebar panel itself is opt-in (#2018).
30
+ - Added a transport-agnostic, secret-safe shared notification service (status, health, test delivery, ownership-protected recovery) consumed by both the `gjc notify` CLI and the cross-mode `/notify` slash command (TUI + ACP), so onboarding and daemon recovery no longer duplicate daemon/config logic per surface. `/notify` now exposes `status|health|test|recovery|setup` and `gjc notify` gains `health`/`test`/`recovery` with `--probe`/`--message` (#2050).
31
+ - Added beginner-safe `gjc daemon` operational shortcuts sharing one operator contract so the guided human surface and machine-readable `--json` never drift: a `restart` alias that resolves to reload-if-running-else-spawn, concise per-daemon output by default with `--verbose`/`-v` for runtime detail and the full roots list, and an actionable structured recovery path when token/chat ownership mismatches instead of a large payload ending in `blocked`. Exit codes stay 0 on success / 1 on failure (#2057).
32
+ - Added fail-closed ACP session deletion: the delete path refuses rather than proceeding when the target session cannot be safely resolved, and retains the inode in the replacement case (#2074).
33
+
34
+ ### Changed
35
+
36
+ - Migrated the repository type-check and release declaration pipeline to stable TypeScript 7.0.2, including the robogjc web workspace and a non-mutating publish-type gate.
37
+ - Rebalanced GPT-5.6 Codex and combo presets around published family tiers and reasoning-effort curves. The executor assignments are informed by descriptive repeated local exact-edit evidence from selected TypeScript tasks; default, planner, architect, and critic assignments remain product judgments rather than benchmark claims.
38
+ - Cache-miss diagnostics now separate actionable, diagnostic-only, and provider-side-suspected causes instead of asserting a user-side fix for every miss (#2020). A large, costly miss with no cache reads or writes is reported as a neutral `Cache notice` marked "provider-side suspected / not user-actionable" (with what GJC cannot determine) rather than telling the user to keep a stable prefix; a miss with reads but no writes is reported as diagnostic-only without asserting a single cause; and the "cache write without enough matching reads" warning now only fires when reads actually fail to cover the writes. The existing miss cost summary and the #1929/#1936 pricing/provenance safeguards are unchanged.
39
+
40
+ ### Fixed
41
+
42
+ - The coordinator MCP owner-server probe now recognizes tmux ≥3.7's missing-server diagnostic (`error connecting to <socket> (No such file or directory)`) as an absent server. tmux 3.7 changed the wording from the older `no server running on <socket>`, which the coordinator probe did not match — so a brand-new coordinator socket (which never has a server yet) was misclassified `unverifiable` instead of `absent`, and **every** `gjc_delegate_*` / session create failed closed with `coordinator_tmux_owner_server_unverifiable` on tmux ≥3.7. The coordinator and `gjc` harness probes now match the same no-server wordings the other owner-isolation probes already did.
43
+ - Preserved explicit Telegram forum-topic renames as durable user-owned names, immediately re-asserting delayed edits while retaining restart and rename-race recovery (#1910).
44
+ - Prevented typed provider safety stops from entering automatic retry loops and aligned ACP refusal reporting with the provider-native classification.
45
+ - `gjc resume` now aliases value-less `--resume`, requests confirmation before opening and continues a resumable tail once only; terminal tails open idle, and headless bare resume exits with explicit `--resume <id>` guidance (#1973).
46
+ - Telegram answers to interactive and unattended `ask` prompts now receive a semantic, origin-bound `Selected!` acknowledgement before workflow continuation, with typed multi-select controls, no acknowledgement for toggles/clarifications/skips, at-most-once delivery attempts, and truthful failure/unknown outcomes (#1974).
47
+ - Isolated unsafe Linux/systemd tmux owners into independently proven user scopes before server creation, added generation-bound exact-SIGTERM shutdown verdicts and deduplicated incident/recovery provenance, and removed pane payloads from raw session lifecycle evidence (#1938).
48
+ - Coordinator MCP stdio server now dispatches JSON-RPC requests with bounded concurrency and answers the standard `ping` utility, so a long-running tool call (e.g. `gjc_coordinator_await_turn`, which polls for minutes) no longer starves keepalive on the same channel — without the state/lifecycle races unbounded concurrency would introduce. Same-session mutations (notably `send_prompt`) serialize through a per-session lock so concurrent calls can no longer persist two "active" turns; `ping` is a reserved control frame that bypasses the data-concurrency cap; data-handler fanout is bounded (excess rejected as `server_busy`); `writeLine` failures are terminal instead of poisoning the write chain; and EOF drains in-flight handlers under a bounded timeout before returning.
49
+ - Prevented best-effort coordinator runtime-state persistence from surfacing unhandled rejections when a session root disappears during teardown, preserved public-safe coordinator errors including bounded-concurrent handler failures, bound tmux GC pruning to the collected native session identity and owner generation so same-name replacements are never removed, and preserved subsecond ordering between canonical verdict artifacts and their evidence receipts (#1938).
50
+ - The `browser` `close`/`close all` tool now enforces one end-to-end deadline (the existing `timeout` option, default 30s) across the whole teardown chain — `releaseAllTabs`, `waitForClosed`, `worker.terminate()`, and `releaseBrowser()`/`disposeBrowserHandle()` — so an externally CDP-connected target dying mid-close can no longer hang or terminate the calling agent session. Steps that exceed the shared budget are detached best-effort with their rejections swallowed (no unhandled rejections, no worker/browser/tab registry leaks, timers cleaned up); the tool always settles with a close count or a structured error, and normal live-target close semantics are unchanged (#2027).
51
+ - Pre-prompt context estimates now anchor on the last successful assistant's total usage (input + cache + output) instead of prompt-only tokens, and skip error/aborted turns when picking the anchor, so a large-reasoning turn (e.g. GPT-5.6 Sol at high efforts) no longer vanishes from the estimate right before the next request. The compaction token-correction ratio likewise no longer counts the anchor assistant's own output in its heuristic denominator, since that output was the anchored request's response rather than part of its prompt.
52
+ - The coordinator MCP tmux owner-server probe (`probeServer`: `tmux list-sessions` plus a portable `ps` incarnation read) now tolerates transient spawn failures. Under load a momentary `Bun.spawn` failure (e.g. `EAGAIN`, or a brief tmux/`ps` hiccup) threw straight out of the probe, and because `proveCoordinatorOwnerServer` only retries on non-safe *state* — not on a thrown exception — a single blip aborted the whole delegate immediately with `coordinator_tmux_owner_server_unverifiable` (a ~0.03s hard failure). The probe now surfaces a transient failure as an `unverifiable` state so the existing bounded retry loop can re-probe once it clears; owner isolation is unchanged (`unverifiable` still fails closed, creating no session).
53
+ - Coordinator-created tmux sessions now require an immutable, launch-bound runtime readiness marker before any prompt keys are injected, preventing early input races and preserving recoverable readiness-timeout evidence (#2009).
54
+ - Unsent-context token estimates are now script-aware (CJK characters charged near 1 token/char instead of chars/4), and the per-message delta estimate is no longer cached: the compaction-threshold decision always recomputes from current content, so an in-place mutation (e.g. a same-length ASCII→CJK edit) can never gate the threshold with a stale 4x-undercounted estimate.
55
+ - Capability-gated controlled ask delivery per connection: clients default-deny until they negotiate `ask_controls_v1`, renegotiate after reconnect, and receive the additive non-actionable `action_unavailable` frame instead of stripped option buttons when non-capable (#2029).
56
+ - `NotificationServer#pushFrame` now rejects `ActionNeeded` frames; emit asks and idle notifications through `registerAsk` / `noteIdle` so controlled asks remain capability-gated per connection (#2029).
57
+ - A rolling/in-place upgrade that left a still-live pre-upgrade Telegram daemon owning the lock is now reloaded instead of silently attached. The old daemon speaks the pre-#1999 wire protocol without ask-ack/controls, so its `Selected!` acknowledgements were dropped; an operational `DAEMON_GENERATION` (tied to `NOTIFICATION_PROTOCOL_VERSION`) now flags a fresh live owner running an older generation as reload-required, and the new host registers its session root then hands off through the cooperative SIGTERM/control path (#2028).
58
+ - A numeric gate reply is an option index: an out-of-range index is no longer accepted as free-text `Other`. `mapAnswerToGate` returns a discriminated result and the unattended handler closes the exact claim/receipt and reissues instead of durably accepting or emitting a `Selected!` ack; the JSON-string free-text path is preserved (#2030).
59
+
5
60
  ## [0.9.6] - 2026-07-10
6
61
  ### Changed
7
62
 
8
63
  - Moved the `codex-eco`/`codex-medium`/`codex-pro` presets and the `opus-codex`/`codex-opencodego`/`fable-opus-codex` combo presets from `gpt-5.5` onto the GPT-5.6 tier family: Sol drives `default` and `architect` on every codex preset (eco `sol:medium`, medium `sol:high`, pro `sol:xhigh`/`sol:max`), with Luna/Terra covering the lighter executor/planner/critic roles by tier.
64
+ ### Fixed
65
+
66
+ - Corrected launch-update guidance: only recognized Bun global installs, recognized Windows npm installs, and supported bundled-installer binaries may use `gjc update`; source checkouts and dev links must use their checkout workflow, while unrecognized package-manager or PATH installs must use their original update method. Successful updates require authoritative post-update version and smoke verification.
9
67
 
10
68
  ### Fixed
11
69
 
@@ -1,13 +1,3 @@
1
- /**
2
- * Classify an install spec as a marketplace plugin reference or a plain npm package.
3
- *
4
- * Rules (applied in order):
5
- * 1. Starts with `@` (scoped npm) -> always npm.
6
- * 2. Contains `@` after the first character -> split on the LAST `@`.
7
- * If the right-hand side is a known marketplace name, it's a marketplace ref.
8
- * Otherwise it's an npm spec (e.g. `pkg@1.2.3`).
9
- * 3. No `@` -> npm.
10
- */
11
1
  export declare function classifyInstallTarget(spec: string, knownMarketplaces: Set<string>): {
12
2
  type: "marketplace";
13
3
  name: string;
@@ -16,6 +16,8 @@ export interface DaemonCommandArgs {
16
16
  gracefulTimeoutMs?: number;
17
17
  killTimeoutMs?: number;
18
18
  spawnIfStopped?: boolean;
19
+ /** Show runtime detail and the full roots list in human output. */
20
+ verbose?: boolean;
19
21
  }
20
22
  export interface DaemonCommandDeps {
21
23
  settings?: Settings;
@@ -14,4 +14,4 @@ export interface InitialMessageResult {
14
14
  * Combine stdin content, @file text, and the first CLI message into a single
15
15
  * initial prompt for non-interactive mode.
16
16
  */
17
- export declare function buildInitialMessage({ parsed, fileText, fileImages, stdinContent }: InitialMessageInput): InitialMessageResult;
17
+ export declare function buildInitialMessage({ parsed, fileText, fileImages, stdinContent, }: InitialMessageInput): InitialMessageResult;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * macOS malloc-stack-logging launch boundary.
3
+ *
4
+ * On macOS, an inherited `MallocStackLogging` / `MallocStackLoggingNoCompact`
5
+ * environment variable (from an Xcode scheme's malloc diagnostics, Instruments,
6
+ * `launchctl setenv`, or a debug-attached shell) makes libmalloc print
7
+ *
8
+ * MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
9
+ *
10
+ * to the stderr of every TTY-attached process. Bun snapshots the spawn-default
11
+ * environment at process startup — before any JS runs — so neither
12
+ * `delete process.env.X` nor a real libc `unsetenv()` cleans the environment
13
+ * that children inherit by default (verified on Bun 1.3.14). Inside the TUI,
14
+ * every PTY-spawned child then repeats the warning straight into the rendered
15
+ * frame and corrupts the display.
16
+ *
17
+ * The only way to hand children a clean startup snapshot is to start the primary
18
+ * process with a clean environment. This module re-execs the exact invocation
19
+ * once (darwin-only) with a `filterProcessEnv`-scrubbed environment and a
20
+ * `GJC_MALLOC_ENV_REEXEC` loop guard, before any fast path or subprocess spawn.
21
+ * The re-exec'd process — and therefore every downstream lane: `Bun.spawn`
22
+ * defaults, `node:child_process`, the native PTY, the tmux owner, plugin
23
+ * installs, and subagents — starts from a clean snapshot.
24
+ *
25
+ * The initial contaminated process's own libmalloc line is emitted by libc
26
+ * before any JS runs and cannot be suppressed from inside the process; it
27
+ * appears at most once per launch. A one-time actionable notice is written to
28
+ * interactive stderr (outside the rendered frame) pointing at the permanent
29
+ * `launchctl unsetenv` fix.
30
+ */
31
+ /** Env vars that make macOS libmalloc write to a TTY when inherited. */
32
+ export declare const MACOS_MALLOC_ENV_VARS: readonly ["MallocStackLogging", "MallocStackLoggingNoCompact"];
33
+ /** Loop guard set on the scrubbed re-exec so it never re-execs itself again. */
34
+ export declare const MALLOC_ENV_REEXEC_GUARD = "GJC_MALLOC_ENV_REEXEC";
35
+ /** True when at least one macOS malloc-stack-logging var is present in `env`. */
36
+ export declare function hasMacOSMallocEnv(env: Record<string, string | undefined>): boolean;
37
+ /**
38
+ * True iff we must re-exec to escape a contaminated macOS startup snapshot:
39
+ * darwin, not already inside the scrubbed re-exec, and at least one malloc var
40
+ * present. Off darwin or on the re-exec'd child this is always false, so the
41
+ * common launch path pays only two cheap lookups.
42
+ */
43
+ export declare function shouldReexecForMacOSMallocEnv(env: Record<string, string | undefined>, platform: NodeJS.Platform): boolean;
44
+ /**
45
+ * Reconstruct the argv that re-runs the exact same program image.
46
+ *
47
+ * - Compiled single-file executable: argv[1] is the embedded virtual entry
48
+ * (`/$bunfs/…` on POSIX, `B:\~BUN\…` on Windows), which must be dropped — the
49
+ * executable re-embeds its own entry. Re-run `[exe, ...userArgs]`.
50
+ * - Source / dev-link run: argv[1] is the on-disk script that must be passed
51
+ * back to the interpreter. Re-run `[interpreter, script, ...userArgs]`.
52
+ */
53
+ export declare function buildMallocReexecArgv(argv: readonly string[], execPath: string): string[];
54
+ /** One-time, human-actionable notice pointing at the permanent environment fix. */
55
+ export declare function formatMallocEnvNotice(): string;
56
+ /**
57
+ * Re-exec the current process once with a scrubbed environment and propagate the
58
+ * child's exit code. Callers MUST gate this behind `shouldReexecForMacOSMallocEnv`.
59
+ *
60
+ * Returns the child exit code, or `null` if the re-exec could not be spawned (in
61
+ * which case the caller falls back to running in the current, contaminated
62
+ * process — degraded but functional; the native PTY boundary and
63
+ * `filterProcessEnv` still keep managed children clean).
64
+ */
65
+ export declare function reexecWithScrubbedMallocEnv(): Promise<number | null>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,5 @@
1
1
  import type { Settings } from "../config/settings";
2
- export type NotifyAction = "setup" | "status" | "daemon-internal";
2
+ export type NotifyAction = "setup" | "status" | "health" | "test" | "recovery" | "daemon-internal";
3
3
  export interface NotifyCommandArgs {
4
4
  action: NotifyAction;
5
5
  smoke?: boolean;
@@ -7,6 +7,8 @@ export interface NotifyCommandArgs {
7
7
  token?: string;
8
8
  chatId?: string;
9
9
  redact?: boolean;
10
+ probe?: boolean;
11
+ message?: string;
10
12
  }
11
13
  export interface NotifyCommandDeps {
12
14
  fetchImpl?: typeof fetch;
@@ -1,3 +1,4 @@
1
- import type { SessionInfo } from "../session/session-manager";
2
- /** Show TUI session selector and return selected session path or null if cancelled */
3
- export declare function selectSession(sessions: SessionInfo[]): Promise<string | null>;
1
+ import { type SessionSelectionResult } from "../modes/components/session-selector";
2
+ import { type SessionInfo } from "../session/session-manager";
3
+ /** Show the read-only TUI session picker and return the user's consent intent. */
4
+ export declare function selectSession(sessions: SessionInfo[]): Promise<SessionSelectionResult>;
@@ -1,3 +1,7 @@
1
+ interface ReleaseInfo {
2
+ tag: string;
3
+ version: string;
4
+ }
1
5
  /** Result from running the installed binary and parsing its reported version. */
2
6
  export interface InstalledVersionVerification {
3
7
  ok: boolean;
@@ -17,7 +21,6 @@ export interface PackageManagerUpdateOptions {
17
21
  expectedVersion: string;
18
22
  runInstall: PackageManagerUpdateRunner;
19
23
  verifyInstalledRuntime: (expectedVersion: string) => Promise<InstalledVersionVerification>;
20
- printVerificationResult?: (expectedVersion: string) => Promise<void>;
21
24
  printRecoveredVerification?: (expectedVersion: string) => void;
22
25
  }
23
26
  /** Paths and verifier used while replacing a downloaded binary update. */
@@ -36,10 +39,19 @@ export declare function parseUpdateArgs(args: string[]): {
36
39
  force: boolean;
37
40
  check: boolean;
38
41
  } | undefined;
39
- type PackageManagerTarget = {
42
+ export type PackageManagerTarget = {
40
43
  manager: "npm";
41
44
  packageName: string;
42
45
  };
46
+ export type UpdateTarget = {
47
+ method: "bun";
48
+ } | {
49
+ method: "npm";
50
+ packageName: string;
51
+ } | {
52
+ method: "binary";
53
+ path: string;
54
+ };
43
55
  type PathPlatform = NodeJS.Platform;
44
56
  type PackageExists = (packageName: string, packageRoot: string) => boolean;
45
57
  export declare function resolveUpdateMethodForTest(ompPath: string, bunBinDir: string | undefined): "bun" | "npm" | "binary";
@@ -78,10 +90,17 @@ export declare function runBinaryUpdateFlow(targetPath: string, url: string, exp
78
90
  /**
79
91
  * Run the update command.
80
92
  */
93
+ export interface UpdateCommandDependencies {
94
+ getLatestRelease?: () => Promise<ReleaseInfo>;
95
+ resolveUpdateTarget?: () => Promise<UpdateTarget>;
96
+ performUpdate?: (target: UpdateTarget, expectedVersion: string) => Promise<void>;
97
+ refreshInstalledDefaultSkills?: () => Promise<void>;
98
+ exit?: (code: number) => never;
99
+ }
81
100
  export declare function runUpdateCommand(opts: {
82
101
  force: boolean;
83
102
  check: boolean;
84
- }): Promise<void>;
103
+ }, deps?: UpdateCommandDependencies): Promise<void>;
85
104
  /**
86
105
  * Print update command help.
87
106
  */
@@ -3,6 +3,7 @@
3
3
  * CLI entry point — registers all commands explicitly and delegates to the
4
4
  * lightweight CLI runner from pi-utils.
5
5
  */
6
+ import "@gajae-code/utils/postmortem";
6
7
  import { Command, type CommandEntry } from "@gajae-code/utils/cli";
7
8
  export declare const commands: CommandEntry[];
8
9
  export declare class RootHelpCommand extends Command {
@@ -131,5 +132,9 @@ export declare class RootHelpCommand extends Command {
131
132
  static strict: boolean;
132
133
  run(): Promise<void>;
133
134
  }
135
+ /** Normalize the sole `gjc resume` alias into the value-less launch intent. */
136
+ export declare function normalizeResumeAlias(argv: readonly string[]): string[];
137
+ /** Apply the same default-launch routing used by runCli after root fast paths. */
138
+ export declare function routeRootArgv(argv: readonly string[]): string[];
134
139
  /** Run the CLI with the given argv (no `process.argv` prefix). */
135
140
  export declare function runCli(argv: string[]): Promise<void>;
@@ -2,14 +2,14 @@
2
2
  * Manage GJC background daemons (status/list/stop/reload).
3
3
  */
4
4
  import { Command } from "@gajae-code/utils/cli";
5
- import { type DaemonCliAction } from "../cli/daemon-cli";
6
5
  export default class Daemon extends Command {
7
6
  static description: string;
7
+ static examples: string[];
8
8
  static args: {
9
9
  action: import("@gajae-code/utils/cli").ArgDescriptor & {
10
10
  description: string;
11
11
  required: false;
12
- options: DaemonCliAction[];
12
+ options: string[];
13
13
  };
14
14
  kind: import("@gajae-code/utils/cli").ArgDescriptor & {
15
15
  description: string;
@@ -18,6 +18,10 @@ export default class Daemon extends Command {
18
18
  };
19
19
  };
20
20
  static flags: {
21
+ verbose: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
22
+ char: string;
23
+ description: string;
24
+ };
21
25
  all: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
22
26
  description: string;
23
27
  };
@@ -2,6 +2,7 @@
2
2
  * Root command for the coding agent CLI.
3
3
  */
4
4
  import { Command } from "@gajae-code/utils/cli";
5
+ export declare function persistCoordinatorLaunchFailure(error: unknown, cwd: string, env?: NodeJS.ProcessEnv): Promise<void>;
5
6
  export default class Index extends Command {
6
7
  static description: string;
7
8
  static hidden: boolean;
@@ -30,6 +30,12 @@ export default class Notify extends Command {
30
30
  redact: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
31
31
  description: string;
32
32
  };
33
+ probe: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
34
+ description: string;
35
+ };
36
+ message: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
37
+ description: string;
38
+ };
33
39
  "owner-id": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
34
40
  description: string;
35
41
  };
@@ -19,4 +19,4 @@ export interface ConventionalAnalysisInput {
19
19
  /**
20
20
  * Generate conventional analysis data from a diff and metadata.
21
21
  */
22
- export declare function generateConventionalAnalysis({ model, apiKey, thinkingLevel, contextFiles, userContext, typesDescription, recentCommits, scopeCandidates, stat, diff }: ConventionalAnalysisInput): Promise<ConventionalAnalysis>;
22
+ export declare function generateConventionalAnalysis({ model, apiKey, thinkingLevel, contextFiles, userContext, typesDescription, recentCommits, scopeCandidates, stat, diff, }: ConventionalAnalysisInput): Promise<ConventionalAnalysis>;
@@ -15,5 +15,5 @@ export interface SummaryInput {
15
15
  /**
16
16
  * Generate a commit summary line for the conventional commit header.
17
17
  */
18
- export declare function generateSummary({ model, apiKey, thinkingLevel, commitType, scope, details, stat, maxChars, userContext }: SummaryInput): Promise<CommitSummary>;
18
+ export declare function generateSummary({ model, apiKey, thinkingLevel, commitType, scope, details, stat, maxChars, userContext, }: SummaryInput): Promise<CommitSummary>;
19
19
  export declare function stripTypePrefix(summary: string, commitType: string, scope: string | null): string;
@@ -27,4 +27,4 @@ export interface ChangelogPromptInput {
27
27
  stat: string;
28
28
  diff: string;
29
29
  }
30
- export declare function generateChangelogEntries({ model, apiKey, thinkingLevel, changelogPath, isPackageChangelog, existingEntries, stat, diff }: ChangelogPromptInput): Promise<ChangelogGenerationResult>;
30
+ export declare function generateChangelogEntries({ model, apiKey, thinkingLevel, changelogPath, isPackageChangelog, existingEntries, stat, diff, }: ChangelogPromptInput): Promise<ChangelogGenerationResult>;
@@ -23,8 +23,8 @@ export interface ChangelogProposalInput {
23
23
  /**
24
24
  * Update CHANGELOG.md entries for staged changes.
25
25
  */
26
- export declare function runChangelogFlow({ cwd, model, apiKey, thinkingLevel, stagedFiles, dryRun, maxDiffChars, onProgress }: ChangelogFlowInput): Promise<string[]>;
26
+ export declare function runChangelogFlow({ cwd, model, apiKey, thinkingLevel, stagedFiles, dryRun, maxDiffChars, onProgress, }: ChangelogFlowInput): Promise<string[]>;
27
27
  /**
28
28
  * Apply changelog entries provided by the commit agent.
29
29
  */
30
- export declare function applyChangelogProposals({ cwd, proposals, dryRun, onProgress }: ChangelogProposalInput): Promise<string[]>;
30
+ export declare function applyChangelogProposals({ cwd, proposals, dryRun, onProgress, }: ChangelogProposalInput): Promise<string[]>;
@@ -14,4 +14,4 @@ export interface MapPhaseInput {
14
14
  retryBackoffMs?: number;
15
15
  };
16
16
  }
17
- export declare function runMapPhase({ model, apiKey, thinkingLevel, files, config }: MapPhaseInput): Promise<FileObservation[]>;
17
+ export declare function runMapPhase({ model, apiKey, thinkingLevel, files, config, }: MapPhaseInput): Promise<FileObservation[]>;
@@ -10,4 +10,4 @@ export interface ReducePhaseInput {
10
10
  scopeCandidates: string;
11
11
  typesDescription?: string;
12
12
  }
13
- export declare function runReducePhase({ model, apiKey, thinkingLevel, observations, stat, scopeCandidates, typesDescription }: ReducePhaseInput): Promise<ConventionalAnalysis>;
13
+ export declare function runReducePhase({ model, apiKey, thinkingLevel, observations, stat, scopeCandidates, typesDescription, }: ReducePhaseInput): Promise<ConventionalAnalysis>;
@@ -40,6 +40,7 @@ interface AppKeybindings {
40
40
  "app.plan.toggle": true;
41
41
  "app.history.search": true;
42
42
  "app.stt.toggle": true;
43
+ "app.irc.sidebar.toggle": true;
43
44
  }
44
45
  export type AppKeybinding = keyof AppKeybindings;
45
46
  declare module "@gajae-code/tui" {
@@ -323,6 +324,10 @@ export declare const KEYBINDINGS: {
323
324
  readonly defaultKeys: "alt+h";
324
325
  readonly description: "Toggle speech-to-text";
325
326
  };
327
+ readonly "app.irc.sidebar.toggle": {
328
+ readonly defaultKeys: "alt+i";
329
+ readonly description: "Toggle IRC sidebar";
330
+ };
326
331
  };
327
332
  declare function migrateKeybindingsConfigFile(agentDir: string): void;
328
333
  /**
@@ -58,6 +58,7 @@ export interface MaterializeModelProfileAssignmentsOptions {
58
58
  export declare function materializeActiveModelProfileAssignment(options: MaterializeModelProfileAssignmentOptions): boolean;
59
59
  export declare function materializeActiveModelProfileAssignments(options: MaterializeModelProfileAssignmentsOptions): boolean;
60
60
  export declare function formatModelProfileCredentialError(profileLabel: string, providers: readonly string[]): string;
61
+ export declare function resolveModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>): string;
61
62
  export declare function prepareModelProfileActivation(options: PrepareModelProfileActivationOptions): Promise<PreparedModelProfileActivation>;
62
63
  export declare function applyPreparedModelProfileActivation(prepared: PreparedModelProfileActivation, options?: ApplyModelProfileActivationOptions): Promise<void>;
63
64
  export interface MaterializeModelProfileForDeletionResult {
@@ -138,6 +138,10 @@ export declare const SETTINGS_SCHEMA: {
138
138
  readonly type: "boolean";
139
139
  readonly default: false;
140
140
  };
141
+ readonly "notifications.telegram.topics.nameTemplate": {
142
+ readonly type: "string";
143
+ readonly default: undefined;
144
+ };
141
145
  readonly "notifications.discord.botToken": {
142
146
  readonly type: "string";
143
147
  readonly default: undefined;
@@ -163,6 +167,11 @@ export declare const SETTINGS_SCHEMA: {
163
167
  readonly default: "lean";
164
168
  readonly validate: (value: string) => value is "lean" | "verbose";
165
169
  };
170
+ readonly "notifications.sessionScope": {
171
+ readonly type: "string";
172
+ readonly default: "all";
173
+ readonly validate: (value: string) => value is "all" | "primary";
174
+ };
166
175
  readonly "notifications.daemon.idleTimeoutMs": {
167
176
  readonly type: "number";
168
177
  readonly default: 60000;
@@ -448,6 +457,25 @@ export declare const SETTINGS_SCHEMA: {
448
457
  readonly description: "Use the session name color for the editor border and status line gap";
449
458
  };
450
459
  };
460
+ readonly "pet.mode": {
461
+ readonly type: "enum";
462
+ readonly values: readonly ["off", "red", "blue"];
463
+ readonly default: "off";
464
+ readonly ui: {
465
+ readonly tab: "appearance";
466
+ readonly label: "Gajae Pet";
467
+ readonly description: "16x16 real-pixel gajae living beside the composer (sixel/kitty terminals)";
468
+ readonly options: readonly [{
469
+ readonly value: "off";
470
+ readonly label: "Off";
471
+ readonly description: "No pet";
472
+ }, ...{
473
+ value: "blue" | "red";
474
+ label: string;
475
+ description: string;
476
+ }[]];
477
+ };
478
+ };
451
479
  readonly "statusLine.maxRows": {
452
480
  readonly type: "number";
453
481
  readonly default: 1;
@@ -636,7 +664,7 @@ export declare const SETTINGS_SCHEMA: {
636
664
  readonly ui: {
637
665
  readonly tab: "tools";
638
666
  readonly label: "Artifact head size (KB)";
639
- readonly description: "Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables \u2014 keep tail only.";
667
+ readonly description: "Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables — keep tail only.";
640
668
  readonly options: readonly [{
641
669
  readonly value: "0";
642
670
  readonly label: "0 KB";
@@ -1434,7 +1462,7 @@ export declare const SETTINGS_SCHEMA: {
1434
1462
  readonly ui: {
1435
1463
  readonly tab: "interaction";
1436
1464
  readonly label: "Check for Updates";
1437
- readonly description: "If false, skip update check";
1465
+ readonly description: "At interactive startup, notify of newer versions; never install. Use `gjc update` only for recognized Bun global, Windows npm, or bundled-installer binaries; source, linked, and unrecognized installs use their original method.";
1438
1466
  };
1439
1467
  };
1440
1468
  readonly "starReminder.enabled": {
@@ -1969,11 +1997,11 @@ export declare const SETTINGS_SCHEMA: {
1969
1997
  readonly options: readonly [{
1970
1998
  readonly value: "global";
1971
1999
  readonly label: "Global";
1972
- readonly description: "One shared bank \u2014 every project sees the same memories";
2000
+ readonly description: "One shared bank — every project sees the same memories";
1973
2001
  }, {
1974
2002
  readonly value: "per-project";
1975
2003
  readonly label: "Per project";
1976
- readonly description: "Isolated bank per cwd basename \u2014 projects cannot see each other's memories";
2004
+ readonly description: "Isolated bank per cwd basename — projects cannot see each other's memories";
1977
2005
  }, {
1978
2006
  readonly value: "per-project-tagged";
1979
2007
  readonly label: "Per project (tagged)";
@@ -2073,7 +2101,7 @@ export declare const SETTINGS_SCHEMA: {
2073
2101
  readonly ui: {
2074
2102
  readonly tab: "memory";
2075
2103
  readonly label: "Hindsight Mental Models";
2076
- readonly description: "Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank \u2014 does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.";
2104
+ readonly description: "Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank — does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.";
2077
2105
  readonly condition: "hindsightActive";
2078
2106
  };
2079
2107
  };
@@ -2111,7 +2139,7 @@ export declare const SETTINGS_SCHEMA: {
2111
2139
  readonly ui: {
2112
2140
  readonly tab: "context";
2113
2141
  readonly label: "TTSR Context Mode";
2114
- readonly description: "What to do with partial output when TTSR triggers. 'discard' (recommended) drops the aborted partial turn so it never accumulates in context. 'keep' retains every aborted partial turn, which grows the token footprint each time a rule fires \u2014 prefer 'discard' unless you specifically need the partial output.";
2142
+ readonly description: "What to do with partial output when TTSR triggers. 'discard' (recommended) drops the aborted partial turn so it never accumulates in context. 'keep' retains every aborted partial turn, which grows the token footprint each time a rule fires — prefer 'discard' unless you specifically need the partial output.";
2115
2143
  };
2116
2144
  };
2117
2145
  readonly "ttsr.interruptMode": {
@@ -2594,6 +2622,15 @@ export declare const SETTINGS_SCHEMA: {
2594
2622
  readonly description: "Enable agent-to-agent IRC messaging via the irc tool";
2595
2623
  };
2596
2624
  };
2625
+ readonly "irc.sidebar.enabled": {
2626
+ readonly type: "boolean";
2627
+ readonly default: true;
2628
+ readonly ui: {
2629
+ readonly tab: "tools";
2630
+ readonly label: "IRC Sidebar";
2631
+ readonly description: "Enable the IRC message sidebar (opens with the toggle key; starts closed)";
2632
+ };
2633
+ };
2597
2634
  readonly "renderMermaid.enabled": {
2598
2635
  readonly type: "boolean";
2599
2636
  readonly default: false;
@@ -3414,7 +3451,7 @@ export declare const SETTINGS_SCHEMA: {
3414
3451
  }, {
3415
3452
  readonly value: "duckduckgo";
3416
3453
  readonly label: "DuckDuckGo";
3417
- readonly description: "Keyless default \u2014 no API key or OAuth required";
3454
+ readonly description: "Keyless default — no API key or OAuth required";
3418
3455
  }, {
3419
3456
  readonly value: "insane";
3420
3457
  readonly label: "Insane";
@@ -3866,6 +3903,9 @@ export interface NotificationsSettings {
3866
3903
  richDraft: {
3867
3904
  enabled: boolean;
3868
3905
  };
3906
+ topics: {
3907
+ nameTemplate: string | undefined;
3908
+ };
3869
3909
  };
3870
3910
  discord: {
3871
3911
  botToken: string | undefined;
@@ -115,6 +115,8 @@ export declare class Settings {
115
115
  * Set a model role (helper for modelRoles record).
116
116
  */
117
117
  setModelRole(role: ModelRole | string, modelId: string): void;
118
+ setGlobalModelRole(role: ModelRole | string, modelId: string | undefined): void;
119
+ setGlobalModelRoleAndFlush(role: ModelRole | string, modelId: string | undefined): Promise<void>;
118
120
  /**
119
121
  * Set an agent model override while keeping any live runtime override aligned.
120
122
  *
@@ -1,4 +1,4 @@
1
1
  export declare const COORDINATOR_MCP_PROTOCOL_VERSION = "2024-11-05";
2
2
  export declare const COORDINATOR_MCP_SERVER_NAME = "gjc-coordinator-mcp";
3
- export declare const COORDINATOR_MCP_TOOL_NAMES: readonly ["gjc_coordinator_list_sessions", "gjc_coordinator_read_status", "gjc_coordinator_read_tail", "gjc_coordinator_list_questions", "gjc_coordinator_list_artifacts", "gjc_coordinator_read_artifact", "gjc_coordinator_read_coordination_status", "gjc_coordinator_watch_events", "gjc_coordinator_register_session", "gjc_coordinator_start_session", "gjc_coordinator_send_prompt", "gjc_coordinator_submit_question_answer", "gjc_coordinator_read_turn", "gjc_coordinator_await_turn", "gjc_coordinator_report_status", "gjc_delegate_plan", "gjc_delegate_execute", "gjc_delegate_team"];
3
+ export declare const COORDINATOR_MCP_TOOL_NAMES: readonly ["gjc_coordinator_list_sessions", "gjc_coordinator_read_status", "gjc_coordinator_read_tail", "gjc_coordinator_list_questions", "gjc_coordinator_list_artifacts", "gjc_coordinator_read_artifact", "gjc_coordinator_read_coordination_status", "gjc_coordinator_watch_events", "gjc_coordinator_register_session", "gjc_coordinator_start_session", "gjc_coordinator_stop_session", "gjc_coordinator_send_prompt", "gjc_coordinator_submit_question_answer", "gjc_coordinator_read_turn", "gjc_coordinator_await_turn", "gjc_coordinator_report_status", "gjc_delegate_plan", "gjc_delegate_execute", "gjc_delegate_team"];
4
4
  export type CoordinatorToolName = (typeof COORDINATOR_MCP_TOOL_NAMES)[number];
@@ -0,0 +1,45 @@
1
+ import { type ModelProfileDefinition } from "../config/model-profiles";
2
+ /**
3
+ * Loads the merged built-in + custom model-profile registry the way the `gjc`
4
+ * CLI resolves `--mpreset`, so coordinator MCP launches select the same
5
+ * authoritative profile the spawned child will activate. Custom profiles live
6
+ * in the shared models config, which the child inherits, so both sides agree.
7
+ */
8
+ export type CoordinatorModelProfileLoader = () => Map<string, ModelProfileDefinition> | Promise<Map<string, ModelProfileDefinition>>;
9
+ /**
10
+ * Thrown by the default loader when `models.yml` exists but is invalid or
11
+ * unreadable. This lets the resolver fail closed with a distinct, stable reason
12
+ * instead of silently collapsing a broken registry to the built-ins-only set
13
+ * (which would misreport a caller's valid custom profile as unknown).
14
+ */
15
+ export declare class CoordinatorModelProfileRegistryError extends Error {
16
+ constructor(cause?: unknown);
17
+ }
18
+ export declare const loadCoordinatorModelProfiles: CoordinatorModelProfileLoader;
19
+ export type CoordinatorMpresetResolution = {
20
+ ok: true;
21
+ mpreset: string | null;
22
+ } | {
23
+ ok: false;
24
+ reason: "unknown_model_profile";
25
+ mpreset: string;
26
+ available_profiles: string[];
27
+ } | {
28
+ ok: false;
29
+ reason: "model_profile_registry_error";
30
+ mpreset: string;
31
+ available_profiles: string[];
32
+ };
33
+ /**
34
+ * Resolve a coordinator `mpreset` argument against the merged profile registry.
35
+ *
36
+ * Only an absent (`undefined`/`null`) value is a no-op (`mpreset: null`); an
37
+ * explicit empty/whitespace string is a caller error and is rejected rather
38
+ * than silently launching at the default tier. Legacy aliases are canonicalized
39
+ * exactly like the CLI (e.g. `codex-standard` -> `codex-medium`) so coordinator
40
+ * selection stays in parity with `gjc --mpreset <profile>`; the resolved value
41
+ * is the canonical profile name. Unknown names are rejected with the
42
+ * available-profile listing and never reach a spawned child command, and a
43
+ * broken registry fails closed with `model_profile_registry_error`.
44
+ */
45
+ export declare function resolveCoordinatorMpreset(raw: unknown, loadProfiles: CoordinatorModelProfileLoader): Promise<CoordinatorMpresetResolution>;
@@ -10,6 +10,9 @@ export interface CoordinatorMcpConfig {
10
10
  namespace: CoordinatorNamespace;
11
11
  stateRoot: string;
12
12
  sessionCommand: string | null;
13
+ sessionIdleTtlMs: number;
14
+ sessionSweepIntervalMs: number;
15
+ forceStopEnabled: boolean;
13
16
  }
14
17
  export interface CoordinatorMutationRequest {
15
18
  allow_mutation?: boolean;