@gajae-code/coding-agent 0.11.6 → 0.11.8
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 +92 -0
- package/dist/types/capability/index.d.ts +10 -20
- package/dist/types/capability/types.d.ts +3 -0
- package/dist/types/cli/args.d.ts +0 -2
- package/dist/types/commands/daemon.d.ts +2 -2
- package/dist/types/commands/sdk.d.ts +20 -2
- package/dist/types/config/keybindings.d.ts +34 -4
- package/dist/types/config/model-profile-activation.d.ts +4 -3
- package/dist/types/config/model-profile-contract.d.ts +38 -0
- package/dist/types/config/settings-schema.d.ts +70 -7
- package/dist/types/edit/modes/patch.d.ts +13 -0
- package/dist/types/edit/path-mutation-lock.d.ts +15 -0
- package/dist/types/eval/py/executor.d.ts +1 -1
- package/dist/types/eval/py/runner-artifact.d.ts +8 -0
- package/dist/types/eval/py/tool-bridge.d.ts +1 -2
- package/dist/types/gjc-runtime/repository-binding.d.ts +63 -0
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +6 -5
- package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +20 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +43 -5
- package/dist/types/main.d.ts +32 -1
- package/dist/types/modes/components/btw-panel.d.ts +1 -0
- package/dist/types/modes/components/model-selector.d.ts +2 -0
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
- package/dist/types/modes/components/tool-status-header.d.ts +4 -2
- package/dist/types/modes/components/welcome.d.ts +2 -0
- package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
- package/dist/types/modes/controllers/command-controller.d.ts +2 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +2 -1
- package/dist/types/modes/interactive-mode.d.ts +7 -2
- package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
- package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
- package/dist/types/modes/types.d.ts +4 -0
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
- package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
- package/dist/types/runtime-mcp/manager.d.ts +1 -1
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
- package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
- package/dist/types/sdk/broker/broker.d.ts +2 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +6 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +6 -1
- package/dist/types/sdk/bus/config-commands.d.ts +2 -2
- package/dist/types/sdk/bus/config.d.ts +2 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
- package/dist/types/sdk/bus/index.d.ts +26 -1
- package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
- package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
- package/dist/types/sdk/bus/notification-service.d.ts +34 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +105 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +18 -3
- package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +189 -4
- package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
- package/dist/types/sdk/client/discovery.d.ts +2 -0
- package/dist/types/sdk/client/liveness.d.ts +7 -0
- package/dist/types/sdk/host/control/operations.d.ts +1 -1
- package/dist/types/sdk/host/host.d.ts +1 -1
- package/dist/types/sdk/host/query/handlers.d.ts +9 -0
- package/dist/types/sdk/index.d.ts +2 -0
- package/dist/types/sdk/prompt-status.d.ts +88 -0
- package/dist/types/sdk/session-directory.d.ts +1 -1
- package/dist/types/sdk/startup-capability.d.ts +3 -0
- package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
- package/dist/types/sdk/transport/index.d.ts +12 -0
- package/dist/types/sdk/transport/relay.d.ts +43 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
- package/dist/types/sdk/transport/socket.d.ts +7 -0
- package/dist/types/sdk/transport/stdio.d.ts +3 -0
- package/dist/types/session/agent-session.d.ts +30 -5
- package/dist/types/session/btw-contract.d.ts +16 -0
- package/dist/types/session/internal/managed-session-scope.d.ts +32 -9
- package/dist/types/session/internal/managed-session-storage.d.ts +27 -10
- package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
- package/dist/types/session/session-manager.d.ts +25 -4
- package/dist/types/session/session-storage.d.ts +18 -0
- package/dist/types/setup/credential-import.d.ts +5 -1
- package/dist/types/setup/provider-onboarding.d.ts +2 -0
- package/dist/types/ssh/utils.d.ts +1 -0
- package/dist/types/task/discovery.d.ts +3 -1
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/task/receipt.d.ts +2 -0
- package/dist/types/task/types.d.ts +94 -0
- package/dist/types/tools/ask.d.ts +454 -174
- package/dist/types/tools/fetch.d.ts +5 -8
- package/dist/types/tools/image-gen.d.ts +63 -1
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/skill-discovery.d.ts +7 -0
- package/dist/types/tools/sqlite-reader.d.ts +7 -0
- package/dist/types/utils/prompt-suggestion.d.ts +33 -0
- package/dist/types/utils/shell-snapshot.d.ts +12 -0
- package/dist/types/web/insane/bridge.d.ts +1 -0
- package/dist/types/web/insane/url-guard.d.ts +17 -0
- package/package.json +8 -8
- package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
- package/scripts/dogfood-repository-binding.ts +209 -0
- package/scripts/generate-sdk-operation-inventory.ts +4 -0
- package/scripts/run-test-manifest.ts +4 -4
- package/src/capability/index.ts +50 -42
- package/src/capability/types.ts +3 -0
- package/src/cli/args.ts +2 -92
- package/src/cli/notify-cli.ts +5 -38
- package/src/cli/setup-cli.ts +10 -4
- package/src/cli.ts +52 -9
- package/src/commands/daemon.ts +22 -5
- package/src/commands/sdk.ts +44 -11
- package/src/config/keybindings.ts +158 -25
- package/src/config/model-profile-activation.ts +7 -18
- package/src/config/model-profile-contract.ts +161 -0
- package/src/config/model-profiles.ts +18 -0
- package/src/config/model-registry.ts +11 -1
- package/src/config/settings-schema.ts +73 -7
- package/src/coordinator-mcp/model-preset.ts +21 -74
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +2 -2
- package/src/defaults/gjc/skills/ralplan/SKILL.md +3 -1
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +42 -1
- package/src/discovery/ssh.ts +12 -1
- package/src/edit/index.ts +3 -6
- package/src/edit/modes/patch.ts +38 -1
- package/src/edit/modes/replace.ts +42 -0
- package/src/edit/path-mutation-lock.ts +112 -0
- package/src/eval/py/executor.ts +30 -11
- package/src/eval/py/kernel.ts +1 -21
- package/src/eval/py/prelude.py +2 -2
- package/src/eval/py/runner-artifact.ts +84 -0
- package/src/eval/py/tool-bridge.ts +34 -18
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +2 -1
- package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
- package/src/gjc-runtime/launch-tmux.ts +1 -1
- package/src/gjc-runtime/managed-owner-supervisor.ts +83 -4
- package/src/gjc-runtime/ralplan-runtime.ts +75 -3
- package/src/gjc-runtime/repository-binding.ts +267 -0
- package/src/gjc-runtime/session-state-sidecar.ts +25 -9
- package/src/gjc-runtime/tmux-owner-isolation.ts +2 -1
- package/src/gjc-runtime/tmux-sessions.ts +45 -6
- package/src/gjc-runtime/ultragoal-guard.ts +93 -15
- package/src/gjc-runtime/ultragoal-receipt-freshness.ts +103 -0
- package/src/gjc-runtime/ultragoal-runtime.ts +456 -31
- package/src/gjc-runtime/workflow-manifest.generated.json +58 -0
- package/src/gjc-runtime/workflow-manifest.ts +23 -0
- package/src/internal-urls/docs-index.generated.ts +12 -10
- package/src/internal-urls/local-protocol.ts +64 -21
- package/src/internal-urls/mcp-protocol.ts +73 -11
- package/src/main.ts +111 -37
- package/src/modes/DESIGN.md +5 -0
- package/src/modes/acp/acp-agent.ts +50 -16
- package/src/modes/action-registry.ts +1 -1
- package/src/modes/components/btw-panel.ts +82 -16
- package/src/modes/components/model-selector.ts +73 -11
- package/src/modes/components/plan-preview-overlay.ts +1 -1
- package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
- package/src/modes/components/tool-status-header.ts +25 -4
- package/src/modes/components/welcome.ts +22 -18
- package/src/modes/controllers/btw-controller.ts +119 -36
- package/src/modes/controllers/command-controller.ts +97 -54
- package/src/modes/controllers/event-controller.ts +10 -0
- package/src/modes/controllers/input-controller.ts +38 -2
- package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
- package/src/modes/controllers/selector-controller.ts +149 -63
- package/src/modes/interactive-mode.ts +57 -34
- package/src/modes/prompt-action-autocomplete.ts +32 -13
- package/src/modes/prompt-suggestion-controller.ts +96 -0
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
- package/src/modes/types.ts +4 -0
- package/src/modes/utils/hotkeys-markdown.ts +64 -36
- package/src/modes/utils/ui-helpers.ts +5 -3
- package/src/prompts/agents/architect.md +0 -1
- package/src/prompts/agents/critic.md +0 -1
- package/src/prompts/system/btw-user.md +3 -8
- package/src/prompts/system/prompt-suggestion-system.md +32 -0
- package/src/prompts/system/system-prompt.md +6 -4
- package/src/prompts/tools/cron.md +3 -1
- package/src/prompts/tools/skill-discovery.md +1 -0
- package/src/runtime-mcp/client.ts +41 -55
- package/src/runtime-mcp/content-limits.ts +71 -0
- package/src/runtime-mcp/json-rpc.ts +23 -9
- package/src/runtime-mcp/manager.ts +51 -53
- package/src/runtime-mcp/oauth-flow.ts +0 -72
- package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
- package/src/runtime-mcp/transports/http.ts +63 -22
- package/src/sdk/broker/broker.ts +34 -20
- package/src/sdk/broker/lifecycle.ts +185 -36
- package/src/sdk/bus/chat-daemon-control.ts +19 -5
- package/src/sdk/bus/config-commands.ts +2 -2
- package/src/sdk/bus/config.ts +9 -1
- package/src/sdk/bus/conversation-store.ts +40 -6
- package/src/sdk/bus/index.ts +244 -70
- package/src/sdk/bus/lifecycle-commands.ts +63 -10
- package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
- package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
- package/src/sdk/bus/notification-orchestration.ts +12 -0
- package/src/sdk/bus/notification-service.ts +68 -20
- package/src/sdk/bus/prompt-reconciliation.ts +239 -0
- package/src/sdk/bus/recent-activity.ts +90 -26
- package/src/sdk/bus/telegram-daemon-contract.ts +18 -3
- package/src/sdk/bus/telegram-daemon-control.ts +147 -35
- package/src/sdk/bus/telegram-daemon.ts +2463 -450
- package/src/sdk/bus/telegram-reference.ts +20 -2
- package/src/sdk/bus/topic-registry.ts +451 -12
- package/src/sdk/cli/session-cli.ts +15 -2
- package/src/sdk/client/discovery.ts +19 -3
- package/src/sdk/client/liveness.ts +49 -0
- package/src/sdk/host/control/dispatch.ts +1 -1
- package/src/sdk/host/control/operations.ts +1 -1
- package/src/sdk/host/host.ts +2 -6
- package/src/sdk/host/query/handlers.ts +70 -5
- package/src/sdk/index.ts +12 -0
- package/src/sdk/prompt-status.ts +97 -0
- package/src/sdk/protocol/operation-inventory.generated.json +58 -0
- package/src/sdk/protocol/operation-registry.ts +18 -4
- package/src/sdk/session-directory.ts +5 -1
- package/src/sdk/session.ts +31 -5
- package/src/sdk/startup-capability.ts +9 -1
- package/src/sdk/transport/auth-preface.ts +82 -0
- package/src/sdk/transport/index.ts +18 -0
- package/src/sdk/transport/relay.ts +252 -0
- package/src/sdk/transport/serve-cli.ts +105 -0
- package/src/sdk/transport/socket.ts +197 -0
- package/src/sdk/transport/stdio.ts +17 -0
- package/src/session/agent-session.ts +292 -154
- package/src/session/blob-store.ts +25 -7
- package/src/session/btw-contract.ts +59 -0
- package/src/session/internal/managed-session-scope.ts +1163 -137
- package/src/session/internal/managed-session-storage.ts +397 -234
- package/src/session/internal/native-publish-outcome.ts +266 -0
- package/src/session/session-manager.ts +620 -403
- package/src/session/session-storage.ts +128 -11
- package/src/setup/credential-import.ts +28 -3
- package/src/setup/provider-onboarding.ts +30 -1
- package/src/setup/provider-presets.json +2 -1
- package/src/slash-commands/builtin-registry.ts +1 -1
- package/src/ssh/utils.ts +14 -0
- package/src/task/discovery.ts +8 -2
- package/src/task/gjc-command.ts +2 -2
- package/src/task/index.ts +121 -15
- package/src/task/receipt.ts +3 -0
- package/src/task/types.ts +34 -3
- package/src/tools/ask.ts +199 -89
- package/src/tools/ast-edit.ts +2 -2
- package/src/tools/bash-pty-selection.ts +2 -2
- package/src/tools/browser/screenshot-format.ts +6 -1
- package/src/tools/cron.ts +1 -1
- package/src/tools/fetch.ts +13 -131
- package/src/tools/image-gen.ts +476 -23
- package/src/tools/index.ts +4 -0
- package/src/tools/read.ts +2 -0
- package/src/tools/render-utils.ts +7 -1
- package/src/tools/skill-discovery.ts +39 -3
- package/src/tools/sqlite-reader.ts +63 -5
- package/src/utils/edit-mode.ts +2 -2
- package/src/utils/pasted-image-path.ts +15 -6
- package/src/utils/prompt-suggestion.ts +265 -0
- package/src/utils/shell-snapshot.ts +173 -63
- package/src/utils/sixel.ts +3 -3
- package/src/web/insane/bridge.ts +5 -1
- package/src/web/insane/url-guard.ts +140 -27
- package/src/web/scrapers/docs-rs.ts +30 -5
- package/src/web/scrapers/types.ts +19 -49
- package/src/web/scrapers/utils.ts +12 -26
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,73 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.11.8] - 2026-07-23
|
|
6
|
+
### Added
|
|
7
|
+
|
|
8
|
+
- Keybinding configuration now keeps portable canonical text while runtime shortcut labels render platform-native, including concise MacBook glyphs in inline surfaces and glyph-plus-text accessibility labels in `/hotkeys` and `/help`; `/hotkeys` remains authoritative for effective remapped bindings.
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Plans and delegated tasks carry an authoritative repository binding (`gjc.repository_binding.v1`). Ultragoal/ralplan stamp identity at creation; task lanes stamp omitted bindings from session cwd **before** agent discovery; ralplan stage writes and handoff re-entry enforce the seed binding; declared paths must stay under the bound root; task receipts include the resolved identity; linked isolation worktrees must match the source repository (#2901).
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Runtime MCP OAuth credentials are now bound to their authorized server origin and token endpoint, reject redirecting refresh responses, and fail closed when legacy or changed configuration lacks an exact match.
|
|
17
|
+
- `/share` now keeps full-session HTML in owner-private unpredictable staging until the share handler or `gh gist create` process has fully stopped; cancelling a blocked gist upload terminates and awaits that process before reporting cancellation and removing the export.
|
|
18
|
+
- Telegram notification daemon self-heals degraded on-disk state: permanently missing scan roots are pruned (so one deleted worktree no longer disables orphan-topic cleanup), and retained exact-unlink transition/placeholder artifacts are reaped on ownership acquire and each scan. `gjc daemon reload` can recover without manual filesystem surgery (#2956).
|
|
19
|
+
- On macOS, resuming a managed session no longer fails with `identity_mismatch` when the first write-append open changes only file `ctime` (e.g. APFS write-provenance / `com.apple.provenance`). `appendSync` allows a single bounded re-capture + retry when `dev`/`ino`/`size`/`mtime`/SHA-256 remain unchanged, and still rejects real content races and repeated ctime transitions (#2944).
|
|
20
|
+
- Interactive `/resume` / `AgentSession.switchSession()` now awaits verified managed `local://` legacy-root migration for the newly selected session before post-commit lifecycle proceeds, matching cold-start `createAgentSession()` readiness from #2797 so synchronous `local://` resolution no longer fails with "legacy migration must complete before path resolution" after a mid-session switch (#2925).
|
|
21
|
+
- Concurrent edits to the same file path are serialized through a path-scoped mutation lock (in-process always; durable cross-process lock on the real filesystem). Disjoint concurrent `applyPatch` / replace mutations no longer silently overwrite each other, and a commit-time content check rejects writers that observe a mid-flight change (#2900).
|
|
22
|
+
- Concurrent edits to the same file path are serialized through a path-scoped mutation lock (in-process always; durable cross-process lock on the real filesystem). Disjoint concurrent `applyPatch` / replace mutations no longer silently overwrite each other, and a commit-time content check rejects writers that observe a mid-flight change. The production `executePatchSingle` / `LspFileSystem` path explicitly enables the durable lock rather than inferring it from FileSystem object identity (#2900).
|
|
23
|
+
- Lean notification verbosity no longer floods remote clients with intermediate tool-turn `turn_stream` frames. Under `/lean`, the latest assistant answer is deferred until `agent_end` (idle); ask lead-ins still flush immediately before inline buttons, and `/verbose` keeps per-turn streaming (including opt-in live frames) (#2863).
|
|
24
|
+
- Ultragoal `complete-goals` no longer reports contradictory next actions when every incomplete story is `blocked` or `review_blocked`. Text and JSON now agree on `next-action=resolve-blockers` with blocked goal IDs/status; failed-only schedules surface `retry-failed`; `execute-goal` always includes a `goal_id` (#2903).
|
|
25
|
+
- Bound each Python tool bridge bearer capability to one active session registration, reject non-canonical or empty bearer credentials before lookup, and rotate authority whenever a retained session replaces its kernel.
|
|
26
|
+
- Deep Interview now scopes provider-facing `ask` metadata to the persisted workflow stage, including after durable session resume: Round 0 advertises only the locked `intent_contract` branch, later rounds advertise ordinary and `intent_review` branches, foreign workflow gates cannot seed recorder state, and wire-valid empty positive-round reviews reach canonical Zod diagnostics while malformed authority remains fail-closed.
|
|
27
|
+
- Bounded docs.rs rustdoc downloads, legacy cache reads, and gzip expansion before parsing or caching; transport-level content encoding is disabled and rejected so Bun cannot decompress outside the explicit output guard.
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- Added SDK v3 prompt reconciliation through `turn.prompt_status` with caller-supplied `clientRef` correlation, bounded live-session lifecycle retention, reconnect-safe lookup, and explicit ordered non-replay semantics for `turn.prompt` (#2930).
|
|
32
|
+
- Added `models.profiles.list` discovery of the effective built-in plus `models.yml` profile catalog, exact-ID pre-spawn validation that reloads host configuration for each lifecycle request, and structured `unknown_model_profile` / `model_profile_registry_error` details across lifecycle startup failures (#2931).
|
|
33
|
+
|
|
34
|
+
## [0.11.7] - 2026-07-22
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- `/btw` now opens an ephemeral multi-turn side chat: plain text continues the side thread until Esc returns to the main chat, while visible text-only context stays outside the main transcript and session observability/debug hooks and is scrubbed synchronously on close or abort.
|
|
38
|
+
- Added `statusLine.showActionHints` (default: `true`) to hide contextual action hints while retaining configured status-line segments.
|
|
39
|
+
- `skill_discovery` empty results now carry a `notice` when discovery config caused the emptiness — naming the exact disabled setting (`skills.enabled`, `skills.enablePiProject`, or `skills.enablePiUser`) and the `gjc config set` command to enable it. Previously a disabled config was indistinguishable from "no skills exist", silently hiding freshly written user/project skills.
|
|
40
|
+
- `generate_image` now supports Alibaba Bailian (Token Plan) `wan2.7-image` as an image provider: set `providers.image` to `alibaba` (or let auto-detect find `ALIBABA_TOKEN_PLAN_API_KEY` / a registered `alibaba-token-plan` key), override the model with `providers.imageModel` (e.g. `wan2.7-image-pro`). Short-lived OSS result URLs are downloaded immediately, and image editing works via input images.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
- Telegram `/session_recent` now retries one concurrently appended managed transcript and omits only candidates that remain unstable, preserving independently verified recent-session rows.
|
|
44
|
+
- Repeated byte-identical stale SDK broker locks no longer cause startup to loop when a prior tombstone exists.
|
|
45
|
+
- ACP session close now rotates idempotency keys for resumed attachment generations while retaining the same key across terminally uncertain close retries.
|
|
46
|
+
- ConversationStore now tolerates only unsupported Windows parent-directory durability errors after preserving temporary-file fsync and atomic rename.
|
|
47
|
+
- Ralplan no longer re-asks for execution approval when the user already explicitly named `ultragoal` or `team` in the current turn; that naming is the consent.
|
|
48
|
+
|
|
49
|
+
- Cron guidance now routes silent recurring polling and event-driven PR/CI watchers to `monitor`, because every cron firing starts a normal assistant turn and prompt wording cannot reliably suppress its response.
|
|
50
|
+
- Ordinary `ask` calls now normalize a provider-emitted `deepInterview: null` placeholder instead of misclassifying it as malformed Round-0 intent recovery data and rejecting it before coercion.
|
|
51
|
+
- SDK event replay authorization now refreshes the negotiated capability cache synchronously from the native-sanitized replay snapshot before host filtering, preserving initial and repeated-hello capability updates without trusting client frame claims.
|
|
52
|
+
|
|
53
|
+
- Plugin-bundle HTTP and SSE MCP requests now bind every connection to a validated public address and revalidate bounded redirects before following them.
|
|
54
|
+
- Deep Interview now exposes stage-specific provider-facing `ask` metadata: Round 0 advertises only the locked `intent_contract` branch, while later rounds advertise ordinary and `intent_review` branches, preventing strict-schema constraint stripping from making an invalid empty Round 0 review selectable.
|
|
55
|
+
- Deep Interview now exposes stage-specific provider-facing `ask` metadata, including after durable session resume: Round 0 advertises only the locked `intent_contract` branch, while later rounds advertise ordinary and `intent_review` branches. Remaining strict-schema constraints that providers cannot express fail closed with bounded corrective guidance instead of an opaque retry loop.
|
|
56
|
+
- Deep Interview now exposes stage-specific provider-facing `ask` metadata, including after durable session resume: Round 0 advertises only the locked `intent_contract` branch, while later rounds advertise ordinary and `intent_review` branches. Foreign workflow gates can no longer seed Deep Interview recorder state, and remaining strict-schema constraints that providers cannot express fail closed with bounded corrective guidance instead of an opaque retry loop.
|
|
57
|
+
- Documented that custom OpenAI-compatible models omit vision by default: when `input` is unset, GJC treats the model as text-only and strips images with `[image omitted: model does not support vision]`. Vision backends must set `input: [text, image]` in `models.yml`.
|
|
58
|
+
- Restored `/models` preset landing navigation after the Image Generation row and made compaction/pruning regression fixtures use an explicit 200K context boundary instead of a mutable provider descriptor default.
|
|
59
|
+
- Fixed Windows legacy session artifact migration by using native directory identity size, a traversable detached-path alias, and writable file handles for final durability sync.
|
|
60
|
+
- `gjc setup credentials` now auto-imports only OAuth credentials with a finite expiry strictly in the future. Expired or malformed-expiry discoveries remain visible as non-importable records, and existing imported credentials remain recoverable through `/login`.
|
|
61
|
+
- Resumed managed sessions now complete the verified legacy `local://` artifact migration before synchronous path resolution, preserving legacy scratch files instead of failing startup with a migration-order error.
|
|
62
|
+
- Corrected Telegram's uncertain lifecycle guidance so create, close, and resume commands describe their own possible outcome; close and resume no longer display the create-only duplicate-start warning.
|
|
63
|
+
- Telegram ask notifications now preserve the authoritative recommended choice from native asks and workflow gates, marking that option as `(Recommended)` in the message body without changing button indices or submitted answers.
|
|
64
|
+
- Telegram `/session_close` now fails closed when tmux disappearance cannot be confirmed, and publishes the managed owner verdict before locked terminal-state preservation so normal close finalization is not delayed behind that state path.
|
|
65
|
+
- Managed publication now fails closed on malformed, committed, or mutation-unknown native outcomes: it never retries or cleans a destination, and preserves bounded atomic-unavailable/durability diagnostics through managed startup (#2804).
|
|
66
|
+
|
|
67
|
+
## [0.11.5] - 2026-07-20
|
|
68
|
+
### Fixed
|
|
69
|
+
|
|
70
|
+
- Internal transcript PageUp/PageDown now keeps moving through tool-output and other non-semantic rows instead of intermittently becoming a no-op after scrolling through anchored conversation content.
|
|
71
|
+
|
|
5
72
|
## [0.11.5] - 2026-07-20
|
|
6
73
|
### Changed
|
|
7
74
|
- Telegram live-message streaming now defaults on for configured Telegram notifications through one durable global preference, supports live in-session preference refresh without weakening redaction, and keeps Discord and Slack finalized-only; process environment overrides remain available.
|
|
@@ -10,14 +77,27 @@
|
|
|
10
77
|
- Session files now use v5 authority records. Do not roll back to a v4 writer after v5 session data has been created: v4 writers cannot preserve independent MCP and discovered-built-in selections.
|
|
11
78
|
|
|
12
79
|
### Fixed
|
|
80
|
+
- SQLite `read` raw queries now accept exactly one explicit `SELECT` statement, reject comments and statement tails before opening the database, recheck the invariant at execution, and enable SQLite query-only mode as defense in depth.
|
|
81
|
+
- Direct HTTP(S) marketplace catalogs now use connection-bound public-address validation, bounded redirects, and a 2 MiB response limit before parsing or caching.
|
|
82
|
+
- Bounded MCP list pagination by cursor-cycle, page-count, and item-count limits while preserving abort and cache behavior.
|
|
83
|
+
- Shell environment snapshots now use one process-private temporary root with exclusive private files, trusted cache validation, and whole-root shutdown cleanup instead of a predictable shared directory.
|
|
84
|
+
- Python kernel startup now materializes its bundled runner in one process-private temporary directory with exclusive file creation instead of consulting a predictable shared cache path.
|
|
85
|
+
- SSH command construction and discovery now reject malformed destinations with unsafe prefixes or control characters while preserving normal host, address, username, and alias forms.
|
|
86
|
+
- Bounded MCP resource URI and template matching now skips oversized templates and uses deterministic literal-segment matching instead of dynamically constructed regular expressions.
|
|
13
87
|
- Fixed the `subagent` tool's `resume` action silently swallowing manager failures. Resume outcomes other than `context_unavailable`/`not_found` (`no_runner`, `resume_failed`, `owner_shutdown_in_progress`, …) were dropped and the stale terminal subagent snapshot was returned as if the resume had succeeded, so ralplan's re-review loop believed the persisted Planner had resumed when it had not and never fell back correctly. The resume action now surfaces every non-ok reason (matching the `steer` branch), and the task resume runner marks a resumed subprocess that aborted or exited non-zero as a `failed` job (carrying its rendered failure summary) instead of reporting it `completed`.
|
|
88
|
+
- Daemon timeout flags now reject missing, malformed, non-positive, fractional, whitespace-containing, and unsafe integer values before daemon command side effects instead of partially parsing them.
|
|
14
89
|
- Hardened standalone HTML session exports so session identifiers, provider/model labels, and embedded raster images remain confined to their intended HTML contexts; malformed image payloads are omitted.
|
|
90
|
+
- Restored legacy `gjc coordinator-mcp` and root `gjc --team --team-size <n>` routing to their native MCP and team commands, with strict team-size validation that prevents malformed legacy flags from selecting team lifecycle actions.
|
|
91
|
+
- Fixed the `subagent` tool's `resume` action silently swallowing manager failures. Resume outcomes other than `context_unavailable`/`not_found` (`no_runner`, `resume_failed`, `owner_shutdown_in_progress`, …) were dropped and the stale terminal subagent snapshot was returned as if the resume had succeeded, so ralplan's re-review loop believed the persisted Planner had resumed when it had not and never fell back correctly. The resume action now surfaces every non-ok reason (matching the `steer` branch), and the task resume runner marks a resumed subprocess that aborted or exited non-zero as a `failed` job (preserving its error text) instead of reporting it `completed`.
|
|
92
|
+
- OpenRouter image generation now retrieves provider-returned HTTP(S) images only through connection-bound public-address validation, revalidates bounded redirects, and enforces image content-type and byte limits before buffering.
|
|
93
|
+
- Fixed session resume crashing with `TypeError: undefined is not an object (evaluating 'usage.input')`, and hardened both usage-aggregation paths against silent total corruption, when a persisted transcript contained a parseable-but-malformed assistant or `task` tool-result entry — as produced by torn concurrent multi-writer / NFS appends. `parseSessionEntries` accepts any parseable JSON, so a corrupt `usage` could be absent, `{}` (NaN totals), numeric strings (`"0" + "10"` → `"010"`), negative (silently reducing totals), a present-but-null/incomplete `premiumRequests`/`cost`, a non-record `cost` (e.g. an array), or cumulatively overflow to `Infinity`. Both the resume (`#buildIndex`) and runtime append (`#appendEntry`) paths now route through one shared validator that requires every usage bucket and `cost.total` to be finite non-negative numbers (defaulting only truly-absent `premiumRequests`/`cost`, and rejecting present-but-null/incomplete fields rather than zeroing them) and rejects any record that would overflow cumulative totals, skipping and reporting the malformed record instead of poisoning every `getUsageStatistics()` consumer.
|
|
15
94
|
- Fixed the `subagent` tool's `resume` failing immediately for a persisted ralplan Planner. A subagent that finishes by calling `yield` (or is torn down right after a tool executes) left the saved session ending on an assistant `toolCall` with no matching `toolResult`; replaying that history on resume produced an invalid provider request (a `tool_use` not followed by a `tool_result`) that failed the resumed turn at once. Resumed transcripts now reconcile any trailing unpaired tool call with a synthesized placeholder result before the first resumed prompt. Additionally, a failed/no-op resume leg no longer overwrites the prior run's success output artifact with an empty file.
|
|
16
95
|
- Fixed persisted subagent resumes being rejected before session reconstruction with `Session is inside managed storage but is not an authorized managed candidate`. Child session files intentionally live inside their parent session's artifact directory and are not top-level resume-picker candidates; the task resume path now explicitly opens the exact internally registered child session directory while retaining strict candidate validation for user-selected managed sessions.
|
|
17
96
|
- Managed session resume scans now read only a bounded no-follow header prefix from foreign workspace transcripts, while fully recapturing and revalidating owned candidates before granting migration, receipt, or deletion authority.
|
|
18
97
|
- Secret obfuscation now uses authenticated process-local placeholders that remain stable within a running process and opaque after restart.
|
|
19
98
|
- Workspace-wide LSP diagnostics now fail closed instead of launching build or typecheck subprocesses outside execution-tool authorization; concrete-file and glob diagnostics remain available.
|
|
20
99
|
- Clean, side-effect-free canonical provider stream first-event and next-event watchdog failures now retry on bare single-model legacy sessions; explicit legacy disable, managed fallback, and fail-closed structured, non-watchdog, or unsafe attempts are unchanged.
|
|
100
|
+
- Remote MCP HTTP and SSE responses now enforce finite content and message budgets before parsing or dispatch.
|
|
21
101
|
- Added fail-closed managed tmux owner SIGABRT recovery: exact-child supervisor receipts and pre-CLI admission now bind replacement ownership, strict durable Ultragoal/transcript evidence reconciles terminal child yields over stale nonterminal runtime state, recovery hydration remains write-free until an ownership fence, and hostile identity, corruption, concurrency, and path boundaries preserve dirty product files (#2681).
|
|
22
102
|
- Restored non-root startup on Synology and other Linux container filesystems that definitively report POSIX ACL storage unsupported for managed session paths; explicit `--session-dir` semantics and all owner, mode, type, symlink, identity, and scope-binding checks remain unchanged and fail closed (#2687).
|
|
23
103
|
- Preserved access to legal SQLite table names beginning with `sqlite` but not reserved `sqlite_`.
|
|
@@ -54,11 +134,19 @@
|
|
|
54
134
|
### Changed
|
|
55
135
|
- The `read` tool is now receipt-by-default: bare and unparseable reads return a bounded receipt (≤50 lines / 10 KiB) with a re-read-with-selector footer only when truncated, `:raw` stays pure verbatim up to a max(2 MiB, spill threshold) ceiling, structural summaries cap unit-granularly at 20 KiB while preserving elision and source-recovery footers, and directories are byte/line capped and never spill. Only an explicit full-content selector (`:raw` or an explicit range) with real content is spill-eligible. Subagent previews now enforce a real byte/code-point cap via per-shape render budgets plus a shape-aware artifact-eligibility tag enforced centrally in output-meta.
|
|
56
136
|
|
|
137
|
+
|
|
138
|
+
### Fixed
|
|
139
|
+
- Ultragoal objective ownership no longer treats arbitrary strings that merely mention `goals.json`/`ledger.jsonl` as Ultragoal-owned; only the exact default aggregate objective qualifies for the known-objective path.
|
|
140
|
+
|
|
57
141
|
### Fixed
|
|
58
142
|
- Workflow-state handoff no longer self-locks the active-state cache, so a same-turn skill handoff (e.g. ultragoal → ralplan) completes instead of stalling behind a lock the handoff itself still holds (#2638).
|
|
59
143
|
- SDK host shutdown now retries a failed broker unregister instead of short-circuiting with a stale broker-index entry, while retained startup-cleanup owner-release failures remain isolated from the red extension-error path (#2625).
|
|
60
144
|
- Non-TTY launches now fail fast when stdin is empty and automatically use print mode for positional prompts and `@file` inputs, preventing orphaned interactive TUI processes (#2507).
|
|
61
145
|
|
|
146
|
+
### Fixed
|
|
147
|
+
|
|
148
|
+
- The command palette now labels `app.session.fork` as “Branch from message,” matching its user-message selector and `AgentSession.branch()` behavior while preserving the existing action ID for keybinding compatibility.
|
|
149
|
+
|
|
62
150
|
## [0.11.2] - 2026-07-19
|
|
63
151
|
|
|
64
152
|
### Changed
|
|
@@ -83,6 +171,7 @@
|
|
|
83
171
|
### Fixed
|
|
84
172
|
- Repository LSP configuration can no longer define process-affecting server behavior: project files may control declarative matching, activation, and capabilities, but cannot set launch fields, initialization options, or opaque server settings. Trusted canonical user configuration outside the project retains those overrides; project-controlled plugin roots and the quarantined `--plugin-dir` surface cannot inject them. Automatic discovery uses trusted external executables and rejects repository-owned lexical paths as well as symlink-resolved project binaries; status uses the session cwd as its lspmux trust root. `GJC_DISABLE_LSPMUX=1` is the canonical opt-out and `PI_DISABLE_LSPMUX=1` is a supported compatibility alias; either truthy value disables lspmux probing and wrapping.
|
|
85
173
|
- Palette slash commands now run only from an empty composer; drafts are never touched.
|
|
174
|
+
- Individual default and named-role model assignments now keep the model selector open for consecutive choices, while batch assignments retain their existing close-on-success behavior.
|
|
86
175
|
- Aborting a session without an enabled active goal no longer suppresses the first reminder when a goal is activated later; active-goal abort suppression is one-shot, goal-owned, and clears across inactive or replacement-goal transitions (#2436).
|
|
87
176
|
- Palette slash submissions no longer clear or rewrite composer text, cursor state, history, or pending images created while an asynchronous input hook is awaiting; canonical keyboard submission cleanup remains unchanged (#2441).
|
|
88
177
|
- Dead browser-tab recovery now expires descriptors without releasing replacement, revived, or differently owned tabs, while exactly-once teardown closes stale targets and releases browser holds without refcount underflow (#2437).
|
|
@@ -108,6 +197,9 @@
|
|
|
108
197
|
### Fixed
|
|
109
198
|
- Connected MCP server instructions now remain untrusted user-role data instead of entering the cached system prompt; hostile file paths, working directories, and workspace-tree metadata are structurally encoded, and volatile project context is removed from durable session history between requests.
|
|
110
199
|
- Restored the strict G002 public-surface quarantine by removing the default README advertisement for the private coordinator MCP runtime.
|
|
200
|
+
### Added
|
|
201
|
+
|
|
202
|
+
- Added opt-in prompt suggestions (Claude Code-style ghost-text autocomplete): with the `promptSuggestions` setting enabled, a smol-model prediction of your likely next prompt renders as dim ghost text in the empty composer after each agent turn; Tab accepts it, typing dismisses it, and a new turn clears it. Predictions are heuristically gated (silence on evaluative/meta/agent-voice/overlong output) and never generated while the composer has text or a turn is streaming.
|
|
111
203
|
|
|
112
204
|
## [0.11.1] - 2026-07-16
|
|
113
205
|
|
|
@@ -17,26 +17,16 @@ export declare function loadCapability<T>(capabilityId: string, options?: LoadOp
|
|
|
17
17
|
* Call this once on startup to enable persistent provider state.
|
|
18
18
|
*/
|
|
19
19
|
export declare function initializeWithSettings(activeSettings: Settings): void;
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
export declare function
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
*/
|
|
27
|
-
export declare function
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
*/
|
|
31
|
-
export declare function isProviderEnabled(providerId: string): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Get list of all disabled provider IDs.
|
|
34
|
-
*/
|
|
35
|
-
export declare function getDisabledProviders(): string[];
|
|
36
|
-
/**
|
|
37
|
-
* Set disabled providers from a list (replaces current set).
|
|
38
|
-
*/
|
|
39
|
-
export declare function setDisabledProviders(providerIds: string[]): void;
|
|
20
|
+
/** Disable a provider for the supplied session settings. */
|
|
21
|
+
export declare function disableProvider(providerId: string, activeSettings?: Settings): void;
|
|
22
|
+
/** Enable a provider for the supplied session settings. */
|
|
23
|
+
export declare function enableProvider(providerId: string, activeSettings?: Settings): void;
|
|
24
|
+
/** Check whether a provider is enabled by the supplied session settings. */
|
|
25
|
+
export declare function isProviderEnabled(providerId: string, activeSettings?: Settings | undefined): boolean;
|
|
26
|
+
/** Get disabled providers from the supplied session settings. */
|
|
27
|
+
export declare function getDisabledProviders(activeSettings?: Settings | undefined): string[];
|
|
28
|
+
/** Replace disabled providers for the supplied session settings. */
|
|
29
|
+
export declare function setDisabledProviders(providerIds: string[], activeSettings?: Settings): void;
|
|
40
30
|
/**
|
|
41
31
|
* Get a capability definition (for introspection).
|
|
42
32
|
*/
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* paths like `.gjc`, `.gemini`, or `.vscode`, they simply ask for `load("mcps")`
|
|
6
6
|
* and get back a unified array of MCP servers.
|
|
7
7
|
*/
|
|
8
|
+
import type { Settings } from "../config/settings";
|
|
8
9
|
/**
|
|
9
10
|
* Context passed to every provider loader.
|
|
10
11
|
*/
|
|
@@ -64,6 +65,8 @@ export interface LoadOptions {
|
|
|
64
65
|
includeDisabled?: boolean;
|
|
65
66
|
/** Explicit disabled extension IDs to apply instead of settings. */
|
|
66
67
|
disabledExtensions?: string[];
|
|
68
|
+
/** Session settings whose provider policy applies to this load. */
|
|
69
|
+
settings?: Settings;
|
|
67
70
|
}
|
|
68
71
|
/**
|
|
69
72
|
* Source metadata attached to every loaded item.
|
package/dist/types/cli/args.d.ts
CHANGED
|
@@ -31,10 +31,10 @@ export default class Daemon extends Command {
|
|
|
31
31
|
force: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
32
32
|
description: string;
|
|
33
33
|
};
|
|
34
|
-
"graceful-timeout-ms": import("@gajae-code/utils/cli").FlagDescriptor<"
|
|
34
|
+
"graceful-timeout-ms": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
35
35
|
description: string;
|
|
36
36
|
};
|
|
37
|
-
"kill-timeout-ms": import("@gajae-code/utils/cli").FlagDescriptor<"
|
|
37
|
+
"kill-timeout-ms": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
38
38
|
description: string;
|
|
39
39
|
};
|
|
40
40
|
"spawn-if-stopped": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
@@ -15,17 +15,35 @@ export declare function runSessionHost(timing?: {
|
|
|
15
15
|
cwd?: string;
|
|
16
16
|
processIncarnation?: (pid: number) => string | undefined;
|
|
17
17
|
}): Promise<void>;
|
|
18
|
+
export type SdkInternalArgv = {
|
|
19
|
+
action: "broker-internal";
|
|
20
|
+
agentDir: string;
|
|
21
|
+
} | {
|
|
22
|
+
action: "session-host-internal";
|
|
23
|
+
};
|
|
24
|
+
/** Parses the exact private argv contracts used by SDK child-process spawns. */
|
|
25
|
+
export declare function parseSdkInternalArgv(argv: readonly string[]): SdkInternalArgv;
|
|
18
26
|
export default class Sdk extends Command {
|
|
19
27
|
static description: string;
|
|
20
28
|
static hidden: boolean;
|
|
29
|
+
static delegateHelp: boolean;
|
|
21
30
|
static args: {
|
|
22
31
|
action: import("@gajae-code/utils/cli").ArgDescriptor & {
|
|
23
|
-
required:
|
|
32
|
+
required: false;
|
|
24
33
|
options: string[];
|
|
25
34
|
};
|
|
26
35
|
};
|
|
27
36
|
static flags: {
|
|
28
|
-
|
|
37
|
+
stdio: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
socket: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
session: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
"pending-ceiling": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
29
47
|
description: string;
|
|
30
48
|
};
|
|
31
49
|
};
|
|
@@ -279,7 +279,7 @@ export declare const KEYBINDINGS: {
|
|
|
279
279
|
};
|
|
280
280
|
readonly "app.session.fork": {
|
|
281
281
|
readonly defaultKeys: [];
|
|
282
|
-
readonly description: "
|
|
282
|
+
readonly description: "Branch from message";
|
|
283
283
|
};
|
|
284
284
|
readonly "app.session.resume": {
|
|
285
285
|
readonly defaultKeys: [];
|
|
@@ -378,6 +378,10 @@ declare function migrateKeybindingsConfigFile(agentDir: string): void;
|
|
|
378
378
|
export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
379
379
|
#private;
|
|
380
380
|
constructor(userBindings?: KeybindingsConfig, configPath?: string);
|
|
381
|
+
/**
|
|
382
|
+
* Replace user bindings only after canonical grammar validation.
|
|
383
|
+
*/
|
|
384
|
+
setUserBindings(userBindings: KeybindingsConfig): void;
|
|
381
385
|
/**
|
|
382
386
|
* Create from config file at agentDir/keybindings.json.
|
|
383
387
|
*/
|
|
@@ -386,6 +390,11 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
|
386
390
|
* Create an in-memory keybindings manager without file persistence.
|
|
387
391
|
*/
|
|
388
392
|
static inMemory(userBindings?: KeybindingsConfig): KeybindingsManager;
|
|
393
|
+
/**
|
|
394
|
+
* Set the default display context used by composed surfaces that do not
|
|
395
|
+
* supply an explicit context.
|
|
396
|
+
*/
|
|
397
|
+
setDisplayContext(context: KeyDisplayContext): void;
|
|
389
398
|
/**
|
|
390
399
|
* Reload keybindings from the config file.
|
|
391
400
|
*/
|
|
@@ -397,9 +406,30 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
|
397
406
|
/**
|
|
398
407
|
* Get display string for a keybinding (e.g., "ctrl+c/escape").
|
|
399
408
|
*/
|
|
400
|
-
getDisplayString(keybinding: Keybinding): string;
|
|
409
|
+
getDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string;
|
|
410
|
+
/**
|
|
411
|
+
* Get an accessibility-oriented display string for help surfaces.
|
|
412
|
+
* Darwin chords include both the concise glyphs and expanded key names.
|
|
413
|
+
*/
|
|
414
|
+
getAccessibleDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string;
|
|
415
|
+
/**
|
|
416
|
+
* Format a fixed key chord using this manager's display context.
|
|
417
|
+
*/
|
|
418
|
+
formatKeyHint(key: string): string;
|
|
419
|
+
/**
|
|
420
|
+
* Format a fixed key chord for accessibility-oriented help surfaces.
|
|
421
|
+
*/
|
|
422
|
+
formatAccessibleKeyHint(key: string): string;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Key hint formatting utilities for UI labels.
|
|
426
|
+
*/
|
|
427
|
+
export interface KeyDisplayContext {
|
|
428
|
+
platform: NodeJS.Platform;
|
|
401
429
|
}
|
|
402
|
-
export declare function formatKeyHint(key:
|
|
403
|
-
export declare function
|
|
430
|
+
export declare function formatKeyHint(key: string, context?: KeyDisplayContext): string;
|
|
431
|
+
export declare function formatAccessibleKeyHint(key: string, context?: KeyDisplayContext): string;
|
|
432
|
+
export declare function formatKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string;
|
|
433
|
+
export declare function formatAccessibleKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string;
|
|
404
434
|
export type { Keybinding, KeybindingsConfig, KeyId };
|
|
405
435
|
export { migrateKeybindingsConfigFile };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
2
2
|
import type { Api, Model } from "@gajae-code/ai";
|
|
3
3
|
import type { AgentSession } from "../session/agent-session";
|
|
4
|
+
export { resolveModelProfileName } from "./model-profile-contract";
|
|
4
5
|
import { type GjcModelAssignmentTargetId, type ModelRegistry } from "./model-registry";
|
|
5
6
|
import { type ModelSelectorValue } from "./model-selector-value";
|
|
6
7
|
import type { Settings } from "./settings";
|
|
@@ -17,7 +18,9 @@ type ModelProfileActivationSession = Pick<AgentSession, "model" | "thinkingLevel
|
|
|
17
18
|
};
|
|
18
19
|
export interface PrepareModelProfileActivationOptions {
|
|
19
20
|
session: ModelProfileActivationSession;
|
|
20
|
-
modelRegistry: Pick<ModelRegistry, "getModelProfile" | "getModelProfiles" | "getAvailableModelProfileNames" | "getApiKeyForProvider" | "getAll" | "resolveCanonicalModel" | "getCanonicalVariants" | "getCanonicalId"
|
|
21
|
+
modelRegistry: Pick<ModelRegistry, "getModelProfile" | "getModelProfiles" | "getAvailableModelProfileNames" | "getApiKeyForProvider" | "getAll" | "resolveCanonicalModel" | "getCanonicalVariants" | "getCanonicalId"> & {
|
|
22
|
+
getError?: ModelRegistry["getError"];
|
|
23
|
+
};
|
|
21
24
|
settings: Pick<Settings, "get">;
|
|
22
25
|
profileName: string;
|
|
23
26
|
}
|
|
@@ -78,7 +81,6 @@ export declare class ModelProfileCredentialError extends Error {
|
|
|
78
81
|
constructor(profileLabel: string, providers: readonly string[]);
|
|
79
82
|
}
|
|
80
83
|
export declare function formatModelProfileCredentialError(profileLabel: string, providers: readonly string[]): string;
|
|
81
|
-
export declare function resolveModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>): string;
|
|
82
84
|
export declare function prepareModelProfileActivation(options: PrepareModelProfileActivationOptions): Promise<PreparedModelProfileActivation>;
|
|
83
85
|
export declare function applyPreparedModelProfileActivation(prepared: PreparedModelProfileActivation, options?: ApplyModelProfileActivationOptions): Promise<void>;
|
|
84
86
|
export interface MaterializeModelProfileForDeletionResult {
|
|
@@ -99,4 +101,3 @@ export declare function restoreMaterializedModelProfileForDeletion(options: {
|
|
|
99
101
|
snapshot: MaterializeModelProfileForDeletionResult;
|
|
100
102
|
}): Promise<void>;
|
|
101
103
|
export declare function activateModelProfile(options: PrepareModelProfileActivationOptions, applyOptions?: ApplyModelProfileActivationOptions): Promise<void>;
|
|
102
|
-
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ModelProfileDefinition } from "./model-profiles";
|
|
2
|
+
export declare const MODEL_PROFILE_DISCOVERY_QUERY = "models.profiles.list";
|
|
3
|
+
export declare const MODEL_PROFILE_ERROR_DETAIL_MAX_BYTES = 2048;
|
|
4
|
+
export interface ModelProfileCatalogItem {
|
|
5
|
+
id: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
source: "builtin" | "configured";
|
|
8
|
+
}
|
|
9
|
+
export interface UnknownModelProfileDetails {
|
|
10
|
+
requestedProfile: string;
|
|
11
|
+
availableProfiles: string[];
|
|
12
|
+
discoveryQuery: typeof MODEL_PROFILE_DISCOVERY_QUERY;
|
|
13
|
+
}
|
|
14
|
+
export interface ModelProfileRegistryErrorDetails {
|
|
15
|
+
requestedProfile?: string;
|
|
16
|
+
availableProfiles: [];
|
|
17
|
+
discoveryQuery: typeof MODEL_PROFILE_DISCOVERY_QUERY;
|
|
18
|
+
}
|
|
19
|
+
export type ModelProfileErrorDetails = UnknownModelProfileDetails | ModelProfileRegistryErrorDetails;
|
|
20
|
+
export type ModelProfileErrorCode = "unknown_model_profile" | "model_profile_registry_error";
|
|
21
|
+
export declare class UnknownModelProfileError extends Error {
|
|
22
|
+
readonly code: "unknown_model_profile";
|
|
23
|
+
readonly details: UnknownModelProfileDetails;
|
|
24
|
+
constructor(requestedProfile: string, profiles: ReadonlyMap<string, unknown>);
|
|
25
|
+
}
|
|
26
|
+
export declare class ModelProfileRegistryError extends Error {
|
|
27
|
+
readonly code: "model_profile_registry_error";
|
|
28
|
+
readonly details: ModelProfileRegistryErrorDetails;
|
|
29
|
+
constructor(requestedProfile?: string);
|
|
30
|
+
}
|
|
31
|
+
export declare function resolveModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>): string;
|
|
32
|
+
export declare function validateModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>, registryError?: unknown): string;
|
|
33
|
+
export declare function projectModelProfileCatalog(profiles: ReadonlyMap<string, ModelProfileDefinition>, registryError?: unknown): ModelProfileCatalogItem[];
|
|
34
|
+
export declare function isModelProfileError(value: unknown): value is {
|
|
35
|
+
code: ModelProfileErrorCode;
|
|
36
|
+
message: string;
|
|
37
|
+
details: ModelProfileErrorDetails;
|
|
38
|
+
};
|
|
@@ -937,6 +937,15 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
937
937
|
readonly type: "boolean";
|
|
938
938
|
readonly default: true;
|
|
939
939
|
};
|
|
940
|
+
readonly "statusLine.showActionHints": {
|
|
941
|
+
readonly type: "boolean";
|
|
942
|
+
readonly default: true;
|
|
943
|
+
readonly ui: {
|
|
944
|
+
readonly tab: "appearance";
|
|
945
|
+
readonly label: "Status Line Action Hints";
|
|
946
|
+
readonly description: "Show contextual keyboard shortcuts in the status line";
|
|
947
|
+
};
|
|
948
|
+
};
|
|
940
949
|
readonly "statusLine.leftSegments": {
|
|
941
950
|
readonly type: "array";
|
|
942
951
|
readonly default: StatusLineSegmentId[];
|
|
@@ -1552,6 +1561,15 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
1552
1561
|
readonly description: "Suggest emojis from `:name:` shortcodes and expand text emoticons like `:D` or `:-)`";
|
|
1553
1562
|
};
|
|
1554
1563
|
};
|
|
1564
|
+
readonly promptSuggestions: {
|
|
1565
|
+
readonly type: "boolean";
|
|
1566
|
+
readonly default: false;
|
|
1567
|
+
readonly ui: {
|
|
1568
|
+
readonly tab: "interaction";
|
|
1569
|
+
readonly label: "Prompt Suggestions";
|
|
1570
|
+
readonly description: "Predict your likely next prompt after each turn (smol-model call) and show it as ghost text; Tab accepts";
|
|
1571
|
+
};
|
|
1572
|
+
};
|
|
1555
1573
|
readonly "startup.quiet": {
|
|
1556
1574
|
readonly type: "boolean";
|
|
1557
1575
|
readonly default: false;
|
|
@@ -2915,8 +2933,8 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
2915
2933
|
readonly default: false;
|
|
2916
2934
|
readonly ui: {
|
|
2917
2935
|
readonly tab: "tools";
|
|
2918
|
-
readonly label: "Insane Search Fallback";
|
|
2919
|
-
readonly description: "
|
|
2936
|
+
readonly label: "Insane Search Fallback (Compatibility)";
|
|
2937
|
+
readonly description: "Compatibility-only preference. Remote renderer fallback stays disabled because it cannot preserve validated per-hop network routing.";
|
|
2920
2938
|
};
|
|
2921
2939
|
};
|
|
2922
2940
|
readonly "github.enabled": {
|
|
@@ -3777,20 +3795,20 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
3777
3795
|
};
|
|
3778
3796
|
readonly "providers.image": {
|
|
3779
3797
|
readonly type: "enum";
|
|
3780
|
-
readonly values: readonly ["auto", "openai", "gemini", "openrouter", "antigravity"];
|
|
3798
|
+
readonly values: readonly ["auto", "openai", "gemini", "openrouter", "antigravity", "alibaba", "custom"];
|
|
3781
3799
|
readonly default: "auto";
|
|
3782
3800
|
readonly ui: {
|
|
3783
3801
|
readonly tab: "providers";
|
|
3784
|
-
readonly label: "Image
|
|
3785
|
-
readonly description: "Provider for image generation tool";
|
|
3802
|
+
readonly label: "Image Generation";
|
|
3803
|
+
readonly description: "Provider and model for image generation tool";
|
|
3786
3804
|
readonly options: readonly [{
|
|
3787
3805
|
readonly value: "auto";
|
|
3788
3806
|
readonly label: "Auto";
|
|
3789
|
-
readonly description: "Priority: GPT model image tool > Antigravity > OpenRouter > Gemini";
|
|
3807
|
+
readonly description: "Priority: GPT model image tool > Antigravity > OpenRouter > Gemini > Alibaba";
|
|
3790
3808
|
}, {
|
|
3791
3809
|
readonly value: "openai";
|
|
3792
3810
|
readonly label: "OpenAI";
|
|
3793
|
-
readonly description: "Uses
|
|
3811
|
+
readonly description: "Uses gpt-image-2 via OpenAI Responses/Codex";
|
|
3794
3812
|
}, {
|
|
3795
3813
|
readonly value: "gemini";
|
|
3796
3814
|
readonly label: "Gemini";
|
|
@@ -3803,9 +3821,53 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
3803
3821
|
readonly value: "antigravity";
|
|
3804
3822
|
readonly label: "Antigravity";
|
|
3805
3823
|
readonly description: "Requires login with google-antigravity";
|
|
3824
|
+
}, {
|
|
3825
|
+
readonly value: "alibaba";
|
|
3826
|
+
readonly label: "Alibaba Bailian";
|
|
3827
|
+
readonly description: "Requires ALIBABA_TOKEN_PLAN_API_KEY (wan2.7-image via Token Plan)";
|
|
3828
|
+
}, {
|
|
3829
|
+
readonly value: "custom";
|
|
3830
|
+
readonly label: "Custom";
|
|
3831
|
+
readonly description: "OpenAI-compatible endpoint (set providers.imageCustomUrl)";
|
|
3806
3832
|
}];
|
|
3807
3833
|
};
|
|
3808
3834
|
};
|
|
3835
|
+
readonly "providers.imageModel": {
|
|
3836
|
+
readonly type: "string";
|
|
3837
|
+
readonly default: undefined;
|
|
3838
|
+
readonly ui: {
|
|
3839
|
+
readonly tab: "providers";
|
|
3840
|
+
readonly label: "Image Model";
|
|
3841
|
+
readonly description: "Override the default image generation model for the selected provider";
|
|
3842
|
+
};
|
|
3843
|
+
};
|
|
3844
|
+
readonly "providers.imageCustomUrl": {
|
|
3845
|
+
readonly type: "string";
|
|
3846
|
+
readonly default: undefined;
|
|
3847
|
+
readonly ui: {
|
|
3848
|
+
readonly tab: "providers";
|
|
3849
|
+
readonly label: "Image Custom URL";
|
|
3850
|
+
readonly description: "Base URL for custom OpenAI-compatible image endpoint";
|
|
3851
|
+
};
|
|
3852
|
+
};
|
|
3853
|
+
readonly "providers.imageCustomKey": {
|
|
3854
|
+
readonly type: "string";
|
|
3855
|
+
readonly default: undefined;
|
|
3856
|
+
readonly ui: {
|
|
3857
|
+
readonly tab: "providers";
|
|
3858
|
+
readonly label: "Image Custom API Key";
|
|
3859
|
+
readonly description: "API key for custom OpenAI-compatible image endpoint";
|
|
3860
|
+
};
|
|
3861
|
+
};
|
|
3862
|
+
readonly "providers.imageCustomKeyEnv": {
|
|
3863
|
+
readonly type: "string";
|
|
3864
|
+
readonly default: undefined;
|
|
3865
|
+
readonly ui: {
|
|
3866
|
+
readonly tab: "providers";
|
|
3867
|
+
readonly label: "Image Custom API Key Env";
|
|
3868
|
+
readonly description: "Environment variable name holding the API key for custom image endpoint";
|
|
3869
|
+
};
|
|
3870
|
+
};
|
|
3809
3871
|
readonly "providers.kimiApiFormat": {
|
|
3810
3872
|
readonly type: "enum";
|
|
3811
3873
|
readonly values: readonly ["openai", "anthropic"];
|
|
@@ -4131,6 +4193,7 @@ export interface StatusLineSettings {
|
|
|
4131
4193
|
maxRows: number;
|
|
4132
4194
|
showHookStatus: boolean;
|
|
4133
4195
|
showSkillHud: boolean;
|
|
4196
|
+
showActionHints: boolean;
|
|
4134
4197
|
leftSegments: StatusLineSegmentId[];
|
|
4135
4198
|
rightSegments: StatusLineSegmentId[];
|
|
4136
4199
|
segmentOptions: Record<string, unknown>;
|
|
@@ -41,11 +41,24 @@ export interface ApplyPatchOptions {
|
|
|
41
41
|
fuzzyThreshold?: number;
|
|
42
42
|
allowFuzzy?: boolean;
|
|
43
43
|
fs?: FileSystem;
|
|
44
|
+
/**
|
|
45
|
+
* When false, skip durable cross-process file locks (in-process path mutex
|
|
46
|
+
* still serializes). Defaults to true only for the real `defaultFileSystem`
|
|
47
|
+
* (or when `fs` is omitted). Disk-backed adapters that are not
|
|
48
|
+
* `defaultFileSystem` (notably production `LspFileSystem` via
|
|
49
|
+
* `executePatchSingle`) MUST pass `crossProcessLock: true` explicitly —
|
|
50
|
+
* object identity is not a durable-lock capability probe.
|
|
51
|
+
*/
|
|
52
|
+
crossProcessLock?: boolean;
|
|
44
53
|
}
|
|
45
54
|
/** Default filesystem implementation using Bun APIs */
|
|
46
55
|
export declare const defaultFileSystem: FileSystem;
|
|
47
56
|
/**
|
|
48
57
|
* Apply a patch operation to the filesystem.
|
|
58
|
+
*
|
|
59
|
+
* Concurrent mutations of the same absolute path are serialized (in-process always;
|
|
60
|
+
* cross-process file lock when using the real filesystem) so disjoint concurrent
|
|
61
|
+
* edits cannot silently overwrite each other (#2900).
|
|
49
62
|
*/
|
|
50
63
|
export declare function applyPatch(input: PatchInput, options: ApplyPatchOptions): Promise<ApplyPatchResult>;
|
|
51
64
|
/**
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type FileLockOptions } from "../config/file-lock";
|
|
2
|
+
export type EditPathMutationOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* When true (default), also acquire a durable cross-process file lock.
|
|
5
|
+
* Disable for injectible/in-memory filesystem tests that do not touch disk.
|
|
6
|
+
*/
|
|
7
|
+
crossProcess?: boolean;
|
|
8
|
+
fileLock?: FileLockOptions;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Run `fn` while holding exclusive mutation rights for every absolute path.
|
|
12
|
+
* Paths are locked in lexicographic order to avoid deadlocks on multi-path ops
|
|
13
|
+
* (e.g. rename source + destination).
|
|
14
|
+
*/
|
|
15
|
+
export declare function withEditPathMutation<T>(absolutePaths: readonly string[], fn: () => Promise<T>, options?: EditPathMutationOptions): Promise<T>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RunnerScriptCache {
|
|
2
|
+
ensureRunnerScript(): Promise<string>;
|
|
3
|
+
cleanup(): Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
export declare function createRunnerScriptCache(tempRoot: string): RunnerScriptCache;
|
|
6
|
+
/** @internal Test-only initializer for isolated artifact assertions. */
|
|
7
|
+
export declare function createRunnerScriptInitializer(tempRoot: string): () => Promise<string>;
|
|
8
|
+
export declare const ensureRunnerScript: () => Promise<string>;
|
|
@@ -7,7 +7,6 @@ export interface PyToolBridgeEntry {
|
|
|
7
7
|
}
|
|
8
8
|
export interface PyToolBridgeInfo {
|
|
9
9
|
url: string;
|
|
10
|
-
token: string;
|
|
11
10
|
}
|
|
12
11
|
/** Starts the bridge server lazily and returns its connection info. */
|
|
13
12
|
export declare function ensurePyToolBridge(): Promise<PyToolBridgeInfo>;
|
|
@@ -15,6 +14,6 @@ export declare function ensurePyToolBridge(): Promise<PyToolBridgeInfo>;
|
|
|
15
14
|
* Register a tool session for the duration of one execution. The returned
|
|
16
15
|
* function MUST be called to remove the entry once execution finishes.
|
|
17
16
|
*/
|
|
18
|
-
export declare function registerPyToolBridge(sessionId: string, entry: PyToolBridgeEntry): () => void;
|
|
17
|
+
export declare function registerPyToolBridge(sessionId: string, capability: string, entry: PyToolBridgeEntry): () => void;
|
|
19
18
|
/** Stop the bridge and clear registrations. Test-only / shutdown helper. */
|
|
20
19
|
export declare function disposePyToolBridge(): Promise<void>;
|