@sayknow-cli/coding-agent 0.4.7 → 0.5.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 +122 -0
- package/dist/types/capability/index.d.ts +10 -20
- package/dist/types/capability/types.d.ts +3 -0
- package/dist/types/cli/args.d.ts +0 -2
- package/dist/types/cli/read-cli.d.ts +1 -0
- package/dist/types/cli.d.ts +9 -1
- package/dist/types/commands/daemon.d.ts +2 -2
- package/dist/types/commands/deep-interview.d.ts +9 -0
- package/dist/types/commands/harness.d.ts +22 -0
- package/dist/types/commands/read.d.ts +6 -0
- package/dist/types/commands/sdk.d.ts +20 -2
- package/dist/types/config/keybindings.d.ts +34 -4
- package/dist/types/config/model-profile-contract.d.ts +40 -0
- package/dist/types/config/model-profiles.d.ts +2 -3
- package/dist/types/config/model-registry.d.ts +5 -0
- package/dist/types/config/provider-auth-health.d.ts +14 -0
- package/dist/types/config/provider-ranking.d.ts +59 -0
- package/dist/types/config/settings-schema.d.ts +156 -10
- package/dist/types/config/settings.d.ts +3 -0
- package/dist/types/edit/modes/patch.d.ts +13 -0
- package/dist/types/edit/path-mutation-lock.d.ts +15 -0
- package/dist/types/eval/py/executor.d.ts +1 -1
- package/dist/types/eval/py/runner-artifact.d.ts +8 -0
- package/dist/types/eval/py/tool-bridge.d.ts +1 -2
- package/dist/types/extensibility/extensions/types.d.ts +43 -2
- package/dist/types/extensibility/shared-events.d.ts +6 -0
- package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
- package/dist/types/main.d.ts +33 -2
- package/dist/types/memories/index.d.ts +2 -0
- package/dist/types/modes/acp/acp-agent.d.ts +22 -9
- package/dist/types/modes/components/assistant-message.d.ts +3 -1
- package/dist/types/modes/components/btw-panel.d.ts +1 -0
- package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
- package/dist/types/modes/components/queue-pane.d.ts +8 -0
- package/dist/types/modes/components/queued-message-selector.d.ts +6 -0
- package/dist/types/modes/components/read-tool-group.d.ts +4 -4
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
- package/dist/types/modes/components/session-observer-overlay.d.ts +4 -0
- package/dist/types/modes/components/settings-selector.d.ts +2 -0
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/components/tool-status-header.d.ts +4 -2
- package/dist/types/modes/components/welcome.d.ts +5 -0
- package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
- package/dist/types/modes/controllers/command-controller.d.ts +2 -0
- package/dist/types/modes/controllers/event-controller.d.ts +3 -0
- package/dist/types/modes/interactive-mode.d.ts +13 -2
- package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
- package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
- package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
- package/dist/types/modes/types.d.ts +6 -0
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
- package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
- package/dist/types/runtime/memory-domain.d.ts +9 -0
- package/dist/types/runtime/memory-guard-contract.d.ts +71 -0
- package/dist/types/runtime/memory-guard.d.ts +39 -0
- package/dist/types/runtime/memory-limit.d.ts +11 -0
- package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +1 -1
- package/dist/types/runtime-mcp/manager.d.ts +9 -1
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
- package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
- package/dist/types/runtime-mcp/redaction.d.ts +2 -0
- package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
- package/dist/types/sdk/acp/final-text.d.ts +19 -0
- package/dist/types/sdk/acp/mcp.d.ts +23 -0
- package/dist/types/sdk/broker/broker.d.ts +2 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +13 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +9 -1
- package/dist/types/sdk/bus/config-commands.d.ts +2 -2
- package/dist/types/sdk/bus/config.d.ts +2 -0
- package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
- package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
- package/dist/types/sdk/bus/index.d.ts +52 -4
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +37 -0
- package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
- package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
- package/dist/types/sdk/bus/notification-service.d.ts +34 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +106 -0
- package/dist/types/sdk/bus/rate-limit-pool.d.ts +2 -0
- package/dist/types/sdk/bus/reconciliation-store.d.ts +65 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +33 -9
- package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +286 -12
- package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
- package/dist/types/sdk/client/discovery.d.ts +2 -0
- package/dist/types/sdk/client/liveness.d.ts +7 -0
- package/dist/types/sdk/host/control/operations.d.ts +3 -2
- package/dist/types/sdk/host/host.d.ts +3 -1
- package/dist/types/sdk/host/query/handlers.d.ts +14 -0
- package/dist/types/sdk/index.d.ts +2 -0
- package/dist/types/sdk/lifecycle-session.d.ts +10 -1
- package/dist/types/sdk/prompt-status.d.ts +88 -0
- package/dist/types/sdk/session-directory.d.ts +1 -1
- package/dist/types/sdk/session.d.ts +7 -0
- package/dist/types/sdk/startup-capability.d.ts +9 -0
- package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
- package/dist/types/sdk/transport/index.d.ts +12 -0
- package/dist/types/sdk/transport/relay.d.ts +43 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
- package/dist/types/sdk/transport/socket.d.ts +7 -0
- package/dist/types/sdk/transport/stdio.d.ts +3 -0
- package/dist/types/session/agent-session.d.ts +83 -24
- package/dist/types/session/btw-contract.d.ts +16 -0
- package/dist/types/session/fallback-chain-controller.d.ts +18 -2
- package/dist/types/session/internal/managed-session-scope.d.ts +70 -10
- package/dist/types/session/internal/managed-session-storage.d.ts +34 -12
- package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
- package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
- package/dist/types/session/session-manager.d.ts +89 -18
- package/dist/types/session/session-storage.d.ts +31 -0
- package/dist/types/session/streaming-output.d.ts +60 -5
- package/dist/types/setup/credential-import.d.ts +5 -1
- package/dist/types/setup/provider-onboarding.d.ts +2 -0
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/deep-interview-stage.d.ts +37 -0
- package/dist/types/skc-runtime/gc-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/linux-proc.d.ts +22 -14
- package/dist/types/skc-runtime/memory-guard-owner-claims.d.ts +47 -0
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +112 -1
- package/dist/types/skc-runtime/repository-binding.d.ts +63 -0
- package/dist/types/skc-runtime/state-runtime.d.ts +3 -1
- package/dist/types/skc-runtime/state-writer.d.ts +5 -1
- package/dist/types/skc-runtime/team-launch.d.ts +1 -1
- package/dist/types/skc-runtime/team-runtime.d.ts +9 -2
- package/dist/types/skc-runtime/team-store.d.ts +12 -0
- package/dist/types/skc-runtime/team-worker-memory-guard.d.ts +92 -0
- package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +7 -0
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +6 -5
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +28 -0
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +43 -5
- package/dist/types/skill-state/workflow-hud.d.ts +3 -0
- package/dist/types/ssh/utils.d.ts +1 -0
- package/dist/types/task/discovery.d.ts +3 -1
- package/dist/types/task/executor.d.ts +6 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/task/provider-retry-status.d.ts +13 -0
- package/dist/types/task/receipt.d.ts +2 -0
- package/dist/types/task/types.d.ts +133 -0
- package/dist/types/task/ultragoal-redteam-activation.d.ts +33 -0
- package/dist/types/tools/browser/launch.d.ts +7 -0
- package/dist/types/tools/fetch.d.ts +22 -9
- package/dist/types/tools/image-gen.d.ts +63 -1
- package/dist/types/tools/index.d.ts +7 -1
- package/dist/types/tools/output-meta.d.ts +21 -1
- package/dist/types/tools/read-internals.d.ts +12 -0
- package/dist/types/tools/read.d.ts +45 -1
- package/dist/types/tools/resource-gc.d.ts +23 -0
- package/dist/types/tools/skill-discovery.d.ts +7 -0
- package/dist/types/tools/sqlite-reader.d.ts +7 -0
- package/dist/types/tools/tool-result.d.ts +7 -1
- package/dist/types/utils/prompt-suggestion.d.ts +33 -0
- package/dist/types/utils/shell-snapshot.d.ts +12 -0
- package/dist/types/web/insane/bridge.d.ts +1 -0
- package/dist/types/web/insane/url-guard.d.ts +17 -0
- package/package.json +8 -12
- package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
- package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
- package/scripts/capture-sticky-viewport-showcase.ts +292 -0
- package/scripts/compile-args.ts +0 -1
- package/scripts/dogfood-repository-binding.ts +209 -0
- package/scripts/generate-docs-index.ts +4 -1
- package/scripts/generate-sdk-operation-inventory.ts +9 -0
- package/scripts/run-test-manifest.ts +6 -4
- package/scripts/verify-skc-sdk-canonicalization.ts +122 -18
- package/scripts/verify-sticky-viewport-showcase.ts +611 -0
- package/src/capability/index.ts +58 -42
- package/src/capability/types.ts +3 -0
- package/src/cli/args.ts +16 -100
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/mcp-cli.ts +4 -21
- package/src/cli/notify-cli.ts +6 -38
- package/src/cli/read-cli.ts +2 -1
- package/src/cli/setup-cli.ts +10 -4
- package/src/cli.ts +133 -11
- package/src/commands/daemon.ts +22 -5
- package/src/commands/deep-interview.ts +26 -1
- package/src/commands/harness.ts +35 -12
- package/src/commands/read.ts +11 -2
- package/src/commands/sdk.ts +134 -17
- package/src/commands/team.ts +1 -1
- package/src/commit/agentic/index.ts +3 -3
- package/src/commit/map-reduce/index.ts +2 -2
- package/src/config/keybindings.ts +158 -25
- package/src/config/model-profile-contract.ts +174 -0
- package/src/config/model-profiles.ts +51 -10
- package/src/config/model-registry.ts +24 -4
- package/src/config/model-resolver.ts +2 -2
- package/src/config/provider-auth-health.ts +42 -0
- package/src/config/provider-ranking.ts +119 -0
- package/src/config/settings-schema.ts +157 -10
- package/src/config/settings.ts +254 -108
- package/src/coordinator-mcp/model-preset.ts +21 -74
- package/src/defaults/skc/skills/deep-interview/SKILL.md +147 -24
- package/src/defaults/skc/skills/ralplan/SKILL.md +91 -34
- package/src/defaults/skc/skills/team/SKILL.md +1 -1
- package/src/defaults/skc/skills/ultragoal/SKILL.md +68 -17
- package/src/discovery/ssh.ts +12 -1
- package/src/edit/index.ts +3 -6
- package/src/edit/modes/patch.ts +38 -1
- package/src/edit/modes/replace.ts +42 -0
- package/src/edit/path-mutation-lock.ts +112 -0
- package/src/eval/js/tool-bridge.ts +1 -1
- package/src/eval/py/executor.ts +37 -13
- package/src/eval/py/kernel.ts +1 -21
- package/src/eval/py/prelude.py +2 -2
- package/src/eval/py/runner-artifact.ts +84 -0
- package/src/eval/py/tool-bridge.ts +34 -18
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +42 -4
- package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
- package/src/extensibility/shared-events.ts +5 -0
- package/src/extensibility/skc-plugins/runtime-adapters.ts +2 -1
- package/src/hooks/native-skill-hook.ts +17 -4
- package/src/internal-urls/docs-index.generated.ts +17 -16
- package/src/internal-urls/local-protocol.ts +87 -25
- package/src/internal-urls/local-root-gc.ts +127 -0
- package/src/internal-urls/mcp-protocol.ts +73 -11
- package/src/main.ts +120 -42
- package/src/memories/index.ts +10 -0
- package/src/modes/DESIGN.md +52 -0
- package/src/modes/acp/acp-agent.ts +647 -83
- package/src/modes/acp/acp-event-mapper.ts +106 -12
- package/src/modes/acp/acp-mode.ts +39 -3
- package/src/modes/action-registry.ts +1 -1
- package/src/modes/components/assistant-message.ts +123 -22
- package/src/modes/components/btw-panel.ts +82 -16
- package/src/modes/components/irc-sidebar.ts +176 -62
- package/src/modes/components/model-selector.ts +61 -4
- package/src/modes/components/notifications-settings-editor.ts +1 -1
- package/src/modes/components/oauth-selector.ts +42 -12
- package/src/modes/components/plan-preview-overlay.ts +1 -1
- package/src/modes/components/queue-pane.ts +55 -9
- package/src/modes/components/queued-message-selector.ts +53 -10
- package/src/modes/components/read-tool-group.ts +82 -14
- package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
- package/src/modes/components/sayknow-pet-widget.ts +20 -8
- package/src/modes/components/session-observer-overlay.ts +187 -32
- package/src/modes/components/settings-selector.ts +60 -18
- package/src/modes/components/tool-execution.ts +138 -27
- package/src/modes/components/tool-status-header.ts +26 -8
- package/src/modes/components/welcome.ts +50 -23
- package/src/modes/controllers/btw-controller.ts +119 -36
- package/src/modes/controllers/command-controller.ts +101 -54
- package/src/modes/controllers/event-controller.ts +119 -27
- package/src/modes/controllers/extension-ui-controller.ts +23 -12
- package/src/modes/controllers/input-controller.ts +100 -8
- package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
- package/src/modes/controllers/selector-controller.ts +4 -1
- package/src/modes/interactive-mode.ts +201 -60
- package/src/modes/irc-observation-ledger.ts +71 -15
- package/src/modes/prompt-action-autocomplete.ts +32 -13
- package/src/modes/prompt-suggestion-controller.ts +96 -0
- package/src/modes/runtime-init.ts +20 -2
- package/src/modes/shared/agent-wire/command-dispatch.ts +3 -3
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
- package/src/modes/types.ts +6 -0
- package/src/modes/utils/hotkeys-markdown.ts +64 -36
- package/src/modes/utils/ui-helpers.ts +99 -4
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/architect.md +17 -3
- package/src/prompts/agents/critic.md +17 -2
- package/src/prompts/agents/executor.md +1 -1
- package/src/prompts/agents/planner.md +8 -1
- package/src/prompts/system/btw-user.md +3 -8
- package/src/prompts/system/prompt-suggestion-system.md +32 -0
- package/src/prompts/system/system-prompt.md +6 -3
- package/src/prompts/tools/cron.md +3 -1
- package/src/prompts/tools/read.md +4 -2
- package/src/prompts/tools/skill-discovery.md +1 -0
- package/src/runtime/memory-domain.ts +66 -0
- package/src/runtime/memory-guard-contract.ts +73 -0
- package/src/runtime/memory-guard.ts +292 -0
- package/src/runtime/memory-limit.ts +50 -0
- package/src/runtime-mcp/client.ts +41 -55
- package/src/runtime-mcp/content-limits.ts +71 -0
- package/src/runtime-mcp/discoverable-tool-metadata.ts +1 -1
- package/src/runtime-mcp/json-rpc.ts +28 -11
- package/src/runtime-mcp/manager.ts +77 -59
- package/src/runtime-mcp/oauth-flow.ts +0 -72
- package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
- package/src/runtime-mcp/redaction.ts +30 -0
- package/src/runtime-mcp/smithery-auth.ts +17 -2
- package/src/runtime-mcp/smithery-connect.ts +11 -1
- package/src/runtime-mcp/transports/http.ts +63 -22
- package/src/sdk/acp/adapter.ts +8 -1
- package/src/sdk/acp/final-text.ts +40 -0
- package/src/sdk/acp/mcp.ts +26 -0
- package/src/sdk/broker/broker.ts +34 -20
- package/src/sdk/broker/identity.ts +22 -12
- package/src/sdk/broker/lifecycle.ts +293 -43
- package/src/sdk/broker/session-index.ts +11 -1
- package/src/sdk/bus/chat-daemon-cli.ts +2 -2
- package/src/sdk/bus/chat-daemon-control.ts +22 -5
- package/src/sdk/bus/config-commands.ts +2 -2
- package/src/sdk/bus/config.ts +10 -2
- package/src/sdk/bus/control-drain-lease.ts +104 -0
- package/src/sdk/bus/conversation-store.ts +40 -6
- package/src/sdk/bus/daemon-paths.ts +2 -0
- package/src/sdk/bus/index.ts +793 -121
- package/src/sdk/bus/kind-aware-reconciliation.ts +242 -0
- package/src/sdk/bus/lifecycle-commands.ts +63 -10
- package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
- package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
- package/src/sdk/bus/notification-orchestration.ts +12 -0
- package/src/sdk/bus/notification-service.ts +87 -25
- package/src/sdk/bus/operator-runtime.ts +31 -5
- package/src/sdk/bus/prompt-reconciliation.ts +240 -0
- package/src/sdk/bus/rate-limit-pool.ts +8 -0
- package/src/sdk/bus/recent-activity.ts +90 -26
- package/src/sdk/bus/reconciliation-store.ts +224 -0
- package/src/sdk/bus/telegram-cli.ts +6 -13
- package/src/sdk/bus/telegram-daemon-cli.ts +8 -3
- package/src/sdk/bus/telegram-daemon-contract.ts +34 -9
- package/src/sdk/bus/telegram-daemon-control.ts +161 -40
- package/src/sdk/bus/telegram-daemon.ts +3649 -593
- package/src/sdk/bus/telegram-reference.ts +20 -2
- package/src/sdk/bus/topic-registry.ts +451 -12
- package/src/sdk/cli/session-cli.ts +15 -2
- package/src/sdk/client/discovery.ts +19 -3
- package/src/sdk/client/liveness.ts +49 -0
- package/src/sdk/host/control/dispatch.ts +8 -2
- package/src/sdk/host/control/operations.ts +3 -2
- package/src/sdk/host/host.ts +27 -9
- package/src/sdk/host/query/handlers.ts +125 -5
- package/src/sdk/index.ts +12 -0
- package/src/sdk/lifecycle-session.ts +19 -3
- package/src/sdk/mcp/server.ts +46 -18
- package/src/sdk/prompt-status.ts +97 -0
- package/src/sdk/protocol/operation-inventory.generated.json +145 -0
- package/src/sdk/protocol/operation-registry.ts +24 -4
- package/src/sdk/session-directory.ts +5 -1
- package/src/sdk/session.ts +69 -8
- package/src/sdk/startup-capability.ts +15 -1
- package/src/sdk/transport/auth-preface.ts +82 -0
- package/src/sdk/transport/index.ts +18 -0
- package/src/sdk/transport/relay.ts +252 -0
- package/src/sdk/transport/serve-cli.ts +105 -0
- package/src/sdk/transport/socket.ts +197 -0
- package/src/sdk/transport/stdio.ts +17 -0
- package/src/session/agent-session.ts +1112 -314
- package/src/session/blob-store.ts +25 -7
- package/src/session/btw-contract.ts +59 -0
- package/src/session/fallback-chain-controller.ts +47 -8
- package/src/session/internal/managed-session-scope.ts +1426 -259
- package/src/session/internal/managed-session-storage.ts +414 -238
- package/src/session/internal/native-publish-outcome.ts +271 -0
- package/src/session/memory-guard-checkpoint-participant.ts +131 -0
- package/src/session/session-manager.ts +2079 -469
- package/src/session/session-storage.ts +151 -11
- package/src/session/streaming-output.ts +262 -43
- package/src/setup/credential-import.ts +28 -3
- package/src/setup/provider-onboarding.ts +49 -5
- package/src/setup/provider-presets.json +2 -1
- package/src/skc-runtime/deep-interview-runtime.ts +303 -36
- package/src/skc-runtime/deep-interview-stage.ts +1016 -0
- package/src/skc-runtime/deep-interview-state.ts +8 -5
- package/src/skc-runtime/gc-render.ts +1 -0
- package/src/skc-runtime/gc-runtime.ts +11 -1
- package/src/skc-runtime/linux-proc.ts +70 -36
- package/src/skc-runtime/managed-owner-supervisor.ts +83 -4
- package/src/skc-runtime/memory-guard-owner-claims.ts +389 -0
- package/src/skc-runtime/ralplan-runtime.ts +1057 -75
- package/src/skc-runtime/repository-binding.ts +267 -0
- package/src/skc-runtime/session-state-sidecar.ts +25 -9
- package/src/skc-runtime/state-runtime.ts +50 -12
- package/src/skc-runtime/state-writer.ts +68 -56
- package/src/skc-runtime/team-launch.ts +34 -5
- package/src/skc-runtime/team-runtime.ts +41 -1
- package/src/skc-runtime/team-store.ts +32 -0
- package/src/skc-runtime/team-worker-memory-guard.ts +363 -0
- package/src/skc-runtime/team-workers.ts +1 -0
- package/src/skc-runtime/tmux-common.ts +13 -2
- package/src/skc-runtime/tmux-owner-isolation.ts +20 -1
- package/src/skc-runtime/tmux-sessions.ts +45 -6
- package/src/skc-runtime/ultragoal-guard.ts +93 -15
- package/src/skc-runtime/ultragoal-receipt-freshness.ts +123 -0
- package/src/skc-runtime/ultragoal-runtime.ts +469 -38
- package/src/skc-runtime/workflow-manifest.generated.json +195 -5
- package/src/skc-runtime/workflow-manifest.ts +67 -3
- package/src/skill-state/workflow-hud.ts +25 -2
- package/src/skill-state/workflow-mutation-guard.ts +104 -12
- package/src/slash-commands/builtin-registry.ts +1 -1
- package/src/ssh/utils.ts +14 -0
- package/src/task/discovery.ts +8 -2
- package/src/task/executor.ts +165 -47
- package/src/task/index.ts +123 -15
- package/src/task/provider-retry-status.ts +88 -0
- package/src/task/receipt.ts +3 -0
- package/src/task/render.ts +45 -26
- package/src/task/skc-command.ts +2 -2
- package/src/task/types.ts +55 -10
- package/src/task/ultragoal-redteam-activation.ts +75 -0
- package/src/tools/ask.ts +1 -1
- package/src/tools/ast-edit.ts +2 -2
- package/src/tools/bash-allowed-prefixes.ts +45 -1
- package/src/tools/bash-pty-selection.ts +2 -2
- package/src/tools/browser/launch.ts +41 -6
- package/src/tools/browser/screenshot-format.ts +6 -1
- package/src/tools/cron.ts +1 -1
- package/src/tools/fetch.ts +127 -154
- package/src/tools/image-gen.ts +476 -23
- package/src/tools/index.ts +7 -1
- package/src/tools/output-meta.ts +176 -9
- package/src/tools/path-utils.ts +5 -1
- package/src/tools/read-internals.ts +44 -0
- package/src/tools/read.ts +1544 -310
- package/src/tools/resource-gc.ts +665 -125
- package/src/tools/skill-discovery.ts +39 -3
- package/src/tools/sqlite-reader.ts +63 -5
- package/src/tools/subagent-render.ts +74 -16
- package/src/tools/subagent.ts +2 -0
- package/src/tools/tool-result.ts +14 -1
- package/src/utils/edit-mode.ts +2 -2
- package/src/utils/pasted-image-path.ts +15 -6
- package/src/utils/prompt-suggestion.ts +265 -0
- package/src/utils/shell-snapshot.ts +173 -63
- package/src/utils/sixel.ts +3 -3
- package/src/web/insane/bridge.ts +5 -1
- package/src/web/insane/url-guard.ts +140 -27
- package/src/web/scrapers/docs-rs.ts +30 -5
- package/src/web/scrapers/types.ts +19 -49
- package/src/web/scrapers/utils.ts +12 -26
- package/src/web/search/providers/codex.ts +1 -1
- package/src/workflow/workflow-intent-diff.ts +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,128 @@ This file tracks the **fork's own releases**; upstream's full feature history li
|
|
|
5
5
|
in that project. Each release notes the upstream version it is built on.
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
## [0.5.1] — 2026-07-29
|
|
9
|
+
|
|
10
|
+
Built on upstream **gajae-code v0.12.0**.
|
|
11
|
+
|
|
12
|
+
### Fixed (Sayknow Pet still left sixel residue under tmux)
|
|
13
|
+
|
|
14
|
+
0.5.0 gave tmux ownership of the pet's sixel, which is the real fix — but it only
|
|
15
|
+
takes effect for a client that attaches *after* the feature is set, because tmux
|
|
16
|
+
computes client features at attach time. Every already-attached client kept
|
|
17
|
+
falling back to DCS passthrough, and that fallback still erased at tmux level
|
|
18
|
+
while its pixels lived in the outer terminal. So the residue persisted for
|
|
19
|
+
exactly the people who already had a session open.
|
|
20
|
+
|
|
21
|
+
- **The erase now rides the same envelope as the draw.** When the frame goes out
|
|
22
|
+
through passthrough, the erase does too, reaching the terminal that actually
|
|
23
|
+
holds the image; the absolute coordinates match because the draw used the same
|
|
24
|
+
ones. When tmux owns the sixel, the erase stays at tmux level as before.
|
|
25
|
+
- **`terminal-features` is set with the correct scope.** It is a *server* option,
|
|
26
|
+
so the previous `set-option -aq -t <target>` silently ignored the target. Now
|
|
27
|
+
`set-option -saq`.
|
|
28
|
+
- Added a regression test that pins the multiplexer environment and asserts draw
|
|
29
|
+
and erase share one envelope. The pet suite previously inherited whatever
|
|
30
|
+
terminal the developer ran it in, so it passed on CI and failed inside tmux;
|
|
31
|
+
the environment is now pinned per test.
|
|
32
|
+
|
|
33
|
+
## [0.5.0] — 2026-07-28
|
|
34
|
+
|
|
35
|
+
Built on upstream **gajae-code v0.12.0** (previous fork release tracked v0.11.6).
|
|
36
|
+
|
|
37
|
+
### Security (inherited from upstream v0.12.0)
|
|
38
|
+
|
|
39
|
+
Every path below trusted the caller's `cwd/.env`, so **opening a hostile repository
|
|
40
|
+
was enough** to trigger it. All now resolve through the non-project resolver
|
|
41
|
+
(launching shell plus SKC/user-owned files); shell and user configuration are
|
|
42
|
+
unchanged.
|
|
43
|
+
|
|
44
|
+
- **Provider base URLs** — `<PROVIDER>_BASE_URL` is derived generically, so a planted
|
|
45
|
+
`.env` could redirect authenticated traffic for *every* provider.
|
|
46
|
+
- **Browser launch overrides** — could pick the browser binary, route all traffic
|
|
47
|
+
through an attacker proxy, and disable certificate validation.
|
|
48
|
+
- **Spawned command overrides** (`SKC_SDK_SESSION_COMMAND`,
|
|
49
|
+
`SKC_HARNESS_PROCESS_START_COMMAND`) — chose which binary those paths execute.
|
|
50
|
+
- **Smithery origin / API base / API key** — the auth session the user is sent to,
|
|
51
|
+
and the credential sent with every call.
|
|
52
|
+
- **Native skill hook config dirs** — could point the hook at a directory the repo
|
|
53
|
+
ships and inject its own `skills.customDirectories`, bypassing escalation guards.
|
|
54
|
+
|
|
55
|
+
Also: **memory consolidation now redacts GitHub tokens.** The scrubber covered AWS
|
|
56
|
+
ids, JWTs, and keyword-prefixed keys, but `ghp_` / `gho_` / `github_pat_` carry none
|
|
57
|
+
of those markers, so a token reached `MEMORY.md` and `memory_summary.md` verbatim —
|
|
58
|
+
and that summary is injected into every later session.
|
|
59
|
+
|
|
60
|
+
### Changed (upstream replaced two surfaces the fork had ported)
|
|
61
|
+
|
|
62
|
+
- The typed deep-interview **draft** CLI was reverted upstream and replaced with a
|
|
63
|
+
staged-transition surface (`stage --for <transition> --input '<json>'`, `check`,
|
|
64
|
+
`apply`, `discard`; one pending draft per session, no `--draft-id`). The fork
|
|
65
|
+
follows upstream here rather than keeping a surface upstream retired.
|
|
66
|
+
- The fork's `absoluteClear` multiplexer width-reflow repair is superseded by
|
|
67
|
+
upstream's width-settle repair, which runs once per settled width sequence
|
|
68
|
+
instead of once per SIGWINCH. Upstream's implementation is kept.
|
|
69
|
+
|
|
70
|
+
### Fixed (Sayknow Pet leaves sixel residue under tmux)
|
|
71
|
+
|
|
72
|
+
- **Give tmux ownership of the pet's sixel instead of smuggling it past tmux.**
|
|
73
|
+
The pet was drawn with DCS passthrough, which writes pixels straight into the
|
|
74
|
+
outer terminal's image plane, while the erase was an `ECH` that only ever
|
|
75
|
+
reached tmux's cell buffer. tmux never recorded the image, so nothing could
|
|
76
|
+
remove it — every frame stacked another vertical band above the pet.
|
|
77
|
+
|
|
78
|
+
This is the same root cause behind the oversize/frozen animation (0.4.6) and
|
|
79
|
+
the viewport scroll (0.4.7): tmux's screen model and the real screen disagreed.
|
|
80
|
+
Those releases each patched the *draw* path; the *erase* path was never
|
|
81
|
+
revisited, so the residue survived all three fixes.
|
|
82
|
+
|
|
83
|
+
SKC-launched sessions now append `terminal-features ,*:sixel`, and the widget
|
|
84
|
+
sends the frame directly whenever tmux claims sixel. tmux 3.4+ parses it into
|
|
85
|
+
its own screen model (`screen_write_sixelimage`) and re-renders it, so the
|
|
86
|
+
existing erase actually deletes the image and scroll/resize/copy-mode stay
|
|
87
|
+
consistent. Passthrough remains only as the fallback for terminals or tmux
|
|
88
|
+
builds that do not claim sixel.
|
|
89
|
+
|
|
90
|
+
### Fixed (rebrand leakage)
|
|
91
|
+
|
|
92
|
+
- **Stop creating `.gjc-*` paths.** `recovery_fs` and `path_identity` still wrote
|
|
93
|
+
`.gjc-recovery`, `.gjc-managed-remove-*`, and `.gjc-exact-unlink-*` on disk: the
|
|
94
|
+
rename never reached them, so recovery state landed under an upstream-branded
|
|
95
|
+
directory name. 24 residual tokens are gone and the sync pipeline now fails the
|
|
96
|
+
build instead of shipping them.
|
|
97
|
+
|
|
98
|
+
### Fixed (fork pipeline)
|
|
99
|
+
|
|
100
|
+
The fork layer is regenerated as `gen-tree(upstream tag) = codemod + deletions +
|
|
101
|
+
overlay + patches + identity`. Five defects made that identity false:
|
|
102
|
+
|
|
103
|
+
- **Overlay swallowed upstream changes.** 66 upstream-owned files were carried as
|
|
104
|
+
whole-file overlays, so every upstream edit to them was silently discarded —
|
|
105
|
+
including `packages/tui`'s `node-pty` dependency. Ownership is now decided by
|
|
106
|
+
the base tree: present upstream ⇒ patch, absent ⇒ overlay (45 → 134 patches).
|
|
107
|
+
- **Release versions leaked into patch context.** A version bump invalidated the
|
|
108
|
+
context lines of unrelated hunks, so patches rejected on every release. Version
|
|
109
|
+
text is now neutralized on both sides of extraction and restored by the identity
|
|
110
|
+
stamp.
|
|
111
|
+
- **Deletions were unrepresentable.** Upstream files the fork drops (`crates/skc-sdk`
|
|
112
|
+
and others) reappeared on each sync; they are now declared and replayed.
|
|
113
|
+
- **Binary assets were declared as patches**, producing unappliable
|
|
114
|
+
"Binary files differ" stubs. They are demoted to overlay automatically.
|
|
115
|
+
- **The codemod never converged.** Overlay and patch payloads carry upstream text
|
|
116
|
+
that the single first pass cannot see, so the idempotence gate could not pass.
|
|
117
|
+
|
|
118
|
+
`gen-tree` also refuses to run against the fork repo itself — an empty argument
|
|
119
|
+
previously codemodded and version-stamped the working tree in place.
|
|
120
|
+
|
|
121
|
+
### Added (ported from upstream)
|
|
122
|
+
|
|
123
|
+
- `ServerHandle::push_frame_and_wait` in `skc-notifications`, so the SDK can await
|
|
124
|
+
per-connection delivery receipts instead of fire-and-forget broadcast.
|
|
125
|
+
- `Process.signalRoot` napi binding for pinned single-process signalling.
|
|
126
|
+
- Worker integration attempts accept an `AbortSignal` and bail between git probes.
|
|
127
|
+
- The deep-interview staged-transition surface (`stage`, `check`, `apply`, `discard`,
|
|
128
|
+
`initialize-context`, `confirm-topology`).
|
|
129
|
+
|
|
8
130
|
## [0.4.7] — 2026-07-24
|
|
9
131
|
|
|
10
132
|
### Fixed (Sayknow Pet scroll under tmux)
|
|
@@ -17,26 +17,16 @@ export declare function loadCapability<T>(capabilityId: string, options?: LoadOp
|
|
|
17
17
|
* Call this once on startup to enable persistent provider state.
|
|
18
18
|
*/
|
|
19
19
|
export declare function initializeWithSettings(activeSettings: Settings): void;
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
export declare function
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
*/
|
|
27
|
-
export declare function
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
*/
|
|
31
|
-
export declare function isProviderEnabled(providerId: string): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Get list of all disabled provider IDs.
|
|
34
|
-
*/
|
|
35
|
-
export declare function getDisabledProviders(): string[];
|
|
36
|
-
/**
|
|
37
|
-
* Set disabled providers from a list (replaces current set).
|
|
38
|
-
*/
|
|
39
|
-
export declare function setDisabledProviders(providerIds: string[]): void;
|
|
20
|
+
/** Disable a provider for the supplied session settings. */
|
|
21
|
+
export declare function disableProvider(providerId: string, activeSettings?: Settings): void;
|
|
22
|
+
/** Enable a provider for the supplied session settings. */
|
|
23
|
+
export declare function enableProvider(providerId: string, activeSettings?: Settings): void;
|
|
24
|
+
/** Check whether a provider is enabled by the supplied session settings. */
|
|
25
|
+
export declare function isProviderEnabled(providerId: string, activeSettings?: Settings | undefined): boolean;
|
|
26
|
+
/** Get disabled providers from the supplied session settings. */
|
|
27
|
+
export declare function getDisabledProviders(activeSettings?: Settings | undefined): string[];
|
|
28
|
+
/** Replace disabled providers for the supplied session settings. */
|
|
29
|
+
export declare function setDisabledProviders(providerIds: string[], activeSettings?: Settings): void;
|
|
40
30
|
/**
|
|
41
31
|
* Get a capability definition (for introspection).
|
|
42
32
|
*/
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* paths like `.skc`, `.gemini`, or `.vscode`, they simply ask for `load("mcps")`
|
|
6
6
|
* and get back a unified array of MCP servers.
|
|
7
7
|
*/
|
|
8
|
+
import type { Settings } from "../config/settings";
|
|
8
9
|
/**
|
|
9
10
|
* Context passed to every provider loader.
|
|
10
11
|
*/
|
|
@@ -64,6 +65,8 @@ export interface LoadOptions {
|
|
|
64
65
|
includeDisabled?: boolean;
|
|
65
66
|
/** Explicit disabled extension IDs to apply instead of settings. */
|
|
66
67
|
disabledExtensions?: string[];
|
|
68
|
+
/** Session settings whose provider policy applies to this load. */
|
|
69
|
+
settings?: Settings;
|
|
67
70
|
}
|
|
68
71
|
/**
|
|
69
72
|
* Source metadata attached to every loaded item.
|
package/dist/types/cli/args.d.ts
CHANGED
package/dist/types/cli.d.ts
CHANGED
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
import "@sayknow-cli/utils/postmortem";
|
|
7
7
|
import { Command, type CommandEntry } from "@sayknow-cli/utils/cli";
|
|
8
8
|
export declare const commands: CommandEntry[];
|
|
9
|
+
export declare function interactiveBootstrapText(argv: readonly string[], stdinIsTTY?: boolean, stdoutIsTTY?: boolean): string | undefined;
|
|
10
|
+
type MemoryGuardNativeSmokeLoad = () => Record<string, unknown>;
|
|
11
|
+
export declare function isMemoryGuardNativeSmokeFastPath(argv: readonly string[]): boolean;
|
|
12
|
+
export declare function runMemoryGuardNativeSmokeFastPath(options?: {
|
|
13
|
+
loadNative?: MemoryGuardNativeSmokeLoad;
|
|
14
|
+
writeStdout?: (text: string) => void;
|
|
15
|
+
}): void;
|
|
9
16
|
export declare class RootHelpCommand extends Command {
|
|
10
17
|
static description: string;
|
|
11
18
|
static hidden: boolean;
|
|
@@ -98,7 +105,7 @@ export declare class RootHelpCommand extends Command {
|
|
|
98
105
|
};
|
|
99
106
|
thinking: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
100
107
|
description: string;
|
|
101
|
-
options:
|
|
108
|
+
options: import("@sayknow-cli/ai").Effort[];
|
|
102
109
|
};
|
|
103
110
|
hook: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
104
111
|
description: string;
|
|
@@ -141,3 +148,4 @@ export declare function normalizeResumeAlias(argv: readonly string[]): string[];
|
|
|
141
148
|
export declare function routeRootArgv(argv: readonly string[]): string[];
|
|
142
149
|
/** Run the CLI with the given argv (no `process.argv` prefix). */
|
|
143
150
|
export declare function runCli(argv: string[]): Promise<void>;
|
|
151
|
+
export {};
|
|
@@ -31,10 +31,10 @@ export default class Daemon extends Command {
|
|
|
31
31
|
force: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
|
|
32
32
|
description: string;
|
|
33
33
|
};
|
|
34
|
-
"graceful-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"
|
|
34
|
+
"graceful-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
35
35
|
description: string;
|
|
36
36
|
};
|
|
37
|
-
"kill-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"
|
|
37
|
+
"kill-timeout-ms": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
38
38
|
description: string;
|
|
39
39
|
};
|
|
40
40
|
"spawn-if-stopped": import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
|
|
@@ -24,6 +24,15 @@ export default class DeepInterview extends Command {
|
|
|
24
24
|
"session-id": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
25
25
|
description: string;
|
|
26
26
|
};
|
|
27
|
+
input: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
for: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
31
|
+
description: string;
|
|
32
|
+
};
|
|
33
|
+
reset: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
27
36
|
write: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
|
|
28
37
|
description: string;
|
|
29
38
|
};
|
|
@@ -1,4 +1,25 @@
|
|
|
1
1
|
import { Command } from "@sayknow-cli/utils/cli";
|
|
2
|
+
/**
|
|
3
|
+
* Operator override for the process-start probe command, resolved from trusted
|
|
4
|
+
* environment sources only.
|
|
5
|
+
*
|
|
6
|
+
* The result is spawned, so whatever can set it chooses which binary runs.
|
|
7
|
+
* `$env` merges the caller's `cwd/.env` into `process.env`, so reading it there
|
|
8
|
+
* would let repository content pick the command; resolve it the same way
|
|
9
|
+
* provider credentials are (launching shell plus SKC/user-owned `.env` files,
|
|
10
|
+
* never the project `.env`). A malformed override stays fatal rather than
|
|
11
|
+
* silently falling back to `ps`, matching the previous behavior.
|
|
12
|
+
*/
|
|
13
|
+
type ProcessStartCommandOverride = {
|
|
14
|
+
kind: "none";
|
|
15
|
+
} | {
|
|
16
|
+
kind: "invalid";
|
|
17
|
+
} | {
|
|
18
|
+
kind: "command";
|
|
19
|
+
command: string[];
|
|
20
|
+
};
|
|
21
|
+
/** Test seam: the process-start command override as resolved from trusted env. */
|
|
22
|
+
export declare function processStartCommandOverrideForTest(): ProcessStartCommandOverride;
|
|
2
23
|
export default class Harness extends Command {
|
|
3
24
|
#private;
|
|
4
25
|
static description: string;
|
|
@@ -41,3 +62,4 @@ export default class Harness extends Command {
|
|
|
41
62
|
static examples: string[];
|
|
42
63
|
run(): Promise<void>;
|
|
43
64
|
}
|
|
65
|
+
export {};
|
|
@@ -10,6 +10,12 @@ export default class Read extends Command {
|
|
|
10
10
|
required: true;
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
|
+
static flags: {
|
|
14
|
+
truncation: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
15
|
+
options: string[];
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
13
19
|
static examples: string[];
|
|
14
20
|
run(): Promise<void>;
|
|
15
21
|
}
|
|
@@ -15,17 +15,35 @@ export declare function runSessionHost(timing?: {
|
|
|
15
15
|
cwd?: string;
|
|
16
16
|
processIncarnation?: (pid: number) => string | undefined;
|
|
17
17
|
}): Promise<void>;
|
|
18
|
+
export type SdkInternalArgv = {
|
|
19
|
+
action: "broker-internal";
|
|
20
|
+
agentDir: string;
|
|
21
|
+
} | {
|
|
22
|
+
action: "session-host-internal";
|
|
23
|
+
};
|
|
24
|
+
/** Parses the exact private argv contracts used by SDK child-process spawns. */
|
|
25
|
+
export declare function parseSdkInternalArgv(argv: readonly string[]): SdkInternalArgv;
|
|
18
26
|
export default class Sdk extends Command {
|
|
19
27
|
static description: string;
|
|
20
28
|
static hidden: boolean;
|
|
29
|
+
static delegateHelp: boolean;
|
|
21
30
|
static args: {
|
|
22
31
|
action: import("@sayknow-cli/utils/cli").ArgDescriptor & {
|
|
23
|
-
required:
|
|
32
|
+
required: false;
|
|
24
33
|
options: string[];
|
|
25
34
|
};
|
|
26
35
|
};
|
|
27
36
|
static flags: {
|
|
28
|
-
|
|
37
|
+
stdio: import("@sayknow-cli/utils/cli").FlagDescriptor<"boolean"> & {
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
socket: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
session: import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
"pending-ceiling": import("@sayknow-cli/utils/cli").FlagDescriptor<"string"> & {
|
|
29
47
|
description: string;
|
|
30
48
|
};
|
|
31
49
|
};
|
|
@@ -151,7 +151,7 @@ export declare const KEYBINDINGS: {
|
|
|
151
151
|
};
|
|
152
152
|
readonly "app.session.fork": {
|
|
153
153
|
readonly defaultKeys: [];
|
|
154
|
-
readonly description: "
|
|
154
|
+
readonly description: "Branch from message";
|
|
155
155
|
};
|
|
156
156
|
readonly "app.session.resume": {
|
|
157
157
|
readonly defaultKeys: [];
|
|
@@ -378,6 +378,10 @@ declare function migrateKeybindingsConfigFile(agentDir: string): void;
|
|
|
378
378
|
export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
379
379
|
#private;
|
|
380
380
|
constructor(userBindings?: KeybindingsConfig, configPath?: string);
|
|
381
|
+
/**
|
|
382
|
+
* Replace user bindings only after canonical grammar validation.
|
|
383
|
+
*/
|
|
384
|
+
setUserBindings(userBindings: KeybindingsConfig): void;
|
|
381
385
|
/**
|
|
382
386
|
* Create from config file at agentDir/keybindings.json.
|
|
383
387
|
*/
|
|
@@ -386,6 +390,11 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
|
386
390
|
* Create an in-memory keybindings manager without file persistence.
|
|
387
391
|
*/
|
|
388
392
|
static inMemory(userBindings?: KeybindingsConfig): KeybindingsManager;
|
|
393
|
+
/**
|
|
394
|
+
* Set the default display context used by composed surfaces that do not
|
|
395
|
+
* supply an explicit context.
|
|
396
|
+
*/
|
|
397
|
+
setDisplayContext(context: KeyDisplayContext): void;
|
|
389
398
|
/**
|
|
390
399
|
* Reload keybindings from the config file.
|
|
391
400
|
*/
|
|
@@ -397,9 +406,30 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
|
397
406
|
/**
|
|
398
407
|
* Get display string for a keybinding (e.g., "ctrl+c/escape").
|
|
399
408
|
*/
|
|
400
|
-
getDisplayString(keybinding: Keybinding): string;
|
|
409
|
+
getDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string;
|
|
410
|
+
/**
|
|
411
|
+
* Get an accessibility-oriented display string for help surfaces.
|
|
412
|
+
* Darwin chords include both the concise glyphs and expanded key names.
|
|
413
|
+
*/
|
|
414
|
+
getAccessibleDisplayString(keybinding: Keybinding, context?: KeyDisplayContext): string;
|
|
415
|
+
/**
|
|
416
|
+
* Format a fixed key chord using this manager's display context.
|
|
417
|
+
*/
|
|
418
|
+
formatKeyHint(key: string): string;
|
|
419
|
+
/**
|
|
420
|
+
* Format a fixed key chord for accessibility-oriented help surfaces.
|
|
421
|
+
*/
|
|
422
|
+
formatAccessibleKeyHint(key: string): string;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Key hint formatting utilities for UI labels.
|
|
426
|
+
*/
|
|
427
|
+
export interface KeyDisplayContext {
|
|
428
|
+
platform: NodeJS.Platform;
|
|
401
429
|
}
|
|
402
|
-
export declare function formatKeyHint(key:
|
|
403
|
-
export declare function
|
|
430
|
+
export declare function formatKeyHint(key: string, context?: KeyDisplayContext): string;
|
|
431
|
+
export declare function formatAccessibleKeyHint(key: string, context?: KeyDisplayContext): string;
|
|
432
|
+
export declare function formatKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string;
|
|
433
|
+
export declare function formatAccessibleKeyHints(keys: string | readonly string[], context?: KeyDisplayContext): string;
|
|
404
434
|
export type { Keybinding, KeybindingsConfig, KeyId };
|
|
405
435
|
export { migrateKeybindingsConfigFile };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ModelProfileDefinition } from "./model-profiles";
|
|
2
|
+
export declare const MODEL_PROFILE_DISCOVERY_QUERY = "models.profiles.list";
|
|
3
|
+
export declare const MODEL_PROFILE_ERROR_DETAIL_MAX_BYTES = 2048;
|
|
4
|
+
export interface ModelProfileCatalogItem {
|
|
5
|
+
id: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
source: "builtin" | "configured";
|
|
8
|
+
available?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface UnknownModelProfileDetails {
|
|
11
|
+
requestedProfile: string;
|
|
12
|
+
availableProfiles: string[];
|
|
13
|
+
discoveryQuery: typeof MODEL_PROFILE_DISCOVERY_QUERY;
|
|
14
|
+
}
|
|
15
|
+
export interface ModelProfileRegistryErrorDetails {
|
|
16
|
+
requestedProfile?: string;
|
|
17
|
+
availableProfiles: [];
|
|
18
|
+
discoveryQuery: typeof MODEL_PROFILE_DISCOVERY_QUERY;
|
|
19
|
+
}
|
|
20
|
+
export type ModelProfileErrorDetails = UnknownModelProfileDetails | ModelProfileRegistryErrorDetails;
|
|
21
|
+
export type ModelProfileErrorCode = "unknown_model_profile" | "model_profile_registry_error";
|
|
22
|
+
export declare class UnknownModelProfileError extends Error {
|
|
23
|
+
readonly code: "unknown_model_profile";
|
|
24
|
+
readonly details: UnknownModelProfileDetails;
|
|
25
|
+
constructor(requestedProfile: string, profiles: ReadonlyMap<string, unknown>);
|
|
26
|
+
}
|
|
27
|
+
export declare class ModelProfileRegistryError extends Error {
|
|
28
|
+
readonly code: "model_profile_registry_error";
|
|
29
|
+
readonly details: ModelProfileRegistryErrorDetails;
|
|
30
|
+
constructor(requestedProfile?: string);
|
|
31
|
+
}
|
|
32
|
+
export declare function resolveModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>): string;
|
|
33
|
+
export declare function validateModelProfileName(profileName: string, profiles: ReadonlyMap<string, unknown>, registryError?: unknown): string;
|
|
34
|
+
export declare function projectModelProfileCatalog(profiles: ReadonlyMap<string, ModelProfileDefinition>, registryError?: unknown): ModelProfileCatalogItem[];
|
|
35
|
+
export declare function isModelProfileProviderAvailable(profile: ModelProfileDefinition, authenticatedProviders: ReadonlySet<string>): boolean;
|
|
36
|
+
export declare function isModelProfileError(value: unknown): value is {
|
|
37
|
+
code: ModelProfileErrorCode;
|
|
38
|
+
message: string;
|
|
39
|
+
details: ModelProfileErrorDetails;
|
|
40
|
+
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { SkcModelAssignmentTargetId } from "./model-registry";
|
|
2
1
|
import { type ModelSelectorValue } from "./model-selector-value";
|
|
3
|
-
import type { ModelsConfig } from "./models-config-schema";
|
|
4
|
-
export type ModelProfileRole =
|
|
2
|
+
import type { ModelsConfig, SKC_MODEL_ASSIGNMENT_TARGET_IDS } from "./models-config-schema";
|
|
3
|
+
export type ModelProfileRole = (typeof SKC_MODEL_ASSIGNMENT_TARGET_IDS)[number];
|
|
5
4
|
export interface ModelProfileDefinition {
|
|
6
5
|
name: string;
|
|
7
6
|
requiredProviders: string[];
|
|
@@ -371,6 +371,10 @@ export declare class ModelRegistry {
|
|
|
371
371
|
* as providers with stored credentials. See issue #993.
|
|
372
372
|
*/
|
|
373
373
|
hasConfiguredAuth(model: Model<Api>): boolean;
|
|
374
|
+
/**
|
|
375
|
+
* Check whether auth is configured for a provider.
|
|
376
|
+
*/
|
|
377
|
+
hasConfiguredProviderAuth(provider: string): boolean;
|
|
374
378
|
getDiscoverableProviders(): string[];
|
|
375
379
|
getProviderDiscoveryState(provider: string): ProviderDiscoveryState | undefined;
|
|
376
380
|
/**
|
|
@@ -388,6 +392,7 @@ export declare class ModelRegistry {
|
|
|
388
392
|
*/
|
|
389
393
|
getApiKey(model: Model<Api>, sessionId?: string, options?: {
|
|
390
394
|
credentialSelector?: AuthCredentialSelector;
|
|
395
|
+
signal?: AbortSignal;
|
|
391
396
|
}): Promise<string | undefined>;
|
|
392
397
|
/**
|
|
393
398
|
* Get API key for a provider (e.g., "openai").
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AuthStorage } from "@sayknow-cli/ai/auth-storage";
|
|
2
|
+
/**
|
|
3
|
+
* Most recent OAuth validation outcome per provider, used only as an ordering
|
|
4
|
+
* hint so `/model` can rank a provider whose stored credentials failed
|
|
5
|
+
* validation below one that is healthy, without re-running validation itself.
|
|
6
|
+
*
|
|
7
|
+
* Entries are scoped to the `AuthStorage` that produced them and to its
|
|
8
|
+
* credential generation, so any login, logout, import, or deletion discards the
|
|
9
|
+
* stale result instead of overriding current auth state.
|
|
10
|
+
*/
|
|
11
|
+
export type ProviderAuthHealth = "valid" | "invalid";
|
|
12
|
+
export declare function recordProviderAuthHealth(authStorage: AuthStorage, providerId: string, health: ProviderAuthHealth): void;
|
|
13
|
+
export declare function getProviderAuthHealth(authStorage: AuthStorage, providerId: string): ProviderAuthHealth | undefined;
|
|
14
|
+
export declare function clearProviderAuthHealth(authStorage: AuthStorage): void;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared provider ordering used by every provider-facing selector (`/login`,
|
|
3
|
+
* `/model`, `/provider`).
|
|
4
|
+
*
|
|
5
|
+
* Providers the user already has come first, then a curated list of well-known
|
|
6
|
+
* providers, then everything else alphabetically. This is the single source of
|
|
7
|
+
* truth for that order — surfaces must not keep their own famous-provider list.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Auth/config state of a provider as seen by the calling surface.
|
|
11
|
+
*
|
|
12
|
+
* - `valid` — stored credentials that validated successfully.
|
|
13
|
+
* - `checking` — stored credentials whose async validation is still in flight.
|
|
14
|
+
* Ranked with `valid` so rows do not reflow when validation resolves.
|
|
15
|
+
* - `configured` — no OAuth record, but the provider is present in the model
|
|
16
|
+
* registry with a working API key (custom/API-compatible providers).
|
|
17
|
+
* - `invalid` — stored credentials that failed validation (problematic login).
|
|
18
|
+
* - `none` — nothing stored and nothing configured.
|
|
19
|
+
*/
|
|
20
|
+
export type ProviderAuthState = "valid" | "checking" | "configured" | "invalid" | "none";
|
|
21
|
+
export declare const PROVIDER_RANK_TIER: {
|
|
22
|
+
readonly existing: 0;
|
|
23
|
+
readonly problematic: 1;
|
|
24
|
+
readonly famous: 2;
|
|
25
|
+
readonly other: 3;
|
|
26
|
+
};
|
|
27
|
+
export type ProviderRankTier = (typeof PROVIDER_RANK_TIER)[keyof typeof PROVIDER_RANK_TIER];
|
|
28
|
+
/**
|
|
29
|
+
* Curated provider order for the famous tier. Regional and device variants sit
|
|
30
|
+
* immediately behind their primary so related entries stay grouped.
|
|
31
|
+
*/
|
|
32
|
+
export declare const FAMOUS_PROVIDER_ORDER: readonly string[];
|
|
33
|
+
/** A provider as ranked by a surface. `label` is what the user sees. */
|
|
34
|
+
export interface RankableProvider {
|
|
35
|
+
id: string;
|
|
36
|
+
label: string;
|
|
37
|
+
authState: ProviderAuthState;
|
|
38
|
+
}
|
|
39
|
+
/** A provider's position in the ordering: its tier plus its rank inside that tier. */
|
|
40
|
+
export interface ProviderRank {
|
|
41
|
+
tier: ProviderRankTier;
|
|
42
|
+
intraTierRank: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The single ranking result for a provider. `intraTierRank` is the curated
|
|
46
|
+
* famous-list position, or `Number.MAX_SAFE_INTEGER` for providers that are not
|
|
47
|
+
* on the list and therefore order by display label.
|
|
48
|
+
*/
|
|
49
|
+
export declare function rankProvider(provider: RankableProvider): ProviderRank;
|
|
50
|
+
export declare function providerRankTier(authState: ProviderAuthState, id: string): ProviderRankTier;
|
|
51
|
+
/** Position within the famous list, or `undefined` for providers not on it. */
|
|
52
|
+
export declare function famousProviderIndex(id: string): number | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Total order over providers: tier, then famous-list position, then display
|
|
55
|
+
* label, then id. The trailing id comparison guarantees no ties.
|
|
56
|
+
*/
|
|
57
|
+
export declare function compareRankedProviders(left: RankableProvider, right: RankableProvider): number;
|
|
58
|
+
/** Convenience wrapper returning a new array in ranked order. */
|
|
59
|
+
export declare function sortRankedProviders<T extends RankableProvider>(providers: readonly T[]): T[];
|