savant-code 0.0.16 → 0.0.19
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/.agents/skills/coding-csharp/SKILL.md +82 -0
- package/.agents/skills/coding-go/SKILL.md +76 -0
- package/.agents/skills/coding-java/SKILL.md +79 -0
- package/.agents/skills/coding-python/SKILL.md +87 -0
- package/.agents/skills/coding-rust/SKILL.md +83 -0
- package/.agents/skills/coding-typescript/SKILL.md +90 -0
- package/.agents/skills/release-workflow/SKILL.md +69 -0
- package/.bun-version +1 -0
- package/.commandcode/settings.json +11 -0
- package/.commandcode/taste/workflow/taste.md +6 -0
- package/.env.example +95 -0
- package/.gitattributes +43 -0
- package/.githooks/pre-push +35 -0
- package/.github/workflows/build-release-binaries.yml +163 -0
- package/.markdownlint.json +42 -0
- package/.markdownlintignore +21 -0
- package/.prettierignore +9 -0
- package/.prettierrc +23 -0
- package/.savantignore +3 -0
- package/AGENTS.md +97 -0
- package/ARCHITECTURE.md +241 -0
- package/CHANGELOG.md +2631 -0
- package/CONTRIBUTING.md +88 -0
- package/ECHO-freebuff.md +22 -0
- package/ECHO.md +722 -0
- package/FREEREADME.md +35 -0
- package/LEARNINGS.md +345 -0
- package/NOTICE +15 -0
- package/README.md +550 -216
- package/README.zh-CN.md +479 -0
- package/SECURITY.md +8 -0
- package/VERSION +1 -0
- package/WINDOWS.md +238 -0
- package/agents/README.md +41 -0
- package/agents/base-chat.ts +44 -0
- package/agents/basher.ts +107 -0
- package/agents/browser-use/browser-use.test.ts +211 -0
- package/agents/browser-use/browser-use.ts +259 -0
- package/agents/constants.ts +1 -0
- package/agents/context-pruner.ts +1076 -0
- package/agents/detective/detective.ts +168 -0
- package/agents/editor/best-of-n/best-of-n-selector2.ts +148 -0
- package/agents/editor/best-of-n/editor-implementor-gpt-5.ts +7 -0
- package/agents/editor/best-of-n/editor-implementor-opus.ts +7 -0
- package/agents/editor/best-of-n/editor-implementor.ts +196 -0
- package/agents/editor/best-of-n/editor-multi-prompt.ts +265 -0
- package/agents/file-explorer/directory-lister.ts +92 -0
- package/agents/file-explorer/glob-matcher.ts +96 -0
- package/agents/forge/forge.ts +146 -0
- package/agents/librarian/librarian.test.ts +289 -0
- package/agents/librarian/librarian.ts +158 -0
- package/agents/package.json +11 -0
- package/agents/recorder/recorder.ts +104 -0
- package/agents/researcher/researcher-docs.ts +32 -0
- package/agents/researcher/researcher-web.ts +40 -0
- package/agents/savant/savant-analyze.ts +11 -0
- package/agents/savant/savant-free-deepseek-flash.ts +13 -0
- package/agents/savant/savant-free-deepseek.ts +13 -0
- package/agents/savant/savant-free-evals.ts +9 -0
- package/agents/savant/savant-free-glm.ts +13 -0
- package/agents/savant/savant-free-kimi.ts +13 -0
- package/agents/savant/savant-free-mimo-pro.ts +13 -0
- package/agents/savant/savant-free-mimo.ts +13 -0
- package/agents/savant/savant-free-minimax-m3.ts +13 -0
- package/agents/savant/savant-free.ts +9 -0
- package/agents/savant/savant-scaffold.ts +15 -0
- package/agents/savant/savant.ts +706 -0
- package/agents/scout/scout.ts +305 -0
- package/agents/scribe/scribe.ts +54 -0
- package/agents/thinker/thinker-gemini.ts +26 -0
- package/agents/thinker/thinker-gpt.ts +21 -0
- package/agents/thinker/thinker-with-files-gemini.ts +66 -0
- package/agents/thinker/thinker.ts +99 -0
- package/agents/tmux-cli.ts +724 -0
- package/agents/tsconfig.json +12 -0
- package/agents/types/agent-definition.ts +1 -0
- package/agents/types/secret-agent-definition.ts +103 -0
- package/agents/types/tools.ts +465 -0
- package/agents/types/util-types.ts +167 -0
- package/agents/verifier/verifier.ts +80 -0
- package/art/savant-redesign.md +7 -0
- package/art/savant-text-graf.md +5 -0
- package/art/savant_ascii.md +88 -0
- package/assets/banner.png +0 -0
- package/bun.lock +1979 -0
- package/bunfig.toml +7 -0
- package/cli/README.md +111 -0
- package/cli/bunfig.toml +2 -0
- package/cli/cli_exit +1 -0
- package/cli/package.json +66 -0
- package/cli/release/README.md +348 -0
- package/{index.js → cli/release/index.js} +0 -0
- package/cli/release/package.json +56 -0
- package/cli/release-core/README.md +20 -0
- package/cli/release-core/package.json +4 -0
- package/cli/release-core/prepare-package.js +31 -0
- package/cli/release-staging/README.md +70 -0
- package/cli/release-staging/index.js +42 -0
- package/cli/release-staging/package.json +43 -0
- package/cli/scripts/build-binary.ts +469 -0
- package/cli/scripts/clean.ts +16 -0
- package/cli/scripts/prebuild-agents.ts +250 -0
- package/cli/scripts/release.ts +103 -0
- package/cli/scripts/smoke-binary.ts +280 -0
- package/cli/scripts/test-sdk-file-hooks.sh +87 -0
- package/cli/scripts/validate-cli-with-tmux.sh +43 -0
- package/cli/src/__tests__/README.md +256 -0
- package/cli/src/__tests__/bash-mode.test.ts +442 -0
- package/cli/src/__tests__/cli-args.test.ts +241 -0
- package/cli/src/__tests__/e2e/first-time-login.test.ts +173 -0
- package/cli/src/__tests__/e2e/logout-relogin-flow.test.ts +110 -0
- package/cli/src/__tests__/e2e/returning-user-auth.test.ts +111 -0
- package/cli/src/__tests__/e2e-cli.test.ts +185 -0
- package/cli/src/__tests__/helpers/mock-api-client.ts +64 -0
- package/cli/src/__tests__/helpers/terminal-watchdog-fixture.ts +50 -0
- package/cli/src/__tests__/home-directory-detection.test.ts +213 -0
- package/cli/src/__tests__/integration/agent-toolnames-validation.test.ts +63 -0
- package/cli/src/__tests__/integration/api-integration.test.ts +289 -0
- package/cli/src/__tests__/integration/credentials-storage.test.ts +453 -0
- package/cli/src/__tests__/integration/local-agents.test.ts +1187 -0
- package/cli/src/__tests__/integration/login-flow-instrumentation.test.ts +146 -0
- package/cli/src/__tests__/integration/login-polling-working.test.ts +287 -0
- package/cli/src/__tests__/integration/usage-refresh-on-completion.test.ts +177 -0
- package/cli/src/__tests__/integration-tmux.test.ts +186 -0
- package/cli/src/__tests__/mocks/hover-toggle-controller.ts +71 -0
- package/cli/src/__tests__/path-completion.test.ts +243 -0
- package/cli/src/__tests__/project-files-chat-id.test.ts +34 -0
- package/cli/src/__tests__/release/proxy-http-get.test.ts +670 -0
- package/cli/src/__tests__/release/wrapper-safety.test.ts +177 -0
- package/cli/src/__tests__/rerender-perf.integration.test.ts +283 -0
- package/cli/src/__tests__/terminal-reset-sequences.test.ts +36 -0
- package/cli/src/__tests__/terminal-watchdog.test.ts +114 -0
- package/cli/src/__tests__/test-utils.ts +266 -0
- package/cli/src/__tests__/tmux-poc.ts +150 -0
- package/cli/src/__tests__/unit/agent-mode-toggle.test.ts +138 -0
- package/cli/src/__tests__/unit/copy-button.test.tsx +188 -0
- package/cli/src/__tests__/unit/create-run-config.test.ts +77 -0
- package/cli/src/__tests__/unit/publish-confirmation.test.ts +70 -0
- package/cli/src/__tests__/unit/segmented-control.test.ts +167 -0
- package/cli/src/__tests__/utils/env.test.ts +210 -0
- package/cli/src/__tests__/utils/project-picker.test.ts +39 -0
- package/cli/src/agents/bundled-agents.generated.d.ts +14 -0
- package/cli/src/agents/bundled-agents.generated.ts +1962 -0
- package/cli/src/app.tsx +383 -0
- package/cli/src/chat.tsx +2008 -0
- package/cli/src/cli-args.ts +183 -0
- package/cli/src/commands/__tests__/bash-command.test.ts +449 -0
- package/cli/src/commands/__tests__/command-args.test.ts +325 -0
- package/cli/src/commands/__tests__/copy-conversation.test.ts +240 -0
- package/cli/src/commands/__tests__/dev-command.test.ts +128 -0
- package/cli/src/commands/__tests__/diagnostics-command.test.ts +35 -0
- package/cli/src/commands/__tests__/image.test.ts +99 -0
- package/cli/src/commands/__tests__/init.test.ts +479 -0
- package/cli/src/commands/__tests__/loop-command.test.ts +89 -0
- package/cli/src/commands/__tests__/new-command-rotates-chat.test.ts +87 -0
- package/cli/src/commands/__tests__/permissions-command.test.ts +93 -0
- package/cli/src/commands/__tests__/process-diagnostics.test.ts +54 -0
- package/cli/src/commands/__tests__/prompt-builders.test.ts +69 -0
- package/cli/src/commands/__tests__/registry-gating.test.ts +125 -0
- package/cli/src/commands/__tests__/rewind-command.test.ts +227 -0
- package/cli/src/commands/__tests__/router-connect-chatgpt.test.ts +72 -0
- package/cli/src/commands/__tests__/router-input.test.ts +302 -0
- package/cli/src/commands/__tests__/router-provider-setup.test.ts +180 -0
- package/cli/src/commands/__tests__/savant-free-command-aliases.test.ts +56 -0
- package/cli/src/commands/ads.ts +45 -0
- package/cli/src/commands/command-registry.ts +1112 -0
- package/cli/src/commands/copy-conversation.ts +386 -0
- package/cli/src/commands/goal.ts +87 -0
- package/cli/src/commands/health-command.ts +61 -0
- package/cli/src/commands/help.ts +13 -0
- package/cli/src/commands/image.ts +20 -0
- package/cli/src/commands/init.ts +121 -0
- package/cli/src/commands/loop.ts +182 -0
- package/cli/src/commands/process-diagnostics.ts +120 -0
- package/cli/src/commands/prompt-builders.ts +140 -0
- package/cli/src/commands/publish.ts +261 -0
- package/cli/src/commands/rewind.ts +130 -0
- package/cli/src/commands/router-utils.ts +80 -0
- package/cli/src/commands/router.ts +589 -0
- package/cli/src/commands/telemetry.ts +68 -0
- package/cli/src/commands/usage.ts +26 -0
- package/cli/src/components/__tests__/ad-banner.test.tsx +84 -0
- package/cli/src/components/__tests__/block-helpers.test.tsx +139 -0
- package/cli/src/components/__tests__/clickable.test.tsx +39 -0
- package/cli/src/components/__tests__/grid-layout.integration.test.tsx +365 -0
- package/cli/src/components/__tests__/grid-layout.test.tsx +1033 -0
- package/cli/src/components/__tests__/markdown-content.test.tsx +163 -0
- package/cli/src/components/__tests__/message-block.completion.test.tsx +104 -0
- package/cli/src/components/__tests__/message-block.streaming.test.tsx +78 -0
- package/cli/src/components/__tests__/message-with-agents.test.tsx +571 -0
- package/cli/src/components/__tests__/multiline-input.test.tsx +1129 -0
- package/cli/src/components/__tests__/selectable-list.test.ts +232 -0
- package/cli/src/components/__tests__/shimmer-text.test.tsx +32 -0
- package/cli/src/components/__tests__/status-indicator.test.tsx +184 -0
- package/cli/src/components/__tests__/user-error-banner.test.tsx +100 -0
- package/cli/src/components/ad-banner.tsx +351 -0
- package/cli/src/components/agent-checklist.tsx +385 -0
- package/cli/src/components/agent-mode-toggle.tsx +294 -0
- package/cli/src/components/ask-user/__tests__/multiple-choice-form.test.ts +432 -0
- package/cli/src/components/ask-user/__tests__/validation.test.ts +213 -0
- package/cli/src/components/ask-user/components/accordion-question.tsx +153 -0
- package/cli/src/components/ask-user/components/custom-answer-input.tsx +66 -0
- package/cli/src/components/ask-user/components/options-list.tsx +139 -0
- package/cli/src/components/ask-user/components/question-header.tsx +80 -0
- package/cli/src/components/ask-user/components/question-option.tsx +94 -0
- package/cli/src/components/ask-user/constants.ts +35 -0
- package/cli/src/components/ask-user/index.tsx +660 -0
- package/cli/src/components/ask-user/utils/validation.ts +85 -0
- package/cli/src/components/attachment-card.tsx +67 -0
- package/cli/src/components/blocks/agent-block-grid.tsx +58 -0
- package/cli/src/components/blocks/agent-branch-item.tsx +230 -0
- package/cli/src/components/blocks/agent-branch-wrapper.tsx +524 -0
- package/cli/src/components/blocks/agent-list-branch.tsx +77 -0
- package/cli/src/components/blocks/ask-user-branch.tsx +98 -0
- package/cli/src/components/blocks/block-helpers.tsx +257 -0
- package/cli/src/components/blocks/blocks-renderer.tsx +296 -0
- package/cli/src/components/blocks/content-with-markdown.tsx +34 -0
- package/cli/src/components/blocks/copy-button.tsx +106 -0
- package/cli/src/components/blocks/copyable-block.tsx +47 -0
- package/cli/src/components/blocks/image-block.tsx +128 -0
- package/cli/src/components/blocks/implementor-row.tsx +453 -0
- package/cli/src/components/blocks/markdown-content.tsx +360 -0
- package/cli/src/components/blocks/markdown-renderables.tsx +347 -0
- package/cli/src/components/blocks/single-block.tsx +210 -0
- package/cli/src/components/blocks/thinking-block.tsx +77 -0
- package/cli/src/components/blocks/tool-block-group.tsx +72 -0
- package/cli/src/components/blocks/tool-branch.tsx +196 -0
- package/cli/src/components/blocks/user-content-copy.tsx +171 -0
- package/cli/src/components/bottom-banner.tsx +145 -0
- package/cli/src/components/build-mode-buttons.tsx +110 -0
- package/cli/src/components/button.tsx +75 -0
- package/cli/src/components/chat-header.tsx +11 -0
- package/cli/src/components/chat-history-screen.tsx +417 -0
- package/cli/src/components/chat-input-bar.tsx +535 -0
- package/cli/src/components/chatgpt-connect-banner.tsx +234 -0
- package/cli/src/components/clickable.tsx +149 -0
- package/cli/src/components/collapse-button.tsx +36 -0
- package/cli/src/components/command-palette.tsx +166 -0
- package/cli/src/components/copy-button.tsx +219 -0
- package/cli/src/components/dialog.tsx +111 -0
- package/cli/src/components/elapsed-timer.tsx +56 -0
- package/cli/src/components/error-boundary.tsx +63 -0
- package/cli/src/components/feedback-container.tsx +206 -0
- package/cli/src/components/feedback-icon-button.tsx +89 -0
- package/cli/src/components/feedback-input-mode.tsx +352 -0
- package/cli/src/components/file-attachment-card.tsx +89 -0
- package/cli/src/components/grid-layout.tsx +83 -0
- package/cli/src/components/help-banner.tsx +136 -0
- package/cli/src/components/highlighted-text.tsx +52 -0
- package/cli/src/components/image-card.tsx +167 -0
- package/cli/src/components/image-thumbnail.tsx +112 -0
- package/cli/src/components/input-cursor.tsx +77 -0
- package/cli/src/components/input-mode-banner.tsx +70 -0
- package/cli/src/components/load-previous-button.tsx +48 -0
- package/cli/src/components/login-modal.tsx +450 -0
- package/cli/src/components/message-block.tsx +337 -0
- package/cli/src/components/message-footer.tsx +269 -0
- package/cli/src/components/message-with-agents.tsx +594 -0
- package/cli/src/components/mode-divider.tsx +43 -0
- package/cli/src/components/model-picker.tsx +371 -0
- package/cli/src/components/multiline-input.tsx +1276 -0
- package/cli/src/components/out-of-credits-banner.tsx +155 -0
- package/cli/src/components/pending-attachments-banner.tsx +125 -0
- package/cli/src/components/pending-bash-message.tsx +57 -0
- package/cli/src/components/progress-bar.tsx +81 -0
- package/cli/src/components/project-picker-screen.tsx +469 -0
- package/cli/src/components/provider-picker.tsx +139 -0
- package/cli/src/components/publish-confirmation.tsx +514 -0
- package/cli/src/components/publish-container.tsx +737 -0
- package/cli/src/components/raised-pill.tsx +89 -0
- package/cli/src/components/renderers/plan-box.tsx +70 -0
- package/cli/src/components/review-screen.tsx +114 -0
- package/cli/src/components/rewind-picker.tsx +276 -0
- package/cli/src/components/right-sidebar.tsx +296 -0
- package/cli/src/components/savant-free-active-session-summary.tsx +63 -0
- package/cli/src/components/savant-free-landing-screen.tsx +756 -0
- package/cli/src/components/savant-free-model-selector.tsx +815 -0
- package/cli/src/components/savant-free-referral-banner.tsx +423 -0
- package/cli/src/components/savant-free-superseded-screen.tsx +62 -0
- package/cli/src/components/savant-ui/animation/pulse.tsx +26 -0
- package/cli/src/components/savant-ui/animation/typewriter.tsx +40 -0
- package/cli/src/components/savant-ui/branding.tsx +59 -0
- package/cli/src/components/savant-ui/data-display/badge.tsx +52 -0
- package/cli/src/components/savant-ui/data-display/code-block.tsx +55 -0
- package/cli/src/components/savant-ui/data-display/key-value.tsx +34 -0
- package/cli/src/components/savant-ui/data-display/sparkline.tsx +42 -0
- package/cli/src/components/savant-ui/data-display/timeline.tsx +44 -0
- package/cli/src/components/savant-ui/data-display/tree-view.tsx +55 -0
- package/cli/src/components/savant-ui/echo/__tests__/sidebar-collapse.test.tsx +90 -0
- package/cli/src/components/savant-ui/echo/agent-stack.tsx +72 -0
- package/cli/src/components/savant-ui/echo/agent-status.tsx +66 -0
- package/cli/src/components/savant-ui/echo/fid-card.tsx +89 -0
- package/cli/src/components/savant-ui/echo/fid-list.tsx +68 -0
- package/cli/src/components/savant-ui/echo/loop-status-panel.tsx +64 -0
- package/cli/src/components/savant-ui/echo/perfection-loop.tsx +118 -0
- package/cli/src/components/savant-ui/echo/phase-indicator.tsx +68 -0
- package/cli/src/components/savant-ui/echo/phase-info.ts +72 -0
- package/cli/src/components/savant-ui/echo/token-meter.tsx +39 -0
- package/cli/src/components/savant-ui/feedback/alert.tsx +45 -0
- package/cli/src/components/savant-ui/feedback/cost-tracker.tsx +54 -0
- package/cli/src/components/savant-ui/feedback/progress-bar.tsx +71 -0
- package/cli/src/components/savant-ui/feedback/spinner.tsx +40 -0
- package/cli/src/components/savant-ui/icon-theme-keys.ts +67 -0
- package/cli/src/components/savant-ui/icon.tsx +53 -0
- package/cli/src/components/savant-ui/index.ts +75 -0
- package/cli/src/components/savant-ui/input/select.tsx +26 -0
- package/cli/src/components/savant-ui/input/toggle.tsx +28 -0
- package/cli/src/components/savant-ui/layout/grid.tsx +52 -0
- package/cli/src/components/savant-ui/layout/header.tsx +28 -0
- package/cli/src/components/savant-ui/navigation/stepper.tsx +41 -0
- package/cli/src/components/savant-ui/primitives/key-hint.tsx +45 -0
- package/cli/src/components/savant-ui/primitives/key-value-row.tsx +41 -0
- package/cli/src/components/savant-ui/primitives/panel.tsx +42 -0
- package/cli/src/components/savant-ui/primitives/separator.tsx +34 -0
- package/cli/src/components/savant-ui/primitives/sidebar-section.tsx +64 -0
- package/cli/src/components/savant-ui/primitives/spacer.tsx +13 -0
- package/cli/src/components/savant-ui/primitives/stack.tsx +35 -0
- package/cli/src/components/savant-ui/theme.ts +45 -0
- package/cli/src/components/scroll-to-bottom-button.tsx +34 -0
- package/cli/src/components/segmented-control.tsx +199 -0
- package/cli/src/components/selectable-list.tsx +249 -0
- package/cli/src/components/selected-chips.tsx +86 -0
- package/cli/src/components/separator.tsx +40 -0
- package/cli/src/components/session-ended-banner.tsx +183 -0
- package/cli/src/components/shimmer-text.tsx +254 -0
- package/cli/src/components/status-bar.tsx +279 -0
- package/cli/src/components/subscription-limit-banner.tsx +269 -0
- package/cli/src/components/suggested-prompts.tsx +184 -0
- package/cli/src/components/suggestion-menu.tsx +219 -0
- package/cli/src/components/terminal-command-display.tsx +152 -0
- package/cli/src/components/terminal-link.tsx +97 -0
- package/cli/src/components/text-attachment-card.tsx +77 -0
- package/cli/src/components/thinking.tsx +108 -0
- package/cli/src/components/toast.tsx +109 -0
- package/cli/src/components/tools/__tests__/apply-patch.test.tsx +97 -0
- package/cli/src/components/tools/__tests__/code-search.test.tsx +45 -0
- package/cli/src/components/tools/__tests__/gravity-index.test.ts +76 -0
- package/cli/src/components/tools/__tests__/render-ui.test.tsx +556 -0
- package/cli/src/components/tools/__tests__/run-terminal-command.test.ts +274 -0
- package/cli/src/components/tools/__tests__/tool-call-item.test.tsx +73 -0
- package/cli/src/components/tools/apply-patch.tsx +101 -0
- package/cli/src/components/tools/code-search.tsx +50 -0
- package/cli/src/components/tools/composio.tsx +140 -0
- package/cli/src/components/tools/diff-viewer.tsx +21 -0
- package/cli/src/components/tools/glob.tsx +66 -0
- package/cli/src/components/tools/gravity-index.tsx +80 -0
- package/cli/src/components/tools/list-directory.tsx +66 -0
- package/cli/src/components/tools/read-docs.tsx +36 -0
- package/cli/src/components/tools/read-files.tsx +97 -0
- package/cli/src/components/tools/read-subtree.tsx +40 -0
- package/cli/src/components/tools/read-url.tsx +32 -0
- package/cli/src/components/tools/registry.ts +131 -0
- package/cli/src/components/tools/render-ui.tsx +466 -0
- package/cli/src/components/tools/run-terminal-command.tsx +86 -0
- package/cli/src/components/tools/skill.tsx +26 -0
- package/cli/src/components/tools/str-replace.tsx +77 -0
- package/cli/src/components/tools/suggest-followups.tsx +373 -0
- package/cli/src/components/tools/task-completed.tsx +16 -0
- package/cli/src/components/tools/tool-call-item.tsx +163 -0
- package/cli/src/components/tools/types.ts +100 -0
- package/cli/src/components/tools/web-search.tsx +32 -0
- package/cli/src/components/tools/write-file.tsx +20 -0
- package/cli/src/components/tools/write-todos.tsx +105 -0
- package/cli/src/components/top-banner.tsx +187 -0
- package/cli/src/components/usage-banner.tsx +296 -0
- package/cli/src/components/user-error-banner.tsx +54 -0
- package/cli/src/components/validation-error-popover.tsx +191 -0
- package/cli/src/data/slash-commands.ts +306 -0
- package/cli/src/hooks/__tests__/holds-live-savant-free-slot.test.ts +49 -0
- package/cli/src/hooks/__tests__/run-outcome.test.ts +178 -0
- package/cli/src/hooks/__tests__/session-fetch-signal.test.ts +45 -0
- package/cli/src/hooks/__tests__/use-activity-query.test.ts +810 -0
- package/cli/src/hooks/__tests__/use-ask-user-bridge.test.ts +175 -0
- package/cli/src/hooks/__tests__/use-auth-query.test.ts +21 -0
- package/cli/src/hooks/__tests__/use-chat-messages-collapse.test.ts +96 -0
- package/cli/src/hooks/__tests__/use-connection-status.test.ts +112 -0
- package/cli/src/hooks/__tests__/use-directory-browser.test.ts +215 -0
- package/cli/src/hooks/__tests__/use-gravity-ad.test.ts +73 -0
- package/cli/src/hooks/__tests__/use-grid-layout.test.ts +346 -0
- package/cli/src/hooks/__tests__/use-input-history.test.ts +704 -0
- package/cli/src/hooks/__tests__/use-loop-scheduler.test.ts +247 -0
- package/cli/src/hooks/__tests__/use-path-tab-completion.test.ts +324 -0
- package/cli/src/hooks/__tests__/use-queue-controls.test.ts +68 -0
- package/cli/src/hooks/__tests__/use-searchable-list.test.ts +364 -0
- package/cli/src/hooks/__tests__/use-send-message-timer.test.ts +146 -0
- package/cli/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +364 -0
- package/cli/src/hooks/__tests__/use-suggestion-engine.test.ts +485 -0
- package/cli/src/hooks/__tests__/use-terminal-focus.test.ts +66 -0
- package/cli/src/hooks/__tests__/use-terminal-layout.test.ts +675 -0
- package/cli/src/hooks/__tests__/use-timeout.test.ts +330 -0
- package/cli/src/hooks/__tests__/use-usage-query.test.ts +526 -0
- package/cli/src/hooks/__tests__/use-user-details-query.test.ts +225 -0
- package/cli/src/hooks/helpers/__tests__/send-message.test.ts +1851 -0
- package/cli/src/hooks/helpers/send-message.ts +553 -0
- package/cli/src/hooks/run-outcome.ts +64 -0
- package/cli/src/hooks/stream-state.ts +106 -0
- package/cli/src/hooks/use-activity-query.ts +696 -0
- package/cli/src/hooks/use-agent-validation.ts +80 -0
- package/cli/src/hooks/use-ask-user-bridge.ts +102 -0
- package/cli/src/hooks/use-auth-query.ts +261 -0
- package/cli/src/hooks/use-auth-state.ts +155 -0
- package/cli/src/hooks/use-chat-input.ts +87 -0
- package/cli/src/hooks/use-chat-keyboard.ts +325 -0
- package/cli/src/hooks/use-chat-messages.ts +273 -0
- package/cli/src/hooks/use-chat-state.ts +219 -0
- package/cli/src/hooks/use-chat-streaming.ts +270 -0
- package/cli/src/hooks/use-chat-ui.ts +136 -0
- package/cli/src/hooks/use-clipboard.ts +154 -0
- package/cli/src/hooks/use-connection-status.ts +156 -0
- package/cli/src/hooks/use-directory-browser.ts +88 -0
- package/cli/src/hooks/use-elapsed-time.ts +116 -0
- package/cli/src/hooks/use-event.ts +36 -0
- package/cli/src/hooks/use-exit-handler.ts +108 -0
- package/cli/src/hooks/use-fetch-login-url.ts +65 -0
- package/cli/src/hooks/use-fids.ts +48 -0
- package/cli/src/hooks/use-fingerprint.ts +64 -0
- package/cli/src/hooks/use-gravity-ad.ts +688 -0
- package/cli/src/hooks/use-grid-layout.ts +78 -0
- package/cli/src/hooks/use-input-history.ts +173 -0
- package/cli/src/hooks/use-login-keyboard-handlers.ts +74 -0
- package/cli/src/hooks/use-login-polling.ts +120 -0
- package/cli/src/hooks/use-logo.tsx +178 -0
- package/cli/src/hooks/use-loop-scheduler.ts +481 -0
- package/cli/src/hooks/use-message-queue.ts +301 -0
- package/cli/src/hooks/use-now.ts +20 -0
- package/cli/src/hooks/use-path-tab-completion.ts +88 -0
- package/cli/src/hooks/use-publish-mutation.ts +60 -0
- package/cli/src/hooks/use-queue-controls.ts +70 -0
- package/cli/src/hooks/use-queue-ui.ts +55 -0
- package/cli/src/hooks/use-savant-free-ctrl-c-exit.ts +23 -0
- package/cli/src/hooks/use-savant-free-session-progress.ts +34 -0
- package/cli/src/hooks/use-savant-free-session.ts +679 -0
- package/cli/src/hooks/use-savant-free-streak-query.ts +72 -0
- package/cli/src/hooks/use-scaffold-confirm.ts +62 -0
- package/cli/src/hooks/use-scaffold-revert-subscriber.ts +66 -0
- package/cli/src/hooks/use-scroll-management.ts +182 -0
- package/cli/src/hooks/use-searchable-list.ts +99 -0
- package/cli/src/hooks/use-send-message.ts +1038 -0
- package/cli/src/hooks/use-sheen-animation.tsx +88 -0
- package/cli/src/hooks/use-subscription-query.ts +106 -0
- package/cli/src/hooks/use-suggestion-engine.ts +793 -0
- package/cli/src/hooks/use-terminal-breakpoints.ts +77 -0
- package/cli/src/hooks/use-terminal-dimensions.ts +50 -0
- package/cli/src/hooks/use-terminal-focus.ts +146 -0
- package/cli/src/hooks/use-terminal-layout.ts +189 -0
- package/cli/src/hooks/use-theme.tsx +140 -0
- package/cli/src/hooks/use-timeout.ts +88 -0
- package/cli/src/hooks/use-toast.ts +114 -0
- package/cli/src/hooks/use-update-preference.ts +77 -0
- package/cli/src/hooks/use-usage-monitor.ts +59 -0
- package/cli/src/hooks/use-usage-query.ts +138 -0
- package/cli/src/hooks/use-user-details-query.ts +104 -0
- package/cli/src/hooks/use-why-did-you-update.ts +178 -0
- package/cli/src/index.tsx +484 -0
- package/cli/src/init/__tests__/init-direnv.test.ts +597 -0
- package/cli/src/init/init-app.ts +54 -0
- package/cli/src/init/init-direnv.ts +133 -0
- package/cli/src/login/constants.ts +71 -0
- package/cli/src/login/login-flow.ts +224 -0
- package/cli/src/login/plain-login.ts +107 -0
- package/cli/src/login/utils.ts +183 -0
- package/cli/src/native/ripgrep.ts +82 -0
- package/cli/src/polyfills/bun-strip-ansi.ts +12 -0
- package/cli/src/pre-init/load-dev-env.ts +98 -0
- package/cli/src/pre-init/tree-sitter-wasm.ts +98 -0
- package/cli/src/project-files.ts +102 -0
- package/cli/src/state/__tests__/chat-store-focus.test.ts +22 -0
- package/cli/src/state/__tests__/feedback-store.test.ts +260 -0
- package/cli/src/state/chat-history-store.ts +27 -0
- package/cli/src/state/chat-store.ts +791 -0
- package/cli/src/state/feedback-store.ts +162 -0
- package/cli/src/state/gateway-catalog-store.ts +45 -0
- package/cli/src/state/login-store.ts +150 -0
- package/cli/src/state/message-block-store.ts +143 -0
- package/cli/src/state/model-picker-store.ts +67 -0
- package/cli/src/state/provider-picker-store.ts +53 -0
- package/cli/src/state/publish-store.ts +141 -0
- package/cli/src/state/review-store.ts +24 -0
- package/cli/src/state/rewind-picker-store.ts +74 -0
- package/cli/src/state/savant-free-model-store.ts +59 -0
- package/cli/src/state/savant-free-session-store.ts +32 -0
- package/cli/src/test-setup.ts +20 -0
- package/cli/src/testing/env.ts +46 -0
- package/cli/src/types/chat-state.ts +15 -0
- package/cli/src/types/chat.ts +242 -0
- package/cli/src/types/contracts/send-message.ts +16 -0
- package/cli/src/types/env.ts +107 -0
- package/cli/src/types/function-params.ts +35 -0
- package/cli/src/types/opentui-augmentation.d.ts +11 -0
- package/cli/src/types/react19-compat.d.ts +19 -0
- package/cli/src/types/savant-free-session.ts +17 -0
- package/cli/src/types/store.ts +112 -0
- package/cli/src/types/theme-system.ts +194 -0
- package/cli/src/types/utils.ts +3 -0
- package/cli/src/utils/__tests__/activity-tracker.test.ts +440 -0
- package/cli/src/utils/__tests__/agent-display.test.ts +139 -0
- package/cli/src/utils/__tests__/analytics-client.test.ts +311 -0
- package/cli/src/utils/__tests__/anonymous-id.test.ts +74 -0
- package/cli/src/utils/__tests__/arrays.test.ts +264 -0
- package/cli/src/utils/__tests__/bash-context-processor.test.ts +38 -0
- package/cli/src/utils/__tests__/block-processor.test.ts +690 -0
- package/cli/src/utils/__tests__/chat-history.test.ts +247 -0
- package/cli/src/utils/__tests__/chat-input-key-intercept.test.ts +40 -0
- package/cli/src/utils/__tests__/chat-layout.test.ts +32 -0
- package/cli/src/utils/__tests__/chat-meta.test.ts +160 -0
- package/cli/src/utils/__tests__/chatgpt-oauth.test.ts +50 -0
- package/cli/src/utils/__tests__/clipboard.test.ts +998 -0
- package/cli/src/utils/__tests__/code-search-summary.test.ts +84 -0
- package/cli/src/utils/__tests__/collapse-helpers.test.ts +1272 -0
- package/cli/src/utils/__tests__/error-handling.test.ts +611 -0
- package/cli/src/utils/__tests__/feedback-helpers.test.ts +452 -0
- package/cli/src/utils/__tests__/feedback-submission.test.ts +26 -0
- package/cli/src/utils/__tests__/fetch-usage.test.ts +355 -0
- package/cli/src/utils/__tests__/fingerprint.test.ts +147 -0
- package/cli/src/utils/__tests__/format-elapsed-time.test.ts +103 -0
- package/cli/src/utils/__tests__/format-timeout.test.ts +87 -0
- package/cli/src/utils/__tests__/image-dimensions.test.ts +243 -0
- package/cli/src/utils/__tests__/image-processor.test.ts +250 -0
- package/cli/src/utils/__tests__/implementor-helpers.test.ts +1457 -0
- package/cli/src/utils/__tests__/keyboard-actions.test.ts +686 -0
- package/cli/src/utils/__tests__/layout-helpers.test.ts +36 -0
- package/cli/src/utils/__tests__/lazy-response-ads.test.ts +167 -0
- package/cli/src/utils/__tests__/logger-sanitize-secrets.test.ts +80 -0
- package/cli/src/utils/__tests__/markdown-renderer.test.tsx +518 -0
- package/cli/src/utils/__tests__/markdown-streaming.test.ts +64 -0
- package/cli/src/utils/__tests__/message-block-helpers.test.ts +1197 -0
- package/cli/src/utils/__tests__/message-updater.test.ts +659 -0
- package/cli/src/utils/__tests__/ollama-onboarding.test.ts +239 -0
- package/cli/src/utils/__tests__/openrouter-models.test.ts +295 -0
- package/cli/src/utils/__tests__/osc-timeout-scenarios.test.ts +172 -0
- package/cli/src/utils/__tests__/pending-attachments.test.ts +278 -0
- package/cli/src/utils/__tests__/provider-setup.test.ts +183 -0
- package/cli/src/utils/__tests__/run-state-storage.test.ts +741 -0
- package/cli/src/utils/__tests__/savant-code-api.test.ts +634 -0
- package/cli/src/utils/__tests__/savant-free-instance-owner.test.ts +69 -0
- package/cli/src/utils/__tests__/savant-free-model-navigation.test.ts +104 -0
- package/cli/src/utils/__tests__/savant-free-premium-reset.test.ts +81 -0
- package/cli/src/utils/__tests__/savant-free-referral-cache.test.ts +67 -0
- package/cli/src/utils/__tests__/savant-free-session-display.test.ts +23 -0
- package/cli/src/utils/__tests__/savant-free-streak-line.test.ts +76 -0
- package/cli/src/utils/__tests__/sdk-event-handlers.test.ts +615 -0
- package/cli/src/utils/__tests__/send-message-helpers.test.ts +1875 -0
- package/cli/src/utils/__tests__/send-message-timer.test.ts +68 -0
- package/cli/src/utils/__tests__/settings.test.ts +138 -0
- package/cli/src/utils/__tests__/strings.test.ts +210 -0
- package/cli/src/utils/__tests__/syntax-theme.test.ts +91 -0
- package/cli/src/utils/__tests__/terminal-color-detection.test.ts +425 -0
- package/cli/src/utils/__tests__/terminal-enter-detection.test.ts +77 -0
- package/cli/src/utils/__tests__/text-layout.test.ts +82 -0
- package/cli/src/utils/__tests__/think-tag-parser.test.ts +159 -0
- package/cli/src/utils/__tests__/trace-writer.test.ts +193 -0
- package/cli/src/utils/__tests__/trim-chat-logs.test.ts +79 -0
- package/cli/src/utils/__tests__/usage-banner-state.test.ts +298 -0
- package/cli/src/utils/__tests__/validation-error-formatting.test.ts +126 -0
- package/cli/src/utils/__tests__/write-file-atomic.test.ts +130 -0
- package/cli/src/utils/active-run.ts +22 -0
- package/cli/src/utils/activity-tracker.ts +66 -0
- package/cli/src/utils/agent-display.ts +87 -0
- package/cli/src/utils/agent-helpers.ts +47 -0
- package/cli/src/utils/ai-message-id.ts +12 -0
- package/cli/src/utils/analytics.ts +407 -0
- package/cli/src/utils/anonymous-id.ts +87 -0
- package/cli/src/utils/arrays.ts +117 -0
- package/cli/src/utils/auth.ts +258 -0
- package/cli/src/utils/bash-context-processor.ts +47 -0
- package/cli/src/utils/bash-messages.ts +108 -0
- package/cli/src/utils/block-margins.ts +35 -0
- package/cli/src/utils/block-operations.ts +548 -0
- package/cli/src/utils/block-processor.ts +212 -0
- package/cli/src/utils/chat-history.ts +265 -0
- package/cli/src/utils/chat-input-key-intercept.ts +52 -0
- package/cli/src/utils/chat-layout.ts +44 -0
- package/cli/src/utils/chat-meta.ts +101 -0
- package/cli/src/utils/chat-scroll-accel.ts +151 -0
- package/cli/src/utils/chatgpt-oauth.ts +350 -0
- package/cli/src/utils/clipboard-image.ts +610 -0
- package/cli/src/utils/clipboard.ts +307 -0
- package/cli/src/utils/code-search-summary.ts +69 -0
- package/cli/src/utils/collapse-helpers.ts +265 -0
- package/cli/src/utils/config-dir.ts +30 -0
- package/cli/src/utils/constants.ts +159 -0
- package/cli/src/utils/create-event-handler-state.ts +79 -0
- package/cli/src/utils/create-run-config.ts +160 -0
- package/cli/src/utils/db-storage.ts +254 -0
- package/cli/src/utils/detect-shell.ts +112 -0
- package/cli/src/utils/directory-browser.ts +74 -0
- package/cli/src/utils/engagement.ts +55 -0
- package/cli/src/utils/env.ts +109 -0
- package/cli/src/utils/error-handling.ts +246 -0
- package/cli/src/utils/error-messages.ts +84 -0
- package/cli/src/utils/feedback-helpers.ts +115 -0
- package/cli/src/utils/feedback-submission.ts +24 -0
- package/cli/src/utils/fetch-usage.ts +75 -0
- package/cli/src/utils/fid-loader.ts +135 -0
- package/cli/src/utils/fingerprint.ts +263 -0
- package/cli/src/utils/finish-logic.ts +154 -0
- package/cli/src/utils/format-elapsed-time.ts +33 -0
- package/cli/src/utils/format-session-units.ts +6 -0
- package/cli/src/utils/format-timeout.ts +28 -0
- package/cli/src/utils/format-validation-errors-for-message.ts +85 -0
- package/cli/src/utils/git.ts +17 -0
- package/cli/src/utils/glyphs.ts +188 -0
- package/cli/src/utils/helpers.ts +47 -0
- package/cli/src/utils/image-display.ts +73 -0
- package/cli/src/utils/image-handler.ts +336 -0
- package/cli/src/utils/image-processor.ts +133 -0
- package/cli/src/utils/image-thumbnail.ts +83 -0
- package/cli/src/utils/implementor-helpers.ts +817 -0
- package/cli/src/utils/input-modes.ts +196 -0
- package/cli/src/utils/keyboard-actions.ts +394 -0
- package/cli/src/utils/keypad-keys.ts +47 -0
- package/cli/src/utils/layout-helpers.ts +36 -0
- package/cli/src/utils/lazy-response-ads.ts +1 -0
- package/cli/src/utils/loading-phrases.ts +68 -0
- package/cli/src/utils/local-agent-registry.ts +611 -0
- package/cli/src/utils/log-shipper.ts +116 -0
- package/cli/src/utils/logger.ts +435 -0
- package/cli/src/utils/markdown-renderer.tsx +1315 -0
- package/cli/src/utils/math.ts +3 -0
- package/cli/src/utils/message-block-helpers.ts +667 -0
- package/cli/src/utils/message-history.ts +153 -0
- package/cli/src/utils/message-tree-utils.ts +67 -0
- package/cli/src/utils/message-updater.ts +279 -0
- package/cli/src/utils/ollama-onboarding.ts +215 -0
- package/cli/src/utils/open-file.ts +144 -0
- package/cli/src/utils/open-url.ts +63 -0
- package/cli/src/utils/openrouter-models.ts +945 -0
- package/cli/src/utils/path-completion.ts +111 -0
- package/cli/src/utils/path-helpers.ts +38 -0
- package/cli/src/utils/pending-attachments.ts +363 -0
- package/cli/src/utils/post-processing.ts +99 -0
- package/cli/src/utils/project-picker.ts +12 -0
- package/cli/src/utils/provider-setup.ts +259 -0
- package/cli/src/utils/recent-projects.ts +156 -0
- package/cli/src/utils/renderer-cleanup.ts +142 -0
- package/cli/src/utils/response-ad-positions.ts +1 -0
- package/cli/src/utils/rewind.ts +175 -0
- package/cli/src/utils/run-state-storage.ts +480 -0
- package/cli/src/utils/savant-code-api.ts +686 -0
- package/cli/src/utils/savant-code-client.ts +217 -0
- package/cli/src/utils/savant-free-agent-selection.ts +12 -0
- package/cli/src/utils/savant-free-exit.ts +24 -0
- package/cli/src/utils/savant-free-instance-owner.ts +66 -0
- package/cli/src/utils/savant-free-model-navigation.ts +46 -0
- package/cli/src/utils/savant-free-premium-reset.ts +52 -0
- package/cli/src/utils/savant-free-referral-cache.ts +35 -0
- package/cli/src/utils/savant-free-session-display.ts +21 -0
- package/cli/src/utils/savant-free-streak-line.ts +67 -0
- package/cli/src/utils/sdk-event-handlers.ts +587 -0
- package/cli/src/utils/send-message-helpers.ts +199 -0
- package/cli/src/utils/send-message-timer.ts +110 -0
- package/cli/src/utils/settings.ts +388 -0
- package/cli/src/utils/skill-registry.ts +100 -0
- package/cli/src/utils/spawn-agent-matcher.ts +56 -0
- package/cli/src/utils/status-indicator-state.ts +100 -0
- package/cli/src/utils/stream-chunk-processor.ts +65 -0
- package/cli/src/utils/strings.ts +272 -0
- package/cli/src/utils/subscription.ts +31 -0
- package/cli/src/utils/syntax-highlighter.tsx +19 -0
- package/cli/src/utils/syntax-theme.ts +131 -0
- package/cli/src/utils/terminal-color-detection.ts +472 -0
- package/cli/src/utils/terminal-enter-detection.ts +63 -0
- package/cli/src/utils/terminal-images.ts +223 -0
- package/cli/src/utils/terminal-reset-sequences.ts +33 -0
- package/cli/src/utils/terminal-title.ts +113 -0
- package/cli/src/utils/terminal-watchdog.ts +246 -0
- package/cli/src/utils/text-layout.ts +153 -0
- package/cli/src/utils/theme-config.ts +143 -0
- package/cli/src/utils/theme-system.ts +1265 -0
- package/cli/src/utils/think-tag-parser.ts +105 -0
- package/cli/src/utils/trace-writer.ts +147 -0
- package/cli/src/utils/ui-constants.ts +69 -0
- package/cli/src/utils/usage-banner-state.ts +146 -0
- package/cli/src/utils/validation-error-formatting.ts +92 -0
- package/cli/src/utils/validation-error-helpers.ts +19 -0
- package/cli/src/utils/version.ts +23 -0
- package/cli/src/utils/word-wrap-utils.ts +53 -0
- package/cli/src/utils/write-file-atomic.ts +82 -0
- package/cli/src/utils/yield-to-event-loop.ts +9 -0
- package/cli/tsconfig.json +26 -0
- package/coding-standards/csharp.md +77 -0
- package/coding-standards/go.md +71 -0
- package/coding-standards/java.md +74 -0
- package/coding-standards/python.md +82 -0
- package/coding-standards/rust.md +78 -0
- package/coding-standards/typescript.md +85 -0
- package/coding-standards/x402.md +227 -0
- package/common/README.md +41 -0
- package/common/common_exit +1 -0
- package/common/package.json +45 -0
- package/common/src/__tests__/agent-validation.test.ts +861 -0
- package/common/src/__tests__/agents.test.ts +16 -0
- package/common/src/__tests__/dynamic-agent-template-schema.test.ts +420 -0
- package/common/src/__tests__/env-ci.test.ts +167 -0
- package/common/src/__tests__/env-process.test.ts +145 -0
- package/common/src/__tests__/free-agents.test.ts +269 -0
- package/common/src/__tests__/handlesteps-parsing.test.ts +247 -0
- package/common/src/__tests__/model-config.test.ts +41 -0
- package/common/src/__tests__/project-file-tree.test.ts +82 -0
- package/common/src/__tests__/response-ad-positions.test.ts +78 -0
- package/common/src/__tests__/savant-free-models.test.ts +460 -0
- package/common/src/__tests__/savant-free-referral-tiers.test.ts +122 -0
- package/common/src/__tests__/user-state.test.ts +30 -0
- package/common/src/actions.ts +215 -0
- package/common/src/analytics-core.ts +73 -0
- package/common/src/analytics.ts +96 -0
- package/common/src/api-keys/constants.ts +26 -0
- package/common/src/browser-actions.ts +414 -0
- package/common/src/constants/agents.ts +250 -0
- package/common/src/constants/analytics-events.ts +318 -0
- package/common/src/constants/anthropic.ts +72 -0
- package/common/src/constants/byok.ts +2 -0
- package/common/src/constants/chatgpt-oauth.ts +85 -0
- package/common/src/constants/composio.ts +34 -0
- package/common/src/constants/feedback.ts +18 -0
- package/common/src/constants/free-agents.ts +347 -0
- package/common/src/constants/gemini.ts +6 -0
- package/common/src/constants/grant-priorities.ts +13 -0
- package/common/src/constants/hosts.ts +6 -0
- package/common/src/constants/images.ts +53 -0
- package/common/src/constants/index.ts +8 -0
- package/common/src/constants/knowledge.ts +46 -0
- package/common/src/constants/limits.ts +23 -0
- package/common/src/constants/model-config.ts +469 -0
- package/common/src/constants/paths.ts +69 -0
- package/common/src/constants/savant-code-config.ts +12 -0
- package/common/src/constants/savant-free-gemini-thinker.ts +30 -0
- package/common/src/constants/savant-free-models.ts +855 -0
- package/common/src/constants/savant-free-referral-tiers.ts +169 -0
- package/common/src/constants/skills.ts +60 -0
- package/common/src/constants/subscription-plans.ts +54 -0
- package/common/src/constants/ui.ts +25 -0
- package/common/src/env-ci.ts +36 -0
- package/common/src/env-process.ts +95 -0
- package/common/src/env-schema.ts +42 -0
- package/common/src/env.ts +69 -0
- package/common/src/mcp/client.ts +308 -0
- package/common/src/old-constants.ts +10 -0
- package/common/src/project-file-tree.ts +361 -0
- package/common/src/reddit-capi.ts +175 -0
- package/common/src/schemas/feedback.ts +57 -0
- package/common/src/schemas/logs.ts +66 -0
- package/common/src/templates/agent-validation.ts +436 -0
- package/common/src/templates/initial-agents-dir/LICENSE +202 -0
- package/common/src/templates/initial-agents-dir/README.md +314 -0
- package/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +17 -0
- package/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +78 -0
- package/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +76 -0
- package/common/src/templates/initial-agents-dir/my-custom-agent.ts +40 -0
- package/common/src/templates/initial-agents-dir/package.json +6 -0
- package/common/src/templates/initial-agents-dir/skills/README.md +66 -0
- package/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +29 -0
- package/common/src/templates/initial-agents-dir/types/agent-definition.ts +484 -0
- package/common/src/templates/initial-agents-dir/types/tools.ts +452 -0
- package/common/src/templates/initial-agents-dir/types/util-types.ts +167 -0
- package/common/src/testing/TESTING_PATTERNS.md +353 -0
- package/common/src/testing/errors.ts +33 -0
- package/common/src/testing/fixtures/agent-runtime.ts +325 -0
- package/common/src/testing/impl/agent-runtime.ts +6 -0
- package/common/src/testing/index.ts +84 -0
- package/common/src/testing/mock-modules.ts +54 -0
- package/common/src/testing/mock-types.ts +123 -0
- package/common/src/testing/mocks/analytics.ts +262 -0
- package/common/src/testing/mocks/child-process.ts +93 -0
- package/common/src/testing/mocks/crypto.ts +218 -0
- package/common/src/testing/mocks/database.ts +337 -0
- package/common/src/testing/mocks/filesystem.ts +166 -0
- package/common/src/testing/mocks/index.ts +83 -0
- package/common/src/testing/mocks/logger.ts +136 -0
- package/common/src/testing/mocks/stream.ts +314 -0
- package/common/src/testing/mocks/timers.ts +132 -0
- package/common/src/testing/mocks/tree-sitter.ts +127 -0
- package/common/src/testing/setup.ts +282 -0
- package/common/src/testing-env-ci.ts +15 -0
- package/common/src/testing-env-process.ts +78 -0
- package/common/src/tools/__tests__/compile-tool-definitions.test.ts +34 -0
- package/common/src/tools/__tests__/thought-session.test.ts +256 -0
- package/common/src/tools/compile-tool-definitions.ts +194 -0
- package/common/src/tools/constants.ts +132 -0
- package/common/src/tools/list.ts +193 -0
- package/common/src/tools/params/__tests__/coerce-to-array.test.ts +237 -0
- package/common/src/tools/params/__tests__/sequential-thinking-coercion.test.ts +98 -0
- package/common/src/tools/params/tool/add-message.ts +36 -0
- package/common/src/tools/params/tool/add-subgoal.ts +57 -0
- package/common/src/tools/params/tool/apply-patch.ts +110 -0
- package/common/src/tools/params/tool/ask-user.ts +181 -0
- package/common/src/tools/params/tool/browser-logs.ts +85 -0
- package/common/src/tools/params/tool/code-search.ts +144 -0
- package/common/src/tools/params/tool/composio.ts +131 -0
- package/common/src/tools/params/tool/create-plan.ts +80 -0
- package/common/src/tools/params/tool/end-turn.ts +54 -0
- package/common/src/tools/params/tool/find-files.ts +60 -0
- package/common/src/tools/params/tool/glob.ts +74 -0
- package/common/src/tools/params/tool/gravity-index.ts +92 -0
- package/common/src/tools/params/tool/list-directory.ts +58 -0
- package/common/src/tools/params/tool/lookup-agent-info.ts +37 -0
- package/common/src/tools/params/tool/propose-str-replace.ts +103 -0
- package/common/src/tools/params/tool/propose-write-file.ts +71 -0
- package/common/src/tools/params/tool/read-docs.ts +85 -0
- package/common/src/tools/params/tool/read-files.ts +61 -0
- package/common/src/tools/params/tool/read-subtree.ts +83 -0
- package/common/src/tools/params/tool/read-url.ts +81 -0
- package/common/src/tools/params/tool/render-ui.ts +203 -0
- package/common/src/tools/params/tool/run-file-change-hooks.ts +57 -0
- package/common/src/tools/params/tool/run-readonly-command.ts +76 -0
- package/common/src/tools/params/tool/run-terminal-command.ts +185 -0
- package/common/src/tools/params/tool/sequential-thinking.ts +110 -0
- package/common/src/tools/params/tool/set-messages.ts +42 -0
- package/common/src/tools/params/tool/set-output.ts +62 -0
- package/common/src/tools/params/tool/set-scaffold-complete.ts +51 -0
- package/common/src/tools/params/tool/skill.ts +56 -0
- package/common/src/tools/params/tool/spawn-agent-inline.ts +57 -0
- package/common/src/tools/params/tool/spawn-agents.ts +154 -0
- package/common/src/tools/params/tool/str-replace.ts +107 -0
- package/common/src/tools/params/tool/suggest-followups.ts +94 -0
- package/common/src/tools/params/tool/task-completed.ts +58 -0
- package/common/src/tools/params/tool/think-deeply.ts +53 -0
- package/common/src/tools/params/tool/transition-phase.ts +57 -0
- package/common/src/tools/params/tool/update-subgoal.ts +89 -0
- package/common/src/tools/params/tool/web-search.ts +73 -0
- package/common/src/tools/params/tool/write-file.ts +71 -0
- package/common/src/tools/params/tool/write-todos.ts +67 -0
- package/common/src/tools/params/utils.ts +152 -0
- package/common/src/tools/safety-registry.ts +274 -0
- package/common/src/tools/safety.ts +42 -0
- package/common/src/tools/sequential-thinking.ts +340 -0
- package/common/src/tools/utils.ts +25 -0
- package/common/src/types/__tests__/dynamic-agent-template.test.ts +20 -0
- package/common/src/types/agent-template.ts +223 -0
- package/common/src/types/api/agents/publish.ts +63 -0
- package/common/src/types/contracts/agent-runtime.ts +84 -0
- package/common/src/types/contracts/analytics.ts +12 -0
- package/common/src/types/contracts/bigquery.ts +55 -0
- package/common/src/types/contracts/billing.ts +46 -0
- package/common/src/types/contracts/client.ts +52 -0
- package/common/src/types/contracts/database.ts +104 -0
- package/common/src/types/contracts/env.ts +203 -0
- package/common/src/types/contracts/llm.ts +183 -0
- package/common/src/types/contracts/logger.ts +29 -0
- package/common/src/types/contracts/logs.ts +34 -0
- package/common/src/types/contracts/trace.ts +21 -0
- package/common/src/types/dynamic-agent-template.ts +290 -0
- package/common/src/types/filesystem.ts +10 -0
- package/common/src/types/function-params.ts +35 -0
- package/common/src/types/grant.ts +20 -0
- package/common/src/types/gravity-index.ts +170 -0
- package/common/src/types/json.ts +26 -0
- package/common/src/types/mcp.ts +26 -0
- package/common/src/types/messages/content-part.ts +59 -0
- package/common/src/types/messages/data-content.ts +14 -0
- package/common/src/types/messages/provider-metadata.ts +10 -0
- package/common/src/types/messages/savant-code-message.ts +55 -0
- package/common/src/types/organization.ts +118 -0
- package/common/src/types/print-mode.ts +167 -0
- package/common/src/types/publisher.ts +67 -0
- package/common/src/types/savant-free-session.ts +295 -0
- package/common/src/types/savant-free-streak.ts +6 -0
- package/common/src/types/session-state.ts +237 -0
- package/common/src/types/skill.ts +56 -0
- package/common/src/types/source.ts +11 -0
- package/common/src/types/spawn.ts +13 -0
- package/common/src/types/subscription.ts +68 -0
- package/common/src/types/usage.ts +16 -0
- package/common/src/types/util.ts +3 -0
- package/common/src/util/__tests__/analytics-dispatcher.test.ts +145 -0
- package/common/src/util/__tests__/analytics-log.test.ts +110 -0
- package/common/src/util/__tests__/analytics-sampling.test.ts +131 -0
- package/common/src/util/__tests__/axiom-only-log.test.ts +64 -0
- package/common/src/util/__tests__/engagement-tracker.test.ts +115 -0
- package/common/src/util/__tests__/error-abort.test.ts +822 -0
- package/common/src/util/__tests__/error-api-details.test.ts +190 -0
- package/common/src/util/__tests__/format-code-search.test.ts +60 -0
- package/common/src/util/__tests__/log-mirror.test.ts +31 -0
- package/common/src/util/__tests__/messages.test.ts +1118 -0
- package/common/src/util/__tests__/partial-json-delta.test.ts +505 -0
- package/common/src/util/__tests__/paths.test.ts +289 -0
- package/common/src/util/__tests__/promise.test.ts +334 -0
- package/common/src/util/__tests__/protocol-config.test.ts +119 -0
- package/common/src/util/__tests__/rate-limit.test.ts +28 -0
- package/common/src/util/__tests__/reddit-savant-free-retention.test.ts +120 -0
- package/common/src/util/__tests__/savant-free-streak.test.ts +142 -0
- package/common/src/util/__tests__/saxy.test.ts +1008 -0
- package/common/src/util/__tests__/string.test.ts +238 -0
- package/common/src/util/__tests__/zoned-time.test.ts +88 -0
- package/common/src/util/agent-file-utils.ts +110 -0
- package/common/src/util/agent-id-parsing.ts +147 -0
- package/common/src/util/agent-name-normalization.ts +39 -0
- package/common/src/util/analytics-dispatcher.ts +81 -0
- package/common/src/util/analytics-log.ts +84 -0
- package/common/src/util/analytics-sampling.ts +225 -0
- package/common/src/util/array.ts +63 -0
- package/common/src/util/axiom-only-log.ts +79 -0
- package/common/src/util/cache-debug.ts +191 -0
- package/common/src/util/credentials.ts +12 -0
- package/common/src/util/currency.ts +25 -0
- package/common/src/util/dates.ts +81 -0
- package/common/src/util/engagement-tracker.ts +133 -0
- package/common/src/util/error.ts +580 -0
- package/common/src/util/file.ts +363 -0
- package/common/src/util/format-code-search.ts +115 -0
- package/common/src/util/lazy-response-ads.ts +93 -0
- package/common/src/util/log-data.ts +57 -0
- package/common/src/util/log-mirror.ts +34 -0
- package/common/src/util/lru-cache.ts +67 -0
- package/common/src/util/messages.ts +600 -0
- package/common/src/util/model-utils.ts +25 -0
- package/common/src/util/object.ts +137 -0
- package/common/src/util/param-helpers.ts +49 -0
- package/common/src/util/partial-json-delta.ts +100 -0
- package/common/src/util/paths.ts +194 -0
- package/common/src/util/promise.ts +87 -0
- package/common/src/util/protocol-config.ts +141 -0
- package/common/src/util/random.ts +15 -0
- package/common/src/util/rate-limit.ts +56 -0
- package/common/src/util/reddit-capi-events.ts +40 -0
- package/common/src/util/reddit-savant-free-retention.ts +69 -0
- package/common/src/util/response-ad-positions.ts +54 -0
- package/common/src/util/savant-free-privacy.ts +78 -0
- package/common/src/util/savant-free-streak.ts +153 -0
- package/common/src/util/saxy.ts +739 -0
- package/common/src/util/skills.ts +32 -0
- package/common/src/util/stop-sequence.ts +60 -0
- package/common/src/util/string.ts +419 -0
- package/common/src/util/system-info.ts +51 -0
- package/common/src/util/type-narrowing.ts +125 -0
- package/common/src/util/xml.ts +17 -0
- package/common/src/util/zod-schema.ts +80 -0
- package/common/src/util/zoned-time.ts +136 -0
- package/common/src/utils/ask-user-bridge.ts +47 -0
- package/common/tsconfig.json +8 -0
- package/database.db +0 -0
- package/dev/LEARNINGS.md +309 -0
- package/dev/fids/.gitkeep +0 -0
- package/dev/fids/archive/.gitkeep +0 -0
- package/dev/fids/archive/FID-2026-0802-008-sdk-package-audit-client-run-run-state.md +238 -0
- package/dev/fids/archive/FID-2026-0803-001-echo-enforcement-layer-drift.md +404 -0
- package/dev/fids/archive/FID-2026-0803-002-llm-providers-database-audit.md +348 -0
- package/dev/fids/archive/FID-2026-0803-003-sdk-impl-common-util-audit.md +277 -0
- package/dev/fids/archive/FID-2026-0803-004-checkpoint-rewind.md +181 -0
- package/dev/fids/archive/FID-2026-0803-005-quality-scan-hygiene-fixes.md +265 -0
- package/dev/fids/archive/FID-2026-0803-006-code-map-audit-hygiene.md +243 -0
- package/dev/fids/archive/FID-2026-0803-007-evals-benchmark-audit-hygiene.md +296 -0
- package/dev/fids/archive/FID-2026-0803-009-echo-enforcement-doc-drift.md +112 -0
- package/dev/fids/archive/FID-2026-0803-010-database-llm-providers-low-fixes.md +255 -0
- package/dev/fids/archive/FID-2026-0803-011-build-artifact-hygiene.md +169 -0
- package/dev/fids/archive/FID-2026-0803-012-release-readiness-audit.md +162 -0
- package/dev/fids/archive/FID-2026-0803-013-agent-roster-over-reporting.md +146 -0
- package/dev/fids/archive/FID-2026-0803-014-freebuff-to-savant-rebrand-sweep.md +185 -0
- package/dev/nova/reports/2026-08-02-top-25-ai-inference-providers-competitive-intel.md +213 -0
- package/dev/nova/specs/echo-v0.1.2-freebuff.md +391 -0
- package/dev/nova/specs/goal-loop-feature-spec.md +245 -0
- package/dev/nova/specs/launch-strategy-research-prompt.md +88 -0
- package/dev/releases/README.md +50 -0
- package/dev/scratchpad/.gitkeep +0 -0
- package/dev/session-summaries/.gitkeep +0 -0
- package/dev/session-summaries/2026-07-16-1255.md +128 -0
- package/dev/session-summaries/2026-07-17-1000.md +64 -0
- package/dev/session-summaries/2026-07-19-eslint-zero-tolerance-cleanup.md +145 -0
- package/dev/session-summaries/2026-07-19-fid-026-debugging-and-rename.md +79 -0
- package/dev/session-summaries/2026-07-19-fid-026-phase-b-rebrand.md +76 -0
- package/dev/session-summaries/2026-07-19-fid-027-clean-break.md +47 -0
- package/dev/session-summaries/2026-07-19-pre-push-house-cleaning.md +100 -0
- package/dev/session-summaries/2026-07-19-v0.0.2-release-session.md +229 -0
- package/dev/session-summaries/2026-07-20-1805-fid-loop-closure.md +95 -0
- package/dev/session-summaries/2026-07-22-1800.md +52 -0
- package/dev/session-summaries/2026-07-23-fsm-optimization.md +88 -0
- package/dev/session-summaries/2026-07-25-0000.md +80 -0
- package/dev/session-summaries/2026-07-25-1200-context-compaction.md +154 -0
- package/dev/session-summaries/2026-07-25-1600-layer4-reactive-compact.md +96 -0
- package/dev/session-summaries/2026-07-25-1700-dev-folder-audit.md +161 -0
- package/dev/session-summaries/2026-07-25-2000-benchmark-v2-filters.md +147 -0
- package/dev/session-summaries/2026-07-25-2000.md +77 -0
- package/dev/session-summaries/2026-07-27-0000.md +63 -0
- package/dev/session-summaries/2026-07-28-history-capture-handoff.md +206 -0
- package/dev/session-summaries/2026-07-31-freebuff-echo-compliance-remediation.md +156 -0
- package/dev/session-summaries/2026-07-31-pre-launch-optimization-execution.md +46 -0
- package/dev/session-summaries/2026-0721-1800.md +44 -0
- package/dev/session-summaries/2026-08-01-sidebar-folded-startup.md +159 -0
- package/dev/session-summaries/2026-08-02-0.0.15-release-closeout.md +32 -0
- package/dev/session-summaries/2026-08-02-repository-hygiene.md +51 -0
- package/dev/session-summaries/2026-08-03-agent-roster-fix-and-ready-check-closeout.md +73 -0
- package/dev/session-summaries/2026-08-03-build-artifact-hygiene-closeout.md +40 -0
- package/dev/session-summaries/2026-08-03-code-map-audit-closeout.md +44 -0
- package/dev/session-summaries/2026-08-03-database-llm-providers-low-fixes-closeout.md +47 -0
- package/dev/session-summaries/2026-08-03-echo-enforcement-doc-drift-closeout.md +43 -0
- package/dev/session-summaries/2026-08-03-evals-benchmark-audit-closeout.md +50 -0
- package/dev/session-summaries/2026-08-03-quality-scan-hygiene-fixes-closeout.md +57 -0
- package/dev/session-summaries/2026-08-03-quality-session-checkpoint-rewind-closeout.md +56 -0
- package/dev/session-summaries/2026-08-03-release-readiness-audit-closeout.md +60 -0
- package/dev/test-prompts/archive/0.0.2-final-pass.md +209 -0
- package/dev/test-prompts/archive/agent-capabilities-full-test.md +361 -0
- package/dev/test-prompts/archive/agent-capabilities-test.md +471 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test-v1.md +441 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test-v2-report.md +377 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test-v2.md +544 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test.md +396 -0
- package/dev/test-prompts/archive/comprehensive-az-test-final.md +900 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v11.md +141 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v12.md +29 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v6.md +631 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v7.md +625 -0
- package/dev/test-prompts/archive/fid-007-ability-confirmation.md +248 -0
- package/dev/test-prompts/archive/fid-2026-0801-006-thinker-tool-call-boundary.md +86 -0
- package/dev/test-prompts/archive/fid-2026-0801-007-child-tool-set-fallback-cli.md +101 -0
- package/dev/test-prompts/archive/fid-2026-0801-008-provider-tool-call-accumulation-cli.md +111 -0
- package/dev/test-prompts/archive/fid-2026-0801-012-thinker-state-output-cli.md +134 -0
- package/dev/test-prompts/archive/gemini-deep-research-sidebar-highlight.md +598 -0
- package/dev/test-prompts/archive/goal-loop-cli-test.md +142 -0
- package/dev/test-prompts/archive/rebrand-qa.md +258 -0
- package/dev/test-prompts/archive/release-az-test-fid-085.md +306 -0
- package/dev/test-prompts/archive/release-az-test-fid-087.md +219 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0726-001.md +270 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0728-008.md +213 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0728-launch-tracks.md +253 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0731-pre-launch.md +102 -0
- package/docs/AI Coding Agents Market Research.md +516 -0
- package/docs/Agent Harness Feature Pairing Research.md +166 -0
- package/docs/CLI Agent Inference Backend Research.md +446 -0
- package/docs/Codebuff Rebranding And Migration Plan.md +418 -0
- package/docs/ECHO-EVOLUTION-ARCH.md +77 -0
- package/docs/Harness Engineering for Coding Agents Research.md +196 -0
- package/docs/Launch Plan Review and Optimization.md +178 -0
- package/docs/OpenTUI Sidebar Bug Fix.md +245 -0
- package/docs/SAVANT-VERSIONING.md +31 -0
- package/docs/Savant Code Launch Strategy.md +270 -0
- package/docs/Savant-Code Business And Backend Research.md +222 -0
- package/docs/agents-and-tools.md +217 -0
- package/docs/cloudflare-llms-full.md +9623 -0
- package/docs/design/OpenTUI Terminal Visualization Guide.md +471 -0
- package/docs/design/database-architecture.md +217 -0
- package/docs/design/deep-research-report.md +295 -0
- package/docs/design/thinker-sequentialthinking-regression-diagnostic.md +366 -0
- package/docs/discord-server-design.md +167 -0
- package/docs/gravity-integration-starter.md +202 -0
- package/docs/launch/hn-first-comment.md +44 -0
- package/docs/launch/hn-post.md +35 -0
- package/docs/launch/incident-response.md +88 -0
- package/docs/launch/landing/index.html +233 -0
- package/docs/launch/mastodon-thread.md +52 -0
- package/docs/launch/newsletter-pitch.md +49 -0
- package/docs/launch/twitter-thread.md +62 -0
- package/docs/privacy.md +186 -0
- package/docs/reports/Savant-Code Benchmark Specification.md +206 -0
- package/docs/reports/Thinker Agent Architecture Research.md +284 -0
- package/docs/reports/adoptable-features-2026-07-25.md +604 -0
- package/docs/reports/adoptable-features-master.md +480 -0
- package/docs/reports/codebuff-discord-feedback.md +43 -0
- package/docs/reports/feature-parity-report.md +810 -0
- package/docs/reports/repos/AionUi.md +75 -0
- package/docs/reports/repos/OpenHands.md +76 -0
- package/docs/reports/repos/SWE-agent.md +82 -0
- package/docs/reports/repos/agno.md +89 -0
- package/docs/reports/repos/aider.md +74 -0
- package/docs/reports/repos/cline.md +83 -0
- package/docs/reports/repos/codex.md +83 -0
- package/docs/reports/repos/gemini-cli.md +92 -0
- package/docs/reports/repos/goose.md +65 -0
- package/docs/reports/repos/gpt-pilot.md +52 -0
- package/docs/reports/repos/hermes-agent.md +101 -0
- package/docs/reports/repos/kilocode.md +79 -0
- package/docs/reports/repos/openclaude.md +99 -0
- package/docs/reports/repos/openclaw.md +100 -0
- package/docs/reports/repos/opencode-dev.md +78 -0
- package/docs/reports/repos/zero.md +123 -0
- package/docs/reports/savant-code-benchmark-v2-2026-08-03.md +76 -0
- package/docs/savant-code-modes.md +338 -0
- package/docs/testing.md +51 -0
- package/docs/visual-mockup-neon-slate.txt +41 -0
- package/eslint.config.js +211 -0
- package/evals/README.md +45 -0
- package/evals/benchmark/README.md +449 -0
- package/evals/benchmark/agent-runner.ts +217 -0
- package/evals/benchmark/analyze-task-scores.ts +496 -0
- package/evals/benchmark/eval-codebuff-hard.json +3343 -0
- package/evals/benchmark/eval-codebuff.json +3193 -0
- package/evals/benchmark/eval-codebuff2.json +2494 -0
- package/evals/benchmark/eval-manifold-hard.json +2525 -0
- package/evals/benchmark/eval-manifold.json +1675 -0
- package/evals/benchmark/eval-manifold2.json +1945 -0
- package/evals/benchmark/eval-plane-hard.json +4372 -0
- package/evals/benchmark/eval-plane.json +2028 -0
- package/evals/benchmark/eval-plane2.json +3517 -0
- package/evals/benchmark/eval-saleor-hard.json +6081 -0
- package/evals/benchmark/eval-saleor.json +1829 -0
- package/evals/benchmark/eval-saleor2.json +3273 -0
- package/evals/benchmark/eval-task-generator.ts +158 -0
- package/evals/benchmark/filter-supplemental-files.ts +225 -0
- package/evals/benchmark/format-output.ts +215 -0
- package/evals/benchmark/gen-evals.ts +294 -0
- package/evals/benchmark/gen-repo-eval.ts +71 -0
- package/evals/benchmark/judge.ts +308 -0
- package/evals/benchmark/lessons-extractor.ts +247 -0
- package/evals/benchmark/main-hard-tasks.ts +49 -0
- package/evals/benchmark/main-single-eval.ts +23 -0
- package/evals/benchmark/main.ts +29 -0
- package/evals/benchmark/meta-analyzer.ts +329 -0
- package/evals/benchmark/pick-commits.ts +627 -0
- package/evals/benchmark/run-benchmark.ts +657 -0
- package/evals/benchmark/runners/claude.ts +176 -0
- package/evals/benchmark/runners/codex.ts +143 -0
- package/evals/benchmark/runners/index.ts +4 -0
- package/evals/benchmark/runners/opencode.ts +253 -0
- package/evals/benchmark/runners/runner.ts +13 -0
- package/evals/benchmark/runners/savant.ts +148 -0
- package/evals/benchmark/setup-test-repo.ts +314 -0
- package/evals/benchmark/trace-analyzer.ts +257 -0
- package/evals/benchmark/trace-utils.ts +80 -0
- package/evals/benchmark/types.ts +83 -0
- package/evals/bunfig.toml +4 -0
- package/evals/logger.ts +87 -0
- package/evals/package.json +31 -0
- package/evals/subagents/test-repo-utils.ts +131 -0
- package/evals/tsconfig.json +13 -0
- package/evals/v2/README.md +149 -0
- package/evals/v2/reports/report.json +261 -0
- package/evals/v2/reports/report.md +15 -0
- package/evals/v2/schema/task.schema.json +172 -0
- package/evals/v2/src/cli.ts +216 -0
- package/evals/v2/src/golden.ts +73 -0
- package/evals/v2/src/harness.ts +293 -0
- package/evals/v2/src/metrics.ts +326 -0
- package/evals/v2/src/registry.ts +179 -0
- package/evals/v2/src/reports.ts +126 -0
- package/evals/v2/src/runner.ts +143 -0
- package/evals/v2/src/runners/savant.ts +105 -0
- package/evals/v2/src/sandbox.ts +42 -0
- package/evals/v2/src/sandboxes/docker.ts +49 -0
- package/evals/v2/src/sandboxes/tempdir.ts +120 -0
- package/evals/v2/src/schema.ts +83 -0
- package/evals/v2/src/trace.ts +186 -0
- package/evals/v2/src/verify.ts +199 -0
- package/evals/v2/tasks/error_recovery/env-fault/calculator.js +11 -0
- package/evals/v2/tasks/error_recovery/env-fault/calculator.test.js +15 -0
- package/evals/v2/tasks/error_recovery/env-fault/golden.patch +15 -0
- package/evals/v2/tasks/error_recovery/env-fault/task.yaml +20 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.js +5 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.test.js +7 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/golden.patch +19 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/greet.js +3 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/orchestration.test.js +30 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/task.yaml +29 -0
- package/evals/v2/tasks/pure_coding/add-fix/add.js +3 -0
- package/evals/v2/tasks/pure_coding/add-fix/add.test.js +11 -0
- package/evals/v2/tasks/pure_coding/add-fix/golden.patch +7 -0
- package/evals/v2/tasks/pure_coding/add-fix/task.yaml +20 -0
- package/evals/v2/tasks/pure_coding/rename-greet/app.js +5 -0
- package/evals/v2/tasks/pure_coding/rename-greet/app.test.js +32 -0
- package/evals/v2/tasks/pure_coding/rename-greet/golden.patch +19 -0
- package/evals/v2/tasks/pure_coding/rename-greet/greet.js +5 -0
- package/evals/v2/tasks/pure_coding/rename-greet/task.yaml +21 -0
- package/evals/v2/tests/golden.test.ts +104 -0
- package/evals/v2/tests/harness.test.ts +204 -0
- package/evals/v2/tests/metrics.test.ts +353 -0
- package/evals/v2/tests/registry.test.ts +210 -0
- package/evals/v2/tests/reports.test.ts +218 -0
- package/evals/v2/tests/savant-runner.test.ts +218 -0
- package/evals/v2/tests/schema.test.ts +127 -0
- package/evals/v2/tests/tempdir-sandbox.test.ts +49 -0
- package/evals/v2/tests/trace.test.ts +76 -0
- package/evals/v2/tests/verify.test.ts +224 -0
- package/license +202 -0
- package/package.json +71 -44
- package/packages/agent-runtime/README.md +46 -0
- package/packages/agent-runtime/agent_exit +1 -0
- package/packages/agent-runtime/bunfig.toml +2 -0
- package/packages/agent-runtime/package.json +34 -0
- package/packages/agent-runtime/src/__tests__/apply-patch-tool.test.ts +202 -0
- package/packages/agent-runtime/src/__tests__/cost-aggregation.test.ts +397 -0
- package/packages/agent-runtime/src/__tests__/generate-diffs-prompt.test.ts +107 -0
- package/packages/agent-runtime/src/__tests__/get-file-reading-updates.test.ts +59 -0
- package/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts +501 -0
- package/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +1512 -0
- package/packages/agent-runtime/src/__tests__/main-prompt.test.ts +452 -0
- package/packages/agent-runtime/src/__tests__/n-parameter.test.ts +984 -0
- package/packages/agent-runtime/src/__tests__/process-file-block.test.ts +196 -0
- package/packages/agent-runtime/src/__tests__/process-str-replace.test.ts +512 -0
- package/packages/agent-runtime/src/__tests__/programmatic-tool-authorization.test.ts +219 -0
- package/packages/agent-runtime/src/__tests__/prompt-caching-subagents.test.ts +749 -0
- package/packages/agent-runtime/src/__tests__/prompts-schema-handling.test.ts +454 -0
- package/packages/agent-runtime/src/__tests__/propose-tools.test.ts +824 -0
- package/packages/agent-runtime/src/__tests__/read-docs-tool.test.ts +394 -0
- package/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts +161 -0
- package/packages/agent-runtime/src/__tests__/run-agent-step-tools.test.ts +612 -0
- package/packages/agent-runtime/src/__tests__/run-programmatic-step.test.ts +1743 -0
- package/packages/agent-runtime/src/__tests__/sandbox-generator.test.ts +154 -0
- package/packages/agent-runtime/src/__tests__/spawn-agents-image-content.test.ts +354 -0
- package/packages/agent-runtime/src/__tests__/spawn-agents-message-history.test.ts +280 -0
- package/packages/agent-runtime/src/__tests__/spawn-agents-permissions.test.ts +664 -0
- package/packages/agent-runtime/src/__tests__/stream-parser-abort.test.ts +250 -0
- package/packages/agent-runtime/src/__tests__/stream-parser-reasoning.test.ts +194 -0
- package/packages/agent-runtime/src/__tests__/subagent-streaming.test.ts +230 -0
- package/packages/agent-runtime/src/__tests__/test-utils.ts +96 -0
- package/packages/agent-runtime/src/__tests__/thinker-convergence-gate.test.ts +242 -0
- package/packages/agent-runtime/src/__tests__/to-token-count-input-schema.test.ts +81 -0
- package/packages/agent-runtime/src/__tests__/tool-executor-sandbox.test.ts +167 -0
- package/packages/agent-runtime/src/__tests__/tool-stream-parser.test.ts +682 -0
- package/packages/agent-runtime/src/__tests__/tool-validation-error.test.ts +1380 -0
- package/packages/agent-runtime/src/__tests__/web-search-tool.test.ts +402 -0
- package/packages/agent-runtime/src/__tests__/xml-tool-result-ordering.test.ts +264 -0
- package/packages/agent-runtime/src/constants.ts +12 -0
- package/packages/agent-runtime/src/context-compactor.ts +425 -0
- package/packages/agent-runtime/src/find-files/__tests__/request-files-prompt.test.ts +190 -0
- package/packages/agent-runtime/src/find-files/custom-file-picker-config.ts +61 -0
- package/packages/agent-runtime/src/find-files/request-files-prompt.ts +462 -0
- package/packages/agent-runtime/src/generate-diffs-prompt.ts +38 -0
- package/packages/agent-runtime/src/get-file-reading-updates.ts +27 -0
- package/packages/agent-runtime/src/llm-api/__tests__/gemini-with-fallbacks.test.ts +267 -0
- package/packages/agent-runtime/src/llm-api/__tests__/serper-api.test.ts +297 -0
- package/packages/agent-runtime/src/llm-api/claude.ts +7 -0
- package/packages/agent-runtime/src/llm-api/context7-api.ts +290 -0
- package/packages/agent-runtime/src/llm-api/gemini-with-fallbacks.ts +104 -0
- package/packages/agent-runtime/src/llm-api/savant-code-web-api.ts +370 -0
- package/packages/agent-runtime/src/llm-api/serper-api.ts +193 -0
- package/packages/agent-runtime/src/main-prompt.ts +251 -0
- package/packages/agent-runtime/src/mcp-constants.ts +12 -0
- package/packages/agent-runtime/src/mcp.ts +83 -0
- package/packages/agent-runtime/src/process-file-block.ts +118 -0
- package/packages/agent-runtime/src/process-str-replace.ts +213 -0
- package/packages/agent-runtime/src/prompt-agent-stream.ts +119 -0
- package/packages/agent-runtime/src/run-agent-step.ts +1632 -0
- package/packages/agent-runtime/src/run-programmatic-step.ts +633 -0
- package/packages/agent-runtime/src/system-prompt/prompts.ts +215 -0
- package/packages/agent-runtime/src/system-prompt/search-system-prompt.ts +89 -0
- package/packages/agent-runtime/src/system-prompt/truncate-file-tree.ts +414 -0
- package/packages/agent-runtime/src/templates/README.md +160 -0
- package/packages/agent-runtime/src/templates/__tests__/agent-registry.test.ts +489 -0
- package/packages/agent-runtime/src/templates/__tests__/strings.test.ts +465 -0
- package/packages/agent-runtime/src/templates/agent-registry.ts +122 -0
- package/packages/agent-runtime/src/templates/prompts.ts +189 -0
- package/packages/agent-runtime/src/templates/strings.ts +292 -0
- package/packages/agent-runtime/src/templates/types.ts +61 -0
- package/packages/agent-runtime/src/tool-stream-parser.ts +260 -0
- package/packages/agent-runtime/src/tools/filter-tool-set.ts +18 -0
- package/packages/agent-runtime/src/tools/handlers/__tests__/glob.test.ts +331 -0
- package/packages/agent-runtime/src/tools/handlers/__tests__/read-subtree.test.ts +346 -0
- package/packages/agent-runtime/src/tools/handlers/__tests__/run-readonly-command.test.ts +284 -0
- package/packages/agent-runtime/src/tools/handlers/handler-function-type.ts +77 -0
- package/packages/agent-runtime/src/tools/handlers/list.ts +105 -0
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/checkpoint-store.test.ts +394 -0
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/skill.test.ts +98 -0
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/write-file.test.ts +24 -0
- package/packages/agent-runtime/src/tools/handlers/tool/add-message.ts +37 -0
- package/packages/agent-runtime/src/tools/handlers/tool/add-subgoal.ts +30 -0
- package/packages/agent-runtime/src/tools/handlers/tool/apply-patch.ts +120 -0
- package/packages/agent-runtime/src/tools/handlers/tool/ask-user.ts +25 -0
- package/packages/agent-runtime/src/tools/handlers/tool/browser-logs.ts +21 -0
- package/packages/agent-runtime/src/tools/handlers/tool/checkpoint-store.ts +378 -0
- package/packages/agent-runtime/src/tools/handlers/tool/code-search.ts +21 -0
- package/packages/agent-runtime/src/tools/handlers/tool/composio.ts +52 -0
- package/packages/agent-runtime/src/tools/handlers/tool/create-plan.ts +63 -0
- package/packages/agent-runtime/src/tools/handlers/tool/end-turn.ts +15 -0
- package/packages/agent-runtime/src/tools/handlers/tool/find-files.ts +161 -0
- package/packages/agent-runtime/src/tools/handlers/tool/glob.ts +22 -0
- package/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts +230 -0
- package/packages/agent-runtime/src/tools/handlers/tool/list-directory.ts +22 -0
- package/packages/agent-runtime/src/tools/handlers/tool/lookup-agent-info.ts +105 -0
- package/packages/agent-runtime/src/tools/handlers/tool/propose-str-replace.ts +111 -0
- package/packages/agent-runtime/src/tools/handlers/tool/propose-write-file.ts +89 -0
- package/packages/agent-runtime/src/tools/handlers/tool/proposed-content-store.ts +64 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-docs.ts +160 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-files.ts +43 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-subtree.ts +198 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-url.ts +21 -0
- package/packages/agent-runtime/src/tools/handlers/tool/render-ui.ts +15 -0
- package/packages/agent-runtime/src/tools/handlers/tool/run-file-change-hooks.ts +20 -0
- package/packages/agent-runtime/src/tools/handlers/tool/run-readonly-command.ts +215 -0
- package/packages/agent-runtime/src/tools/handlers/tool/run-terminal-command.ts +33 -0
- package/packages/agent-runtime/src/tools/handlers/tool/sequential-thinking.ts +53 -0
- package/packages/agent-runtime/src/tools/handlers/tool/set-messages.ts +19 -0
- package/packages/agent-runtime/src/tools/handlers/tool/set-output.ts +104 -0
- package/packages/agent-runtime/src/tools/handlers/tool/set-scaffold-complete.ts +32 -0
- package/packages/agent-runtime/src/tools/handlers/tool/skill.ts +146 -0
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-inline.ts +149 -0
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts +436 -0
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agents.ts +286 -0
- package/packages/agent-runtime/src/tools/handlers/tool/str-replace.ts +135 -0
- package/packages/agent-runtime/src/tools/handlers/tool/suggest-followups.ts +20 -0
- package/packages/agent-runtime/src/tools/handlers/tool/task-completed.ts +15 -0
- package/packages/agent-runtime/src/tools/handlers/tool/think-deeply.ts +25 -0
- package/packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts +160 -0
- package/packages/agent-runtime/src/tools/handlers/tool/update-subgoal.ts +48 -0
- package/packages/agent-runtime/src/tools/handlers/tool/web-search.ts +151 -0
- package/packages/agent-runtime/src/tools/handlers/tool/write-file.ts +281 -0
- package/packages/agent-runtime/src/tools/handlers/tool/write-todos.ts +19 -0
- package/packages/agent-runtime/src/tools/prompts.ts +233 -0
- package/packages/agent-runtime/src/tools/sandbox/__tests__/engine.test.ts +169 -0
- package/packages/agent-runtime/src/tools/sandbox/__tests__/shell-denylist.test.ts +104 -0
- package/packages/agent-runtime/src/tools/sandbox/engine.ts +109 -0
- package/packages/agent-runtime/src/tools/sandbox/index.ts +14 -0
- package/packages/agent-runtime/src/tools/sandbox/shell-denylist.ts +119 -0
- package/packages/agent-runtime/src/tools/stream-parser.ts +407 -0
- package/packages/agent-runtime/src/tools/thinker-convergence-gate.ts +162 -0
- package/packages/agent-runtime/src/tools/thought-session-store.ts +43 -0
- package/packages/agent-runtime/src/tools/tool-executor.ts +1098 -0
- package/packages/agent-runtime/src/util/__tests__/messages.test.ts +995 -0
- package/packages/agent-runtime/src/util/__tests__/parse-tool-calls-from-text.test.ts +363 -0
- package/packages/agent-runtime/src/util/__tests__/simplify-tool-results.test.ts +382 -0
- package/packages/agent-runtime/src/util/__tests__/stream-xml-parser.test.ts +285 -0
- package/packages/agent-runtime/src/util/__tests__/think-tags.test.ts +49 -0
- package/packages/agent-runtime/src/util/__tests__/token-counter.test.ts +121 -0
- package/packages/agent-runtime/src/util/activity-tracking.ts +252 -0
- package/packages/agent-runtime/src/util/agent-output.ts +102 -0
- package/packages/agent-runtime/src/util/cache-debug.ts +330 -0
- package/packages/agent-runtime/src/util/format-value.ts +16 -0
- package/packages/agent-runtime/src/util/messages.ts +461 -0
- package/packages/agent-runtime/src/util/parse-tool-calls-from-text.ts +122 -0
- package/packages/agent-runtime/src/util/render-read-files-result.ts +18 -0
- package/packages/agent-runtime/src/util/simplify-tool-results.ts +61 -0
- package/packages/agent-runtime/src/util/stream-xml-parser.ts +259 -0
- package/packages/agent-runtime/src/util/think-tags.ts +33 -0
- package/packages/agent-runtime/src/util/token-counter.ts +136 -0
- package/packages/agent-runtime/tsconfig.json +8 -0
- package/packages/code-map/README.md +43 -0
- package/packages/code-map/__tests__/integration.test.ts +278 -0
- package/packages/code-map/__tests__/languages.test.ts +240 -0
- package/packages/code-map/__tests__/parse.test.ts +640 -0
- package/packages/code-map/__tests__/test-langs/test.c +42 -0
- package/packages/code-map/__tests__/test-langs/test.cpp +34 -0
- package/packages/code-map/__tests__/test-langs/test.cs +34 -0
- package/packages/code-map/__tests__/test-langs/test.go +27 -0
- package/packages/code-map/__tests__/test-langs/test.java +31 -0
- package/packages/code-map/__tests__/test-langs/test.js +50 -0
- package/packages/code-map/__tests__/test-langs/test.php +34 -0
- package/packages/code-map/__tests__/test-langs/test.py +25 -0
- package/packages/code-map/__tests__/test-langs/test.rb +28 -0
- package/packages/code-map/__tests__/test-langs/test.rs +28 -0
- package/packages/code-map/__tests__/test-langs/test.ts +31 -0
- package/packages/code-map/package.json +33 -0
- package/packages/code-map/src/index.ts +4 -0
- package/packages/code-map/src/init-node.ts +185 -0
- package/packages/code-map/src/languages.ts +344 -0
- package/packages/code-map/src/parse.ts +410 -0
- package/packages/code-map/src/tree-sitter-queries/readme.md +24 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-c-tags.scm +16 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +23 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-cpp-tags.scm +29 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-go-tags.scm +26 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-java-tags.scm +19 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-javascript-tags.scm +16 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-php-tags.scm +23 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-python-tags.scm +12 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-ruby-tags.scm +58 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-rust-tags.scm +26 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-typescript-tags.scm +22 -0
- package/packages/code-map/src/types.ts +11 -0
- package/packages/code-map/src/utils.ts +12 -0
- package/packages/code-map/tsconfig.json +10 -0
- package/packages/database/README.md +43 -0
- package/packages/database/package.json +28 -0
- package/packages/database/src/__tests__/service.test.ts +167 -0
- package/packages/database/src/index.ts +146 -0
- package/packages/database/src/service.ts +342 -0
- package/packages/database/tsconfig.json +9 -0
- package/packages/llm-providers/README.md +42 -0
- package/packages/llm-providers/package.json +42 -0
- package/packages/llm-providers/src/ollama/__tests__/detect.test.ts +59 -0
- package/packages/llm-providers/src/ollama/detect.ts +113 -0
- package/packages/llm-providers/src/ollama/index.ts +2 -0
- package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.test.ts +855 -0
- package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.ts +177 -0
- package/packages/llm-providers/src/openai-compatible/chat/get-response-metadata.ts +15 -0
- package/packages/llm-providers/src/openai-compatible/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-api-types.ts +60 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.test.ts +549 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.ts +474 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-options.ts +25 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-metadata-extractor.ts +49 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-prepare-tools.ts +162 -0
- package/packages/llm-providers/src/openai-compatible/chat/stream-transform.test.ts +106 -0
- package/packages/llm-providers/src/openai-compatible/chat/stream-transform.ts +585 -0
- package/packages/llm-providers/src/openai-compatible/completion/convert-to-openai-compatible-completion-prompt.ts +98 -0
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.test.ts +173 -0
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.ts +414 -0
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-options.ts +33 -0
- package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-model.ts +143 -0
- package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-options.ts +21 -0
- package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-model.ts +129 -0
- package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-settings.ts +1 -0
- package/packages/llm-providers/src/openai-compatible/index.ts +27 -0
- package/packages/llm-providers/src/openai-compatible/openai-compatible-error.ts +34 -0
- package/packages/llm-providers/src/openai-compatible/openai-compatible-provider.ts +174 -0
- package/packages/llm-providers/src/openai-compatible/version.ts +5 -0
- package/packages/llm-providers/tsconfig.json +9 -0
- package/protocol.config.yaml +113 -0
- package/savant-free/README.md +73 -0
- package/savant-free/SPEC.md +385 -0
- package/savant-free/cli/build.ts +49 -0
- package/savant-free/cli/release/README.md +55 -0
- package/savant-free/cli/release/index.js +37 -0
- package/savant-free/cli/release/package.json +43 -0
- package/savant-free/cli/release.ts +128 -0
- package/savant-free/cli/smoke-test.test.ts +257 -0
- package/savant-free/e2e/README.md +173 -0
- package/savant-free/e2e/agent/savant-free-tester.ts +52 -0
- package/savant-free/e2e/tests/ads-behavior.e2e.test.ts +51 -0
- package/savant-free/e2e/tests/agent-startup.e2e.test.ts +61 -0
- package/savant-free/e2e/tests/code-edit.e2e.test.ts +78 -0
- package/savant-free/e2e/tests/help-command.e2e.test.ts +97 -0
- package/savant-free/e2e/tests/knowledge-file.e2e.test.ts +66 -0
- package/savant-free/e2e/tests/slash-commands.e2e.test.ts +119 -0
- package/savant-free/e2e/tests/startup.e2e.test.ts +56 -0
- package/savant-free/e2e/tests/terminal-command.e2e.test.ts +71 -0
- package/savant-free/e2e/tests/version.e2e.test.ts +50 -0
- package/savant-free/e2e/utils/binary-helpers.ts +24 -0
- package/savant-free/e2e/utils/index.ts +17 -0
- package/savant-free/e2e/utils/savant-free-session.ts +229 -0
- package/savant-free/e2e/utils/tmux-custom-tools.ts +156 -0
- package/savant-free/e2e/utils/tmux-helpers.ts +79 -0
- package/savant-free/package.json +20 -0
- package/scripts/eslint-rules/__fixtures__/debug-ast.mjs +20 -0
- package/scripts/eslint-rules/__fixtures__/probe.mjs +41 -0
- package/scripts/eslint-rules/__fixtures__/probe2.mjs +43 -0
- package/scripts/eslint-rules/__fixtures__/rule-test.mjs +44 -0
- package/scripts/eslint-rules/__fixtures__/rule-test2.mjs +27 -0
- package/scripts/eslint-rules/__fixtures__/unknown-bad.ts +21 -0
- package/scripts/eslint-rules/__fixtures__/unknown-good.ts +35 -0
- package/scripts/eslint-rules/no-unknown-in-signatures.js +141 -0
- package/scripts/release.py +360 -0
- package/scripts/run-az-test.sh +1150 -0
- package/scripts/sync-agents.py +337 -0
- package/scripts/tmux/README.md +359 -0
- package/scripts/tmux/package.json +9 -0
- package/scripts/tmux/tmux-capture.sh +231 -0
- package/scripts/tmux/tmux-cli.sh +160 -0
- package/scripts/tmux/tmux-env.sh +34 -0
- package/scripts/tmux/tmux-send.sh +339 -0
- package/scripts/tmux/tmux-start.sh +264 -0
- package/scripts/tmux/tmux-stop.sh +157 -0
- package/scripts/tmux/tmux-viewer/README.md +254 -0
- package/scripts/tmux/tmux-viewer/components/session-viewer.tsx +556 -0
- package/scripts/tmux/tmux-viewer/components/theme.ts +54 -0
- package/scripts/tmux/tmux-viewer/gif-encoder-2.d.ts +28 -0
- package/scripts/tmux/tmux-viewer/gif-exporter.ts +278 -0
- package/scripts/tmux/tmux-viewer/index.tsx +237 -0
- package/scripts/tmux/tmux-viewer/package.json +9 -0
- package/scripts/tmux/tmux-viewer/session-loader.ts +234 -0
- package/scripts/tmux/tmux-viewer/tsconfig.json +9 -0
- package/scripts/tmux/tmux-viewer/types.ts +76 -0
- package/sdk/CHANGELOG.md +126 -0
- package/sdk/PUBLISHING.md +55 -0
- package/sdk/README.md +334 -0
- package/sdk/bunfig.toml +6 -0
- package/sdk/e2e/README.md +158 -0
- package/sdk/e2e/custom-agents/api-integration-agent.e2e.test.ts +145 -0
- package/sdk/e2e/custom-agents/apply-patch-tool.e2e.test.ts +62 -0
- package/sdk/e2e/custom-agents/database-query-agent.e2e.test.ts +135 -0
- package/sdk/e2e/custom-agents/weather-agent.e2e.test.ts +120 -0
- package/sdk/e2e/examples/code-explainer.example.ts +62 -0
- package/sdk/e2e/examples/code-reviewer.example.ts +52 -0
- package/sdk/e2e/examples/commit-message-generator.example.ts +61 -0
- package/sdk/e2e/examples/sdk-lint.example.ts +65 -0
- package/sdk/e2e/examples/sdk-refactor.example.ts +63 -0
- package/sdk/e2e/examples/sdk-test-gen.example.ts +62 -0
- package/sdk/e2e/features/knowledge-files.e2e.test.ts +82 -0
- package/sdk/e2e/features/max-agent-steps.e2e.test.ts +65 -0
- package/sdk/e2e/features/project-files.e2e.test.ts +80 -0
- package/sdk/e2e/integration/connection-check.integration.test.ts +33 -0
- package/sdk/e2e/integration/event-ordering.integration.test.ts +186 -0
- package/sdk/e2e/integration/event-types.integration.test.ts +183 -0
- package/sdk/e2e/integration/stream-chunks.integration.test.ts +191 -0
- package/sdk/e2e/streaming/concurrent-streams.e2e.test.ts +164 -0
- package/sdk/e2e/streaming/subagent-streaming.e2e.test.ts +158 -0
- package/sdk/e2e/utils/__tests__/event-collector.test.ts +297 -0
- package/sdk/e2e/utils/e2e-mocks.ts +458 -0
- package/sdk/e2e/utils/event-collector.ts +145 -0
- package/sdk/e2e/utils/get-api-key.ts +76 -0
- package/sdk/e2e/utils/index.ts +3 -0
- package/sdk/e2e/utils/test-fixtures.ts +196 -0
- package/sdk/e2e/workflows/error-recovery.e2e.test.ts +112 -0
- package/sdk/e2e/workflows/multi-turn-conversation.e2e.test.ts +132 -0
- package/sdk/examples/readme-example-1.ts +34 -0
- package/sdk/examples/readme-example-2.ts +76 -0
- package/sdk/package.json +82 -0
- package/sdk/scripts/build.ts +349 -0
- package/sdk/scripts/fetch-ripgrep.ts +172 -0
- package/sdk/scripts/publish.ts +51 -0
- package/sdk/scripts/release.js +100 -0
- package/sdk/scripts/verify.ts +204 -0
- package/sdk/sdk_exit +1 -0
- package/sdk/smoke-test-dist.ts +248 -0
- package/sdk/src/__tests__/apply-overrides-resume.test.ts +83 -0
- package/sdk/src/__tests__/apply-patch.test.ts +438 -0
- package/sdk/src/__tests__/build-file-tree.test.ts +31 -0
- package/sdk/src/__tests__/change-file.test.ts +212 -0
- package/sdk/src/__tests__/client.test.ts +142 -0
- package/sdk/src/__tests__/clone-session-state.test.ts +158 -0
- package/sdk/src/__tests__/code-search.test.ts +896 -0
- package/sdk/src/__tests__/composio.test.ts +86 -0
- package/sdk/src/__tests__/credentials.test.ts +344 -0
- package/sdk/src/__tests__/database.test.ts +153 -0
- package/sdk/src/__tests__/env.test.ts +137 -0
- package/sdk/src/__tests__/error-utils.test.ts +253 -0
- package/sdk/src/__tests__/fixtures/windows-stubborn-grandchild.ts +26 -0
- package/sdk/src/__tests__/initial-session-state.test.ts +447 -0
- package/sdk/src/__tests__/knowledge-file-selection.test.ts +335 -0
- package/sdk/src/__tests__/load-agents.test.ts +935 -0
- package/sdk/src/__tests__/load-mcp-config.test.ts +285 -0
- package/sdk/src/__tests__/load-skills.test.ts +325 -0
- package/sdk/src/__tests__/model-provider.test.ts +44 -0
- package/sdk/src/__tests__/path-utils.test.ts +66 -0
- package/sdk/src/__tests__/read-files.test.ts +573 -0
- package/sdk/src/__tests__/read-url.test.ts +371 -0
- package/sdk/src/__tests__/researcher-web.integration.test.ts +130 -0
- package/sdk/src/__tests__/run-cancellation.test.ts +1321 -0
- package/sdk/src/__tests__/run-error-preserves-history.test.ts +335 -0
- package/sdk/src/__tests__/run-event-dispatch.test.ts +80 -0
- package/sdk/src/__tests__/run-file-filter.test.ts +530 -0
- package/sdk/src/__tests__/run-handle-event.test.ts +142 -0
- package/sdk/src/__tests__/run-mcp-tool-filter.test.ts +124 -0
- package/sdk/src/__tests__/run-state-child-process.test.ts +72 -0
- package/sdk/src/__tests__/run-terminal-command.test.ts +236 -0
- package/sdk/src/__tests__/run.integration.test.ts +170 -0
- package/sdk/src/__tests__/user-knowledge-files.test.ts +361 -0
- package/sdk/src/__tests__/validate-agents.test.ts +943 -0
- package/sdk/src/agents/load-agents.ts +339 -0
- package/sdk/src/agents/load-mcp-config.ts +275 -0
- package/sdk/src/client.ts +87 -0
- package/sdk/src/composio.ts +78 -0
- package/sdk/src/constants.ts +29 -0
- package/sdk/src/credentials.ts +303 -0
- package/sdk/src/custom-tool.ts +66 -0
- package/sdk/src/env.ts +116 -0
- package/sdk/src/error-utils.ts +127 -0
- package/sdk/src/impl/__tests__/llm-chatgpt-oauth-policy.test.ts +67 -0
- package/sdk/src/impl/__tests__/llm-native-tool-call.test.ts +38 -0
- package/sdk/src/impl/__tests__/llm-stream-yielded-content.test.ts +118 -0
- package/sdk/src/impl/__tests__/model-provider-free-mode.test.ts +166 -0
- package/sdk/src/impl/__tests__/prompt-result.test.ts +210 -0
- package/sdk/src/impl/__tests__/provider-options-metadata.test.ts +67 -0
- package/sdk/src/impl/agent-runtime.ts +159 -0
- package/sdk/src/impl/chatgpt-backend-fetch.ts +588 -0
- package/sdk/src/impl/database.ts +516 -0
- package/sdk/src/impl/llm.ts +852 -0
- package/sdk/src/impl/model-provider.ts +638 -0
- package/sdk/src/impl/openrouter-key-resolver.ts +78 -0
- package/sdk/src/index.ts +133 -0
- package/sdk/src/native/ripgrep.ts +141 -0
- package/sdk/src/retry-config.ts +51 -0
- package/sdk/src/run-state.ts +897 -0
- package/sdk/src/run.ts +1222 -0
- package/sdk/src/skills/load-skills.ts +253 -0
- package/sdk/src/testing/env.ts +19 -0
- package/sdk/src/tools/apply-patch.ts +690 -0
- package/sdk/src/tools/change-file.ts +155 -0
- package/sdk/src/tools/code-search.ts +547 -0
- package/sdk/src/tools/glob.ts +58 -0
- package/sdk/src/tools/index.ts +19 -0
- package/sdk/src/tools/list-directory.ts +52 -0
- package/sdk/src/tools/path-utils.ts +101 -0
- package/sdk/src/tools/read-files.ts +110 -0
- package/sdk/src/tools/read-url.ts +469 -0
- package/sdk/src/tools/run-file-change-hooks.ts +22 -0
- package/sdk/src/tools/run-terminal-command.ts +483 -0
- package/sdk/src/tools/ssrf.ts +120 -0
- package/sdk/src/types/env.ts +40 -0
- package/sdk/src/utils/logger.ts +15 -0
- package/sdk/src/validate-agents.ts +157 -0
- package/sdk/test/cjs-compatibility/package-lock.json +423 -0
- package/sdk/test/cjs-compatibility/package.json +21 -0
- package/sdk/test/cjs-compatibility/test-imports.js +77 -0
- package/sdk/test/cjs-compatibility/test-types.ts +54 -0
- package/sdk/test/cjs-compatibility/tsconfig.json +17 -0
- package/sdk/test/esm-compatibility/package-lock.json +423 -0
- package/sdk/test/esm-compatibility/package.json +21 -0
- package/sdk/test/esm-compatibility/test-imports.js +83 -0
- package/sdk/test/esm-compatibility/test-types.ts +59 -0
- package/sdk/test/esm-compatibility/tsconfig.json +17 -0
- package/sdk/test/ripgrep-bundling/package-lock.json +423 -0
- package/sdk/test/ripgrep-bundling/package.json +21 -0
- package/sdk/test/ripgrep-bundling/test-ripgrep-types.ts +132 -0
- package/sdk/test/ripgrep-bundling/test-ripgrep.js +257 -0
- package/sdk/test/ripgrep-bundling/tsconfig.json +15 -0
- package/sdk/test/setup-env.ts +54 -0
- package/sdk/test/test-sdk.ts +25 -0
- package/sdk/test/tree-sitter-queries/package-lock.json +47 -0
- package/sdk/test/tree-sitter-queries/package.json +12 -0
- package/sdk/test/tree-sitter-queries/test-query-files.js +256 -0
- package/sdk/tsconfig.build.json +32 -0
- package/sdk/tsconfig.json +27 -0
- package/sdk/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/sdk/vendor/ripgrep/arm64-linux/rg +0 -0
- package/sdk/vendor/ripgrep/x64-darwin/rg +0 -0
- package/sdk/vendor/ripgrep/x64-linux/rg +0 -0
- package/sdk/vendor/ripgrep/x64-win32/rg.exe +0 -0
- package/templates/FID-TEMPLATE.md +125 -0
- package/templates/README-TEMPLATE.md +87 -0
- package/templates/SESSION-SUMMARY.md +135 -0
- package/tsconfig.base.json +18 -0
- package/tsconfig.json +27 -0
- /package/{http.js → cli/release-core/http.js} +0 -0
- /package/{launcher.js → cli/release-core/launcher.js} +0 -0
|
@@ -0,0 +1,855 @@
|
|
|
1
|
+
import {
|
|
2
|
+
atlasCloudModels,
|
|
3
|
+
mimoModels,
|
|
4
|
+
minimaxModels,
|
|
5
|
+
moonshotModels,
|
|
6
|
+
openrouterModels,
|
|
7
|
+
} from './model-config'
|
|
8
|
+
import {
|
|
9
|
+
addDaysToYmd,
|
|
10
|
+
getUtcForZonedTime,
|
|
11
|
+
getZonedParts,
|
|
12
|
+
} from '../util/zoned-time'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Models a savant-free user can pick between in the waiting-room model selector.
|
|
16
|
+
*
|
|
17
|
+
* Each model has its own queue (server keys queue position by `model`), so the
|
|
18
|
+
* list here is effectively the set of separate waiting lines. Order is the
|
|
19
|
+
* order shown in the UI.
|
|
20
|
+
*/
|
|
21
|
+
export interface SavantFreeModel {
|
|
22
|
+
/** Stable ID used in the wire protocol and DB. Matches the model id passed
|
|
23
|
+
* to the chat-completions endpoint. */
|
|
24
|
+
id: string
|
|
25
|
+
/** Short label for the selector UI. */
|
|
26
|
+
displayName: string
|
|
27
|
+
/** One-line description shown next to the label. */
|
|
28
|
+
tagline: string
|
|
29
|
+
/** Availability policy for the selector and server-side admission. */
|
|
30
|
+
availability: 'always' | 'deployment_hours'
|
|
31
|
+
/** Optional caveat shown in the picker (e.g. data-collection warning).
|
|
32
|
+
* Rendered in the warning/secondary color so users spot it before
|
|
33
|
+
* picking the model. */
|
|
34
|
+
warning?: string
|
|
35
|
+
/** Premium models carry a per-day usage limit
|
|
36
|
+
* (SAVANT_FREE_PREMIUM_SESSION_LIMIT). Surfaced in the UI as a "Premium"
|
|
37
|
+
* badge with the limit. Derived from SAVANT_FREE_PREMIUM_MODEL_IDS so the two
|
|
38
|
+
* never drift. */
|
|
39
|
+
premium: boolean
|
|
40
|
+
/** Whether the model accepts image input. Drives whether uploaded images
|
|
41
|
+
* are forwarded as real multimodal content vs. dropped/inlined as text. */
|
|
42
|
+
multimodal: boolean
|
|
43
|
+
/** Whether the model is still being trialed and may be unreliable. Surfaced
|
|
44
|
+
* in the picker as a "TEST" badge with a tooltip so users know it is not
|
|
45
|
+
* yet production-grade. */
|
|
46
|
+
experimental?: boolean
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Server-facing fallback copy for APIs and provider errors that can't know
|
|
50
|
+
* the caller's local timezone. The CLI should render
|
|
51
|
+
* `getSavantFreeDeploymentAvailabilityLabel()` instead. */
|
|
52
|
+
export const SAVANT_FREE_DEPLOYMENT_HOURS_LABEL = '9am ET-5pm PT every day'
|
|
53
|
+
export const SAVANT_FREE_GEMINI_PRO_MODEL_ID = 'google/gemini-3.1-pro-preview'
|
|
54
|
+
export const SAVANT_FREE_DEEPSEEK_V4_PRO_MODEL_ID = 'deepseek/deepseek-v4-pro'
|
|
55
|
+
export const SAVANT_FREE_DEEPSEEK_V4_FLASH_MODEL_ID =
|
|
56
|
+
'deepseek/deepseek-v4-flash'
|
|
57
|
+
/** DeepSeek V4 Flash served by Fireworks instead of DeepSeek's direct API.
|
|
58
|
+
* Used only by savant-free.com/chat, where Fireworks' faster inference is worth
|
|
59
|
+
* a slightly less capable serving stack. Not in SUPPORTED_SAVANT_FREE_MODELS or
|
|
60
|
+
* the free-mode allowlists — the CLI and web builder keep DeepSeek direct. */
|
|
61
|
+
export const SAVANT_FREE_DEEPSEEK_V4_FLASH_FIREWORKS_MODEL_ID =
|
|
62
|
+
'fireworks/deepseek-v4-flash'
|
|
63
|
+
export const SAVANT_FREE_KIMI_MODEL_ID = moonshotModels.kimiK27Code
|
|
64
|
+
export const SAVANT_FREE_HY3_OPENROUTER_FREE_MODEL_ID =
|
|
65
|
+
openrouterModels.openrouter_tencent_hy3_free
|
|
66
|
+
export const SAVANT_FREE_HY3_OPENROUTER_PAID_MODEL_ID =
|
|
67
|
+
openrouterModels.openrouter_tencent_hy3
|
|
68
|
+
export const SAVANT_FREE_HY3_ATLAS_MODEL_ID = atlasCloudModels.tencentHy3
|
|
69
|
+
export const SAVANT_FREE_HY3_MODEL_ID = SAVANT_FREE_HY3_OPENROUTER_FREE_MODEL_ID
|
|
70
|
+
export const SAVANT_FREE_MINIMAX_M3_MODEL_ID = minimaxModels.minimaxM3
|
|
71
|
+
export const SAVANT_FREE_MIMO_V25_MODEL_ID = mimoModels.mimoV25
|
|
72
|
+
export const SAVANT_FREE_MIMO_V25_PRO_MODEL_ID = mimoModels.mimoV25Pro
|
|
73
|
+
/** GLM 5.2 (Z.ai), served by Fireworks serverless. Unlike the other picker
|
|
74
|
+
* models it is NOT freely available — it is unlocked by referring friends.
|
|
75
|
+
* Each qualified referral grants one 1-hour GLM session per week (capped at
|
|
76
|
+
* SAVANT_FREE_GLM_V52_REFERRAL_CAP). Gated by a per-user weekly session pool whose
|
|
77
|
+
* limit equals the caller's GLM referral score (see the free-session quota). */
|
|
78
|
+
export const SAVANT_FREE_GLM_V52_MODEL_ID = 'z-ai/glm-5.2'
|
|
79
|
+
/** UI-only rollout switch. Backend support and free-mode allowlists remain
|
|
80
|
+
* wired even when these models are hidden from the SavantFree picker. */
|
|
81
|
+
export const SAVANT_FREE_ENABLE_MIMO_MODELS_IN_UI = true
|
|
82
|
+
/** UI-only rollout switch for the streak indicator in the waiting room. */
|
|
83
|
+
export const SAVANT_FREE_ENABLE_STREAK_IN_UI = true
|
|
84
|
+
/** Local/debug switch: force the localhost free-mode country bypass into
|
|
85
|
+
* limited access so the limited SavantFree UX can be exercised without an env
|
|
86
|
+
* var. */
|
|
87
|
+
export const SAVANT_FREE_FORCE_LIMITED_MODE = false
|
|
88
|
+
export const SAVANT_FREE_PREMIUM_SESSION_LIMIT = 5
|
|
89
|
+
export const SAVANT_FREE_LIMITED_SESSION_LIMIT = 5
|
|
90
|
+
export const SAVANT_FREE_PREMIUM_SESSION_RESET_TIMEZONE = 'America/Los_Angeles'
|
|
91
|
+
export const SAVANT_FREE_PREMIUM_SESSION_PERIOD = 'pacific_day'
|
|
92
|
+
/** GLM 5.2 referral-reward session pool. Distinct from the premium daily pool:
|
|
93
|
+
* GLM sessions reset weekly (Pacific) and the per-user limit is the caller's
|
|
94
|
+
* GLM referral score, capped at SAVANT_FREE_GLM_V52_REFERRAL_CAP. */
|
|
95
|
+
export const SAVANT_FREE_WEEKLY_SESSION_PERIOD = 'pacific_week'
|
|
96
|
+
export const SAVANT_FREE_GLM_V52_SESSION_RESET_TIMEZONE =
|
|
97
|
+
SAVANT_FREE_PREMIUM_SESSION_RESET_TIMEZONE
|
|
98
|
+
export const SAVANT_FREE_GLM_V52_SESSION_WINDOW_HOURS = 24 * 7
|
|
99
|
+
/** Max number of qualified referrals that count toward GLM sessions, i.e. the
|
|
100
|
+
* most 1-hour GLM sessions a user can earn per week. */
|
|
101
|
+
export const SAVANT_FREE_GLM_V52_REFERRAL_CAP = 10
|
|
102
|
+
/** Master kill-switch for the GLM 5.2 referral program. While true, qualified
|
|
103
|
+
* referrals grant weekly GLM sessions and the CLI advertises the perk. Flip to
|
|
104
|
+
* false to wind the program down: entitlement drops to 0 for everyone and the
|
|
105
|
+
* CLI stops showing the banner. The perk is intentionally framed as
|
|
106
|
+
* limited-time in the UI so turning this off isn't a surprise. */
|
|
107
|
+
export const SAVANT_FREE_GLM_V52_REFERRAL_ENABLED = true
|
|
108
|
+
/** GLM sessions are exactly one hour of wall-clock time, regardless of the
|
|
109
|
+
* global free-session length, so the "1 hour per referral per week" promise is
|
|
110
|
+
* exact. */
|
|
111
|
+
export const SAVANT_FREE_GLM_V52_SESSION_LENGTH_MS = 60 * 60 * 1000
|
|
112
|
+
export const SAVANT_FREE_LIMITED_SESSION_RESET_TIMEZONE =
|
|
113
|
+
SAVANT_FREE_PREMIUM_SESSION_RESET_TIMEZONE
|
|
114
|
+
export const SAVANT_FREE_LIMITED_SESSION_PERIOD =
|
|
115
|
+
SAVANT_FREE_PREMIUM_SESSION_PERIOD
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Streak rewards. Once a user reaches a `SAVANT_FREE_STREAK_REWARD_INTERVAL_DAYS`
|
|
119
|
+
* (7)-day daily streak, they earn:
|
|
120
|
+
* - +1 session in their primary daily pool (premium for full-access users,
|
|
121
|
+
* limited for limited-access) **every day** the streak stays at 7+; and
|
|
122
|
+
* - for full-access users, +1 GLM 5.2 session **each week**, granted on the
|
|
123
|
+
* exact 7/14/21… milestone days, on top of any referral entitlement.
|
|
124
|
+
*
|
|
125
|
+
* The bonus is implemented by raising the relevant pool's effective session
|
|
126
|
+
* limit for the period the reward lands in: the daily premium/limited bonus
|
|
127
|
+
* raises today's cap (re-granted each day the streak holds), and the weekly GLM
|
|
128
|
+
* bonus raises that Pacific week's cap. Milestones are 7 days apart and the GLM
|
|
129
|
+
* pool is a Pacific week, so GLM stays exactly one bonus per week — matching the
|
|
130
|
+
* "+1 GLM session per week" promise.
|
|
131
|
+
*/
|
|
132
|
+
export const SAVANT_FREE_STREAK_REWARD_INTERVAL_DAYS = 7
|
|
133
|
+
/** Master kill-switch for streak rewards. When false, streaks grant nothing
|
|
134
|
+
* and effective limits fall back to the base pool limits. */
|
|
135
|
+
export const SAVANT_FREE_STREAK_REWARDS_ENABLED = true
|
|
136
|
+
/** Sub-switch for the full-access GLM 5.2 portion of the streak reward. Lets the
|
|
137
|
+
* GLM perk be wound down independently of the premium/limited bonus (and of the
|
|
138
|
+
* separate referral-driven GLM program). */
|
|
139
|
+
export const SAVANT_FREE_STREAK_GLM_BONUS_ENABLED = true
|
|
140
|
+
/** Session-units granted per streak-reward grant, per pool. One whole session. */
|
|
141
|
+
export const SAVANT_FREE_STREAK_BONUS_SESSION_UNITS = 1
|
|
142
|
+
|
|
143
|
+
/** Which session pool a streak bonus credit applies to. `premium` and `limited`
|
|
144
|
+
* are the daily pools (full vs limited access); `glm` is the weekly GLM 5.2
|
|
145
|
+
* pool (full access only). */
|
|
146
|
+
export type SavantFreeStreakPool = 'premium' | 'limited' | 'glm'
|
|
147
|
+
/** Deprecated wire compatibility field. Session usage now resets at midnight
|
|
148
|
+
* Pacific time rather than using a rolling hourly window. */
|
|
149
|
+
export const SAVANT_FREE_PREMIUM_SESSION_WINDOW_HOURS = 24
|
|
150
|
+
export const SAVANT_FREE_LIMITED_SESSION_WINDOW_HOURS =
|
|
151
|
+
SAVANT_FREE_PREMIUM_SESSION_WINDOW_HOURS
|
|
152
|
+
const SAVANT_FREE_EASTERN_TIMEZONE = 'America/New_York'
|
|
153
|
+
const SAVANT_FREE_PACIFIC_TIMEZONE = 'America/Los_Angeles'
|
|
154
|
+
|
|
155
|
+
interface LocalTimeFormatOptions {
|
|
156
|
+
locale?: string
|
|
157
|
+
timeZone?: string
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Full-access savant-free models that benefit from spawning the gemini-thinker
|
|
161
|
+
* subagent for deeper reasoning. Covers every full-access picker model except
|
|
162
|
+
* the two limited-tier ones (DeepSeek V4 Flash, MiMo 2.5). Used by the CLI to
|
|
163
|
+
* toggle the gemini-thinker spawnable + prompts based on the user's pick, and
|
|
164
|
+
* by the server to admit gemini-thinker child requests against a parent
|
|
165
|
+
* session bound to one of these models. */
|
|
166
|
+
export const SAVANT_FREE_GEMINI_THINKER_PARENT_MODELS = new Set<string>([
|
|
167
|
+
SAVANT_FREE_KIMI_MODEL_ID,
|
|
168
|
+
SAVANT_FREE_DEEPSEEK_V4_PRO_MODEL_ID,
|
|
169
|
+
SAVANT_FREE_MIMO_V25_PRO_MODEL_ID,
|
|
170
|
+
SAVANT_FREE_MINIMAX_M3_MODEL_ID,
|
|
171
|
+
])
|
|
172
|
+
|
|
173
|
+
export function canSavantFreeModelSpawnGeminiThinker(modelId: string): boolean {
|
|
174
|
+
return SAVANT_FREE_GEMINI_THINKER_PARENT_MODELS.has(modelId)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Single source of truth for "this model collects data for training". A model
|
|
178
|
+
* that carries this exact `warning` is both shown the caveat in the picker AND
|
|
179
|
+
* has its chat-completion traces stored in free mode (see
|
|
180
|
+
* SAVANT_FREE_TRACED_MODEL_IDS, which is derived from it) — the two can't drift. */
|
|
181
|
+
export const SAVANT_FREE_DATA_COLLECTION_WARNING = 'Collects data for training'
|
|
182
|
+
|
|
183
|
+
const DEEPSEEK_V4_PRO_MODEL = {
|
|
184
|
+
id: SAVANT_FREE_DEEPSEEK_V4_PRO_MODEL_ID,
|
|
185
|
+
displayName: 'DeepSeek V4 Pro',
|
|
186
|
+
tagline: 'Smartest',
|
|
187
|
+
availability: 'always',
|
|
188
|
+
warning: SAVANT_FREE_DATA_COLLECTION_WARNING,
|
|
189
|
+
premium: true,
|
|
190
|
+
multimodal: false,
|
|
191
|
+
} as const satisfies SavantFreeModel
|
|
192
|
+
|
|
193
|
+
const MIMO_V25_PRO_MODEL = {
|
|
194
|
+
id: SAVANT_FREE_MIMO_V25_PRO_MODEL_ID,
|
|
195
|
+
displayName: 'MiMo 2.5 Pro',
|
|
196
|
+
tagline: 'Smartest & Slow',
|
|
197
|
+
availability: 'always',
|
|
198
|
+
premium: true,
|
|
199
|
+
multimodal: true,
|
|
200
|
+
} as const satisfies SavantFreeModel
|
|
201
|
+
|
|
202
|
+
const KIMI_MODEL = {
|
|
203
|
+
id: SAVANT_FREE_KIMI_MODEL_ID,
|
|
204
|
+
displayName: 'Kimi K2.7 Code',
|
|
205
|
+
tagline: 'Best for coding',
|
|
206
|
+
availability: 'always',
|
|
207
|
+
premium: true,
|
|
208
|
+
multimodal: true,
|
|
209
|
+
} as const satisfies SavantFreeModel
|
|
210
|
+
|
|
211
|
+
const HY3_MODEL = {
|
|
212
|
+
id: SAVANT_FREE_HY3_MODEL_ID,
|
|
213
|
+
displayName: 'HY3',
|
|
214
|
+
tagline: 'Trialing its performance',
|
|
215
|
+
availability: 'always',
|
|
216
|
+
premium: true,
|
|
217
|
+
multimodal: false,
|
|
218
|
+
experimental: true,
|
|
219
|
+
} as const satisfies SavantFreeModel
|
|
220
|
+
|
|
221
|
+
const HY3_ATLAS_MODEL = {
|
|
222
|
+
id: SAVANT_FREE_HY3_ATLAS_MODEL_ID,
|
|
223
|
+
displayName: 'HY3 Atlas',
|
|
224
|
+
tagline: 'Direct via Atlas Cloud',
|
|
225
|
+
availability: 'always',
|
|
226
|
+
premium: true,
|
|
227
|
+
multimodal: false,
|
|
228
|
+
experimental: true,
|
|
229
|
+
} as const satisfies SavantFreeModel
|
|
230
|
+
|
|
231
|
+
const MIMO_V25_MODEL = {
|
|
232
|
+
id: SAVANT_FREE_MIMO_V25_MODEL_ID,
|
|
233
|
+
displayName: 'MiMo 2.5',
|
|
234
|
+
tagline: 'Multimodal',
|
|
235
|
+
availability: 'always',
|
|
236
|
+
premium: false,
|
|
237
|
+
multimodal: true,
|
|
238
|
+
} as const satisfies SavantFreeModel
|
|
239
|
+
|
|
240
|
+
const DEEPSEEK_V4_FLASH_MODEL = {
|
|
241
|
+
id: SAVANT_FREE_DEEPSEEK_V4_FLASH_MODEL_ID,
|
|
242
|
+
displayName: 'DeepSeek V4 Flash',
|
|
243
|
+
tagline: 'Smart & Fast',
|
|
244
|
+
availability: 'always',
|
|
245
|
+
warning: SAVANT_FREE_DATA_COLLECTION_WARNING,
|
|
246
|
+
premium: false,
|
|
247
|
+
multimodal: false,
|
|
248
|
+
} as const satisfies SavantFreeModel
|
|
249
|
+
|
|
250
|
+
const MINIMAX_M3_MODEL = {
|
|
251
|
+
id: SAVANT_FREE_MINIMAX_M3_MODEL_ID,
|
|
252
|
+
displayName: 'MiniMax M3',
|
|
253
|
+
tagline: 'Smartest & Fastest',
|
|
254
|
+
availability: 'always',
|
|
255
|
+
// No data-collection warning: M3 is served by Fireworks (no provider-side
|
|
256
|
+
// training). Omitting the warning also keeps it out of SAVANT_FREE_TRACED_MODEL_IDS,
|
|
257
|
+
// so we don't store its traces either.
|
|
258
|
+
premium: false,
|
|
259
|
+
multimodal: true,
|
|
260
|
+
} as const satisfies SavantFreeModel
|
|
261
|
+
|
|
262
|
+
const GLM_V52_MODEL = {
|
|
263
|
+
id: SAVANT_FREE_GLM_V52_MODEL_ID,
|
|
264
|
+
displayName: 'GLM 5.2',
|
|
265
|
+
tagline: 'Unlock by referring friends',
|
|
266
|
+
availability: 'always',
|
|
267
|
+
// No data-collection warning: served by Fireworks (no provider-side
|
|
268
|
+
// training), and omitting it keeps GLM out of SAVANT_FREE_TRACED_MODEL_IDS.
|
|
269
|
+
// `premium` drives the "Premium" badge styling in the picker; GLM's real
|
|
270
|
+
// gate is its weekly referral-session pool, not the daily premium pool.
|
|
271
|
+
premium: true,
|
|
272
|
+
multimodal: false,
|
|
273
|
+
} as const satisfies SavantFreeModel
|
|
274
|
+
|
|
275
|
+
export const SUPPORTED_SAVANT_FREE_MODELS = [
|
|
276
|
+
DEEPSEEK_V4_PRO_MODEL,
|
|
277
|
+
MIMO_V25_PRO_MODEL,
|
|
278
|
+
KIMI_MODEL,
|
|
279
|
+
MINIMAX_M3_MODEL,
|
|
280
|
+
GLM_V52_MODEL,
|
|
281
|
+
DEEPSEEK_V4_FLASH_MODEL,
|
|
282
|
+
MIMO_V25_MODEL,
|
|
283
|
+
] as const satisfies readonly SavantFreeModel[]
|
|
284
|
+
|
|
285
|
+
// GLM 5.2 is intentionally NOT in SAVANT_FREE_MODELS: it isn't a freely-pickable
|
|
286
|
+
// grid model, it's a referral reward surfaced by the separate referral banner.
|
|
287
|
+
// It stays in SUPPORTED_SAVANT_FREE_MODELS so the session/chat layers accept it as
|
|
288
|
+
// a valid model id once the user's weekly entitlement admits them.
|
|
289
|
+
// Kimi returned to the picker as K2.7 Code: the K2.6 first-token stalls that
|
|
290
|
+
// got Kimi hidden were provider-side; K2.7 Code is served via Infron pinned to
|
|
291
|
+
// Alibaba us/eu (~3s warm-cache TTFT benchmarked).
|
|
292
|
+
export const SAVANT_FREE_MODELS = [
|
|
293
|
+
MINIMAX_M3_MODEL,
|
|
294
|
+
DEEPSEEK_V4_PRO_MODEL,
|
|
295
|
+
KIMI_MODEL,
|
|
296
|
+
...(SAVANT_FREE_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_PRO_MODEL] : []),
|
|
297
|
+
DEEPSEEK_V4_FLASH_MODEL,
|
|
298
|
+
...(SAVANT_FREE_ENABLE_MIMO_MODELS_IN_UI ? [MIMO_V25_MODEL] : []),
|
|
299
|
+
] as const satisfies readonly SavantFreeModel[]
|
|
300
|
+
|
|
301
|
+
export const SAVANT_FREE_PREMIUM_MODEL_IDS = [
|
|
302
|
+
SAVANT_FREE_DEEPSEEK_V4_PRO_MODEL_ID,
|
|
303
|
+
SAVANT_FREE_MIMO_V25_PRO_MODEL_ID,
|
|
304
|
+
SAVANT_FREE_KIMI_MODEL_ID,
|
|
305
|
+
] as const
|
|
306
|
+
|
|
307
|
+
/** SavantFree Web-only picker/support set. HY3 is intentionally excluded from
|
|
308
|
+
* SAVANT_FREE_MODELS and SUPPORTED_SAVANT_FREE_MODELS so CLI/Desktop savant-free
|
|
309
|
+
* surfaces do not pick it up during the initial web rollout. */
|
|
310
|
+
export const SAVANT_FREE_WEB_MODELS = [
|
|
311
|
+
HY3_MODEL,
|
|
312
|
+
GLM_V52_MODEL,
|
|
313
|
+
...SAVANT_FREE_MODELS,
|
|
314
|
+
] as const satisfies readonly SavantFreeModel[]
|
|
315
|
+
|
|
316
|
+
export const SAVANT_FREE_WEB_GOD_ONLY_MODELS = [
|
|
317
|
+
HY3_ATLAS_MODEL,
|
|
318
|
+
] as const satisfies readonly SavantFreeModel[]
|
|
319
|
+
|
|
320
|
+
export const SAVANT_FREE_WEB_ALL_MODELS = [
|
|
321
|
+
...SAVANT_FREE_WEB_GOD_ONLY_MODELS,
|
|
322
|
+
...SAVANT_FREE_WEB_MODELS,
|
|
323
|
+
] as const satisfies readonly SavantFreeModel[]
|
|
324
|
+
|
|
325
|
+
export const SAVANT_FREE_WEB_GOD_ONLY_MODEL_IDS = [
|
|
326
|
+
SAVANT_FREE_HY3_ATLAS_MODEL_ID,
|
|
327
|
+
] as const
|
|
328
|
+
|
|
329
|
+
export const SAVANT_FREE_WEB_PREMIUM_MODEL_IDS = [
|
|
330
|
+
...SAVANT_FREE_PREMIUM_MODEL_IDS,
|
|
331
|
+
SAVANT_FREE_HY3_MODEL_ID,
|
|
332
|
+
SAVANT_FREE_HY3_ATLAS_MODEL_ID,
|
|
333
|
+
] as const
|
|
334
|
+
|
|
335
|
+
/** Models unlocked by referrals, metered by the weekly GLM session pool rather
|
|
336
|
+
* than the daily premium pool. Kept separate from SAVANT_FREE_PREMIUM_MODEL_IDS
|
|
337
|
+
* so GLM never falls into the shared 5/day premium quota. */
|
|
338
|
+
export const SAVANT_FREE_GLM_V52_MODEL_IDS = [
|
|
339
|
+
SAVANT_FREE_GLM_V52_MODEL_ID,
|
|
340
|
+
] as const
|
|
341
|
+
|
|
342
|
+
/** Models that occupy the single per-user "premium-bucket" CONCURRENCY slot in
|
|
343
|
+
* SavantFree Desktop's multi-session mode: at most one of these may have an
|
|
344
|
+
* active session per user at a time, while unlimited-bucket models (DeepSeek V4
|
|
345
|
+
* Flash, MiMo 2.5) may run in any number of concurrent tabs. (On the LIMITED
|
|
346
|
+
* access tier the admission path puts EVERY model in the slot regardless of
|
|
347
|
+
* this list — limited users get one savant-free tab at a time; see
|
|
348
|
+
* `requestDesktopSession`.)
|
|
349
|
+
*
|
|
350
|
+
* This is strictly a CONCURRENCY bucket, NOT a quota bucket. It is intentionally
|
|
351
|
+
* a SUPERSET of SAVANT_FREE_PREMIUM_MODEL_IDS: it also includes MiniMax M3 and GLM
|
|
352
|
+
* 5.2, which are unlimited / weekly for QUOTA purposes but expensive enough that
|
|
353
|
+
* we cap them to one concurrent desktop session. Do NOT use this for the daily
|
|
354
|
+
* premium quota — that stays on isSavantFreePremiumModelId so M3/GLM never start
|
|
355
|
+
* burning the 5/day premium pool. */
|
|
356
|
+
export const SAVANT_FREE_DESKTOP_PREMIUM_BUCKET_MODEL_IDS = [
|
|
357
|
+
...SAVANT_FREE_PREMIUM_MODEL_IDS,
|
|
358
|
+
SAVANT_FREE_MINIMAX_M3_MODEL_ID,
|
|
359
|
+
SAVANT_FREE_GLM_V52_MODEL_ID,
|
|
360
|
+
] as const
|
|
361
|
+
|
|
362
|
+
/** True when a desktop tab running `model` under `accessTier` occupies the
|
|
363
|
+
* single per-user concurrency slot. On the full tier that's the premium
|
|
364
|
+
* bucket; on the LIMITED tier EVERY model occupies it — limited users get one
|
|
365
|
+
* savant-free tab at a time. THE shared definition of the one-tab rule: the
|
|
366
|
+
* server's admission path and the desktop's picker/soft-gate must both call
|
|
367
|
+
* this so the client can't drift from what the server enforces. */
|
|
368
|
+
export function occupiesSavantFreeDesktopSlot(
|
|
369
|
+
model: string,
|
|
370
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
371
|
+
): boolean {
|
|
372
|
+
return (
|
|
373
|
+
accessTier === 'limited' || isSavantFreeDesktopPremiumBucketModelId(model)
|
|
374
|
+
)
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/** Wire headers for the free-mode session endpoints
|
|
378
|
+
* (/api/v1/savant-free/session). Shared so the server handlers and every client
|
|
379
|
+
* (CLI, desktop) agree on the exact strings instead of redefining literals. */
|
|
380
|
+
export const SAVANT_FREE_INSTANCE_HEADER = 'x-savant-free-instance-id'
|
|
381
|
+
export const SAVANT_FREE_MODEL_HEADER = 'x-savant-free-model'
|
|
382
|
+
/** Trusted server-to-server header. Only the SavantCode API may honor this when
|
|
383
|
+
* the request authenticates as the SavantFree Web service account; browser and
|
|
384
|
+
* normal API callers must not be able to select another user's session row. */
|
|
385
|
+
export const SAVANT_FREE_ACTING_USER_HEADER = 'x-savant-free-acting-user-id'
|
|
386
|
+
/** Trusted SavantFree Web/Cloud session-proxy hint. Keeps the normal CLI GET
|
|
387
|
+
* response compact while letting the browser model picker request zero-usage
|
|
388
|
+
* quota snapshots so it can render accurate "N of M sessions" labels. */
|
|
389
|
+
export const SAVANT_FREE_INCLUDE_UNUSED_RATE_LIMITS_HEADER =
|
|
390
|
+
'x-savant-free-include-unused-rate-limits'
|
|
391
|
+
/** Set to '1' by SavantFree Desktop to opt into multi-session mode (concurrent
|
|
392
|
+
* per-tab sessions); absent for CLI/web, which keep one session per user. */
|
|
393
|
+
export const SAVANT_FREE_MULTI_SESSION_HEADER = 'x-savant-free-multi-session'
|
|
394
|
+
|
|
395
|
+
/** Models that accept image input. Used to decide whether uploaded images are
|
|
396
|
+
* forwarded to the model as real multimodal content. */
|
|
397
|
+
export const SAVANT_FREE_MULTIMODAL_MODEL_IDS = [
|
|
398
|
+
SAVANT_FREE_MIMO_V25_MODEL_ID,
|
|
399
|
+
SAVANT_FREE_MIMO_V25_PRO_MODEL_ID,
|
|
400
|
+
SAVANT_FREE_MINIMAX_M3_MODEL_ID,
|
|
401
|
+
SAVANT_FREE_KIMI_MODEL_ID,
|
|
402
|
+
] as const
|
|
403
|
+
|
|
404
|
+
export const SAVANT_FREE_WEB_MULTIMODAL_MODEL_IDS = [
|
|
405
|
+
...SAVANT_FREE_MULTIMODAL_MODEL_IDS,
|
|
406
|
+
] as const
|
|
407
|
+
|
|
408
|
+
/** Free-mode models whose chat-completion traces we store in our own dataset
|
|
409
|
+
* (chat_completion_traces). Derived from the picker's data-collection warning
|
|
410
|
+
* so the disclosure and the storage are one fact: a model is traced in free
|
|
411
|
+
* mode iff it shows the "Collects data for training" caveat. Every other free
|
|
412
|
+
* model (incl. MiniMax M3 on Fireworks) is NOT stored; paid, non-free-mode
|
|
413
|
+
* requests are unaffected and traced as usual. */
|
|
414
|
+
export const SAVANT_FREE_TRACED_MODEL_IDS = SUPPORTED_SAVANT_FREE_MODELS.filter(
|
|
415
|
+
(model: SavantFreeModel) =>
|
|
416
|
+
model.warning === SAVANT_FREE_DATA_COLLECTION_WARNING,
|
|
417
|
+
).map((model) => model.id)
|
|
418
|
+
|
|
419
|
+
export type SavantFreeModelId = (typeof SAVANT_FREE_MODELS)[number]['id']
|
|
420
|
+
export type SupportedSavantFreeModelId =
|
|
421
|
+
(typeof SUPPORTED_SAVANT_FREE_MODELS)[number]['id']
|
|
422
|
+
export type SavantFreePremiumModelId =
|
|
423
|
+
(typeof SAVANT_FREE_PREMIUM_MODEL_IDS)[number]
|
|
424
|
+
export type SavantFreeWebAllModelId =
|
|
425
|
+
(typeof SAVANT_FREE_WEB_ALL_MODELS)[number]['id']
|
|
426
|
+
export type SavantFreeWebPremiumModelId =
|
|
427
|
+
(typeof SAVANT_FREE_WEB_PREMIUM_MODEL_IDS)[number]
|
|
428
|
+
|
|
429
|
+
/** What new savant-free users see selected in the picker. MiniMax M3 is the
|
|
430
|
+
* strongest unlimited model (smartest & multimodal), so new users get good
|
|
431
|
+
* quality without burning the 5/day premium quota on routine messages.
|
|
432
|
+
* Callers that need a guaranteed-available id for resolution /
|
|
433
|
+
* auto-fallbacks should use FALLBACK_SAVANT_FREE_MODEL_ID instead. */
|
|
434
|
+
export const DEFAULT_SAVANT_FREE_MODEL_ID: SavantFreeModelId =
|
|
435
|
+
SAVANT_FREE_MINIMAX_M3_MODEL_ID
|
|
436
|
+
|
|
437
|
+
/** Always-available fallback used when the requested model can't be served
|
|
438
|
+
* right now (unknown id, deployment hours closed, etc.). Kept distinct from
|
|
439
|
+
* DEFAULT_SAVANT_FREE_MODEL_ID so a new user's "preferred default" can be the
|
|
440
|
+
* smartest model without auto-flipping anyone to a closed serverless model. */
|
|
441
|
+
export const FALLBACK_SAVANT_FREE_MODEL_ID: SavantFreeModelId =
|
|
442
|
+
SAVANT_FREE_DEEPSEEK_V4_FLASH_MODEL_ID
|
|
443
|
+
|
|
444
|
+
export const LIMITED_SAVANT_FREE_MODEL_ID: SavantFreeModelId =
|
|
445
|
+
SAVANT_FREE_DEEPSEEK_V4_FLASH_MODEL_ID
|
|
446
|
+
export const LIMITED_SAVANT_FREE_MODEL_IDS = [
|
|
447
|
+
SAVANT_FREE_DEEPSEEK_V4_FLASH_MODEL_ID,
|
|
448
|
+
SAVANT_FREE_MIMO_V25_MODEL_ID,
|
|
449
|
+
] as const
|
|
450
|
+
export const LIMITED_SAVANT_FREE_MODELS = LIMITED_SAVANT_FREE_MODEL_IDS.map(
|
|
451
|
+
(modelId) =>
|
|
452
|
+
SUPPORTED_SAVANT_FREE_MODELS.find((model) => model.id === modelId)!,
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
export type SavantFreeAccessTier = 'full' | 'limited'
|
|
456
|
+
|
|
457
|
+
/** Access tier carried in the SavantFree Web Convex JWT. Extends the CLI tier
|
|
458
|
+
* with 'blocked' (Tor / corroborated anonymous network): the app still
|
|
459
|
+
* loads, but every agent send is rejected server-side. */
|
|
460
|
+
export type SavantFreeWebAccessTier = SavantFreeAccessTier | 'blocked'
|
|
461
|
+
|
|
462
|
+
/** Temporary project-creation cap for outer-region (limited-tier) SavantFree Web
|
|
463
|
+
* users. A new project consumes one slot; the quota resets at midnight
|
|
464
|
+
* Pacific time. */
|
|
465
|
+
export const SAVANT_FREE_WEB_LIMITED_PROJECT_DAILY_LIMIT = 3
|
|
466
|
+
|
|
467
|
+
/** Models available to limited-region SavantFree Web users. They share the
|
|
468
|
+
* limited-region session pool; every other model remains geo-gated. */
|
|
469
|
+
export const SAVANT_FREE_WEB_GEO_EXEMPT_MODEL_IDS = [
|
|
470
|
+
SAVANT_FREE_DEEPSEEK_V4_FLASH_MODEL_ID,
|
|
471
|
+
SAVANT_FREE_MIMO_V25_MODEL_ID,
|
|
472
|
+
] as const
|
|
473
|
+
|
|
474
|
+
export function isSavantFreeWebGeoExemptModelId(
|
|
475
|
+
id: string | null | undefined,
|
|
476
|
+
): boolean {
|
|
477
|
+
if (!id) return false
|
|
478
|
+
return SAVANT_FREE_WEB_GEO_EXEMPT_MODEL_IDS.some((modelId) => modelId === id)
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/** Models a limited-tier SavantFree Web user may select. */
|
|
482
|
+
export const SAVANT_FREE_WEB_LIMITED_MODEL_IDS = [
|
|
483
|
+
...new Set<string>([
|
|
484
|
+
...SAVANT_FREE_WEB_GEO_EXEMPT_MODEL_IDS,
|
|
485
|
+
...LIMITED_SAVANT_FREE_MODEL_IDS,
|
|
486
|
+
]),
|
|
487
|
+
]
|
|
488
|
+
|
|
489
|
+
export function isSavantFreeWebModelAllowedForLimitedTier(
|
|
490
|
+
id: string | null | undefined,
|
|
491
|
+
): boolean {
|
|
492
|
+
if (!id) return false
|
|
493
|
+
return SAVANT_FREE_WEB_LIMITED_MODEL_IDS.some((modelId) => modelId === id)
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/** Coerce a limited-tier SavantFree Web selection (premium ids, stale
|
|
497
|
+
* localStorage values) to the allowed default (DeepSeek V4 Flash). */
|
|
498
|
+
export function resolveSavantFreeWebModelForLimitedTier(
|
|
499
|
+
id: string | null | undefined,
|
|
500
|
+
): string {
|
|
501
|
+
return isSavantFreeWebModelAllowedForLimitedTier(id)
|
|
502
|
+
? (id as string)
|
|
503
|
+
: LIMITED_SAVANT_FREE_MODEL_ID
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
export function getSavantFreeModelsForAccessTier(
|
|
507
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
508
|
+
): readonly SavantFreeModel[] {
|
|
509
|
+
if (accessTier === 'limited') return LIMITED_SAVANT_FREE_MODELS
|
|
510
|
+
return SAVANT_FREE_MODELS
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/** The model the picker highlights as the "recommended" hero so a new user can
|
|
514
|
+
* start with one Enter press without scanning the full list. Full access →
|
|
515
|
+
* MiniMax M3 (the smart, unlimited, multimodal default); limited → the
|
|
516
|
+
* always-available flash model. Both are unlimited, so the recommended pick
|
|
517
|
+
* never burns the daily premium quota. */
|
|
518
|
+
export function getRecommendedSavantFreeModelId(
|
|
519
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
520
|
+
): SupportedSavantFreeModelId {
|
|
521
|
+
return accessTier === 'limited'
|
|
522
|
+
? LIMITED_SAVANT_FREE_MODEL_ID
|
|
523
|
+
: DEFAULT_SAVANT_FREE_MODEL_ID
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
export function isSavantFreeModelAllowedForAccessTier(
|
|
527
|
+
model: string | null | undefined,
|
|
528
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
529
|
+
): boolean {
|
|
530
|
+
if (!model) return false
|
|
531
|
+
if (accessTier !== 'limited') return isSupportedSavantFreeModelId(model)
|
|
532
|
+
return LIMITED_SAVANT_FREE_MODEL_IDS.some((modelId) => modelId === model)
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/** Session admission is shared by CLI/Desktop/Web/Cloud. The CLI picker only
|
|
536
|
+
* uses SUPPORTED_SAVANT_FREE_MODELS, while Web/Cloud have a small set of
|
|
537
|
+
* trial/god-only model ids. Those Web-only ids still draw from the same
|
|
538
|
+
* session pools, so the admission layer accepts the union here without
|
|
539
|
+
* changing the CLI picker. */
|
|
540
|
+
export function isSavantFreeSessionModelId(
|
|
541
|
+
id: string | null | undefined,
|
|
542
|
+
): id is SupportedSavantFreeModelId | SavantFreeWebAllModelId {
|
|
543
|
+
return (
|
|
544
|
+
isSupportedSavantFreeModelId(id) ||
|
|
545
|
+
isSavantFreeWebModelId(id, {
|
|
546
|
+
includeGodOnly: true,
|
|
547
|
+
})
|
|
548
|
+
)
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
export function isSavantFreeSessionModelAllowedForAccessTier(
|
|
552
|
+
model: string | null | undefined,
|
|
553
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
554
|
+
): boolean {
|
|
555
|
+
if (!model) return false
|
|
556
|
+
if (accessTier !== 'limited') return isSavantFreeSessionModelId(model)
|
|
557
|
+
return LIMITED_SAVANT_FREE_MODEL_IDS.some((modelId) => modelId === model)
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
export function isSavantFreeModelId(
|
|
561
|
+
id: string | null | undefined,
|
|
562
|
+
): id is SavantFreeModelId {
|
|
563
|
+
if (!id) return false
|
|
564
|
+
return SAVANT_FREE_MODELS.some((m) => m.id === id)
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
export function isSavantFreeWebModelId(
|
|
568
|
+
id: string | null | undefined,
|
|
569
|
+
options: { includeGodOnly?: boolean } = {},
|
|
570
|
+
): id is SavantFreeWebAllModelId {
|
|
571
|
+
if (!id) return false
|
|
572
|
+
const models = options.includeGodOnly
|
|
573
|
+
? SAVANT_FREE_WEB_ALL_MODELS
|
|
574
|
+
: SAVANT_FREE_WEB_MODELS
|
|
575
|
+
return models.some((m) => m.id === id)
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
export function isSavantFreeWebGodOnlyModelId(
|
|
579
|
+
id: string | null | undefined,
|
|
580
|
+
): boolean {
|
|
581
|
+
if (!id) return false
|
|
582
|
+
return SAVANT_FREE_WEB_GOD_ONLY_MODEL_IDS.some((modelId) => modelId === id)
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
export function resolveSavantFreeModel(
|
|
586
|
+
id: string | null | undefined,
|
|
587
|
+
): SavantFreeModelId {
|
|
588
|
+
return isSavantFreeModelId(id) ? id : FALLBACK_SAVANT_FREE_MODEL_ID
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
export function resolveSavantFreeWebModel(
|
|
592
|
+
id: string | null | undefined,
|
|
593
|
+
options: { includeGodOnly?: boolean } = {},
|
|
594
|
+
): SavantFreeWebAllModelId {
|
|
595
|
+
return isSavantFreeWebModelId(id, options)
|
|
596
|
+
? id
|
|
597
|
+
: (FALLBACK_SAVANT_FREE_MODEL_ID as SavantFreeWebAllModelId)
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export function resolveSavantFreeModelForAccessTier(
|
|
601
|
+
id: string | null | undefined,
|
|
602
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
603
|
+
): SupportedSavantFreeModelId {
|
|
604
|
+
if (accessTier === 'limited') {
|
|
605
|
+
return isSavantFreeModelAllowedForAccessTier(id, accessTier)
|
|
606
|
+
? (id as SupportedSavantFreeModelId)
|
|
607
|
+
: LIMITED_SAVANT_FREE_MODEL_ID
|
|
608
|
+
}
|
|
609
|
+
const resolved = resolveSupportedSavantFreeModel(id)
|
|
610
|
+
return isSavantFreeModelAllowedForAccessTier(resolved, accessTier)
|
|
611
|
+
? resolved
|
|
612
|
+
: FALLBACK_SAVANT_FREE_MODEL_ID
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
export function resolveSavantFreeSessionModelForAccessTier(
|
|
616
|
+
id: string | null | undefined,
|
|
617
|
+
accessTier: SavantFreeAccessTier | null | undefined,
|
|
618
|
+
): SupportedSavantFreeModelId | SavantFreeWebAllModelId {
|
|
619
|
+
if (accessTier === 'limited') {
|
|
620
|
+
return isSavantFreeSessionModelAllowedForAccessTier(id, accessTier)
|
|
621
|
+
? (id as SupportedSavantFreeModelId)
|
|
622
|
+
: LIMITED_SAVANT_FREE_MODEL_ID
|
|
623
|
+
}
|
|
624
|
+
return isSavantFreeSessionModelId(id)
|
|
625
|
+
? id
|
|
626
|
+
: (FALLBACK_SAVANT_FREE_MODEL_ID as SupportedSavantFreeModelId)
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
export function isSupportedSavantFreeModelId(
|
|
630
|
+
id: string | null | undefined,
|
|
631
|
+
): id is SupportedSavantFreeModelId {
|
|
632
|
+
if (!id) return false
|
|
633
|
+
return SUPPORTED_SAVANT_FREE_MODELS.some((m) => m.id === id)
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/**
|
|
637
|
+
* Match a model id against a base id, tolerating the dated provider snapshot
|
|
638
|
+
* suffix OpenRouter (and our own routing) appends, e.g.
|
|
639
|
+
* `google/gemini-3.1-pro-preview-20260219` for base `google/gemini-3.1-pro-preview`.
|
|
640
|
+
* Mirrors the suffix logic in `isFreeModeAllowedAgentModel` (free-agents.ts) —
|
|
641
|
+
* the two MUST stay in sync. Only a `-YYYYMMDD`-style suffix matches, so e.g.
|
|
642
|
+
* `mimo-v2.5-pro` never matches the base `mimo-v2.5`.
|
|
643
|
+
*/
|
|
644
|
+
export function isMatchingModelId(
|
|
645
|
+
candidate: string | null | undefined,
|
|
646
|
+
baseId: string,
|
|
647
|
+
): boolean {
|
|
648
|
+
if (!candidate) return false
|
|
649
|
+
if (candidate === baseId) return true
|
|
650
|
+
const prefix = baseId + '-'
|
|
651
|
+
if (!candidate.startsWith(prefix)) return false
|
|
652
|
+
return /^\d{6,8}(?:$|[-:])/.test(candidate.slice(prefix.length))
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/** Whether the requested model is Gemini Pro, tolerating the dated snapshot
|
|
656
|
+
* suffix. Use this instead of `=== SAVANT_FREE_GEMINI_PRO_MODEL_ID` so a caller
|
|
657
|
+
* can't dodge a Gemini gate by sending the dated id. */
|
|
658
|
+
export function isSavantFreeGeminiProModelId(
|
|
659
|
+
id: string | null | undefined,
|
|
660
|
+
): boolean {
|
|
661
|
+
return isMatchingModelId(id, SAVANT_FREE_GEMINI_PRO_MODEL_ID)
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
export function isSavantFreePremiumModelId(
|
|
665
|
+
id: string | null | undefined,
|
|
666
|
+
): id is SavantFreePremiumModelId {
|
|
667
|
+
if (!id) return false
|
|
668
|
+
// Suffix-tolerant: a dated variant of a premium id (e.g. a dated Kimi) must
|
|
669
|
+
// still count as premium so it can't dodge the premium daily rate cap.
|
|
670
|
+
return SAVANT_FREE_PREMIUM_MODEL_IDS.some((modelId) =>
|
|
671
|
+
isMatchingModelId(id, modelId),
|
|
672
|
+
)
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
export function isSavantFreeWebPremiumModelId(
|
|
676
|
+
id: string | null | undefined,
|
|
677
|
+
): id is SavantFreeWebPremiumModelId {
|
|
678
|
+
if (!id) return false
|
|
679
|
+
return SAVANT_FREE_WEB_PREMIUM_MODEL_IDS.some((modelId) =>
|
|
680
|
+
isMatchingModelId(id, modelId),
|
|
681
|
+
)
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
export function isSavantFreeSessionPremiumModelId(
|
|
685
|
+
id: string | null | undefined,
|
|
686
|
+
): boolean {
|
|
687
|
+
return isSavantFreeWebPremiumModelId(id)
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
/** Whether `model` occupies the one-per-user SavantFree Desktop premium
|
|
691
|
+
* CONCURRENCY slot (premium models + MiniMax M3 + GLM 5.2). Suffix-tolerant
|
|
692
|
+
* (dated snapshots) like the other model predicates so a dated variant can't
|
|
693
|
+
* dodge the cap. Distinct from isSavantFreePremiumModelId, which gates the daily
|
|
694
|
+
* premium QUOTA and must NOT include M3/GLM. */
|
|
695
|
+
export function isSavantFreeDesktopPremiumBucketModelId(
|
|
696
|
+
id: string | null | undefined,
|
|
697
|
+
): boolean {
|
|
698
|
+
if (!id) return false
|
|
699
|
+
return SAVANT_FREE_DESKTOP_PREMIUM_BUCKET_MODEL_IDS.some((modelId) =>
|
|
700
|
+
isMatchingModelId(id, modelId),
|
|
701
|
+
)
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/** Whether the requested model is the GLM 5.2 referral reward, tolerating the
|
|
705
|
+
* dated snapshot suffix. GLM is metered by the weekly referral-session pool
|
|
706
|
+
* rather than the daily premium pool, so callers branch on this before the
|
|
707
|
+
* premium check. */
|
|
708
|
+
export function isSavantFreeGlmV52ModelId(
|
|
709
|
+
id: string | null | undefined,
|
|
710
|
+
): boolean {
|
|
711
|
+
return SAVANT_FREE_GLM_V52_MODEL_IDS.some((modelId) =>
|
|
712
|
+
isMatchingModelId(id, modelId),
|
|
713
|
+
)
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
export function isSavantFreeMultimodalModelId(
|
|
717
|
+
id: string | null | undefined,
|
|
718
|
+
): boolean {
|
|
719
|
+
if (!id) return false
|
|
720
|
+
return SAVANT_FREE_MULTIMODAL_MODEL_IDS.some((modelId) => modelId === id)
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
export function isSavantFreeWebMultimodalModelId(
|
|
724
|
+
id: string | null | undefined,
|
|
725
|
+
): boolean {
|
|
726
|
+
if (!id) return false
|
|
727
|
+
return SAVANT_FREE_WEB_MULTIMODAL_MODEL_IDS.some((modelId) => modelId === id)
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/** Whether we store our own chat-completion traces for this free-mode model.
|
|
731
|
+
* See SAVANT_FREE_TRACED_MODEL_IDS. */
|
|
732
|
+
export function isSavantFreeTracedModelId(
|
|
733
|
+
id: string | null | undefined,
|
|
734
|
+
): boolean {
|
|
735
|
+
if (!id) return false
|
|
736
|
+
return SAVANT_FREE_TRACED_MODEL_IDS.some((modelId) => modelId === id)
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
export function resolveSupportedSavantFreeModel(
|
|
740
|
+
id: string | null | undefined,
|
|
741
|
+
): SupportedSavantFreeModelId {
|
|
742
|
+
return isSupportedSavantFreeModelId(id) ? id : FALLBACK_SAVANT_FREE_MODEL_ID
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
export function getSavantFreeModel(id: string): SavantFreeModel {
|
|
746
|
+
return (
|
|
747
|
+
SUPPORTED_SAVANT_FREE_MODELS.find((m) => m.id === id) ??
|
|
748
|
+
SAVANT_FREE_MODELS.find((m) => m.id === FALLBACK_SAVANT_FREE_MODEL_ID)!
|
|
749
|
+
)
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
export function getSavantFreeWebModel(id: string): SavantFreeModel {
|
|
753
|
+
return (
|
|
754
|
+
SAVANT_FREE_WEB_ALL_MODELS.find((m) => m.id === id) ??
|
|
755
|
+
SAVANT_FREE_WEB_ALL_MODELS.find(
|
|
756
|
+
(m) => m.id === FALLBACK_SAVANT_FREE_MODEL_ID,
|
|
757
|
+
)!
|
|
758
|
+
)
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
function getNextSavantFreeDeploymentStart(now: Date): Date {
|
|
762
|
+
const easternNow = getZonedParts(now, SAVANT_FREE_EASTERN_TIMEZONE)
|
|
763
|
+
const isBeforeTodayOpen = easternNow.hour < 9
|
|
764
|
+
|
|
765
|
+
const offset = isBeforeTodayOpen ? 0 : 1
|
|
766
|
+
|
|
767
|
+
return getUtcForZonedTime(
|
|
768
|
+
addDaysToYmd(easternNow.year, easternNow.month, easternNow.day, offset),
|
|
769
|
+
SAVANT_FREE_EASTERN_TIMEZONE,
|
|
770
|
+
9,
|
|
771
|
+
0,
|
|
772
|
+
)
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
function getCurrentSavantFreeDeploymentEnd(now: Date): Date {
|
|
776
|
+
const pacificNow = getZonedParts(now, SAVANT_FREE_PACIFIC_TIMEZONE)
|
|
777
|
+
return getUtcForZonedTime(pacificNow, SAVANT_FREE_PACIFIC_TIMEZONE, 17, 0)
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
function isSameLocalDay(left: Date, right: Date, timeZone?: string): boolean {
|
|
781
|
+
const formatter = new Intl.DateTimeFormat('en-CA', {
|
|
782
|
+
timeZone,
|
|
783
|
+
year: 'numeric',
|
|
784
|
+
month: '2-digit',
|
|
785
|
+
day: '2-digit',
|
|
786
|
+
})
|
|
787
|
+
return formatter.format(left) === formatter.format(right)
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
function formatLocalTime(
|
|
791
|
+
date: Date,
|
|
792
|
+
referenceNow: Date,
|
|
793
|
+
options: LocalTimeFormatOptions = {},
|
|
794
|
+
): string {
|
|
795
|
+
const shouldShowWeekday = !isSameLocalDay(
|
|
796
|
+
date,
|
|
797
|
+
referenceNow,
|
|
798
|
+
options.timeZone,
|
|
799
|
+
)
|
|
800
|
+
return new Intl.DateTimeFormat(options.locale, {
|
|
801
|
+
timeZone: options.timeZone,
|
|
802
|
+
weekday: shouldShowWeekday ? 'short' : undefined,
|
|
803
|
+
hour: 'numeric',
|
|
804
|
+
minute: '2-digit',
|
|
805
|
+
}).format(date)
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
export function getSavantFreeDeploymentAvailabilityLabel(
|
|
809
|
+
now: Date = new Date(),
|
|
810
|
+
options: LocalTimeFormatOptions = {},
|
|
811
|
+
): string {
|
|
812
|
+
if (isSavantFreeDeploymentHours(now)) {
|
|
813
|
+
const closesAt = getCurrentSavantFreeDeploymentEnd(now)
|
|
814
|
+
return `until ${formatLocalTime(closesAt, now, options)}`
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
const opensAt = getNextSavantFreeDeploymentStart(now)
|
|
818
|
+
return `opens ${formatLocalTime(opensAt, now, options)}`
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
export function isSavantFreeDeploymentHours(now: Date = new Date()): boolean {
|
|
822
|
+
const eastern = getZonedParts(now, SAVANT_FREE_EASTERN_TIMEZONE)
|
|
823
|
+
const pacific = getZonedParts(now, SAVANT_FREE_PACIFIC_TIMEZONE)
|
|
824
|
+
return (
|
|
825
|
+
eastern.hour * 60 + eastern.minute >= 9 * 60 &&
|
|
826
|
+
pacific.hour * 60 + pacific.minute < 17 * 60
|
|
827
|
+
)
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
export function isSavantFreeModelAvailable(
|
|
831
|
+
id: string,
|
|
832
|
+
now: Date = new Date(),
|
|
833
|
+
): boolean {
|
|
834
|
+
const model = SUPPORTED_SAVANT_FREE_MODELS.find((m) => m.id === id)
|
|
835
|
+
if (!model) return false
|
|
836
|
+
return model.availability === 'always' || isSavantFreeDeploymentHours(now)
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
export function isSavantFreeSessionModelAvailable(
|
|
840
|
+
id: string,
|
|
841
|
+
now: Date = new Date(),
|
|
842
|
+
): boolean {
|
|
843
|
+
const model = getSavantFreeWebModel(id)
|
|
844
|
+
return model.availability === 'always' || isSavantFreeDeploymentHours(now)
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
export function resolveAvailableSavantFreeModel(
|
|
848
|
+
id: string | null | undefined,
|
|
849
|
+
now: Date = new Date(),
|
|
850
|
+
): SavantFreeModelId {
|
|
851
|
+
const resolved = resolveSavantFreeModel(id)
|
|
852
|
+
return isSavantFreeModelAvailable(resolved, now)
|
|
853
|
+
? resolved
|
|
854
|
+
: FALLBACK_SAVANT_FREE_MODEL_ID
|
|
855
|
+
}
|