@gajae-code/coding-agent 0.15.6 → 0.16.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 +99 -0
- package/dist/types/async/job-manager.d.ts +32 -1
- package/dist/types/browser-backend.d.ts +12 -0
- package/dist/types/cli/args.d.ts +2 -0
- package/dist/types/cli/root-flags.d.ts +14 -0
- package/dist/types/cli/update-cli.d.ts +14 -0
- package/dist/types/cli.d.ts +7 -0
- package/dist/types/commands/launch.d.ts +10 -0
- package/dist/types/commands/sdk.d.ts +2 -0
- package/dist/types/config/autorouting-tier-map.d.ts +24 -0
- package/dist/types/config/billing-path.d.ts +25 -0
- package/dist/types/config/config-schema-version.d.ts +13 -1
- package/dist/types/config/file-lock.d.ts +5 -0
- package/dist/types/config/model-registry.d.ts +22 -0
- package/dist/types/config/settings-schema.d.ts +27 -8
- package/dist/types/config/settings.d.ts +2 -0
- package/dist/types/coordinator-mcp/projection-scan.d.ts +8 -0
- package/dist/types/crash/record-loader.d.ts +15 -0
- package/dist/types/extensibility/extensions/types.d.ts +8 -3
- package/dist/types/gjc-runtime/launch-worktree-reservation.d.ts +21 -0
- package/dist/types/gjc-runtime/launch-worktree.d.ts +25 -1
- package/dist/types/gjc-runtime/managed-owner-supervisor.d.ts +2 -0
- package/dist/types/gjc-runtime/session-state-lock.d.ts +22 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +66 -1
- package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +1 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +27 -0
- package/dist/types/main.d.ts +1 -0
- package/dist/types/master-mode/context.d.ts +21 -0
- package/dist/types/master-mode/first-request.d.ts +34 -0
- package/dist/types/master-mode/snapshot.d.ts +32 -0
- package/dist/types/modes/acp/acp-agent.d.ts +21 -21
- package/dist/types/modes/components/frictionless-onboarding-selector.d.ts +10 -0
- package/dist/types/modes/components/model-selector.d.ts +4 -0
- package/dist/types/modes/components/oauth-selector.d.ts +1 -0
- package/dist/types/modes/components/session-selector.d.ts +1 -1
- package/dist/types/modes/components/sessions-dashboard.d.ts +2 -1
- package/dist/types/modes/components/status-line/model-name.d.ts +18 -0
- package/dist/types/modes/components/status-line/priority-row.d.ts +34 -0
- package/dist/types/modes/components/status-line/segments.d.ts +10 -0
- package/dist/types/modes/interactive-mode.d.ts +16 -2
- package/dist/types/modes/print-mode.d.ts +17 -0
- package/dist/types/modes/theme/theme.d.ts +2 -1
- package/dist/types/modes/types.d.ts +2 -0
- package/dist/types/modes/ui-language.d.ts +7 -1
- package/dist/types/sdk/broker/broker.d.ts +79 -2
- package/dist/types/sdk/broker/endpoint-authority.d.ts +24 -0
- package/dist/types/sdk/broker/ensure.d.ts +3 -0
- package/dist/types/sdk/broker/index.d.ts +3 -0
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +6 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +40 -0
- package/dist/types/sdk/broker/master-capability.d.ts +10 -0
- package/dist/types/sdk/broker/session-index.d.ts +40 -11
- package/dist/types/sdk/broker/session-scope.d.ts +72 -0
- package/dist/types/sdk/broker/spawn-authority.d.ts +201 -0
- package/dist/types/sdk/broker/spawn-substrate.d.ts +30 -0
- package/dist/types/sdk/broker/startup-budget.d.ts +52 -0
- package/dist/types/sdk/broker/state-version.d.ts +21 -1
- package/dist/types/sdk/broker/worktree-occupancy.d.ts +28 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +3 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +1 -1
- package/dist/types/sdk/bus/index.d.ts +9 -1
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +1 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +1 -1
- package/dist/types/sdk/bus/slack-daemon.d.ts +1 -1
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +1 -1
- package/dist/types/sdk/cli/index.d.ts +1 -0
- package/dist/types/sdk/cli/master-cli.d.ts +63 -0
- package/dist/types/sdk/cli/rows.d.ts +12 -5
- package/dist/types/sdk/cli/session-cli.d.ts +20 -3
- package/dist/types/sdk/client/client.d.ts +3 -2
- package/dist/types/sdk/host/control/dispatch.d.ts +10 -0
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +2 -0
- package/dist/types/sdk/host/control/runtime-gate.d.ts +21 -7
- package/dist/types/sdk/host/events.d.ts +1 -0
- package/dist/types/sdk/host/host.d.ts +10 -0
- package/dist/types/sdk/host/query/cursor.d.ts +4 -2
- package/dist/types/sdk/host/query/handlers.d.ts +1 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +1 -0
- package/dist/types/sdk/host/session-runtime.d.ts +70 -17
- package/dist/types/sdk/lifecycle/broker-client.d.ts +6 -0
- package/dist/types/sdk/lifecycle/service.d.ts +15 -3
- package/dist/types/sdk/lifecycle-session.d.ts +3 -1
- package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -5
- package/dist/types/sdk/receipt-state.d.ts +2 -0
- package/dist/types/sdk/router/session-router.d.ts +6 -0
- package/dist/types/sdk/session.d.ts +16 -0
- package/dist/types/sdk/startup-capability.d.ts +2 -1
- package/dist/types/sdk/turn-result.d.ts +6 -0
- package/dist/types/session/agent-session.d.ts +52 -7
- package/dist/types/session/credential-store-errors.d.ts +1 -0
- package/dist/types/session/fold-coordinator.d.ts +29 -2
- package/dist/types/session/session-manager.d.ts +79 -2
- package/dist/types/session/yield-queue.d.ts +5 -4
- package/dist/types/setup/frictionless-onboarding.d.ts +1 -0
- package/dist/types/tools/ask.d.ts +1 -0
- package/dist/types/tools/bash.d.ts +16 -0
- package/dist/types/tools/browser/launch.d.ts +10 -0
- package/dist/types/tools/browser/registry.d.ts +8 -0
- package/dist/types/tools/gh.d.ts +8 -0
- package/dist/types/tools/index.d.ts +10 -10
- package/dist/types/tools/job.d.ts +3 -1
- package/dist/types/utils/external-editor.d.ts +7 -0
- package/examples/extensions/README.md +1 -1
- package/examples/extensions/pirate.ts +7 -4
- package/package.json +7 -7
- package/scripts/generate-sdk-operation-inventory.ts +13 -1
- package/scripts/verify-gjc-sdk-canonicalization.ts +35 -1
- package/src/async/job-manager.ts +107 -9
- package/src/browser-backend.ts +29 -0
- package/src/cli/accounts-cli.ts +9 -5
- package/src/cli/args.ts +17 -0
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/plugin-cli.ts +29 -0
- package/src/cli/root-flags.ts +5 -0
- package/src/cli/update-cli.ts +140 -23
- package/src/commands/launch.ts +86 -18
- package/src/commands/sdk.ts +135 -28
- package/src/config/autorouting-tier-map.ts +12 -0
- package/src/config/billing-path.ts +42 -0
- package/src/config/config-schema-version.ts +18 -1
- package/src/config/file-lock.ts +158 -83
- package/src/config/model-preset-registry.ts +178 -23
- package/src/config/model-profiles.ts +5 -5
- package/src/config/model-registry.ts +291 -42
- package/src/config/model-resolver.ts +5 -0
- package/src/config/settings-schema.ts +27 -8
- package/src/config/settings.ts +51 -15
- package/src/coordinator-mcp/projection-scan.ts +27 -6
- package/src/coordinator-mcp/question-state.ts +9 -11
- package/src/coordinator-mcp/server.ts +115 -21
- package/src/crash/index-store.ts +2 -0
- package/src/crash/record-loader.ts +10 -0
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +1 -1
- package/src/extensibility/extensions/runner.ts +27 -0
- package/src/extensibility/extensions/types.ts +8 -3
- package/src/extensibility/gjc-plugins/installer.ts +51 -11
- package/src/extensibility/runtime-skill-discovery.ts +110 -3
- package/src/extensibility/skills.ts +22 -12
- package/src/gjc-runtime/launch-worktree-reservation.ts +242 -0
- package/src/gjc-runtime/launch-worktree.ts +285 -4
- package/src/gjc-runtime/managed-owner-supervisor.ts +63 -51
- package/src/gjc-runtime/session-state-lock.ts +213 -14
- package/src/gjc-runtime/session-state-sidecar.ts +938 -39
- package/src/gjc-runtime/tmux-owner-isolation-cli.ts +4 -7
- package/src/gjc-runtime/tmux-owner-isolation.ts +18 -3
- package/src/gjc-runtime/tmux-sessions.ts +252 -13
- package/src/hooks/skill-state.ts +6 -0
- package/src/internal-urls/docs-index.generated.ts +15 -15
- package/src/internal-urls/issue-pr-protocol.ts +4 -2
- package/src/main.ts +61 -3
- package/src/master-mode/context.ts +50 -0
- package/src/master-mode/first-request.ts +65 -0
- package/src/master-mode/snapshot.ts +205 -0
- package/src/modes/acp/acp-agent.ts +610 -161
- package/src/modes/components/footer.ts +4 -2
- package/src/modes/components/frictionless-onboarding-selector.ts +48 -2
- package/src/modes/components/model-selector.ts +76 -8
- package/src/modes/components/oauth-selector.ts +6 -1
- package/src/modes/components/session-selector.ts +23 -15
- package/src/modes/components/sessions-dashboard.ts +8 -5
- package/src/modes/components/settings-selector.ts +1 -0
- package/src/modes/components/status-line/model-name.ts +53 -0
- package/src/modes/components/status-line/priority-row.ts +107 -0
- package/src/modes/components/status-line/segments.ts +23 -9
- package/src/modes/components/tool-status-header.ts +151 -15
- package/src/modes/controllers/command-controller.ts +1 -1
- package/src/modes/controllers/event-controller.ts +30 -4
- package/src/modes/controllers/extension-ui-controller.ts +13 -13
- package/src/modes/controllers/input-controller.ts +30 -2
- package/src/modes/controllers/selector-controller.ts +200 -98
- package/src/modes/interactive-mode.ts +36 -12
- package/src/modes/print-mode.ts +64 -0
- package/src/modes/prompt-action-autocomplete.ts +30 -4
- package/src/modes/runtime-init.ts +12 -9
- package/src/modes/theme/theme.ts +5 -0
- package/src/modes/types.ts +2 -0
- package/src/modes/ui-language.ts +49 -2
- package/src/modes/utils/ui-helpers.ts +22 -3
- package/src/prompts/agent-fragments/browser-aside.md +22 -0
- package/src/prompts/system/master-mode.md +28 -0
- package/src/prompts/tools/ask.md +1 -1
- package/src/prompts/tools/bash.md +1 -0
- package/src/prompts/tools/job.md +1 -1
- package/src/sdk/acp/adapter.ts +5 -0
- package/src/sdk/broker/broker.ts +1646 -27
- package/src/sdk/broker/endpoint-authority.ts +86 -0
- package/src/sdk/broker/ensure.ts +81 -3
- package/src/sdk/broker/index.ts +3 -0
- package/src/sdk/broker/lifecycle-ledger.ts +6 -0
- package/src/sdk/broker/lifecycle.ts +440 -75
- package/src/sdk/broker/master-capability.ts +232 -0
- package/src/sdk/broker/session-index.ts +121 -17
- package/src/sdk/broker/session-scope.ts +272 -0
- package/src/sdk/broker/spawn-authority.ts +1031 -0
- package/src/sdk/broker/spawn-substrate.ts +591 -0
- package/src/sdk/broker/startup-budget.ts +144 -2
- package/src/sdk/broker/state-version.ts +43 -14
- package/src/sdk/broker/transport.ts +1 -0
- package/src/sdk/broker/worktree-occupancy.ts +90 -0
- package/src/sdk/bus/chat-daemon-control.ts +5 -2
- package/src/sdk/bus/chat-daemon-runtime.ts +136 -18
- package/src/sdk/bus/discord-daemon.ts +50 -10
- package/src/sdk/bus/index.ts +84 -7
- package/src/sdk/bus/kind-aware-reconciliation.ts +296 -48
- package/src/sdk/bus/lifecycle-commands.ts +4 -0
- package/src/sdk/bus/notification-service.ts +22 -5
- package/src/sdk/bus/prompt-reconciliation.ts +7 -2
- package/src/sdk/bus/reconciliation-store.ts +55 -31
- package/src/sdk/bus/slack-conversation.ts +1 -1
- package/src/sdk/bus/slack-daemon.ts +72 -38
- package/src/sdk/bus/telegram-daemon-contract.ts +1 -1
- package/src/sdk/cli/index.ts +1 -0
- package/src/sdk/cli/master-cli.ts +259 -0
- package/src/sdk/cli/rows.ts +41 -15
- package/src/sdk/cli/session-cli.ts +297 -26
- package/src/sdk/client/client.ts +14 -8
- package/src/sdk/host/control/dispatch.ts +101 -40
- package/src/sdk/host/control/index.ts +2 -0
- package/src/sdk/host/control/operations.ts +2 -0
- package/src/sdk/host/control/runtime-gate.ts +203 -11
- package/src/sdk/host/events.ts +1 -0
- package/src/sdk/host/host.ts +29 -2
- package/src/sdk/host/query/cursor.ts +52 -7
- package/src/sdk/host/query/handlers.ts +33 -12
- package/src/sdk/host/query/revision-store.ts +12 -0
- package/src/sdk/host/session-runtime.test.ts +673 -14
- package/src/sdk/host/session-runtime.ts +674 -103
- package/src/sdk/host/surface-policy.ts +3 -3
- package/src/sdk/lifecycle/broker-client.ts +28 -0
- package/src/sdk/lifecycle/service.ts +279 -20
- package/src/sdk/lifecycle-session.ts +17 -4
- package/src/sdk/prompt-deadline-manager.ts +2 -1
- package/src/sdk/protocol/operation-inventory.generated.json +105 -3
- package/src/sdk/protocol/operation-registry.ts +14 -4
- package/src/sdk/receipt-state.ts +10 -0
- package/src/sdk/router/session-router.ts +219 -118
- package/src/sdk/session.ts +416 -195
- package/src/sdk/startup-capability.ts +1 -0
- package/src/sdk/turn-result.ts +22 -0
- package/src/session/agent-session.ts +1628 -318
- package/src/session/blob-store.ts +15 -5
- package/src/session/credential-store-errors.ts +2 -0
- package/src/session/fold-coordinator.ts +40 -3
- package/src/session/internal/managed-session-storage.ts +153 -78
- package/src/session/session-manager.ts +850 -97
- package/src/session/yield-queue.ts +24 -10
- package/src/setup/frictionless-onboarding.ts +2 -0
- package/src/slash-commands/builtin-registry.ts +41 -0
- package/src/task/executor.ts +9 -4
- package/src/telemetry/events.ts +1138 -12
- package/src/tools/ask-contract.test.ts +64 -0
- package/src/tools/ask-contract.ts +36 -1
- package/src/tools/ask.ts +10 -8
- package/src/tools/bash-interactive.ts +11 -2
- package/src/tools/bash.ts +412 -75
- package/src/tools/browser/launch.ts +37 -0
- package/src/tools/browser/registry.ts +99 -9
- package/src/tools/cron.ts +6 -4
- package/src/tools/descriptors.test.ts +15 -0
- package/src/tools/descriptors.ts +5 -1
- package/src/tools/gh.ts +104 -48
- package/src/tools/github-cache.ts +2 -2
- package/src/tools/index.ts +10 -6
- package/src/tools/job.ts +4 -1
- package/src/tools/monitor.ts +12 -9
- package/src/tools/resolve.ts +30 -10
- package/src/tools/tool-catalog.generated.ts +2 -2
- package/src/utils/external-editor.ts +72 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,105 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.16.1] - 2026-09-03
|
|
6
|
+
|
|
7
|
+
- Broker-launched SDK sessions now activate an already-cached default model profile before refreshing provider catalogs in the background, preventing redundant online discovery from consuming the fixed semantic-readiness window while preserving strict refresh fallback when cached profile resolution fails.
|
|
8
|
+
- Native Windows external editors now launch executable commands directly instead of through `cmd.exe`, preventing the shell handoff from swallowing the first editor keystroke; `.cmd` and `.bat` editor commands retain shell execution.
|
|
9
|
+
- Slack Socket Mode now accepts real `event_callback` payloads, routes ordinary active-thread text as new user turns when no ask is pending, keeps idle notifications non-replyable, deduplicates distinct messages without treating shared `event_context` metadata as event identity, and scopes deterministic root message IDs to the configured workspace and channel.
|
|
10
|
+
- Ask now rejects standalone custom-input pseudo-option labels such as `Other (type your own)`, `custom input`, and `직접 입력` while preserving genuine labels that merely contain those words; single-option asks no longer publish a recommended marker, including through workflow-gate/SDK question projection.
|
|
11
|
+
- Session-state lock acquisition now retries immediately after positively proving and identity-reclaiming a dead transition owner, so forced exits no longer add a retry delay to the next resume while unproven or live claims retain the bounded backoff path.
|
|
12
|
+
- Coordinator persist failures now include typed lock-cause fields and use a per-document, per-failure-class 30-second warn window; proven-refused local model discovery is debug-level, and `session_closed` delivery failures route by attached-client count.
|
|
13
|
+
- `gjc update` now identifies the active Linux libc instead of treating an optional installed musl loader as proof that a glibc-based Ubuntu host runs musl.
|
|
14
|
+
- The interactive TUI now warns when a turn ends with `stopReason: "length"` before producing any visible text or tool call — a reasoning model whose thinking alone consumed the budget — instead of returning to the prompt with no explanation, and the completion notification for that turn no longer reports success. Other surfaces (SDK, ACP, print mode, telemetry) already reported this state; no length-specific automatic continuation is added and existing continuation policies are unchanged.
|
|
15
|
+
- Sessions can now be marked with `/star` and `/unstar`; starred sessions persist in append-only metadata, display a `★` in resume and read-only dashboard views, and sort ahead of unstarred sessions without changing deletion or retention behavior.
|
|
16
|
+
- Steering is now admitted only into a live agent run. A steer submitted when no run is live — after a turn ended, during the post-prompt unwind window where the session still reports streaming, while another prompt is in preflight, or while an abort is unwinding — is no longer parked in the Agent steering queue where it was invisible to the queue display and consumed by whichever unrelated later prompt polled it first (appearing turn after turn, or being drained silently by the first Esc). The session now routes such a steer as a sequential follow-up owned by the next turn and auto-continues into it, so `session.steer()`, `prompt(..., { streamingBehavior: "steer" })`, `sendUserMessage(..., { deliverAs: "steer" })`, `sendCustomMessage(..., { deliverAs: "steer" })`, and SDK `turn.steer` all behave identically. A steer-behavior prompt submitted while another prompt is still acquiring session admission is queued against that prompt's turn instead of being rejected with `busy` and lost.
|
|
17
|
+
- The `interruptMode` setting is renamed to `toolInterruptPolicy` with values `abort_tools` (was `immediate`, default) and `finish_tools` (was `wait`); existing config files are migrated once (config schema version 2). The setting only decides whether a steer aborts the tools still running in the current batch and never changes when a steer is consumed — the previous label implied queue semantics it never had. The ACP config option, its SDK control operation (`queue.interrupt_mode.set` → `queue.tool_interrupt_policy.set`, `setQueueMode("tool_interrupt", ...)`), and `AgentSession.setToolInterruptPolicy()` follow the rename. `ToolSession.steer` is removed: the `cron`, `monitor`, and `resolve` tools deliver through `sendCustomMessage` (`deliverAs: "steer"` for the resolve reminder), so no tool pushes onto the Agent queue directly. Composer-submitted steers request sequential delivery (`steerQueuePolicy: "sequential"`) so they still arrive one at a time under `steeringMode: "all"`.
|
|
18
|
+
- Steering a run leaves unconsumed when it ends is now settled in one place. The session consumes the run's `agent_end.disownedSteering` once: a user interrupt (Esc) and a natural end re-route it as sequential follow-ups of the next turn (queue and pending display together), a terminal abort drops everything except client steers admitted after the abort's admission snapshot (which are re-routed the same way and rearmed as a fresh turn), and every other abort cause (teardown, session switch, compaction, handoff, tool abort) drops it and settles its SDK submission with a removal disposition. This replaces the three cause-specific recovery patches (user-interrupt rearm, terminal-abort steering purge, and steering rearm) that each reasoned about the Agent queue separately. `cancelAndSubmit` now keeps the aborted turn's steers as steers of the new turn — restored into the new run once it is accepted — instead of re-labelling them as follow-ups that drained turn after turn; with a selected queue entry the unselected messages still become follow-ups and their pending display now mirrors that.
|
|
19
|
+
- Rerouted steering preserves its queue policy: `toolInterruptPolicy: "finish_tools"` with `steeringMode: "all"` keeps one ordered successor-turn cohort across run disown and abort unwind, while composer submissions explicitly marked sequential still deliver one per turn.
|
|
20
|
+
- A user steer admitted into a live run now folds a running foreground `bash` call (managed non-PTY, ACP client-terminal, and PTY) into a background job once the command has run for a fixed 2 s grace window (`STEER_FOLD_GRACE_MS`), mirroring how a steer ends a subagent await: the call returns the chord-fold background-start result plus `Folded into background job <id> because a user steer arrived; the command keeps running with its original timeout and its result will wake a later turn.`, the same run consumes the steer at the tool boundary, and the job's completion wakes a later turn. Steers inside the grace window let the command finish; `busyPromptMode=queue` or `toolInterruptPolicy=finish_tools` never fold; Esc still aborts. Every fold (steer, chord, auto-background timer, `bash.background`) publishes one replayable `bash_folded` SDK event and exposes `foldReason` in job snapshots.
|
|
21
|
+
- The TUI activity indicator itemizes running background work by kind (`Working… · 2 subagents, 1 background bash, 1 monitor` / `Background: 2 subagents, 1 background bash, 1 monitor…`) instead of a single `N background task(s)` count.
|
|
22
|
+
- Explicit static `vllm` and `sglang` providers no longer acquire the generic custom-provider `/v1/models` auto-discovery lane; their configured catalog remains authoritative unless `discovery` is explicitly enabled.
|
|
23
|
+
- Coordinator projection scans now use identity-bracketed directory authority on macOS instead of failing every scan as unsupported, while root and candidate replacement races remain fail-closed.
|
|
24
|
+
- The `/model` selector no longer stalls the UI thread on open, model selection, provider-tab switch, and every catalog change for credentialed users. Each `refresh("offline")` re-ran the built-in-discovery freshness filter across the whole cached catalog (thousands of models) while recomputing per model values that only vary per provider — `#getProviderEvidenceGeneration` (an AuthStorage lookup) and `#getProviderBaseUrlForDiscovery` + endpoint normalization (URL parsing). That provider-keyed work is now memoized once per provider per refresh, so on the bundled catalog with credentials `refresh("offline")` drops from ~40ms to ~15ms per interaction with identical freshness results. Complements the earlier batch canonical-selection fix.
|
|
25
|
+
- Skill slash commands now autocomplete from subsequent whitespace-delimited tokens, including later prompt lines and case-insensitive `/Skill:` prefixes, while runtime invocation matching uses the same case-insensitive canonical recognition and case-variant skill discovery preserves project-over-user precedence.
|
|
26
|
+
- `/model` preset authentication refreshes now resolve each repeated role selector once per refresh instead of once per profile assignment, avoiding synchronous UI stalls as the preset catalog grows.
|
|
27
|
+
- Interactive startup no longer re-verifies the signed model preset registry once per subsystem. A launch read the accepted registry four times, and each read verified every cached generation in both the primary and backup state copies from several recovery angles, re-running Ed25519 verification, Zod schema parsing, canonical-JSON re-serialization, and the confusable-identity walk over the same documents. On a 2.5MB accepted state (4278 presets, 58 profiles) that cost about 3.0s of the pre-paint startup path. Verification results are now memoized per generation, the already-schema-parsed documents are no longer re-parsed to derive an identical value, and an accepted-registry read is reused for as long as the state, backup, and control files hash unchanged, so any write or tampering by any process is still verified from scratch. Measured startup drops from ~5.5s to ~1.9s.
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- Added `browser.backend` (`native` | `aside`, default `native`) to select the browser surface offered to the model. Operators who drive a real logged-in browser through the Aside CLI had no way to keep the model off the built-in Puppeteer `browser` tool short of `browser.enabled: false`, which also dropped every hint about the replacement surface, so the model would still reach for headless Chromium or invent a browser MCP. With `aside`, the built-in `browser` tool is neither active nor discoverable (`descriptors.ts` availability gate) and the system prompt gains a `<browser-backend>` block (`prompts/agent-fragments/browser-aside.md`, threaded from the session settings through `buildSystemPrompt`) that requires browser work to run through Bash as direct `aside repl` / `aside exec` invocations with the attach-verify-snapshot discipline. Nothing is spawned, supervised, or registered by GJC: no MCP server, no in-process Aside driver, no fallback to native when the CLI is missing. `native` is byte-for-byte the previous behavior, and `browser.enabled` keeps its meaning for the native backend.
|
|
31
|
+
- Interactive OAuth account selection now handles a stale or missing pinned credential in place, preserving the session and actionable `/login` or AUTO guidance instead of creating an unhandled rejection and crash record.
|
|
32
|
+
- Custom OpenAI-compatible providers in `models.yml` now auto-populate `/model` from their live `/v1/models` catalog without a manual `discovery:` block, and auto-classify each discovered model's wire API family. Any custom provider with a `baseUrl` and an OpenAI-family `api` (either provider-level, or the dominant OpenAI-family `api` among its statically-configured models) gets an implicit optional `openai-models-list` discovery lane, so a subscription-style gateway (e.g. CLIProxyAPI) shows its full model list with zero extra config and degrades to the configured static models when the endpoint has no `/v1/models`. During discovery each model's API type is inferred from the OpenAI `owned_by` owner (`anthropic` → `anthropic-messages`, `openai` → OpenAI) and then the model id (`claude-*` → `anthropic-messages`, `gpt-*`/`o1`/`codex`/… → OpenAI); OpenAI-family models keep the provider's configured OpenAI transport (`openai-responses` vs `openai-completions`) rather than being forced to chat-completions, an explicit `discovery.apiByModelPrefix` still wins, and an inconclusive model falls back to the provider default api.
|
|
33
|
+
- Named-worktree SDK session.create now gives git worktree add/reuse and workspace install independent 30s budgets instead of charging them against the child 10s semantic-readiness clock. Prep timeouts stay typed and terminal (`worktree_preparation_timeout` / `dependency_preparation_timeout`); Coordinator and ACP preserve those codes instead of collapsing them to `unavailable` or `broker_compensation_unobserved`. Ordinary no-worktree sessions stay 10s/21s.
|
|
34
|
+
- SDK session-index scan/replay now explicitly documents and regression-tests the
|
|
35
|
+
v4 compatibility boundary: supported v4 session-index events and snapshots are
|
|
36
|
+
accepted at every entry surface (scan, replay, tail, append, repair), future
|
|
37
|
+
versions stay fail-closed with data-preserving quarantine, and the generic
|
|
38
|
+
SDK-state guard (`maximum supported version is 1`) is documented as never
|
|
39
|
+
applying to session-index rows so the #5181 crash class cannot recur.
|
|
40
|
+
|
|
41
|
+
- GJC plugin TAR/TGZ installs now bound archive input and aggregate gzip expansion before extraction, preventing compressed bundles from exhausting memory while preserving valid concatenated gzip members.
|
|
42
|
+
|
|
43
|
+
## [0.16.0] - 2026-09-02
|
|
44
|
+
|
|
45
|
+
- Added master mode (`gjc --master [--scope repo|pwd|global]`) with authenticated, broker-authoritative child orchestration: `gjc sdk spawn` creates task-seeded children, scoped `gjc sdk search` discovers broker-visible sessions with paginated results, and locator v2 session rows carry canonical cwd, worktree-root, and state-root identity.
|
|
46
|
+
- SDK master-mode authority now selects the newest retained master epoch, binds worktree occupancy to canonical worktree roots with positive process-exit proof, keeps master capabilities out of ordinary Bash descendants, bounds authenticated nonce replay state, and preserves scoped search rows across pagination beyond the probe budget.
|
|
47
|
+
- `move_session`, TUI `/move`, and SDK/ACP `session.cwd.move` no longer strand coordinator runtime-state persistence for the rest of the session. All three surfaces now cross one `SessionManager.moveTo` lifecycle: admitted old-cwd sidecar writes drain before commit, later queued writes are generation-fenced, and a durable rescope journal records the exact old/new cwd and session-file identities before publication so restart can finish an interrupted migration. Relocation holds both canonical state paths' process, namespace, and state-file locks in deterministic order across read/authenticate/write/remove; signed predecessors and destinations require the matching key id plus a valid Ed25519 signature, unsigned rows require complete exact cwd/workdir/session-file identity, and coordinator bootstrap or partial rows are never laundered into authoritative state. No-follow descriptor reads and native identity-bound orphan retirement reject symlink/path replacement, a valid self-healed destination is preserved while its authenticated old marker is removed, and rejected/tampered evidence stays intact with the journal retained for recovery. Rollback clears the prepared journal, committed metadata failures still run relocation, and postmortem finalizer rebinding is unconditional even when repair fails, so unexpected exit targets the live cwd/session file. (#4629)
|
|
48
|
+
- `move_session` and `session.cwd.move` now report an unreadable target as `Directory identity or access unavailable` on macOS too. Darwin's `realpath(3)` fails with `EACCES` on a mode-0 directory where Linux resolves it and fails later at the access probe, so the same refusal was previously misreported as `Directory does not exist or is not a directory`.
|
|
49
|
+
- The status rail no longer collapses to a bare `…+N` overflow marker on very small terminals. Context %, the goal indicator and the model name are now the last segments evicted (in that order), and once ordinary telemetry is gone they degrade through shortened and single-glyph forms before being dropped — context % is never dropped, keeps `18.3%/200K` while it fits, falls back to an integer `18%`, and retains its usage-level color. The overflow marker is suppressed at those widths so its cells go to the priority items instead. Rails with no context window and no active goal evict exactly as before.
|
|
50
|
+
- Model names now render in their shortest recognizable id-derived form (`anthropic/claude-sonnet-4-5-20250929` → `sonnet-4.5`) in both the status rail and the footer telemetry line, replacing the raw id in the footer and the previous Anthropic-only `"Claude "` prefix strip in the rail. The rule is a pure heuristic — provider prefix, vendor family word and trailing date/build stamp removed — with no curated override table, and never yields an empty label. Model pickers and selectors keep full ids.
|
|
51
|
+
- The `claude-fable` and `fable-opus-codex` built-in presets now use `anthropic/claude-fable-5-1` instead of `anthropic/claude-fable-5`, with effort suffixes preserved (`claude-fable` default/architect `xhigh`, critic `high`, planner `low`; `fable-opus-codex` default `high`). Fable 5.1 exposes the identical effort ladder, so no role mapping changed shape, and the non-fable roles (`anthropic/claude-sonnet-5` executor, `anthropic/claude-opus-5` planner/critic, the Codex executor/architect) are untouched. The extragoal reviewer template moves to `anthropic/claude-fable-5-1:xhigh` for the same reason. `claude-fable-5` remains in the catalog for pinned selectors and for gateways that do not serve 5.1.
|
|
52
|
+
- Fresh interactive onboarding now asks for an interface language before showing guidance, supports English, Korean, Simplified Chinese, and Japanese, persists the choice through `ui.language`, and uses a documented English fallback for noninteractive, invalid, cancelled, or unwritable startup.
|
|
53
|
+
- Coordinator projection consumers now retry a bounded number of fresh authoritative scans when concurrent session churn races a candidate. Cap exhaustion, owner disappearance, unsupported authority, and parse failures remain fail-closed, while settled concurrent SDK sessions no longer permanently starve the session reaper or coordinator mutations. (#5168)
|
|
54
|
+
|
|
55
|
+
- Coordinator session-state locks now reclaim an empty, identity-qualified released transition tombstone on POSIX after a short release grace period. Live, foreign, malformed, non-empty, or identity-changed claims remain fail-closed, while persistent macOS/File Provider debris no longer burns the full transition timeout on every state write. (#5159)
|
|
56
|
+
|
|
57
|
+
- A runtime-state marker recorded against a different workspace path now reports that mismatch instead of claiming the file is unreadable, and a terminal, not-live marker that travelled into the current workspace with its session directory is adopted rather than refused. Live, non-terminal, and out-of-workspace markers are still refused untouched.
|
|
58
|
+
- An unavailable provider-qualified `modelRoles.default` selection now reports the requested model instead of silently starting on another provider's baseline. This keeps signed-registry omissions and failed catalog admission actionable rather than routing requests to an unrelated retired model. (#5144)
|
|
59
|
+
- Headless SDK substrate close now reports success when exact teardown observes the recorded process gone even if cleanup unlinks the durable proof first; live or identity-ambiguous substrates still report `substrate_mismatch`. (#5130)
|
|
60
|
+
|
|
61
|
+
- Windows session-state locks now drain late terminal reconciliation writes before disposal returns and safely reclaim valid dead transition claims during resume. (#5102)
|
|
62
|
+
|
|
63
|
+
- Deferred MCP startup now releases queued idle yields as soon as readiness settles without bypassing prompt admission. Barrier extensions remain gated, rejected startup drops the wake without prompting, settled sessions retain the normal idle merge window, and readiness stays session-local. (#5085)
|
|
64
|
+
- ACP deep-interview's real subprocess fixture now retires its owned lifecycle sessions before broker/root cleanup, preventing detached session hosts from recreating the fixture root after teardown. (#5086)
|
|
65
|
+
- The ACP fixture tracks broker startup through its full producer deadline and tracks session creation before awaiting responses, keeps its independent broker fallback client available when runtime shutdown fails, and retires sessions first seen in either broker inventory phase directly through that fallback across cleanup retries. Verified broker-startup rejection no longer strands the root, while an unverified child-reap failure retains cleanup authority. Reconciliation recognizes the real ACP `terminal_uncertain` after-send wire envelope as transport uncertainty while preserving semantic close diagnostics, then accepts terminal races only after strict inventory proves unambiguous and certain retirement. A stalled broker-client transport close no longer blocks authoritative lease/root cleanup, and the child environment confines Windows profile and temporary paths to the fixture root. (#5086)
|
|
66
|
+
- Telemetry install IDs are now staged in private temporary files and published atomically, so concurrent startup readers cannot observe a partial UUID payload; stale temporary files are never adopted and malformed persisted IDs still fail closed. Publication also falls back through native no-replace links and an exclusive claim protocol when rename-no-replace is unavailable, Windows reads and claim mutations use identity-bracketed opens, transient claimed payloads are retried, and every winner is tightened to mode 0600. (#5048)
|
|
67
|
+
|
|
68
|
+
- An install with no configured model no longer starts on a model its provider has already withdrawn. The startup fallback now applies the configured provider-priority policy, skips bundled defaults disproved by fresh provider discovery, and only then preserves catalog order for remaining candidates. Explicit model and profile selections, enabled-model allowlists, credential selectors, disabled providers, and provider/id collision-safe candidate membership remain unchanged.
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- The shipped pirate extension example now appends its instructions through the supported `systemPrompt` result, and unsupported `before_agent_start` result fields emit a bounded diagnostic instead of being silently ignored.
|
|
73
|
+
|
|
74
|
+
- File locks now use a descriptor-relative exclusive directory-publication fallback
|
|
75
|
+
when a filesystem returns `EINVAL` for `renameat2(RENAME_NOREPLACE)` (for example
|
|
76
|
+
WSL2 DrvFs), so `edit` and terminal persistence no longer surface `Failed to publish
|
|
77
|
+
file lock: invalid_request` on valid paths. The native fallback preserves no-follow
|
|
78
|
+
path containment, owner identity, no-replace contention, and fail-closed stale-owner
|
|
79
|
+
checks. (#5164)
|
|
80
|
+
|
|
81
|
+
- The first Esc on a streaming turn with a queued steering message again consumes that steer and auto-continues instead of aborting the turn and dumping the queue back into the composer. The busy-indicator recovery branch counted the same drainable queue as cancellable work and, because a streaming turn always has that indicator mounted, it short-circuited before the steer-on-interrupt branch could run. Stale busy-indicator recovery, pending-submission cancellation, and the loud second-Esc abort are unchanged.
|
|
82
|
+
|
|
83
|
+
- Print and JSON turns now fail closed when the provider/agent produces no readable assistant text: JSON emits a bounded `agent_failed` disposition and failures exit nonzero, while tool-only terminal output can no longer masquerade as success. (#5153)
|
|
84
|
+
- Interactive `/login`, `/logout`, and account inventory commands now keep the TUI alive when the credential database reports `SQLITE_CORRUPT` or `SQLITE_NOTADB`. They show a bounded, payload-free recovery message and never auto-repair or delete the database. (#5070)
|
|
85
|
+
- `session.last_assistant` now reads the public transcript projection, skips trailing tool-only, thinking-only, empty, and whitespace-only assistant rows, and returns the most recent readable assistant text or an empty string when none exists. (#5078)
|
|
86
|
+
- Chat-daemon same-generation successor attachments now wait for predecessor provider retirement before admitting frames. Retired attachment frames remain fenced, successor frames resume after retirement, queue waiters settle during takeover and shutdown, and cross-generation replacement remains isolated. (#5120)
|
|
87
|
+
|
|
88
|
+
- SDK lifecycle readiness now uses the same descriptor-bound endpoint identity tolerance as broker endpoint reads and selects owners by scoped state root, process incarnation, and lifecycle marker instead of bare session ID. This restores default source-host startup, shipped SDK lifecycle topology, shared-agent saved-source isolation, cold resume/fork cleanup, local SDK-only broker recovery, and generated operation-matrix closure after the master-mode merge. (#5114)
|
|
89
|
+
|
|
90
|
+
- Coordinator event watchers now advertise the exact supported event-kind enum, while outbox entity validation and durable WAL/active-turn cleanup reuse their existing authority helpers instead of leaving those checks disconnected. (#5115)
|
|
91
|
+
- Post-install update verification now preserves a bounded, secret-redacted stderr/stdout cause when the newly installed `gjc --version` exits unsuccessfully, so runtime guards such as Bun version incompatibilities remain actionable instead of collapsing to a generic verification failure. (#5108)
|
|
92
|
+
- Concurrent coordinator mutations sharing one idempotency key now join the same in-process flight before taking the durable key lock, so a slow accepted prompt cannot make its retry time out as unavailable. Conflicting in-flight requests still fail closed, completed responses remain durably replayable, and different keys remain isolated. (#5110)
|
|
93
|
+
- Custom providers declaring `transport: pi-native` in `models.yml` now actually dispatch through the auth-gateway native endpoint. The provider-level transport was silently dropped for models.yml-declared models, so requests went to `<baseUrl>/chat/completions` and the gateway answered 404; and the pi-native client now serializes only wire-safe tool fields, so runtime tool state carrying fs-stat BigInts no longer aborts request serialization with `JSON.stringify cannot serialize BigInt`.
|
|
94
|
+
- ACP prompts now settle immediately on correlated explicit failure outcomes without waiting for a later `agent_end`; generic error-only `agent_failed` events remain additive diagnostics until an authoritative terminal, while late duplicates and unrelated correlations stay isolated. (#5107)
|
|
95
|
+
- Session disposal no longer waits behind an abort-ignoring tool's prompt admission or cwd read lease before reaching its bounded Agent abort. Disposal now fences new prompt and cwd-move admissions without draining unbounded reader work, while preserving cwd moves admitted before teardown and suppressing late run events. (#5100)
|
|
96
|
+
|
|
97
|
+
- Managed-session file identities now use one canonical unsigned 64-bit representation across stat/native boundaries and replacement cleanup receipts. Native Windows file IDs surfaced as signed negative bigints no longer create double-hyphen receipt names that block persistence or reopen; already-written signed receipt names and interrupted pending receipts are recovered only through the existing identity-bound, fail-closed reconciliation paths. (#5095)
|
|
98
|
+
|
|
99
|
+
- `gh` PR diffs decode git's C-style quoted paths as UTF-8 bytes instead of Latin-1 code points, so non-ASCII file names (`docs/\355\225\234\352\270\200.md`) no longer surface as mojibake in the file list, and quoted `rename from`/`rename to` lines are unquoted the same way instead of keeping their literal quotes and escapes.
|
|
100
|
+
- Confirmed operator `turn.abort` requests now travel through a dedicated local Broker route instead of trusting caller-supplied `operator:true` and `confirm:true` on ordinary SDK frames. The Broker revalidates the exact live endpoint identity, injects a process-bound private capability, preserves post-send uncertainty, and the host uses one capability-free canonical identity for dispatch idempotency, durable admission, and delivery receipts, so forged, stale, dropped, and replayed requests fail closed consistently across restart boundaries.
|
|
101
|
+
|
|
102
|
+
- Blob references and filesystem-backed blob reads now accept only exact lowercase SHA-256 names before resolving a disk path; canonical references and valid missing-blob behavior are unchanged.
|
|
103
|
+
|
|
5
104
|
## [0.15.6] - 2026-08-30
|
|
6
105
|
|
|
7
106
|
- Auth metadata remains session-only when a compatibility registry has auth storage but no owner accessor, preventing an unscoped OAuth account lookup from attributing a registry-scoped API-key request to the wrong account.
|
|
@@ -43,9 +43,23 @@ export interface AsyncJob {
|
|
|
43
43
|
* incrementing a completed job's timer.
|
|
44
44
|
*/
|
|
45
45
|
export declare function jobElapsedMs(job: Pick<AsyncJob, "startTime" | "endTime">, now?: number): number;
|
|
46
|
+
/**
|
|
47
|
+
* Why a foreground wait left the foreground. Every fold path names its
|
|
48
|
+
* trigger so job snapshots and SDK clients can tell a user steer from the
|
|
49
|
+
* chord, the auto-background timer, or the explicit `bash.background` control.
|
|
50
|
+
*/
|
|
51
|
+
export type FoldReason = "steer" | "chord" | "timer" | "sdk_control";
|
|
52
|
+
/** A fold observed by the manager; published to SDK clients as `bash_folded`. */
|
|
53
|
+
export interface JobFoldEvent {
|
|
54
|
+
jobId: string;
|
|
55
|
+
generation: string;
|
|
56
|
+
reason: FoldReason;
|
|
57
|
+
}
|
|
46
58
|
export interface AsyncJobMetadata {
|
|
47
59
|
/** Set once a foreground wait has been folded, so surfacing can show folded work. */
|
|
48
60
|
backgrounded?: boolean;
|
|
61
|
+
/** Why a foreground wait was folded; absent for jobs started directly in the background (`async: true`). */
|
|
62
|
+
foldReason?: FoldReason;
|
|
49
63
|
subagent?: {
|
|
50
64
|
id: string;
|
|
51
65
|
agent: string;
|
|
@@ -197,6 +211,8 @@ export interface AsyncJobSnapshotEntry {
|
|
|
197
211
|
status: AsyncJob["status"];
|
|
198
212
|
generation: string;
|
|
199
213
|
backgrounded: boolean;
|
|
214
|
+
/** Present when `backgrounded` was set by a fold; absent for direct background starts. */
|
|
215
|
+
foldReason?: FoldReason;
|
|
200
216
|
deliveryState: JobDeliveryState;
|
|
201
217
|
}
|
|
202
218
|
/** Scalar delivery-failure evidence that may outlive its AsyncJob record. */
|
|
@@ -546,11 +562,25 @@ export declare class AsyncJobManager {
|
|
|
546
562
|
timeoutMs?: number;
|
|
547
563
|
}): Promise<boolean>;
|
|
548
564
|
getLastDisposeDiagnostics(): AsyncJobDisposeDiagnostics;
|
|
565
|
+
/**
|
|
566
|
+
* Subscribe to fold events. Fires once per successful `markBackgrounded`
|
|
567
|
+
* transition (never on the idempotent repeat), so a subscriber can publish
|
|
568
|
+
* exactly one `bash_folded` frame per fold. Listener errors are isolated.
|
|
569
|
+
*/
|
|
570
|
+
onFold(cb: (event: JobFoldEvent) => void): () => void;
|
|
571
|
+
/**
|
|
572
|
+
* Mark a job that was launched directly in the background (`bash` with
|
|
573
|
+
* `async: true`). It never had a foreground wait, so this is not a fold: no
|
|
574
|
+
* `foldReason` is recorded and no fold listener fires.
|
|
575
|
+
*/
|
|
576
|
+
markStartedInBackground(jobId: string, generation: string): boolean;
|
|
549
577
|
/**
|
|
550
578
|
* Mark a running job as backgrounded (folded out of its foreground call).
|
|
551
579
|
* Read by getJobsSnapshot so folded work stays visible; safe to call twice.
|
|
580
|
+
* The first transition records `reason` and notifies fold listeners; a
|
|
581
|
+
* repeat keeps the original reason and emits nothing.
|
|
552
582
|
*/
|
|
553
|
-
markBackgrounded(jobId: string, generation: string): boolean;
|
|
583
|
+
markBackgrounded(jobId: string, generation: string, reason: FoldReason): boolean;
|
|
554
584
|
waitForAll(): Promise<void>;
|
|
555
585
|
drainDeliveries(options?: {
|
|
556
586
|
timeoutMs?: number;
|
|
@@ -559,5 +589,6 @@ export declare class AsyncJobManager {
|
|
|
559
589
|
dispose(options?: {
|
|
560
590
|
timeoutMs?: number;
|
|
561
591
|
}): Promise<boolean>;
|
|
592
|
+
awaitRetainedDisposalCompletion(): Promise<void>;
|
|
562
593
|
isDeliverySuppressed(jobId: string, generation?: string): boolean;
|
|
563
594
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type BrowserBackendId = "native" | "aside";
|
|
2
|
+
export interface BrowserBackend {
|
|
3
|
+
readonly id: BrowserBackendId;
|
|
4
|
+
readonly exposesBuiltinTool: boolean;
|
|
5
|
+
readonly developerInstructions?: string;
|
|
6
|
+
}
|
|
7
|
+
interface BrowserBackendSettingsSource {
|
|
8
|
+
get(key: string): unknown;
|
|
9
|
+
}
|
|
10
|
+
/** Resolve the configured browser backend. Aside is strictly opt-in. */
|
|
11
|
+
export declare function resolveBrowserBackend(settings: BrowserBackendSettingsSource): BrowserBackend;
|
|
12
|
+
export {};
|
package/dist/types/cli/args.d.ts
CHANGED
|
@@ -50,6 +50,8 @@ export interface Args {
|
|
|
50
50
|
noRules?: boolean;
|
|
51
51
|
listModels?: string | true;
|
|
52
52
|
noTitle?: boolean;
|
|
53
|
+
master?: true;
|
|
54
|
+
masterScope?: "repo" | "pwd" | "global";
|
|
53
55
|
messages: string[];
|
|
54
56
|
fileArgs: string[];
|
|
55
57
|
/** Flags unknown to every launch parser; their consumer supplies the diagnostic. */
|
|
@@ -119,6 +119,13 @@ export declare const ROOT_LAUNCH_FLAGS: {
|
|
|
119
119
|
"no-title": FlagDescriptor<"boolean"> & {
|
|
120
120
|
description: string;
|
|
121
121
|
};
|
|
122
|
+
master: FlagDescriptor<"boolean"> & {
|
|
123
|
+
description: string;
|
|
124
|
+
};
|
|
125
|
+
scope: FlagDescriptor<"string"> & {
|
|
126
|
+
description: string;
|
|
127
|
+
options: string[];
|
|
128
|
+
};
|
|
122
129
|
};
|
|
123
130
|
export type ConsumerLaunchFlagName = "hook" | "extension" | "no-extensions" | "no-skills" | "skills";
|
|
124
131
|
export type LaunchFlagConsumer = "acp" | "local";
|
|
@@ -247,6 +254,13 @@ export declare const LAUNCH_PARSE_FLAGS: {
|
|
|
247
254
|
"no-title": FlagDescriptor<"boolean"> & {
|
|
248
255
|
description: string;
|
|
249
256
|
};
|
|
257
|
+
master: FlagDescriptor<"boolean"> & {
|
|
258
|
+
description: string;
|
|
259
|
+
};
|
|
260
|
+
scope: FlagDescriptor<"string"> & {
|
|
261
|
+
description: string;
|
|
262
|
+
options: string[];
|
|
263
|
+
};
|
|
250
264
|
extension: FlagDescriptor<"boolean" | "integer" | "string">;
|
|
251
265
|
hook: FlagDescriptor<"boolean" | "integer" | "string">;
|
|
252
266
|
"no-extensions": FlagDescriptor<"boolean" | "integer" | "string">;
|
|
@@ -21,6 +21,7 @@ export interface InstalledVersionVerification {
|
|
|
21
21
|
ok: boolean;
|
|
22
22
|
actual?: string;
|
|
23
23
|
path?: string;
|
|
24
|
+
versionOutput?: string;
|
|
24
25
|
smokeTestFailed?: boolean;
|
|
25
26
|
smokeTestOutput?: string;
|
|
26
27
|
cleanupWarning?: string;
|
|
@@ -87,6 +88,18 @@ export declare function resolveGjcPathForTest(options: {
|
|
|
87
88
|
whichPath: string | undefined;
|
|
88
89
|
}): string | undefined;
|
|
89
90
|
export declare function parseReportedVersionForTest(output: string): string | undefined;
|
|
91
|
+
export declare function sanitizeVerificationOutputForTest(stderr: string | undefined, stdout: string | undefined): string | undefined;
|
|
92
|
+
interface InstalledVersionCommandResult {
|
|
93
|
+
exitCode: number | null;
|
|
94
|
+
stdout: string;
|
|
95
|
+
stderr: string;
|
|
96
|
+
}
|
|
97
|
+
type InstalledVersionCommandRunner = (runtimePath: string) => Promise<InstalledVersionCommandResult>;
|
|
98
|
+
export declare function verifyInstalledVersionForTest(options: {
|
|
99
|
+
expectedVersion: string;
|
|
100
|
+
runtimePath: string | undefined;
|
|
101
|
+
runVersion: InstalledVersionCommandRunner;
|
|
102
|
+
}): Promise<InstalledVersionVerification>;
|
|
90
103
|
interface MigrationTargetVerificationOptions {
|
|
91
104
|
runtimePath: string;
|
|
92
105
|
verifyChecksum: () => Promise<void>;
|
|
@@ -137,6 +150,7 @@ export interface BinaryUpdateFlow {
|
|
|
137
150
|
* possibly-truncated binary.
|
|
138
151
|
*/
|
|
139
152
|
export declare function runBinaryUpdateFlow(targetPath: string, url: string, expectedVersion: string, flow: BinaryUpdateFlow): Promise<InstalledVersionVerification>;
|
|
153
|
+
export declare function assertSupportedLinuxLibcForTest(glibcVersionRuntime: string | undefined, muslLoaderPresent: boolean): void;
|
|
140
154
|
/**
|
|
141
155
|
* Run the update command.
|
|
142
156
|
*/
|
package/dist/types/cli.d.ts
CHANGED
|
@@ -142,6 +142,13 @@ export declare class RootHelpCommand extends Command {
|
|
|
142
142
|
"no-title": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
143
143
|
description: string;
|
|
144
144
|
};
|
|
145
|
+
master: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
146
|
+
description: string;
|
|
147
|
+
};
|
|
148
|
+
scope: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
149
|
+
description: string;
|
|
150
|
+
options: string[];
|
|
151
|
+
};
|
|
145
152
|
};
|
|
146
153
|
static examples: string[];
|
|
147
154
|
static strict: boolean;
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
* Root command for the coding agent CLI.
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from "@gajae-code/utils/cli";
|
|
5
|
+
import { type LaunchWorktreeReservation } from "../gjc-runtime/launch-worktree-reservation";
|
|
5
6
|
export declare function persistCoordinatorLaunchFailure(error: unknown, cwd: string, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
7
|
+
/** Test seam for the path-keyed atomic reservation. */
|
|
8
|
+
export declare function reserveLaunchWorktreeForTest(agentDir: string, worktreePath: string): Promise<LaunchWorktreeReservation>;
|
|
6
9
|
export default class Index extends Command {
|
|
7
10
|
static description: string;
|
|
8
11
|
static hidden: boolean;
|
|
@@ -132,6 +135,13 @@ export default class Index extends Command {
|
|
|
132
135
|
"no-title": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
133
136
|
description: string;
|
|
134
137
|
};
|
|
138
|
+
master: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
|
|
139
|
+
description: string;
|
|
140
|
+
};
|
|
141
|
+
scope: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
|
|
142
|
+
description: string;
|
|
143
|
+
options: string[];
|
|
144
|
+
};
|
|
135
145
|
};
|
|
136
146
|
static examples: string[];
|
|
137
147
|
static strict: boolean;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from "@gajae-code/utils/cli";
|
|
2
2
|
import type { Args as ParsedArgs } from "../cli/args";
|
|
3
|
+
import { applyStartupModelProfiles } from "../main";
|
|
3
4
|
import { type SessionLifecycleLaunchRequest } from "../sdk/broker/lifecycle";
|
|
4
5
|
import { SessionManager } from "../session/session-manager";
|
|
5
6
|
export declare function lifecycleArgs(request: SessionLifecycleLaunchRequest, cwd: string, agentDir: string): Promise<ParsedArgs>;
|
|
@@ -109,6 +110,7 @@ export declare function runSessionHost(timing?: {
|
|
|
109
110
|
sleep?: (ms: number) => Promise<void>;
|
|
110
111
|
cwd?: string;
|
|
111
112
|
processIncarnation?: (pid: number) => string | undefined;
|
|
113
|
+
applyStartupModelProfiles?: typeof applyStartupModelProfiles;
|
|
112
114
|
}): Promise<void>;
|
|
113
115
|
export type SdkInternalArgv = {
|
|
114
116
|
action: "broker-internal";
|
|
@@ -784,12 +784,33 @@ export declare const TIER_MAP_SKIP_LIST: {
|
|
|
784
784
|
readonly "openai-codex/gpt-daybreak-blue-latest": {
|
|
785
785
|
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
786
786
|
};
|
|
787
|
+
readonly "opencode-go/deepseek-v4-flash-vision-exp": {
|
|
788
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
789
|
+
};
|
|
790
|
+
readonly "opencode-go/glm-5.3-flash": {
|
|
791
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
792
|
+
};
|
|
787
793
|
readonly "opencode-go/gpt-5.6-luna": {
|
|
788
794
|
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
789
795
|
};
|
|
796
|
+
readonly "opencode-go/grok-4.6": {
|
|
797
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
798
|
+
};
|
|
790
799
|
readonly "opencode-go/hy3": {
|
|
791
800
|
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
792
801
|
};
|
|
802
|
+
readonly "opencode-go/hy4-preview": {
|
|
803
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
804
|
+
};
|
|
805
|
+
readonly "opencode-go/longcat-2.0": {
|
|
806
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
807
|
+
};
|
|
808
|
+
readonly "opencode-go/muse-spark-1.2-contributor": {
|
|
809
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
810
|
+
};
|
|
811
|
+
readonly "opencode-go/qwen3.8-flash": {
|
|
812
|
+
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
813
|
+
};
|
|
793
814
|
readonly "opencode-go/qwen3.8-max": {
|
|
794
815
|
readonly rationale: "post-rebase catalog addition from dev; not yet curated";
|
|
795
816
|
};
|
|
@@ -1686,6 +1707,9 @@ export declare const TIER_MAP_SKIP_LIST: {
|
|
|
1686
1707
|
readonly baseline: true;
|
|
1687
1708
|
readonly rationale: "pre-feature baseline; not yet curated";
|
|
1688
1709
|
};
|
|
1710
|
+
readonly "anthropic/claude-fable-5-1": {
|
|
1711
|
+
readonly rationale: "post-feature catalog addition; not yet curated";
|
|
1712
|
+
};
|
|
1689
1713
|
readonly "anthropic/claude-haiku-4-5-20251001": {
|
|
1690
1714
|
readonly baseline: true;
|
|
1691
1715
|
readonly rationale: "pre-feature baseline; not yet curated";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Billing path for a resolved binding's credential source — audit-reversible.
|
|
3
|
+
* Derived from (model.api, credential-provenance) where the binding actually
|
|
4
|
+
* resolves credentials, not from a provider-name allowlist.
|
|
5
|
+
*/
|
|
6
|
+
import type { Api } from "@gajae-code/ai/core";
|
|
7
|
+
import type { EffectiveProviderAuth } from "./provider-selection-policy";
|
|
8
|
+
/**
|
|
9
|
+
* Label shown in the selector row + active-model line. Only the category is
|
|
10
|
+
* disclosed (never the key material or project id).
|
|
11
|
+
*/
|
|
12
|
+
export type BillingPathKind = "metered-api" | "cloud-project" | "bundled";
|
|
13
|
+
export interface BillingPath {
|
|
14
|
+
kind: BillingPathKind;
|
|
15
|
+
/** Stable per-credential-source key for one-time notice dismissal. */
|
|
16
|
+
dismissKey: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Derive from the concrete binding (api + credential provenance).
|
|
21
|
+
* - oauth/keyless/unknown => bundled (plan/proxied/kNoAuth-like)
|
|
22
|
+
* - key + cloud-project api (google-vertex / bedrock) => cloud-project
|
|
23
|
+
* - key + any other api (including custom OpenAI-compatible) => metered-api
|
|
24
|
+
*/
|
|
25
|
+
export declare function deriveBillingPath(provider: string, api: Api | string | undefined, effectiveAuth: EffectiveProviderAuth): BillingPath | undefined;
|
|
@@ -7,4 +7,16 @@
|
|
|
7
7
|
* this dependency-light module so the resolver can import it without pulling in
|
|
8
8
|
* the TUI/AI-heavy settings schema.
|
|
9
9
|
*/
|
|
10
|
-
export declare const CONFIG_SCHEMA_VERSION =
|
|
10
|
+
export declare const CONFIG_SCHEMA_VERSION = 2;
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a durable `configSchemaVersion` marker into a comparable version.
|
|
13
|
+
*
|
|
14
|
+
* Every version decision (future-schema detection, migration-pending state, and
|
|
15
|
+
* the ordered migration registry) must read the SAME normalized value: a
|
|
16
|
+
* malformed marker read as a future schema by one guard and as unmigrated by
|
|
17
|
+
* the next would skip legacy migrations while still re-running v0 transforms.
|
|
18
|
+
* A finite malformed value floors to the nearest completed version; a
|
|
19
|
+
* non-finite or non-numeric one carries no version information and normalizes
|
|
20
|
+
* to 0 (fully unmigrated). `undefined` stays `undefined` (no marker written).
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeConfigSchemaVersion(value: unknown): number | undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { NativeDirectoryTreeResult, NativeExactUnlinkResult } from "@gajae-code/natives";
|
|
2
|
+
import { renameDirectoryNoReplacePathAsync, renameNoReplacePathAsync } from "@gajae-code/natives";
|
|
2
3
|
export interface FileLockOptions {
|
|
3
4
|
staleMs?: number;
|
|
4
5
|
retries?: number;
|
|
@@ -15,6 +16,10 @@ export declare const FILE_LOCK_RELEASE_RETRY_ATTEMPTS = 5;
|
|
|
15
16
|
export declare const FILE_LOCK_RELEASE_RETRY_DELAY_MS = 10;
|
|
16
17
|
export declare const FileLockTestHooks: {
|
|
17
18
|
afterParentMkdir?: (lockPath: string) => void | Promise<void>;
|
|
19
|
+
nativePublicationBindings?: () => {
|
|
20
|
+
renameNoReplacePathAsync: typeof renameNoReplacePathAsync;
|
|
21
|
+
renameDirectoryNoReplacePathAsync: typeof renameDirectoryNoReplacePathAsync;
|
|
22
|
+
};
|
|
18
23
|
nativeQuarantineBindings?: () => NativeFileLockBindings;
|
|
19
24
|
};
|
|
20
25
|
/**
|
|
@@ -4,6 +4,7 @@ import { type ThemeColor } from "../modes/theme/theme";
|
|
|
4
4
|
import { type ActiveProviderDescriptor } from "../sdk/providers";
|
|
5
5
|
import type { AuthStorage } from "../session/auth-storage";
|
|
6
6
|
import type { ActiveSearchModelContext, WebSearchMode } from "../web/search/types";
|
|
7
|
+
import { type BillingPath } from "./billing-path";
|
|
7
8
|
import { ConfigError, ConfigFile } from "./config-file";
|
|
8
9
|
import { isAuthenticated, kNoAuth } from "./model-auth";
|
|
9
10
|
import { type ConfiguredModelBindings } from "./model-bindings-applier";
|
|
@@ -15,9 +16,16 @@ import { type ModelProfileDefinition } from "./model-profiles";
|
|
|
15
16
|
import { GJC_MODEL_ASSIGNMENT_TARGET_IDS, type ModelProfileConfig } from "./models-config-schema";
|
|
16
17
|
import { type EffectiveProviderAuth } from "./provider-selection-policy";
|
|
17
18
|
import { type Settings } from "./settings";
|
|
19
|
+
export type { BillingPath, BillingPathKind } from "./billing-path";
|
|
18
20
|
export type { EffectiveProviderAuth, ProviderSelectionPolicy } from "./provider-selection-policy";
|
|
19
21
|
export type { CanonicalModelIndex, CanonicalModelRecord, CanonicalModelVariant, ModelEquivalenceConfig };
|
|
20
22
|
export { isAuthenticated, kNoAuth };
|
|
23
|
+
/**
|
|
24
|
+
* A loopback discovery endpoint that is proven to have no listener is the normal state of
|
|
25
|
+
* a machine without a local model server. Structured transport evidence is required when
|
|
26
|
+
* available; DNS, routing, proxy, TLS, and HTTP failures remain warnings.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isQuietLocalDiscoveryFailure(baseUrl: string, _warning: string, evidence?: unknown): boolean;
|
|
21
29
|
export type ModelRole = "default";
|
|
22
30
|
export interface ModelRoleInfo {
|
|
23
31
|
tag?: string;
|
|
@@ -409,6 +417,12 @@ export declare class ModelRegistry {
|
|
|
409
417
|
* with case-sensitive exact strings.
|
|
410
418
|
*/
|
|
411
419
|
autoroutingProviderOrder(): readonly string[];
|
|
420
|
+
/**
|
|
421
|
+
* Provider priority for automatic model selection. Explicit provider order
|
|
422
|
+
* wins first, followed by omitted OAuth providers, then other providers;
|
|
423
|
+
* catalog order breaks ties within each policy band.
|
|
424
|
+
*/
|
|
425
|
+
automaticProviderOrder(sessionId?: string): readonly string[];
|
|
412
426
|
getCanonicalModels(options?: CanonicalModelQueryOptions): CanonicalModelRecord[];
|
|
413
427
|
/**
|
|
414
428
|
* Batch form of {@link resolveCanonicalModel} over every canonical record:
|
|
@@ -460,6 +474,14 @@ export declare class ModelRegistry {
|
|
|
460
474
|
* unknown/keyless providers fall back to non-OAuth.
|
|
461
475
|
*/
|
|
462
476
|
getEffectiveProviderAuth(provider: string, sessionId?: string): EffectiveProviderAuth;
|
|
477
|
+
/**
|
|
478
|
+
* Billing path for a resolved binding — derived at the point the binding
|
|
479
|
+
* resolves credentials (model.api + credential provenance). Not a
|
|
480
|
+
* provider-name allowlist: a custom OpenAI-compatible provider bound
|
|
481
|
+
* to a metered gateway is "metered-api" exactly like a first-party
|
|
482
|
+
* key. Only the billing category is ever disclosed.
|
|
483
|
+
*/
|
|
484
|
+
getBillingPath(model: Model<Api>, sessionId?: string): BillingPath | undefined;
|
|
463
485
|
/**
|
|
464
486
|
* Forget a session's remembered canonical variant so the next resolution
|
|
465
487
|
* for that session re-ranks from scratch (explicit reselection
|
|
@@ -219,6 +219,12 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
219
219
|
readonly description: "Hard maximum runtime for an SDK prompt from acceptance, bounding progress-aware renewals.";
|
|
220
220
|
readonly validate: (value: number) => boolean;
|
|
221
221
|
};
|
|
222
|
+
readonly "sdk.masterOrphanGraceMs": {
|
|
223
|
+
readonly type: "number";
|
|
224
|
+
readonly default: 120000;
|
|
225
|
+
readonly description: "Grace period before a master-spawned child orphaned by confirmed master loss is closed.";
|
|
226
|
+
readonly validate: (value: number) => boolean;
|
|
227
|
+
};
|
|
222
228
|
readonly "notifications.enabled": {
|
|
223
229
|
readonly type: "boolean";
|
|
224
230
|
readonly default: false;
|
|
@@ -604,7 +610,7 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
604
610
|
};
|
|
605
611
|
readonly "ui.language": {
|
|
606
612
|
readonly type: "enum";
|
|
607
|
-
readonly values: readonly ["en", "ko", "ja"];
|
|
613
|
+
readonly values: readonly ["en", "ko", "zh", "ja"];
|
|
608
614
|
readonly default: "en";
|
|
609
615
|
readonly ui: {
|
|
610
616
|
readonly tab: "appearance";
|
|
@@ -616,6 +622,9 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
616
622
|
}, {
|
|
617
623
|
readonly value: "ko";
|
|
618
624
|
readonly label: "Korean (한국어)";
|
|
625
|
+
}, {
|
|
626
|
+
readonly value: "zh";
|
|
627
|
+
readonly label: "Chinese (简体中文)";
|
|
619
628
|
}, {
|
|
620
629
|
readonly value: "ja";
|
|
621
630
|
readonly label: "Japanese (日本語)";
|
|
@@ -1729,14 +1738,14 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
1729
1738
|
readonly description: "How to drain follow-up messages after a turn completes";
|
|
1730
1739
|
};
|
|
1731
1740
|
};
|
|
1732
|
-
readonly
|
|
1741
|
+
readonly toolInterruptPolicy: {
|
|
1733
1742
|
readonly type: "enum";
|
|
1734
|
-
readonly values: readonly ["
|
|
1735
|
-
readonly default: "
|
|
1743
|
+
readonly values: readonly ["abort_tools", "finish_tools"];
|
|
1744
|
+
readonly default: "abort_tools";
|
|
1736
1745
|
readonly ui: {
|
|
1737
1746
|
readonly tab: "interaction";
|
|
1738
|
-
readonly label: "Interrupt
|
|
1739
|
-
readonly description: "
|
|
1747
|
+
readonly label: "Tool Interrupt Policy";
|
|
1748
|
+
readonly description: "Whether a steering message aborts the tools still running in the current batch (abort_tools) or lets them finish first (finish_tools). Never changes when a steer is consumed: it is always picked up at the next tool/turn boundary either way.";
|
|
1740
1749
|
};
|
|
1741
1750
|
};
|
|
1742
1751
|
readonly busyPromptMode: {
|
|
@@ -3433,6 +3442,16 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
3433
3442
|
readonly description: "Enable the browser tool (Ulixee Hero)";
|
|
3434
3443
|
};
|
|
3435
3444
|
};
|
|
3445
|
+
readonly "browser.backend": {
|
|
3446
|
+
readonly type: "enum";
|
|
3447
|
+
readonly values: readonly ["native", "aside"];
|
|
3448
|
+
readonly default: "native";
|
|
3449
|
+
readonly ui: {
|
|
3450
|
+
readonly tab: "tools";
|
|
3451
|
+
readonly label: "Browser Backend";
|
|
3452
|
+
readonly description: "Browser surface offered to the model. 'native' exposes the built-in Puppeteer browser tool. 'aside' hides it and requires every browser task to run through the Aside CLI in your live logged-in browser (requires the Aside CLI).";
|
|
3453
|
+
};
|
|
3454
|
+
};
|
|
3436
3455
|
readonly "browser.headless": {
|
|
3437
3456
|
readonly type: "boolean";
|
|
3438
3457
|
readonly default: true;
|
|
@@ -3458,7 +3477,7 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
3458
3477
|
readonly ui: {
|
|
3459
3478
|
readonly tab: "tools";
|
|
3460
3479
|
readonly label: "Profile reuse posture";
|
|
3461
|
-
readonly description: "'auto' (default): when a usable real Chrome profile is available, the browser tool uses an isolated copy of it (cookies/session/cache) for stronger stealth, warns, and falls back to synthetic. 'opt-in': stay synthetic unless a real profile is explicitly requested.";
|
|
3480
|
+
readonly description: "'auto' (default): when a usable real Chrome profile is available, the browser tool uses an isolated copy of it (cookies/session/cache) for stronger stealth, warns, and falls back to synthetic. 'opt-in': stay synthetic unless a real profile is explicitly requested. On macOS, cookie decryption is brand-specific (Chrome Safe Storage vs Chromium Safe Storage Keychain); a Chrome profile copied into bundled Chromium decrypts to garbage, so auto reuses the profile only when the headless executable can decrypt it — detected system Chrome/Chromium or PUPPETEER_EXECUTABLE_PATH — otherwise it falls back to synthetic with a warning.";
|
|
3462
3481
|
};
|
|
3463
3482
|
};
|
|
3464
3483
|
readonly "browser.geo.timezone": {
|
|
@@ -4538,7 +4557,7 @@ export declare function getPathsForTab(tab: SettingTab): SettingPath[];
|
|
|
4538
4557
|
export declare function getType(path: SettingPath): SettingDef["type"];
|
|
4539
4558
|
/** Get enum values for an enum setting */
|
|
4540
4559
|
export declare function getEnumValues(path: SettingPath): readonly string[] | undefined;
|
|
4541
|
-
export { CONFIG_SCHEMA_VERSION } from "./config-schema-version";
|
|
4560
|
+
export { CONFIG_SCHEMA_VERSION, normalizeConfigSchemaVersion } from "./config-schema-version";
|
|
4542
4561
|
export type SettingsSchemaIssue = {
|
|
4543
4562
|
path: string;
|
|
4544
4563
|
kind: "unknown" | "invalid" | "coerced" | "pending-migration";
|
|
@@ -145,6 +145,8 @@ export declare class Settings implements NotificationSettingsReader {
|
|
|
145
145
|
onChanged(listener: (path: SettingPath) => void): () => void;
|
|
146
146
|
/** Whether durable settings mutations are permitted for the loaded configuration. */
|
|
147
147
|
canWriteDurableConfig(): boolean;
|
|
148
|
+
/** Whether this instance can publish a mutation to a durable config file. */
|
|
149
|
+
canPersistDurableConfig(): boolean;
|
|
148
150
|
/**
|
|
149
151
|
* Set a setting value (sync).
|
|
150
152
|
* Updates global settings and reserves its background persistence slot before
|
|
@@ -4,6 +4,8 @@ export declare const ProjectionScanTestHooks: {
|
|
|
4
4
|
};
|
|
5
5
|
/** Post-filter parse-candidate cap. Exhaustion returns an explicit incomplete result. */
|
|
6
6
|
export declare const COORDINATOR_JSON_SCAN_CAP = 10000;
|
|
7
|
+
/** Number of fresh authoritative attempts allowed for a scan that observed churn. */
|
|
8
|
+
export declare const COORDINATOR_JSON_SCAN_RETRY_ATTEMPTS = 3;
|
|
7
9
|
export interface ProjectionScanStat {
|
|
8
10
|
size: number | bigint;
|
|
9
11
|
dev?: number | bigint;
|
|
@@ -44,3 +46,9 @@ export interface ProjectionScanResult {
|
|
|
44
46
|
}
|
|
45
47
|
export declare function isCoordinatorScanDebrisName(name: string): boolean;
|
|
46
48
|
export declare function listCoordinatorJsonFiles(dir: string, io?: ProjectionScanFs, cap?: number): Promise<ProjectionScanResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Retry only scans invalidated by observed directory/file churn. A candidate cap,
|
|
51
|
+
* unsupported authority, parse error, or any other failure remains fail-closed.
|
|
52
|
+
* Each attempt acquires a new authority, so no partial result crosses attempts.
|
|
53
|
+
*/
|
|
54
|
+
export declare function listCoordinatorJsonFilesWithRetry(dir: string, io?: ProjectionScanFs, cap?: number, maxAttempts?: number): Promise<ProjectionScanResult>;
|