@gajae-code/coding-agent 0.18.11 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +760 -0
- package/dist/types/async/job-manager.d.ts +7 -3
- package/dist/types/async/result-formatting.d.ts +2 -0
- package/dist/types/autoresearch/git.d.ts +1 -1
- package/dist/types/capability/fs.d.ts +2 -2
- package/dist/types/capability/rule.d.ts +7 -2
- package/dist/types/cli/accounts-cli.d.ts +2 -2
- package/dist/types/cli/append-system-prompt.d.ts +6 -0
- package/dist/types/cli/args.d.ts +7 -2
- package/dist/types/cli/customize-doctor-precedence.d.ts +16 -0
- package/dist/types/cli/customize-doctor.d.ts +4 -3
- package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
- package/dist/types/cli/install-activation.d.ts +10 -4
- package/dist/types/cli/public-command-errors.d.ts +2 -0
- package/dist/types/cli/root-flags.d.ts +0 -12
- package/dist/types/cli/update-cli.d.ts +21 -3
- package/dist/types/cli-main.d.ts +0 -6
- package/dist/types/cli-ordinary.d.ts +2 -2
- package/dist/types/commands/accounts.d.ts +2 -1
- package/dist/types/commands/launch.d.ts +0 -6
- package/dist/types/commands/migrate.d.ts +1 -1
- package/dist/types/commands/sdk.d.ts +13 -0
- package/dist/types/commit/changelog/index.d.ts +1 -0
- package/dist/types/commit/map-reduce/index.d.ts +4 -4
- package/dist/types/config/autorouting-tier-map.d.ts +53 -1
- package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
- package/dist/types/config/config-hot-reload.d.ts +44 -0
- package/dist/types/config/file-lock.d.ts +52 -3
- package/dist/types/config/model-discovery-manager.d.ts +2 -0
- package/dist/types/config/model-profile-activation.d.ts +79 -9
- package/dist/types/config/model-registry.d.ts +72 -8
- package/dist/types/config/model-resolver.d.ts +7 -4
- package/dist/types/config/models-config-schema.d.ts +10 -0
- package/dist/types/config/settings-schema.d.ts +57 -4
- package/dist/types/config/settings.d.ts +33 -1
- package/dist/types/coordinator-mcp/server.d.ts +4 -0
- package/dist/types/customization/import.d.ts +2 -0
- package/dist/types/customization/types.d.ts +1 -1
- package/dist/types/dap/config.d.ts +8 -4
- package/dist/types/dap/session.d.ts +11 -2
- package/dist/types/debug/system-info.d.ts +6 -1
- package/dist/types/discovery/helpers.d.ts +7 -2
- package/dist/types/discovery/mcp-compat.d.ts +3 -1
- package/dist/types/edit/index.d.ts +5 -0
- package/dist/types/edit/modes/patch.d.ts +14 -0
- package/dist/types/edit/modes/replace.d.ts +3 -0
- package/dist/types/eval/py/runtime.d.ts +9 -0
- package/dist/types/exec/bash-executor.d.ts +12 -0
- package/dist/types/export/ttsr.d.ts +19 -0
- package/dist/types/extensibility/extensions/types.d.ts +5 -1
- package/dist/types/extensibility/slash-commands.d.ts +1 -0
- package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-current-final.d.ts +54 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +5 -0
- package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
- package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +24 -0
- package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +6 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
- package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
- package/dist/types/hindsight/content.d.ts +5 -6
- package/dist/types/internal-urls/types.d.ts +2 -0
- package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -4
- package/dist/types/main.d.ts +23 -18
- package/dist/types/migrate/action-planner.d.ts +10 -1
- package/dist/types/migrate/adapters/codex.d.ts +2 -1
- package/dist/types/migrate/adapters/index.d.ts +42 -1
- package/dist/types/migrate/executor.d.ts +3 -1
- package/dist/types/migrate/hook-module.d.ts +23 -0
- package/dist/types/migrate/report.d.ts +2 -1
- package/dist/types/migrate/types.d.ts +82 -3
- package/dist/types/modes/components/agent-dashboard.d.ts +1 -1
- package/dist/types/modes/components/model-selector.d.ts +43 -0
- package/dist/types/modes/components/settings-selector.d.ts +6 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
- package/dist/types/modes/prompt-suggestion-controller.d.ts +1 -1
- package/dist/types/modes/theme/theme.d.ts +1 -0
- package/dist/types/modes/utils/host-status.d.ts +15 -11
- package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
- package/dist/types/runtime-mcp/manager.d.ts +7 -0
- package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
- package/dist/types/runtime-mcp/project-host-values.d.ts +11 -5
- package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
- package/dist/types/sdk/broker/broker-exit.d.ts +3 -3
- package/dist/types/sdk/broker/broker.d.ts +29 -2
- package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
- package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
- package/dist/types/sdk/broker/ensure.d.ts +141 -9
- package/dist/types/sdk/broker/hop.d.ts +45 -0
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
- package/dist/types/sdk/broker/lifecycle.d.ts +22 -0
- package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
- package/dist/types/sdk/broker/session-index.d.ts +6 -1
- package/dist/types/sdk/broker/transport.d.ts +2 -0
- package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
- package/dist/types/sdk/bus/index.d.ts +44 -0
- package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +2 -0
- package/dist/types/sdk/bus/threaded-render.d.ts +2 -1
- package/dist/types/sdk/cli/session-cli.d.ts +0 -1
- package/dist/types/sdk/host/control/operations.d.ts +5 -1
- package/dist/types/sdk/host/events.d.ts +4 -0
- package/dist/types/sdk/host/host.d.ts +2 -1
- package/dist/types/sdk/host/prompt-image-upload.d.ts +43 -0
- package/dist/types/sdk/host/session-runtime.d.ts +40 -8
- package/dist/types/sdk/host/surface-policy.d.ts +2 -1
- package/dist/types/sdk/lifecycle/service.d.ts +12 -0
- package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
- package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
- package/dist/types/sdk/prompt-status.d.ts +11 -4
- package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
- package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
- package/dist/types/sdk/session-list.d.ts +1 -1
- package/dist/types/session/agent-session.d.ts +107 -9
- package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
- package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
- package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
- package/dist/types/session/messages.d.ts +5 -1
- package/dist/types/session/session-manager.d.ts +29 -3
- package/dist/types/session/startup-auth-config.d.ts +24 -2
- package/dist/types/session/streaming-output.d.ts +11 -0
- package/dist/types/session/terminal-abort.d.ts +3 -1
- package/dist/types/session-import/service.d.ts +1 -1
- package/dist/types/skill-state/workflow-mutation-guard.d.ts +20 -4
- package/dist/types/slash-commands/helpers/mcp.d.ts +5 -0
- package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
- package/dist/types/ssh/ssh-executor.d.ts +8 -1
- package/dist/types/system-prompt.d.ts +3 -2
- package/dist/types/task/executor.d.ts +19 -2
- package/dist/types/task/role-body.d.ts +11 -0
- package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
- package/dist/types/tools/atomic-file-write.d.ts +9 -7
- package/dist/types/tools/awaiting-input.d.ts +28 -0
- package/dist/types/tools/bash-allowed-prefixes.d.ts +17 -0
- package/dist/types/tools/bash-skill-urls.d.ts +4 -0
- package/dist/types/tools/bash.d.ts +7 -0
- package/dist/types/tools/descriptors.d.ts +15 -2
- package/dist/types/tools/fetch.d.ts +7 -1
- package/dist/types/tools/index.d.ts +2 -0
- package/dist/types/tools/irc.d.ts +5 -3
- package/dist/types/tools/python.d.ts +1 -1
- package/dist/types/tools/report-issue.d.ts +41 -0
- package/dist/types/tools/subagent.d.ts +23 -0
- package/dist/types/tools/tmux-self-injection-guard.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +1 -1
- package/dist/types/tools/write.d.ts +2 -0
- package/dist/types/utils/file-mentions.d.ts +5 -0
- package/dist/types/utils/image-limits.d.ts +7 -0
- package/dist/types/utils/image-loading.d.ts +0 -1
- package/dist/types/utils/open.d.ts +0 -1
- package/dist/types/utils/pasted-image-loading.d.ts +1 -5
- package/dist/types/utils/prompt-suggestion.d.ts +2 -2
- package/dist/types/utils/shell-snapshot.d.ts +2 -0
- package/dist/types/utils/title-generator.d.ts +13 -3
- package/dist/types/web/scrapers/types.d.ts +8 -1
- package/dist/types/web/search/providers/codex.d.ts +6 -7
- package/dist/types/web/search/providers/insane.d.ts +7 -1
- package/dist/types/web/search/providers/searxng.d.ts +5 -0
- package/package.json +10 -9
- package/scripts/acp-conformance-agent.ts +12 -2
- package/scripts/build-binary.ts +2 -1
- package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
- package/scripts/generate-docs-index.ts +8 -1
- package/scripts/generate-sdk-operation-inventory.ts +38 -4
- package/src/async/job-manager.ts +356 -56
- package/src/async/result-formatting.ts +40 -0
- package/src/autoresearch/git.ts +9 -2
- package/src/autoresearch/prompts/prompt-setup.md +1 -1
- package/src/capability/fs.ts +58 -22
- package/src/capability/index.ts +2 -2
- package/src/capability/rule.ts +11 -2
- package/src/cli/accounts-cli.ts +176 -8
- package/src/cli/append-system-prompt.ts +12 -0
- package/src/cli/args.ts +11 -7
- package/src/cli/auth-broker-cli.ts +21 -11
- package/src/cli/customize-doctor-precedence.ts +31 -0
- package/src/cli/customize-doctor.ts +49 -39
- package/src/cli/doctor/install-repairs.ts +35 -5
- package/src/cli/fast-help.ts +1 -3
- package/src/cli/install-activation.ts +47 -4
- package/src/cli/migrate-cli.ts +19 -6
- package/src/cli/public-command-errors.ts +6 -0
- package/src/cli/root-flags.ts +2 -4
- package/src/cli/stats-cli.ts +9 -5
- package/src/cli/update-cli.ts +471 -13
- package/src/cli-ordinary.ts +7 -2
- package/src/commands/accounts.ts +10 -5
- package/src/commands/harness.ts +25 -15
- package/src/commands/migrate.ts +3 -3
- package/src/commands/sdk.ts +277 -50
- package/src/commands/ultragoal.ts +16 -8
- package/src/commit/agentic/agent.ts +6 -6
- package/src/commit/analysis/conventional.ts +14 -5
- package/src/commit/changelog/index.ts +39 -1
- package/src/commit/map-reduce/index.ts +7 -7
- package/src/commit/message.ts +10 -3
- package/src/commit/pipeline.ts +12 -12
- package/src/config/autorouting-tier-map.ts +50 -1
- package/src/config/config-file.ts +106 -3
- package/src/config/config-hot-reload-trust.ts +148 -0
- package/src/config/config-hot-reload.ts +742 -0
- package/src/config/file-lock.ts +1615 -328
- package/src/config/keybindings.ts +154 -7
- package/src/config/model-bindings-applier.ts +85 -47
- package/src/config/model-discovery-manager.ts +10 -0
- package/src/config/model-profile-activation.ts +889 -148
- package/src/config/model-registry.ts +1706 -205
- package/src/config/model-resolver.ts +52 -22
- package/src/config/models-config-schema.ts +6 -0
- package/src/config/settings-schema.ts +73 -4
- package/src/config/settings.ts +460 -24
- package/src/coordinator-mcp/policy.ts +26 -1
- package/src/coordinator-mcp/server.ts +37 -2
- package/src/crash/sanitize.ts +7 -1
- package/src/customization/import.ts +279 -8
- package/src/customization/inventory.ts +24 -8
- package/src/customization/types.ts +1 -0
- package/src/dap/client.ts +3 -2
- package/src/dap/config.ts +31 -11
- package/src/dap/defaults.json +1 -1
- package/src/dap/session.ts +161 -36
- package/src/debug/crash-diagnostics.ts +89 -6
- package/src/debug/report-bundle.ts +90 -2
- package/src/debug/system-info.ts +8 -3
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
- package/src/discovery/agents-md.ts +1 -1
- package/src/discovery/builtin.ts +4 -3
- package/src/discovery/helpers.ts +25 -16
- package/src/discovery/mcp-compat.ts +120 -17
- package/src/edit/apply-patch/index.ts +12 -1
- package/src/edit/index.ts +204 -22
- package/src/edit/modes/patch.ts +214 -8
- package/src/edit/modes/replace.ts +136 -0
- package/src/eval/js/context-manager.ts +29 -3
- package/src/eval/js/worker-entry.ts +51 -18
- package/src/eval/py/executor.ts +14 -4
- package/src/eval/py/runner.py +144 -5
- package/src/eval/py/runtime.ts +44 -4
- package/src/exec/bash-executor.ts +81 -4
- package/src/exec/bash-shell-guardian.ts +4 -1
- package/src/exec/bash-shell-supervisor.ts +8 -4
- package/src/exec/isolated-shell.ts +5 -1
- package/src/exec/non-interactive-env.ts +0 -1
- package/src/export/html/index.ts +86 -6
- package/src/export/ttsr.ts +176 -1
- package/src/extensibility/custom-tools/wrapper.ts +3 -1
- package/src/extensibility/extensions/loader.ts +10 -1
- package/src/extensibility/extensions/ouroboros-ooo-bridge.ts +63 -1
- package/src/extensibility/extensions/types.ts +5 -1
- package/src/extensibility/hooks/loader.ts +10 -2
- package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
- package/src/extensibility/plugins/marketplace/manager.ts +36 -10
- package/src/extensibility/slash-commands.ts +5 -0
- package/src/gjc-runtime/gc-runtime.ts +37 -7
- package/src/gjc-runtime/launch-tmux.ts +30 -15
- package/src/gjc-runtime/launch-worktree.test.ts +148 -0
- package/src/gjc-runtime/launch-worktree.ts +101 -14
- package/src/gjc-runtime/managed-owner-admission.ts +46 -2
- package/src/gjc-runtime/ralplan-current-final.ts +294 -0
- package/src/gjc-runtime/ralplan-runtime.ts +95 -1
- package/src/gjc-runtime/session-resolution.ts +38 -6
- package/src/gjc-runtime/session-state-lock.ts +59 -14
- package/src/gjc-runtime/state-runtime.ts +23 -19
- package/src/gjc-runtime/state-writer.ts +109 -5
- package/src/gjc-runtime/tmux-sessions.ts +93 -13
- package/src/gjc-runtime/ultragoal-change-set.ts +90 -11
- package/src/gjc-runtime/ultragoal-guard.ts +9 -1
- package/src/gjc-runtime/ultragoal-runtime.ts +15 -5
- package/src/harness-control-plane/finalize.ts +11 -0
- package/src/harness-control-plane/receipt-spool.ts +105 -28
- package/src/harness-control-plane/storage.ts +124 -6
- package/src/hindsight/content.ts +116 -16
- package/src/hindsight/mental-models.ts +22 -10
- package/src/hindsight/state.ts +7 -4
- package/src/hooks/native-skill-hook.ts +17 -12
- package/src/internal-urls/artifact-protocol.ts +3 -1
- package/src/internal-urls/docs-index.generated.ts +23 -22
- package/src/internal-urls/local-protocol.ts +167 -8
- package/src/internal-urls/types.ts +2 -0
- package/src/lsp/client.ts +2 -1
- package/src/lsp/clients/biome-client.ts +2 -0
- package/src/lsp/clients/swiftlint-client.ts +2 -0
- package/src/lsp/index.ts +29 -0
- package/src/lsp/workspace-path.ts +23 -0
- package/src/main.ts +330 -92
- package/src/memories/index.ts +25 -2
- package/src/migrate/action-planner.ts +574 -2
- package/src/migrate/adapters/claude-code.ts +162 -5
- package/src/migrate/adapters/codex.ts +77 -7
- package/src/migrate/adapters/index.ts +258 -5
- package/src/migrate/adapters/opencode.ts +10 -1
- package/src/migrate/executor.ts +222 -7
- package/src/migrate/hook-module.ts +193 -0
- package/src/migrate/report.ts +63 -2
- package/src/migrate/types.ts +84 -4
- package/src/modes/DESIGN.md +51 -0
- package/src/modes/acp/acp-agent.ts +10 -1
- package/src/modes/acp/permission-mode.ts +18 -1
- package/src/modes/components/agent-dashboard.ts +20 -4
- package/src/modes/components/assistant-message.ts +55 -1
- package/src/modes/components/customization/customization-dashboard.ts +7 -0
- package/src/modes/components/customization/import-wizard.ts +29 -3
- package/src/modes/components/model-selector.ts +157 -103
- package/src/modes/components/settings-selector.ts +103 -37
- package/src/modes/components/welcome.ts +3 -1
- package/src/modes/controllers/command-controller.ts +300 -9
- package/src/modes/controllers/event-controller.ts +1 -1
- package/src/modes/controllers/extension-ui-controller.ts +31 -1
- package/src/modes/controllers/goal-mode-controller.ts +79 -10
- package/src/modes/controllers/input-controller.ts +2 -0
- package/src/modes/controllers/plan-mode-controller.ts +66 -11
- package/src/modes/controllers/runtime-mcp-command-controller.ts +7 -6
- package/src/modes/controllers/selector-controller.ts +76 -7
- package/src/modes/interactive-mode.ts +123 -4
- package/src/modes/prompt-suggestion-controller.ts +1 -1
- package/src/modes/runtime-init.ts +5 -1
- package/src/modes/theme/theme.ts +15 -0
- package/src/modes/utils/host-status.ts +21 -10
- package/src/prompts/agent-fragments/browser-aside.md +2 -2
- package/src/prompts/system/irc-incoming.md +3 -1
- package/src/prompts/tools/debug.md +1 -1
- package/src/prompts/tools/irc.md +1 -1
- package/src/prompts/tools/read.md +1 -1
- package/src/prompts/tools/report-issue.md +13 -0
- package/src/prompts/tools/task.md +1 -1
- package/src/runtime-credential-selector.ts +2 -2
- package/src/runtime-mcp/content-limits.ts +7 -0
- package/src/runtime-mcp/manager-pool.test.ts +5 -4
- package/src/runtime-mcp/manager.ts +40 -3
- package/src/runtime-mcp/oauth-flow.ts +32 -6
- package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
- package/src/runtime-mcp/project-host-values.ts +12 -8
- package/src/runtime-mcp/render.ts +16 -1
- package/src/runtime-mcp/tool-bridge.ts +194 -21
- package/src/runtime-mcp/transports/stdio.ts +2 -1
- package/src/sdk/broker/broker-exit.ts +10 -5
- package/src/sdk/broker/broker.ts +484 -85
- package/src/sdk/broker/daemon-entry.ts +338 -116
- package/src/sdk/broker/doctor-restart.ts +2 -1
- package/src/sdk/broker/ensure.ts +1214 -268
- package/src/sdk/broker/hop.ts +286 -0
- package/src/sdk/broker/lifecycle-ledger.ts +38 -11
- package/src/sdk/broker/lifecycle.ts +102 -6
- package/src/sdk/broker/lock-host-identity.ts +29 -0
- package/src/sdk/broker/session-index.ts +91 -16
- package/src/sdk/broker/transport.ts +17 -1
- package/src/sdk/bus/chat-command-policy.ts +16 -3
- package/src/sdk/bus/chat-daemon-control.ts +2 -2
- package/src/sdk/bus/index.ts +460 -35
- package/src/sdk/bus/reconciliation-store.ts +201 -8
- package/src/sdk/bus/session-control.ts +2 -0
- package/src/sdk/bus/slack-daemon.ts +105 -9
- package/src/sdk/bus/telegram-daemon-contract.ts +9 -1
- package/src/sdk/bus/telegram-daemon.ts +10 -2
- package/src/sdk/bus/threaded-render.ts +20 -1
- package/src/sdk/cli/session-cli.ts +23 -6
- package/src/sdk/host/control/dispatch.ts +13 -1
- package/src/sdk/host/control/operations.ts +10 -1
- package/src/sdk/host/events.ts +67 -4
- package/src/sdk/host/host.ts +8 -2
- package/src/sdk/host/prompt-image-upload.ts +438 -0
- package/src/sdk/host/sdk-surface-parity.test.ts +15 -0
- package/src/sdk/host/session-runtime.test.ts +1737 -129
- package/src/sdk/host/session-runtime.ts +684 -83
- package/src/sdk/host/surface-policy.ts +4 -0
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +90 -2
- package/src/sdk/host/websocket-transport.ts +19 -7
- package/src/sdk/lifecycle/service.ts +15 -1
- package/src/sdk/prompt-deadline-flush.ts +78 -5
- package/src/sdk/prompt-deadline-manager.ts +68 -14
- package/src/sdk/prompt-status.ts +6 -4
- package/src/sdk/protocol/adapter-validation.ts +81 -12
- package/src/sdk/protocol/operation-inventory.generated.json +261 -2
- package/src/sdk/protocol/operation-registry.ts +33 -3
- package/src/sdk/reconciliation-extensions.ts +1 -0
- package/src/sdk/session-list.ts +1 -0
- package/src/sdk/session.ts +237 -97
- package/src/session/agent-session.ts +2726 -479
- package/src/session/history-storage.ts +182 -12
- package/src/session/internal/managed-session-scope.ts +173 -57
- package/src/session/internal/managed-session-storage.ts +85 -12
- package/src/session/internal/native-publish-outcome.ts +5 -1
- package/src/session/messages.ts +47 -6
- package/src/session/session-manager.ts +326 -19
- package/src/session/startup-auth-config.ts +116 -8
- package/src/session/streaming-output.ts +262 -4
- package/src/session/terminal-abort.ts +14 -2
- package/src/session-import/redact.ts +53 -2
- package/src/session-import/service.ts +1 -0
- package/src/skill-state/workflow-mutation-guard.ts +2145 -206
- package/src/slash-commands/builtin-registry.ts +21 -6
- package/src/slash-commands/helpers/credential-switch.ts +10 -5
- package/src/slash-commands/helpers/mcp.ts +11 -3
- package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
- package/src/ssh/ssh-executor.ts +9 -2
- package/src/stt/recorder.ts +26 -9
- package/src/system-prompt.ts +61 -16
- package/src/task/executor.ts +115 -20
- package/src/task/index.ts +389 -175
- package/src/task/role-body.ts +84 -0
- package/src/task/token-log-mode.test.ts +162 -0
- package/src/task/token-log.ts +91 -2
- package/src/tools/archive-reader.ts +650 -37
- package/src/tools/ask.ts +1 -0
- package/src/tools/ast-edit-write-path.ts +64 -0
- package/src/tools/ast-edit.ts +18 -1
- package/src/tools/ast-grep.ts +7 -2
- package/src/tools/atomic-file-write.ts +46 -15
- package/src/tools/auto-generated-guard.ts +15 -3
- package/src/tools/awaiting-input.ts +114 -0
- package/src/tools/bash-allowed-prefixes.ts +214 -6
- package/src/tools/bash-interactive.ts +14 -2
- package/src/tools/bash-skill-urls.ts +58 -5
- package/src/tools/bash.ts +113 -26
- package/src/tools/browser/tab-worker.ts +39 -13
- package/src/tools/browser.ts +17 -7
- package/src/tools/cron.ts +10 -1
- package/src/tools/debug.ts +16 -8
- package/src/tools/descriptors.test.ts +44 -0
- package/src/tools/descriptors.ts +50 -6
- package/src/tools/eval.ts +15 -0
- package/src/tools/fetch.ts +93 -4
- package/src/tools/gh.ts +27 -12
- package/src/tools/image-gen.ts +20 -6
- package/src/tools/index.ts +2 -0
- package/src/tools/irc.ts +5 -3
- package/src/tools/monitor.ts +9 -1
- package/src/tools/output-meta.ts +74 -5
- package/src/tools/python.ts +1 -1
- package/src/tools/read.ts +26 -37
- package/src/tools/recipe/runner.ts +23 -12
- package/src/tools/render-utils.ts +2 -2
- package/src/tools/report-issue.ts +184 -0
- package/src/tools/search.ts +3 -2
- package/src/tools/ssh.ts +274 -8
- package/src/tools/subagent-render.ts +114 -12
- package/src/tools/subagent.ts +118 -5
- package/src/tools/tmux-self-injection-guard.ts +3301 -122
- package/src/tools/todo-write.ts +41 -3
- package/src/tools/tool-catalog.generated.ts +32 -4
- package/src/tools/ultragoal-ask-guard.ts +13 -1
- package/src/tools/write.ts +42 -3
- package/src/tui/tree-list.ts +15 -1
- package/src/utils/commit-message-generator.ts +12 -4
- package/src/utils/external-editor.ts +21 -7
- package/src/utils/file-mentions.ts +75 -7
- package/src/utils/git.ts +38 -7
- package/src/utils/image-limits.ts +8 -0
- package/src/utils/image-loading.ts +1 -1
- package/src/utils/open.ts +73 -4
- package/src/utils/pasted-image-loading.ts +9 -8
- package/src/utils/prompt-suggestion.ts +5 -4
- package/src/utils/shell-snapshot.ts +9 -1
- package/src/utils/title-generator.ts +72 -22
- package/src/web/scrapers/index.ts +3 -1
- package/src/web/scrapers/types.ts +8 -0
- package/src/web/scrapers/youtube.ts +3 -2
- package/src/web/search/index.ts +2 -1
- package/src/web/search/providers/codex.ts +29 -32
- package/src/web/search/providers/insane.ts +91 -28
- package/src/web/search/providers/searxng.ts +62 -10
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* producer is available (resumed-from-disk or backward-compat records).
|
|
9
9
|
*/
|
|
10
10
|
import type { Component } from "@gajae-code/tui";
|
|
11
|
-
import { Text } from "@gajae-code/tui";
|
|
11
|
+
import { getKeybindings, Text } from "@gajae-code/tui";
|
|
12
12
|
import { formatNumber } from "@gajae-code/utils";
|
|
13
|
+
import { isSettingsInitialized, settings } from "../config/settings";
|
|
13
14
|
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
14
15
|
import type { Theme } from "../modes/theme/theme";
|
|
15
16
|
import { providerRetryPhaseLabel } from "../task/provider-retry-status";
|
|
@@ -18,21 +19,26 @@ import {
|
|
|
18
19
|
formatDuration,
|
|
19
20
|
formatStatusIcon,
|
|
20
21
|
getPreviewLines,
|
|
22
|
+
pluralize,
|
|
21
23
|
replaceTabs,
|
|
22
24
|
type ToolUIStatus,
|
|
23
25
|
truncateToWidth,
|
|
26
|
+
wrapTextWithAnsi,
|
|
24
27
|
} from "./render-utils";
|
|
25
28
|
import {
|
|
26
29
|
SUBAGENT_ACTIVITY_BUCKET_MS,
|
|
30
|
+
SUBAGENT_COMPACT_IDLE_MS,
|
|
27
31
|
type SubagentLiveProgress,
|
|
28
32
|
type SubagentSnapshot,
|
|
29
33
|
type SubagentToolDetails,
|
|
30
34
|
subagentAwaitRenderedStateSignature,
|
|
35
|
+
summarizeSubagentGroup,
|
|
31
36
|
} from "./subagent";
|
|
32
37
|
|
|
33
38
|
export { subagentAwaitRenderedStateSignature } from "./subagent";
|
|
34
39
|
|
|
35
40
|
const PREVIEW_LINES_COLLAPSED = 1;
|
|
41
|
+
const GUIDANCE_MAX_LINES = 12;
|
|
36
42
|
const PREVIEW_LINES_EXPANDED = 4;
|
|
37
43
|
const PREVIEW_LINE_WIDTH = 80;
|
|
38
44
|
|
|
@@ -114,10 +120,90 @@ function collectProviderDegradationGroups(
|
|
|
114
120
|
.sort((a, b) => b.count - a.count || a.provider.localeCompare(b.provider));
|
|
115
121
|
}
|
|
116
122
|
|
|
123
|
+
function compactSubagentPanelEnabled(): boolean {
|
|
124
|
+
return isSettingsInitialized() && settings.get("task.compactSubagentPanel") === true;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// One summary line for the whole group. Counts only, so the line stays O(1) in the
|
|
128
|
+
// number of subagents; each subagent is still one expand toggle away.
|
|
129
|
+
function renderCompactSubagentSummary(subagents: readonly SubagentSnapshot[], theme: Theme): string {
|
|
130
|
+
const summary = summarizeSubagentGroup(subagents, Date.now());
|
|
131
|
+
const parts: string[] = [];
|
|
132
|
+
if (summary.running > 0) parts.push(`${summary.running} ${pluralize("subagent", summary.running)} running`);
|
|
133
|
+
// Attention-worthy counts come first so a narrow terminal truncates the rest.
|
|
134
|
+
if (summary.failed > 0) parts.push(`${summary.failed} failed`);
|
|
135
|
+
if (summary.retrying > 0) parts.push(`${summary.retrying} retrying`);
|
|
136
|
+
if (summary.idle > 0) parts.push(`${summary.idle} idle >${SUBAGENT_COMPACT_IDLE_MS / 1000}s`);
|
|
137
|
+
if (summary.queued > 0) parts.push(`${summary.queued} queued`);
|
|
138
|
+
if (summary.paused > 0) parts.push(`${summary.paused} paused`);
|
|
139
|
+
if (summary.completed > 0) parts.push(`${summary.completed} done`);
|
|
140
|
+
if (summary.cancelled > 0) parts.push(`${summary.cancelled} cancelled`);
|
|
141
|
+
return ` ${theme.fg("dim", parts.join(" · "))}`;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// At most one warning row in compact mode, however many providers degrade, so the
|
|
145
|
+
// collapsed height stays independent of the subagent count. The expanded view keeps
|
|
146
|
+
// one row per provider.
|
|
147
|
+
function renderCompactDegradationLine(
|
|
148
|
+
groups: ReadonlyArray<{ provider: string; count: number }>,
|
|
149
|
+
theme: Theme,
|
|
150
|
+
): string | undefined {
|
|
151
|
+
const [worst] = groups;
|
|
152
|
+
if (!worst) return undefined;
|
|
153
|
+
const more = groups.length > 1 ? ` (+${groups.length - 1} more ${pluralize("provider", groups.length - 1)})` : "";
|
|
154
|
+
return ` ${theme.fg("warning", `provider degraded: ${worst.count} subagents retrying on ${worst.provider}${more}`)}`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// The expand hint gets its own line so a long summary never truncates it away.
|
|
158
|
+
function renderCompactSubagentHint(running: boolean, theme: Theme): string {
|
|
159
|
+
const expandKey = getKeybindings().getKeys("app.tools.expand")[0];
|
|
160
|
+
const hints = [expandKey ? `${expandKey} to list each` : "expand tool output to list each"];
|
|
161
|
+
if (running) hints.push("ctrl+s to observe sessions");
|
|
162
|
+
return ` ${theme.fg("dim", `(${hints.join(" · ")})`)}`;
|
|
163
|
+
}
|
|
164
|
+
|
|
117
165
|
function boundSubagentBodyLines(lines: string[], width: number): string[] {
|
|
118
166
|
return lines.map(line => (line.length > 0 ? truncateToWidth(replaceTabs(line), width, Ellipsis.Omit) : ""));
|
|
119
167
|
}
|
|
120
168
|
|
|
169
|
+
// Guidance is an instruction the caller must act on (e.g. "inspect before
|
|
170
|
+
// cancelling" after an await timeout), so it wraps to the terminal width instead
|
|
171
|
+
// of being cut to one preview line.
|
|
172
|
+
function renderSubagentGuidanceLines(snapshot: SubagentSnapshot, width: number, theme: Theme): string[] {
|
|
173
|
+
const guidance = snapshot.guidance?.trim();
|
|
174
|
+
if (!guidance) return [];
|
|
175
|
+
const indent = " ";
|
|
176
|
+
const wrapWidth = Math.max(1, width - indent.length);
|
|
177
|
+
const wrapped = guidance.split("\n").flatMap(segment => wrapTextWithAnsi(replaceTabs(segment), wrapWidth));
|
|
178
|
+
// Still bounded: producer guidance is a short fixed sentence, so the cap only
|
|
179
|
+
// bites on pathologically narrow terminals.
|
|
180
|
+
if (wrapped.length > GUIDANCE_MAX_LINES) {
|
|
181
|
+
wrapped.length = GUIDANCE_MAX_LINES;
|
|
182
|
+
wrapped[GUIDANCE_MAX_LINES - 1] = truncateToWidth(
|
|
183
|
+
`${wrapped[GUIDANCE_MAX_LINES - 1]!}…`,
|
|
184
|
+
wrapWidth,
|
|
185
|
+
Ellipsis.Unicode,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return wrapped.map(line => `${indent}${theme.fg("dim", line)}`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function renderBoundSubagentBody(
|
|
192
|
+
snapshot: SubagentSnapshot,
|
|
193
|
+
expanded: boolean,
|
|
194
|
+
width: number,
|
|
195
|
+
theme: Theme,
|
|
196
|
+
staticTime: boolean,
|
|
197
|
+
): string[] {
|
|
198
|
+
return boundSubagentBodyLines(
|
|
199
|
+
[
|
|
200
|
+
...renderSubagentSnapshotBody(snapshot, expanded, theme, staticTime),
|
|
201
|
+
...renderSubagentGuidanceLines(snapshot, width, theme),
|
|
202
|
+
],
|
|
203
|
+
width,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
121
207
|
function renderCachedSubagentBody(
|
|
122
208
|
snapshot: SubagentSnapshot,
|
|
123
209
|
signature: string,
|
|
@@ -133,7 +219,7 @@ function renderCachedSubagentBody(
|
|
|
133
219
|
subagentBodyCache.set(key, hit);
|
|
134
220
|
return hit;
|
|
135
221
|
}
|
|
136
|
-
const lines =
|
|
222
|
+
const lines = renderBoundSubagentBody(snapshot, expanded, width, theme, true);
|
|
137
223
|
subagentBodyRenderCount += 1;
|
|
138
224
|
subagentBodyCache.set(key, lines);
|
|
139
225
|
if (subagentBodyCache.size > SUBAGENT_BODY_CACHE_MAX) {
|
|
@@ -150,7 +236,7 @@ function renderDynamicSubagentBody(
|
|
|
150
236
|
theme: Theme,
|
|
151
237
|
): string[] {
|
|
152
238
|
subagentBodyRenderCount += 1;
|
|
153
|
-
return
|
|
239
|
+
return renderBoundSubagentBody(snapshot, expanded, width, theme, false);
|
|
154
240
|
}
|
|
155
241
|
|
|
156
242
|
function statusIconKind(status: SubagentSnapshot["status"]): ToolUIStatus {
|
|
@@ -363,11 +449,7 @@ function renderSubagentSnapshotBody(
|
|
|
363
449
|
}
|
|
364
450
|
}
|
|
365
451
|
|
|
366
|
-
|
|
367
|
-
for (const line of getPreviewLines(snapshot.guidance, 1, PREVIEW_LINE_WIDTH, Ellipsis.Unicode)) {
|
|
368
|
-
lines.push(` ${theme.fg("dim", replaceTabs(line))}`);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
452
|
+
// `snapshot.guidance` is appended by renderBoundSubagentBody, wrapped to width.
|
|
371
453
|
|
|
372
454
|
return lines;
|
|
373
455
|
}
|
|
@@ -421,6 +503,29 @@ export const subagentToolRenderer = {
|
|
|
421
503
|
theme,
|
|
422
504
|
);
|
|
423
505
|
const out: string[] = [truncateToWidth(replaceTabs(header), width, Ellipsis.Omit)];
|
|
506
|
+
const liveProgress = subagents.flatMap(snapshot =>
|
|
507
|
+
snapshot.progress && snapshot.liveProgressAvailable !== false ? [snapshot.progress] : [],
|
|
508
|
+
);
|
|
509
|
+
const degradationGroups = collectProviderDegradationGroups(liveProgress);
|
|
510
|
+
// Compact applies only to live await progress. Final results (timeout
|
|
511
|
+
// guidance, failure and completion receipts, status/steer replies) keep
|
|
512
|
+
// the full per-subagent rendering.
|
|
513
|
+
if (!expanded && options.isPartial && compactSubagentPanelEnabled()) {
|
|
514
|
+
out.push(
|
|
515
|
+
truncateToWidth(replaceTabs(renderCompactSubagentSummary(subagents, theme)), width, Ellipsis.Unicode),
|
|
516
|
+
);
|
|
517
|
+
const compactDegradation = renderCompactDegradationLine(degradationGroups, theme);
|
|
518
|
+
if (compactDegradation)
|
|
519
|
+
out.push(truncateToWidth(replaceTabs(compactDegradation), width, Ellipsis.Unicode));
|
|
520
|
+
out.push(
|
|
521
|
+
truncateToWidth(
|
|
522
|
+
replaceTabs(renderCompactSubagentHint(runningCount > 0, theme)),
|
|
523
|
+
width,
|
|
524
|
+
Ellipsis.Unicode,
|
|
525
|
+
),
|
|
526
|
+
);
|
|
527
|
+
return out;
|
|
528
|
+
}
|
|
424
529
|
// Discoverability: the inline panel is a bounded preview; the session
|
|
425
530
|
// observer (ctrl+s) streams the full per-subagent message history.
|
|
426
531
|
if (runningCount > 0) {
|
|
@@ -432,10 +537,7 @@ export const subagentToolRenderer = {
|
|
|
432
537
|
),
|
|
433
538
|
);
|
|
434
539
|
}
|
|
435
|
-
const
|
|
436
|
-
snapshot.progress && snapshot.liveProgressAvailable !== false ? [snapshot.progress] : [],
|
|
437
|
-
);
|
|
438
|
-
for (const group of collectProviderDegradationGroups(liveProgress)) {
|
|
540
|
+
for (const group of degradationGroups) {
|
|
439
541
|
out.push(
|
|
440
542
|
truncateToWidth(
|
|
441
543
|
replaceTabs(
|
package/src/tools/subagent.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { type AsyncJob, AsyncJobManager, jobElapsedMs, type SubagentRecord } fro
|
|
|
6
6
|
import subagentDescription from "../prompts/tools/subagent.md" with { type: "text" };
|
|
7
7
|
import type { AgentProgress, AgentSource, LocalErrorSummary } from "../task/types";
|
|
8
8
|
import { Ellipsis, truncateToWidth } from "../tui";
|
|
9
|
+
import { wrapUntrustedContent } from "./fetch";
|
|
9
10
|
import type { ToolSession } from "./index";
|
|
10
11
|
import { replaceTabs } from "./render-utils";
|
|
11
12
|
import { ToolError } from "./tool-errors";
|
|
@@ -540,8 +541,11 @@ export class SubagentTool implements AgentTool<typeof subagentSchema, SubagentTo
|
|
|
540
541
|
if (!onUpdate || streamingDisabled) return;
|
|
541
542
|
try {
|
|
542
543
|
const result = this.#progressResult(manager, records, true);
|
|
543
|
-
const signature = subagentAwaitRenderedStateSignature(result.details?.subagents ?? []);
|
|
544
544
|
const t = nowMs();
|
|
545
|
+
const snapshots = result.details?.subagents ?? [];
|
|
546
|
+
const signature = this.session.settings.get("task.compactSubagentPanel")
|
|
547
|
+
? subagentCompactRenderedStateSignature(snapshots, Date.now())
|
|
548
|
+
: subagentAwaitRenderedStateSignature(snapshots);
|
|
545
549
|
const livenessDue = force || t - lastEmitMs >= livenessIntervalMs;
|
|
546
550
|
if (!livenessDue && signature === lastEmittedSignature) return;
|
|
547
551
|
lastEmittedSignature = signature;
|
|
@@ -796,7 +800,11 @@ export class SubagentTool implements AgentTool<typeof subagentSchema, SubagentTo
|
|
|
796
800
|
}
|
|
797
801
|
if (snapshot.description) lines.push(`Description: ${snapshot.description}`);
|
|
798
802
|
if (snapshot.outputRef) lines.push(`Output: ${snapshot.outputRef}`);
|
|
799
|
-
|
|
803
|
+
// A markdown fence is not a boundary: subagent text can contain ``` and
|
|
804
|
+
// close it, leaving the rest as raw tool-result text. Frame the data.
|
|
805
|
+
if (snapshot.setupFailureSummary) {
|
|
806
|
+
lines.push(wrapUntrustedContent(`Setup failure: ${snapshot.setupFailureSummary}`));
|
|
807
|
+
}
|
|
800
808
|
if (snapshot.localErrorSummary) {
|
|
801
809
|
const local = snapshot.localErrorSummary;
|
|
802
810
|
lines.push(`Local failure (${local.kind}): ${local.summary}`);
|
|
@@ -813,13 +821,14 @@ export class SubagentTool implements AgentTool<typeof subagentSchema, SubagentTo
|
|
|
813
821
|
);
|
|
814
822
|
}
|
|
815
823
|
}
|
|
816
|
-
if (snapshot.assignment) lines.push(
|
|
824
|
+
if (snapshot.assignment) lines.push(wrapUntrustedContent(`Assignment:\n${snapshot.assignment}`));
|
|
817
825
|
if (snapshot.steerMessage) {
|
|
818
|
-
lines.push(`Steer (${snapshot.steerState ?? "queued"})
|
|
826
|
+
lines.push(wrapUntrustedContent(`Steer (${snapshot.steerState ?? "queued"}):\n${snapshot.steerMessage}`));
|
|
819
827
|
lines.push(STEER_QUEUED_GUIDANCE);
|
|
820
828
|
}
|
|
821
829
|
if (snapshot.resultPreview) {
|
|
822
|
-
|
|
830
|
+
const previewLabel = snapshot.errorText ? "Error preview:" : "Result preview:";
|
|
831
|
+
lines.push(wrapUntrustedContent(`${previewLabel}\n${snapshot.resultPreview}`));
|
|
823
832
|
if (snapshot.truncated)
|
|
824
833
|
lines.push("Preview truncated; use the output ref or explicit ids with `verbosity=full` for more.");
|
|
825
834
|
}
|
|
@@ -1136,6 +1145,110 @@ export function subagentAwaitRenderedStateSignature(
|
|
|
1136
1145
|
});
|
|
1137
1146
|
}
|
|
1138
1147
|
|
|
1148
|
+
/** A running subagent with no activity for longer than this counts as idle in the compact panel. */
|
|
1149
|
+
export const SUBAGENT_COMPACT_IDLE_MS = 30_000;
|
|
1150
|
+
|
|
1151
|
+
/** Group counts behind the compact await panel's single summary line. */
|
|
1152
|
+
export interface SubagentGroupSummary {
|
|
1153
|
+
running: number;
|
|
1154
|
+
idle: number;
|
|
1155
|
+
retrying: number;
|
|
1156
|
+
queued: number;
|
|
1157
|
+
paused: number;
|
|
1158
|
+
completed: number;
|
|
1159
|
+
failed: number;
|
|
1160
|
+
cancelled: number;
|
|
1161
|
+
/** Running subagents in provider retry, per provider; drives the degradation warning. */
|
|
1162
|
+
retryingByProvider: Record<string, number>;
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
export function summarizeSubagentGroup(subagents: readonly SubagentSnapshot[], nowMs: number): SubagentGroupSummary {
|
|
1166
|
+
const summary: SubagentGroupSummary = {
|
|
1167
|
+
running: 0,
|
|
1168
|
+
idle: 0,
|
|
1169
|
+
retrying: 0,
|
|
1170
|
+
queued: 0,
|
|
1171
|
+
paused: 0,
|
|
1172
|
+
completed: 0,
|
|
1173
|
+
failed: 0,
|
|
1174
|
+
cancelled: 0,
|
|
1175
|
+
retryingByProvider: {},
|
|
1176
|
+
};
|
|
1177
|
+
for (const snapshot of subagents) {
|
|
1178
|
+
switch (snapshot.status) {
|
|
1179
|
+
case "running": {
|
|
1180
|
+
summary.running += 1;
|
|
1181
|
+
const live = snapshot.liveProgressAvailable !== false ? snapshot.progress : undefined;
|
|
1182
|
+
if (live?.status === "running" && live.retryState) {
|
|
1183
|
+
summary.retrying += 1;
|
|
1184
|
+
const provider = live.retryState.provider ?? "provider";
|
|
1185
|
+
summary.retryingByProvider[provider] = (summary.retryingByProvider[provider] ?? 0) + 1;
|
|
1186
|
+
}
|
|
1187
|
+
// Before its first activity a subagent has no timestamp; its elapsed job time
|
|
1188
|
+
// is then the age, so one stalled from the start still turns idle.
|
|
1189
|
+
const quietMs = live?.lastActivityMs !== undefined ? nowMs - live.lastActivityMs : snapshot.durationMs;
|
|
1190
|
+
if (quietMs > SUBAGENT_COMPACT_IDLE_MS) summary.idle += 1;
|
|
1191
|
+
break;
|
|
1192
|
+
}
|
|
1193
|
+
case "queued":
|
|
1194
|
+
summary.queued += 1;
|
|
1195
|
+
break;
|
|
1196
|
+
case "paused":
|
|
1197
|
+
summary.paused += 1;
|
|
1198
|
+
break;
|
|
1199
|
+
case "completed":
|
|
1200
|
+
case "already_completed":
|
|
1201
|
+
summary.completed += 1;
|
|
1202
|
+
break;
|
|
1203
|
+
case "failed":
|
|
1204
|
+
case "not_found":
|
|
1205
|
+
summary.failed += 1;
|
|
1206
|
+
break;
|
|
1207
|
+
case "cancelled":
|
|
1208
|
+
summary.cancelled += 1;
|
|
1209
|
+
break;
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
return summary;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
/**
|
|
1216
|
+
* The compact degradation row shows only the most-degraded provider, its count, and
|
|
1217
|
+
* how many other providers degrade (providers with a single retrying subagent are
|
|
1218
|
+
* not a degradation). Signing exactly that keeps invisible per-provider churn from
|
|
1219
|
+
* re-emitting.
|
|
1220
|
+
*/
|
|
1221
|
+
function compactDegradationSignature(
|
|
1222
|
+
retryingByProvider: Record<string, number>,
|
|
1223
|
+
): { provider: string; count: number; moreProviders: number } | null {
|
|
1224
|
+
const groups = Object.entries(retryingByProvider)
|
|
1225
|
+
.filter(([, count]) => count > 1)
|
|
1226
|
+
.sort(([a, countA], [b, countB]) => countB - countA || a.localeCompare(b));
|
|
1227
|
+
const [worst] = groups;
|
|
1228
|
+
return worst ? { provider: worst[0], count: worst[1], moreProviders: groups.length - 1 } : null;
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
/**
|
|
1232
|
+
* Rendered-state signature for the compact await panel. It covers only what the
|
|
1233
|
+
* compact view shows (group counts and the single degradation row), so per-subagent activity that does not move
|
|
1234
|
+
* a count no longer re-emits: the update rate is bounded by count transitions and
|
|
1235
|
+
* the liveness interval instead of growing with the number of live subagents.
|
|
1236
|
+
*/
|
|
1237
|
+
export function subagentCompactRenderedStateSignature(
|
|
1238
|
+
subagents: readonly SubagentSnapshot[],
|
|
1239
|
+
nowMs: number,
|
|
1240
|
+
receipt?: Pick<SubagentToolDetails, "awaitOutcome" | "interrupted">,
|
|
1241
|
+
): string {
|
|
1242
|
+
return JSON.stringify({
|
|
1243
|
+
awaitOutcome: receipt?.awaitOutcome ?? null,
|
|
1244
|
+
interrupted: receipt?.interrupted === true,
|
|
1245
|
+
summary: (({ retryingByProvider, ...counts }) => ({
|
|
1246
|
+
...counts,
|
|
1247
|
+
degradation: compactDegradationSignature(retryingByProvider),
|
|
1248
|
+
}))(summarizeSubagentGroup(subagents, nowMs)),
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1139
1252
|
function canonicalizeSnapshotForSignature(snapshot: SubagentSnapshot): unknown {
|
|
1140
1253
|
return {
|
|
1141
1254
|
id: snapshot.id,
|