@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.
- package/CHANGELOG.md +58 -0
- package/dist/types/cli/classify-install-target.d.ts +0 -10
- package/dist/types/cli/daemon-cli.d.ts +2 -0
- package/dist/types/cli/initial-message.d.ts +1 -1
- package/dist/types/cli/malloc-env-guard.d.ts +65 -0
- package/dist/types/cli/malloc-env-guard.test.d.ts +1 -0
- package/dist/types/cli/notify-cli.d.ts +3 -1
- package/dist/types/cli/session-picker.d.ts +4 -3
- package/dist/types/cli/update-cli.d.ts +22 -3
- package/dist/types/cli.d.ts +5 -0
- package/dist/types/commands/daemon.d.ts +6 -2
- package/dist/types/commands/launch.d.ts +1 -0
- package/dist/types/commands/notify.d.ts +6 -0
- package/dist/types/commit/analysis/conventional.d.ts +1 -1
- package/dist/types/commit/analysis/summary.d.ts +1 -1
- package/dist/types/commit/changelog/generate.d.ts +1 -1
- package/dist/types/commit/changelog/index.d.ts +2 -2
- package/dist/types/commit/map-reduce/map-phase.d.ts +1 -1
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +1 -1
- package/dist/types/config/keybindings.d.ts +5 -0
- package/dist/types/config/model-profile-activation.d.ts +1 -0
- package/dist/types/config/settings-schema.d.ts +47 -7
- package/dist/types/config/settings.d.ts +2 -0
- package/dist/types/coordinator/contract.d.ts +1 -1
- package/dist/types/coordinator-mcp/model-preset.d.ts +45 -0
- package/dist/types/coordinator-mcp/policy.d.ts +3 -0
- package/dist/types/coordinator-mcp/server.d.ts +79 -6
- package/dist/types/coordinator-mcp/session-reaper.d.ts +53 -0
- package/dist/types/daemon/control-types.d.ts +10 -0
- package/dist/types/daemon/operator-contract.d.ts +47 -0
- package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.d.ts +4 -0
- package/dist/types/discovery/helpers.d.ts +1 -1
- package/dist/types/discovery/substitute-plugin-root.d.ts +0 -4
- package/dist/types/extensibility/extensions/types.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +26 -7
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +34 -3
- package/dist/types/gjc-runtime/tmux-common.d.ts +6 -0
- package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +5 -0
- package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +309 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +49 -17
- package/dist/types/internal-urls/local-protocol.d.ts +13 -9
- package/dist/types/main.d.ts +66 -2
- package/dist/types/modes/acp/acp-agent.d.ts +19 -2
- package/dist/types/modes/acp/acp-mode.d.ts +12 -0
- package/dist/types/modes/components/assistant-message.d.ts +1 -1
- package/dist/types/modes/components/custom-editor.d.ts +2 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +59 -0
- package/dist/types/modes/components/hook-selector.d.ts +5 -0
- package/dist/types/modes/components/irc-sidebar.d.ts +32 -0
- package/dist/types/modes/components/pet-selector.d.ts +11 -0
- package/dist/types/modes/components/session-selector.d.ts +22 -9
- package/dist/types/modes/components/settings-selector.d.ts +2 -0
- package/dist/types/modes/components/status-line/types.d.ts +1 -1
- package/dist/types/modes/components/status-line.d.ts +0 -10
- package/dist/types/modes/components/tool-execution.d.ts +1 -0
- package/dist/types/modes/components/user-message.d.ts +2 -1
- package/dist/types/modes/controllers/event-controller.d.ts +4 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +24 -2
- package/dist/types/modes/irc-observation-ledger.d.ts +22 -0
- package/dist/types/modes/print-mode.d.ts +3 -4
- package/dist/types/modes/rpc/rpc-client.d.ts +7 -1
- package/dist/types/modes/rpc/rpc-mode.d.ts +2 -1
- package/dist/types/modes/rpc/rpc-types.d.ts +17 -1
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +8 -0
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +5 -0
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +45 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +42 -2
- package/dist/types/modes/theme/defaults/index.d.ts +568 -568
- package/dist/types/modes/types.d.ts +28 -2
- package/dist/types/modes/utils/abort-message.d.ts +1 -1
- package/dist/types/modes/utils/context-usage.d.ts +4 -19
- package/dist/types/modes/utils/irc-message.d.ts +38 -0
- package/dist/types/modes/utils/ui-helpers.d.ts +13 -4
- package/dist/types/notifications/config.d.ts +34 -0
- package/dist/types/notifications/daemon-paths.d.ts +7 -0
- package/dist/types/notifications/index.d.ts +27 -0
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +12 -4
- package/dist/types/notifications/notification-service.d.ts +144 -0
- package/dist/types/notifications/rate-limit-pool.d.ts +27 -9
- package/dist/types/notifications/telegram-daemon-control.d.ts +6 -0
- package/dist/types/notifications/telegram-daemon.d.ts +130 -3
- package/dist/types/notifications/telegram-reference.d.ts +19 -2
- package/dist/types/notifications/topic-registry.d.ts +24 -4
- package/dist/types/registry/agent-registry.d.ts +2 -0
- package/dist/types/rlm/index.d.ts +1 -1
- package/dist/types/sdk.d.ts +2 -0
- package/dist/types/secrets/obfuscator.d.ts +1 -1
- package/dist/types/session/agent-session.d.ts +40 -3
- package/dist/types/session/cache-economics.d.ts +79 -0
- package/dist/types/session/context-estimation.d.ts +31 -0
- package/dist/types/session/provider-safety-stop.d.ts +5 -0
- package/dist/types/session/session-manager.d.ts +124 -4
- package/dist/types/session/session-storage.d.ts +155 -13
- package/dist/types/setup/credential-auto-import.d.ts +2 -2
- package/dist/types/task/executor.d.ts +3 -0
- package/dist/types/task/receipt.d.ts +3 -1
- package/dist/types/task/types.d.ts +8 -0
- package/dist/types/tools/ask-answer-registry.d.ts +5 -0
- package/dist/types/tools/ask.d.ts +25 -1
- package/dist/types/tools/bash.d.ts +1 -1
- package/dist/types/tools/browser/tab-supervisor.d.ts +6 -0
- package/dist/types/tools/index.d.ts +58 -6
- package/dist/types/tools/telegram-send.d.ts +7 -0
- package/dist/types/utils/external-editor.d.ts +2 -0
- package/package.json +9 -9
- package/scripts/g004-tmux-smoke.ts +196 -36
- package/src/cli/daemon-cli.ts +19 -29
- package/src/cli/malloc-env-guard.test.ts +104 -0
- package/src/cli/malloc-env-guard.ts +149 -0
- package/src/cli/notify-cli.ts +78 -14
- package/src/cli/session-picker.ts +23 -40
- package/src/cli/update-cli.ts +56 -37
- package/src/cli.ts +51 -10
- package/src/commands/daemon.ts +19 -5
- package/src/commands/harness.ts +515 -47
- package/src/commands/launch.ts +11 -3
- package/src/commands/notify.ts +5 -1
- package/src/commands/session.ts +6 -1
- package/src/config/keybindings.ts +5 -0
- package/src/config/model-profile-activation.ts +1 -1
- package/src/config/model-profiles.ts +14 -14
- package/src/config/settings-schema.ts +41 -1
- package/src/config/settings.ts +96 -45
- package/src/coordinator/contract.ts +1 -0
- package/src/coordinator-mcp/model-preset.ts +100 -0
- package/src/coordinator-mcp/policy.ts +30 -0
- package/src/coordinator-mcp/server.ts +2881 -425
- package/src/coordinator-mcp/session-reaper.ts +129 -0
- package/src/daemon/control-types.ts +11 -0
- package/src/daemon/operator-contract.ts +121 -0
- package/src/deep-interview/render-middleware.ts +67 -2
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
- package/src/extensibility/extensions/runner.ts +1 -1
- package/src/extensibility/extensions/types.ts +3 -1
- package/src/gjc-runtime/launch-tmux.ts +702 -135
- package/src/gjc-runtime/session-state-sidecar.ts +756 -135
- package/src/gjc-runtime/team-runtime.ts +6 -0
- package/src/gjc-runtime/tmux-common.ts +26 -7
- package/src/gjc-runtime/tmux-gc.ts +52 -9
- package/src/gjc-runtime/tmux-owner-isolation-cli.ts +185 -0
- package/src/gjc-runtime/tmux-owner-isolation.ts +2060 -0
- package/src/gjc-runtime/tmux-sessions.ts +871 -68
- package/src/internal-urls/docs-index.generated.ts +12 -11
- package/src/internal-urls/local-protocol.ts +29 -10
- package/src/main.ts +301 -80
- package/src/modes/acp/acp-agent.ts +730 -100
- package/src/modes/acp/acp-mode.ts +29 -2
- package/src/modes/components/assistant-message.ts +32 -3
- package/src/modes/components/bash-execution.ts +43 -13
- package/src/modes/components/custom-editor.ts +5 -0
- package/src/modes/components/footer.ts +3 -3
- package/src/modes/components/gajae-pet-widget.ts +360 -0
- package/src/modes/components/hook-selector.ts +12 -0
- package/src/modes/components/irc-sidebar.ts +206 -0
- package/src/modes/components/pet-selector.ts +55 -0
- package/src/modes/components/session-selector.ts +222 -221
- package/src/modes/components/settings-selector.ts +10 -0
- package/src/modes/components/status-line/segments.ts +13 -6
- package/src/modes/components/status-line/types.ts +1 -1
- package/src/modes/components/status-line.ts +4 -171
- package/src/modes/components/tool-execution.ts +47 -6
- package/src/modes/components/user-message.ts +26 -9
- package/src/modes/controllers/command-controller.ts +28 -2
- package/src/modes/controllers/event-controller.ts +159 -36
- package/src/modes/controllers/extension-ui-controller.ts +37 -18
- package/src/modes/controllers/input-controller.ts +8 -2
- package/src/modes/controllers/selector-controller.ts +62 -15
- package/src/modes/interactive-mode.ts +199 -7
- package/src/modes/irc-observation-ledger.ts +127 -0
- package/src/modes/print-mode.ts +228 -92
- package/src/modes/rpc/rpc-client.ts +58 -1
- package/src/modes/rpc/rpc-mode.ts +286 -85
- package/src/modes/rpc/rpc-types.ts +15 -1
- package/src/modes/shared/agent-wire/command-dispatch.ts +33 -1
- package/src/modes/shared/agent-wire/command-validation.ts +10 -0
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
- package/src/modes/shared/agent-wire/scopes.ts +1 -0
- package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
- package/src/modes/types.ts +34 -2
- package/src/modes/utils/context-usage.ts +56 -92
- package/src/modes/utils/hotkeys-markdown.ts +1 -0
- package/src/modes/utils/irc-message.ts +138 -0
- package/src/modes/utils/ui-helpers.ts +216 -50
- package/src/notifications/config.ts +44 -0
- package/src/notifications/daemon-paths.ts +8 -0
- package/src/notifications/index.ts +535 -75
- package/src/notifications/lifecycle-control-runtime.ts +930 -77
- package/src/notifications/notification-service.ts +710 -0
- package/src/notifications/rate-limit-pool.ts +46 -12
- package/src/notifications/telegram-daemon-cli.ts +2 -0
- package/src/notifications/telegram-daemon-control.ts +27 -2
- package/src/notifications/telegram-daemon.ts +635 -94
- package/src/notifications/telegram-reference.ts +73 -13
- package/src/notifications/topic-registry.ts +86 -9
- package/src/prompts/system/irc-peer-roster.md +1 -0
- package/src/prompts/system/subagent-system-prompt.md +1 -0
- package/src/prompts/system/system-prompt.md +1 -0
- package/src/prompts/tools/irc.md +1 -1
- package/src/registry/agent-registry.ts +3 -0
- package/src/sdk.ts +52 -1
- package/src/secrets/obfuscator.ts +4 -2
- package/src/session/agent-session.ts +670 -217
- package/src/session/cache-economics.ts +275 -0
- package/src/session/context-estimation.ts +91 -0
- package/src/session/provider-safety-stop.ts +9 -0
- package/src/session/session-dump-format.ts +6 -0
- package/src/session/session-manager.ts +809 -39
- package/src/session/session-storage.ts +582 -38
- package/src/slash-commands/builtin-registry.ts +153 -9
- package/src/slash-commands/helpers/context-report.ts +26 -4
- package/src/task/executor.ts +12 -3
- package/src/task/index.ts +8 -0
- package/src/task/receipt.ts +7 -2
- package/src/task/types.ts +26 -0
- package/src/tools/ask-answer-registry.ts +25 -0
- package/src/tools/ask.ts +355 -33
- package/src/tools/browser/tab-supervisor.ts +63 -6
- package/src/tools/browser.ts +8 -3
- package/src/tools/index.ts +81 -6
- package/src/tools/sqlite-reader.ts +8 -4
- package/src/tui/output-block.ts +18 -6
- 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
|
|
2
|
-
|
|
3
|
-
|
|
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
|
*/
|
package/dist/types/cli.d.ts
CHANGED
|
@@ -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:
|
|
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
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|