savant-code 0.0.19 → 0.0.21
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/README.md +402 -550
- package/{cli/release/index.js → index.js} +0 -0
- package/{cli/release-core/launcher.js → launcher.js} +138 -32
- package/package.json +44 -71
- package/.agents/skills/coding-csharp/SKILL.md +0 -82
- package/.agents/skills/coding-go/SKILL.md +0 -76
- package/.agents/skills/coding-java/SKILL.md +0 -79
- package/.agents/skills/coding-python/SKILL.md +0 -87
- package/.agents/skills/coding-rust/SKILL.md +0 -83
- package/.agents/skills/coding-typescript/SKILL.md +0 -90
- package/.agents/skills/release-workflow/SKILL.md +0 -69
- package/.bun-version +0 -1
- package/.commandcode/settings.json +0 -11
- package/.commandcode/taste/workflow/taste.md +0 -6
- package/.env.example +0 -95
- package/.gitattributes +0 -43
- package/.githooks/pre-push +0 -35
- package/.github/workflows/build-release-binaries.yml +0 -163
- package/.markdownlint.json +0 -42
- package/.markdownlintignore +0 -21
- package/.prettierignore +0 -9
- package/.prettierrc +0 -23
- package/.savantignore +0 -3
- package/AGENTS.md +0 -97
- package/ARCHITECTURE.md +0 -241
- package/CHANGELOG.md +0 -2631
- package/CONTRIBUTING.md +0 -88
- package/ECHO-freebuff.md +0 -22
- package/ECHO.md +0 -722
- package/FREEREADME.md +0 -35
- package/LEARNINGS.md +0 -345
- package/NOTICE +0 -15
- package/README.zh-CN.md +0 -479
- package/SECURITY.md +0 -8
- package/VERSION +0 -1
- package/WINDOWS.md +0 -238
- package/agents/README.md +0 -41
- package/agents/base-chat.ts +0 -44
- package/agents/basher.ts +0 -107
- package/agents/browser-use/browser-use.test.ts +0 -211
- package/agents/browser-use/browser-use.ts +0 -259
- package/agents/constants.ts +0 -1
- package/agents/context-pruner.ts +0 -1076
- package/agents/detective/detective.ts +0 -168
- package/agents/editor/best-of-n/best-of-n-selector2.ts +0 -148
- package/agents/editor/best-of-n/editor-implementor-gpt-5.ts +0 -7
- package/agents/editor/best-of-n/editor-implementor-opus.ts +0 -7
- package/agents/editor/best-of-n/editor-implementor.ts +0 -196
- package/agents/editor/best-of-n/editor-multi-prompt.ts +0 -265
- package/agents/file-explorer/directory-lister.ts +0 -92
- package/agents/file-explorer/glob-matcher.ts +0 -96
- package/agents/forge/forge.ts +0 -146
- package/agents/librarian/librarian.test.ts +0 -289
- package/agents/librarian/librarian.ts +0 -158
- package/agents/package.json +0 -11
- package/agents/recorder/recorder.ts +0 -104
- package/agents/researcher/researcher-docs.ts +0 -32
- package/agents/researcher/researcher-web.ts +0 -40
- package/agents/savant/savant-analyze.ts +0 -11
- package/agents/savant/savant-free-deepseek-flash.ts +0 -13
- package/agents/savant/savant-free-deepseek.ts +0 -13
- package/agents/savant/savant-free-evals.ts +0 -9
- package/agents/savant/savant-free-glm.ts +0 -13
- package/agents/savant/savant-free-kimi.ts +0 -13
- package/agents/savant/savant-free-mimo-pro.ts +0 -13
- package/agents/savant/savant-free-mimo.ts +0 -13
- package/agents/savant/savant-free-minimax-m3.ts +0 -13
- package/agents/savant/savant-free.ts +0 -9
- package/agents/savant/savant-scaffold.ts +0 -15
- package/agents/savant/savant.ts +0 -706
- package/agents/scout/scout.ts +0 -305
- package/agents/scribe/scribe.ts +0 -54
- package/agents/thinker/thinker-gemini.ts +0 -26
- package/agents/thinker/thinker-gpt.ts +0 -21
- package/agents/thinker/thinker-with-files-gemini.ts +0 -66
- package/agents/thinker/thinker.ts +0 -99
- package/agents/tmux-cli.ts +0 -724
- package/agents/tsconfig.json +0 -12
- package/agents/types/agent-definition.ts +0 -1
- package/agents/types/secret-agent-definition.ts +0 -103
- package/agents/types/tools.ts +0 -465
- package/agents/types/util-types.ts +0 -167
- package/agents/verifier/verifier.ts +0 -80
- package/art/savant-redesign.md +0 -7
- package/art/savant-text-graf.md +0 -5
- package/art/savant_ascii.md +0 -88
- package/assets/banner.png +0 -0
- package/bun.lock +0 -1979
- package/bunfig.toml +0 -7
- package/cli/README.md +0 -111
- package/cli/bunfig.toml +0 -2
- package/cli/cli_exit +0 -1
- package/cli/package.json +0 -66
- package/cli/release/README.md +0 -348
- package/cli/release/package.json +0 -56
- package/cli/release-core/README.md +0 -20
- package/cli/release-core/package.json +0 -4
- package/cli/release-core/prepare-package.js +0 -31
- package/cli/release-staging/README.md +0 -70
- package/cli/release-staging/index.js +0 -42
- package/cli/release-staging/package.json +0 -43
- package/cli/scripts/build-binary.ts +0 -469
- package/cli/scripts/clean.ts +0 -16
- package/cli/scripts/prebuild-agents.ts +0 -250
- package/cli/scripts/release.ts +0 -103
- package/cli/scripts/smoke-binary.ts +0 -280
- package/cli/scripts/test-sdk-file-hooks.sh +0 -87
- package/cli/scripts/validate-cli-with-tmux.sh +0 -43
- package/cli/src/__tests__/README.md +0 -256
- package/cli/src/__tests__/bash-mode.test.ts +0 -442
- package/cli/src/__tests__/cli-args.test.ts +0 -241
- package/cli/src/__tests__/e2e/first-time-login.test.ts +0 -173
- package/cli/src/__tests__/e2e/logout-relogin-flow.test.ts +0 -110
- package/cli/src/__tests__/e2e/returning-user-auth.test.ts +0 -111
- package/cli/src/__tests__/e2e-cli.test.ts +0 -185
- package/cli/src/__tests__/helpers/mock-api-client.ts +0 -64
- package/cli/src/__tests__/helpers/terminal-watchdog-fixture.ts +0 -50
- package/cli/src/__tests__/home-directory-detection.test.ts +0 -213
- package/cli/src/__tests__/integration/agent-toolnames-validation.test.ts +0 -63
- package/cli/src/__tests__/integration/api-integration.test.ts +0 -289
- package/cli/src/__tests__/integration/credentials-storage.test.ts +0 -453
- package/cli/src/__tests__/integration/local-agents.test.ts +0 -1187
- package/cli/src/__tests__/integration/login-flow-instrumentation.test.ts +0 -146
- package/cli/src/__tests__/integration/login-polling-working.test.ts +0 -287
- package/cli/src/__tests__/integration/usage-refresh-on-completion.test.ts +0 -177
- package/cli/src/__tests__/integration-tmux.test.ts +0 -186
- package/cli/src/__tests__/mocks/hover-toggle-controller.ts +0 -71
- package/cli/src/__tests__/path-completion.test.ts +0 -243
- package/cli/src/__tests__/project-files-chat-id.test.ts +0 -34
- package/cli/src/__tests__/release/proxy-http-get.test.ts +0 -670
- package/cli/src/__tests__/release/wrapper-safety.test.ts +0 -177
- package/cli/src/__tests__/rerender-perf.integration.test.ts +0 -283
- package/cli/src/__tests__/terminal-reset-sequences.test.ts +0 -36
- package/cli/src/__tests__/terminal-watchdog.test.ts +0 -114
- package/cli/src/__tests__/test-utils.ts +0 -266
- package/cli/src/__tests__/tmux-poc.ts +0 -150
- package/cli/src/__tests__/unit/agent-mode-toggle.test.ts +0 -138
- package/cli/src/__tests__/unit/copy-button.test.tsx +0 -188
- package/cli/src/__tests__/unit/create-run-config.test.ts +0 -77
- package/cli/src/__tests__/unit/publish-confirmation.test.ts +0 -70
- package/cli/src/__tests__/unit/segmented-control.test.ts +0 -167
- package/cli/src/__tests__/utils/env.test.ts +0 -210
- package/cli/src/__tests__/utils/project-picker.test.ts +0 -39
- package/cli/src/agents/bundled-agents.generated.d.ts +0 -14
- package/cli/src/agents/bundled-agents.generated.ts +0 -1962
- package/cli/src/app.tsx +0 -383
- package/cli/src/chat.tsx +0 -2008
- package/cli/src/cli-args.ts +0 -183
- package/cli/src/commands/__tests__/bash-command.test.ts +0 -449
- package/cli/src/commands/__tests__/command-args.test.ts +0 -325
- package/cli/src/commands/__tests__/copy-conversation.test.ts +0 -240
- package/cli/src/commands/__tests__/dev-command.test.ts +0 -128
- package/cli/src/commands/__tests__/diagnostics-command.test.ts +0 -35
- package/cli/src/commands/__tests__/image.test.ts +0 -99
- package/cli/src/commands/__tests__/init.test.ts +0 -479
- package/cli/src/commands/__tests__/loop-command.test.ts +0 -89
- package/cli/src/commands/__tests__/new-command-rotates-chat.test.ts +0 -87
- package/cli/src/commands/__tests__/permissions-command.test.ts +0 -93
- package/cli/src/commands/__tests__/process-diagnostics.test.ts +0 -54
- package/cli/src/commands/__tests__/prompt-builders.test.ts +0 -69
- package/cli/src/commands/__tests__/registry-gating.test.ts +0 -125
- package/cli/src/commands/__tests__/rewind-command.test.ts +0 -227
- package/cli/src/commands/__tests__/router-connect-chatgpt.test.ts +0 -72
- package/cli/src/commands/__tests__/router-input.test.ts +0 -302
- package/cli/src/commands/__tests__/router-provider-setup.test.ts +0 -180
- package/cli/src/commands/__tests__/savant-free-command-aliases.test.ts +0 -56
- package/cli/src/commands/ads.ts +0 -45
- package/cli/src/commands/command-registry.ts +0 -1112
- package/cli/src/commands/copy-conversation.ts +0 -386
- package/cli/src/commands/goal.ts +0 -87
- package/cli/src/commands/health-command.ts +0 -61
- package/cli/src/commands/help.ts +0 -13
- package/cli/src/commands/image.ts +0 -20
- package/cli/src/commands/init.ts +0 -121
- package/cli/src/commands/loop.ts +0 -182
- package/cli/src/commands/process-diagnostics.ts +0 -120
- package/cli/src/commands/prompt-builders.ts +0 -140
- package/cli/src/commands/publish.ts +0 -261
- package/cli/src/commands/rewind.ts +0 -130
- package/cli/src/commands/router-utils.ts +0 -80
- package/cli/src/commands/router.ts +0 -589
- package/cli/src/commands/telemetry.ts +0 -68
- package/cli/src/commands/usage.ts +0 -26
- package/cli/src/components/__tests__/ad-banner.test.tsx +0 -84
- package/cli/src/components/__tests__/block-helpers.test.tsx +0 -139
- package/cli/src/components/__tests__/clickable.test.tsx +0 -39
- package/cli/src/components/__tests__/grid-layout.integration.test.tsx +0 -365
- package/cli/src/components/__tests__/grid-layout.test.tsx +0 -1033
- package/cli/src/components/__tests__/markdown-content.test.tsx +0 -163
- package/cli/src/components/__tests__/message-block.completion.test.tsx +0 -104
- package/cli/src/components/__tests__/message-block.streaming.test.tsx +0 -78
- package/cli/src/components/__tests__/message-with-agents.test.tsx +0 -571
- package/cli/src/components/__tests__/multiline-input.test.tsx +0 -1129
- package/cli/src/components/__tests__/selectable-list.test.ts +0 -232
- package/cli/src/components/__tests__/shimmer-text.test.tsx +0 -32
- package/cli/src/components/__tests__/status-indicator.test.tsx +0 -184
- package/cli/src/components/__tests__/user-error-banner.test.tsx +0 -100
- package/cli/src/components/ad-banner.tsx +0 -351
- package/cli/src/components/agent-checklist.tsx +0 -385
- package/cli/src/components/agent-mode-toggle.tsx +0 -294
- package/cli/src/components/ask-user/__tests__/multiple-choice-form.test.ts +0 -432
- package/cli/src/components/ask-user/__tests__/validation.test.ts +0 -213
- package/cli/src/components/ask-user/components/accordion-question.tsx +0 -153
- package/cli/src/components/ask-user/components/custom-answer-input.tsx +0 -66
- package/cli/src/components/ask-user/components/options-list.tsx +0 -139
- package/cli/src/components/ask-user/components/question-header.tsx +0 -80
- package/cli/src/components/ask-user/components/question-option.tsx +0 -94
- package/cli/src/components/ask-user/constants.ts +0 -35
- package/cli/src/components/ask-user/index.tsx +0 -660
- package/cli/src/components/ask-user/utils/validation.ts +0 -85
- package/cli/src/components/attachment-card.tsx +0 -67
- package/cli/src/components/blocks/agent-block-grid.tsx +0 -58
- package/cli/src/components/blocks/agent-branch-item.tsx +0 -230
- package/cli/src/components/blocks/agent-branch-wrapper.tsx +0 -524
- package/cli/src/components/blocks/agent-list-branch.tsx +0 -77
- package/cli/src/components/blocks/ask-user-branch.tsx +0 -98
- package/cli/src/components/blocks/block-helpers.tsx +0 -257
- package/cli/src/components/blocks/blocks-renderer.tsx +0 -296
- package/cli/src/components/blocks/content-with-markdown.tsx +0 -34
- package/cli/src/components/blocks/copy-button.tsx +0 -106
- package/cli/src/components/blocks/copyable-block.tsx +0 -47
- package/cli/src/components/blocks/image-block.tsx +0 -128
- package/cli/src/components/blocks/implementor-row.tsx +0 -453
- package/cli/src/components/blocks/markdown-content.tsx +0 -360
- package/cli/src/components/blocks/markdown-renderables.tsx +0 -347
- package/cli/src/components/blocks/single-block.tsx +0 -210
- package/cli/src/components/blocks/thinking-block.tsx +0 -77
- package/cli/src/components/blocks/tool-block-group.tsx +0 -72
- package/cli/src/components/blocks/tool-branch.tsx +0 -196
- package/cli/src/components/blocks/user-content-copy.tsx +0 -171
- package/cli/src/components/bottom-banner.tsx +0 -145
- package/cli/src/components/build-mode-buttons.tsx +0 -110
- package/cli/src/components/button.tsx +0 -75
- package/cli/src/components/chat-header.tsx +0 -11
- package/cli/src/components/chat-history-screen.tsx +0 -417
- package/cli/src/components/chat-input-bar.tsx +0 -535
- package/cli/src/components/chatgpt-connect-banner.tsx +0 -234
- package/cli/src/components/clickable.tsx +0 -149
- package/cli/src/components/collapse-button.tsx +0 -36
- package/cli/src/components/command-palette.tsx +0 -166
- package/cli/src/components/copy-button.tsx +0 -219
- package/cli/src/components/dialog.tsx +0 -111
- package/cli/src/components/elapsed-timer.tsx +0 -56
- package/cli/src/components/error-boundary.tsx +0 -63
- package/cli/src/components/feedback-container.tsx +0 -206
- package/cli/src/components/feedback-icon-button.tsx +0 -89
- package/cli/src/components/feedback-input-mode.tsx +0 -352
- package/cli/src/components/file-attachment-card.tsx +0 -89
- package/cli/src/components/grid-layout.tsx +0 -83
- package/cli/src/components/help-banner.tsx +0 -136
- package/cli/src/components/highlighted-text.tsx +0 -52
- package/cli/src/components/image-card.tsx +0 -167
- package/cli/src/components/image-thumbnail.tsx +0 -112
- package/cli/src/components/input-cursor.tsx +0 -77
- package/cli/src/components/input-mode-banner.tsx +0 -70
- package/cli/src/components/load-previous-button.tsx +0 -48
- package/cli/src/components/login-modal.tsx +0 -450
- package/cli/src/components/message-block.tsx +0 -337
- package/cli/src/components/message-footer.tsx +0 -269
- package/cli/src/components/message-with-agents.tsx +0 -594
- package/cli/src/components/mode-divider.tsx +0 -43
- package/cli/src/components/model-picker.tsx +0 -371
- package/cli/src/components/multiline-input.tsx +0 -1276
- package/cli/src/components/out-of-credits-banner.tsx +0 -155
- package/cli/src/components/pending-attachments-banner.tsx +0 -125
- package/cli/src/components/pending-bash-message.tsx +0 -57
- package/cli/src/components/progress-bar.tsx +0 -81
- package/cli/src/components/project-picker-screen.tsx +0 -469
- package/cli/src/components/provider-picker.tsx +0 -139
- package/cli/src/components/publish-confirmation.tsx +0 -514
- package/cli/src/components/publish-container.tsx +0 -737
- package/cli/src/components/raised-pill.tsx +0 -89
- package/cli/src/components/renderers/plan-box.tsx +0 -70
- package/cli/src/components/review-screen.tsx +0 -114
- package/cli/src/components/rewind-picker.tsx +0 -276
- package/cli/src/components/right-sidebar.tsx +0 -296
- package/cli/src/components/savant-free-active-session-summary.tsx +0 -63
- package/cli/src/components/savant-free-landing-screen.tsx +0 -756
- package/cli/src/components/savant-free-model-selector.tsx +0 -815
- package/cli/src/components/savant-free-referral-banner.tsx +0 -423
- package/cli/src/components/savant-free-superseded-screen.tsx +0 -62
- package/cli/src/components/savant-ui/animation/pulse.tsx +0 -26
- package/cli/src/components/savant-ui/animation/typewriter.tsx +0 -40
- package/cli/src/components/savant-ui/branding.tsx +0 -59
- package/cli/src/components/savant-ui/data-display/badge.tsx +0 -52
- package/cli/src/components/savant-ui/data-display/code-block.tsx +0 -55
- package/cli/src/components/savant-ui/data-display/key-value.tsx +0 -34
- package/cli/src/components/savant-ui/data-display/sparkline.tsx +0 -42
- package/cli/src/components/savant-ui/data-display/timeline.tsx +0 -44
- package/cli/src/components/savant-ui/data-display/tree-view.tsx +0 -55
- package/cli/src/components/savant-ui/echo/__tests__/sidebar-collapse.test.tsx +0 -90
- package/cli/src/components/savant-ui/echo/agent-stack.tsx +0 -72
- package/cli/src/components/savant-ui/echo/agent-status.tsx +0 -66
- package/cli/src/components/savant-ui/echo/fid-card.tsx +0 -89
- package/cli/src/components/savant-ui/echo/fid-list.tsx +0 -68
- package/cli/src/components/savant-ui/echo/loop-status-panel.tsx +0 -64
- package/cli/src/components/savant-ui/echo/perfection-loop.tsx +0 -118
- package/cli/src/components/savant-ui/echo/phase-indicator.tsx +0 -68
- package/cli/src/components/savant-ui/echo/phase-info.ts +0 -72
- package/cli/src/components/savant-ui/echo/token-meter.tsx +0 -39
- package/cli/src/components/savant-ui/feedback/alert.tsx +0 -45
- package/cli/src/components/savant-ui/feedback/cost-tracker.tsx +0 -54
- package/cli/src/components/savant-ui/feedback/progress-bar.tsx +0 -71
- package/cli/src/components/savant-ui/feedback/spinner.tsx +0 -40
- package/cli/src/components/savant-ui/icon-theme-keys.ts +0 -67
- package/cli/src/components/savant-ui/icon.tsx +0 -53
- package/cli/src/components/savant-ui/index.ts +0 -75
- package/cli/src/components/savant-ui/input/select.tsx +0 -26
- package/cli/src/components/savant-ui/input/toggle.tsx +0 -28
- package/cli/src/components/savant-ui/layout/grid.tsx +0 -52
- package/cli/src/components/savant-ui/layout/header.tsx +0 -28
- package/cli/src/components/savant-ui/navigation/stepper.tsx +0 -41
- package/cli/src/components/savant-ui/primitives/key-hint.tsx +0 -45
- package/cli/src/components/savant-ui/primitives/key-value-row.tsx +0 -41
- package/cli/src/components/savant-ui/primitives/panel.tsx +0 -42
- package/cli/src/components/savant-ui/primitives/separator.tsx +0 -34
- package/cli/src/components/savant-ui/primitives/sidebar-section.tsx +0 -64
- package/cli/src/components/savant-ui/primitives/spacer.tsx +0 -13
- package/cli/src/components/savant-ui/primitives/stack.tsx +0 -35
- package/cli/src/components/savant-ui/theme.ts +0 -45
- package/cli/src/components/scroll-to-bottom-button.tsx +0 -34
- package/cli/src/components/segmented-control.tsx +0 -199
- package/cli/src/components/selectable-list.tsx +0 -249
- package/cli/src/components/selected-chips.tsx +0 -86
- package/cli/src/components/separator.tsx +0 -40
- package/cli/src/components/session-ended-banner.tsx +0 -183
- package/cli/src/components/shimmer-text.tsx +0 -254
- package/cli/src/components/status-bar.tsx +0 -279
- package/cli/src/components/subscription-limit-banner.tsx +0 -269
- package/cli/src/components/suggested-prompts.tsx +0 -184
- package/cli/src/components/suggestion-menu.tsx +0 -219
- package/cli/src/components/terminal-command-display.tsx +0 -152
- package/cli/src/components/terminal-link.tsx +0 -97
- package/cli/src/components/text-attachment-card.tsx +0 -77
- package/cli/src/components/thinking.tsx +0 -108
- package/cli/src/components/toast.tsx +0 -109
- package/cli/src/components/tools/__tests__/apply-patch.test.tsx +0 -97
- package/cli/src/components/tools/__tests__/code-search.test.tsx +0 -45
- package/cli/src/components/tools/__tests__/gravity-index.test.ts +0 -76
- package/cli/src/components/tools/__tests__/render-ui.test.tsx +0 -556
- package/cli/src/components/tools/__tests__/run-terminal-command.test.ts +0 -274
- package/cli/src/components/tools/__tests__/tool-call-item.test.tsx +0 -73
- package/cli/src/components/tools/apply-patch.tsx +0 -101
- package/cli/src/components/tools/code-search.tsx +0 -50
- package/cli/src/components/tools/composio.tsx +0 -140
- package/cli/src/components/tools/diff-viewer.tsx +0 -21
- package/cli/src/components/tools/glob.tsx +0 -66
- package/cli/src/components/tools/gravity-index.tsx +0 -80
- package/cli/src/components/tools/list-directory.tsx +0 -66
- package/cli/src/components/tools/read-docs.tsx +0 -36
- package/cli/src/components/tools/read-files.tsx +0 -97
- package/cli/src/components/tools/read-subtree.tsx +0 -40
- package/cli/src/components/tools/read-url.tsx +0 -32
- package/cli/src/components/tools/registry.ts +0 -131
- package/cli/src/components/tools/render-ui.tsx +0 -466
- package/cli/src/components/tools/run-terminal-command.tsx +0 -86
- package/cli/src/components/tools/skill.tsx +0 -26
- package/cli/src/components/tools/str-replace.tsx +0 -77
- package/cli/src/components/tools/suggest-followups.tsx +0 -373
- package/cli/src/components/tools/task-completed.tsx +0 -16
- package/cli/src/components/tools/tool-call-item.tsx +0 -163
- package/cli/src/components/tools/types.ts +0 -100
- package/cli/src/components/tools/web-search.tsx +0 -32
- package/cli/src/components/tools/write-file.tsx +0 -20
- package/cli/src/components/tools/write-todos.tsx +0 -105
- package/cli/src/components/top-banner.tsx +0 -187
- package/cli/src/components/usage-banner.tsx +0 -296
- package/cli/src/components/user-error-banner.tsx +0 -54
- package/cli/src/components/validation-error-popover.tsx +0 -191
- package/cli/src/data/slash-commands.ts +0 -306
- package/cli/src/hooks/__tests__/holds-live-savant-free-slot.test.ts +0 -49
- package/cli/src/hooks/__tests__/run-outcome.test.ts +0 -178
- package/cli/src/hooks/__tests__/session-fetch-signal.test.ts +0 -45
- package/cli/src/hooks/__tests__/use-activity-query.test.ts +0 -810
- package/cli/src/hooks/__tests__/use-ask-user-bridge.test.ts +0 -175
- package/cli/src/hooks/__tests__/use-auth-query.test.ts +0 -21
- package/cli/src/hooks/__tests__/use-chat-messages-collapse.test.ts +0 -96
- package/cli/src/hooks/__tests__/use-connection-status.test.ts +0 -112
- package/cli/src/hooks/__tests__/use-directory-browser.test.ts +0 -215
- package/cli/src/hooks/__tests__/use-gravity-ad.test.ts +0 -73
- package/cli/src/hooks/__tests__/use-grid-layout.test.ts +0 -346
- package/cli/src/hooks/__tests__/use-input-history.test.ts +0 -704
- package/cli/src/hooks/__tests__/use-loop-scheduler.test.ts +0 -247
- package/cli/src/hooks/__tests__/use-path-tab-completion.test.ts +0 -324
- package/cli/src/hooks/__tests__/use-queue-controls.test.ts +0 -68
- package/cli/src/hooks/__tests__/use-searchable-list.test.ts +0 -364
- package/cli/src/hooks/__tests__/use-send-message-timer.test.ts +0 -146
- package/cli/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +0 -364
- package/cli/src/hooks/__tests__/use-suggestion-engine.test.ts +0 -485
- package/cli/src/hooks/__tests__/use-terminal-focus.test.ts +0 -66
- package/cli/src/hooks/__tests__/use-terminal-layout.test.ts +0 -675
- package/cli/src/hooks/__tests__/use-timeout.test.ts +0 -330
- package/cli/src/hooks/__tests__/use-usage-query.test.ts +0 -526
- package/cli/src/hooks/__tests__/use-user-details-query.test.ts +0 -225
- package/cli/src/hooks/helpers/__tests__/send-message.test.ts +0 -1851
- package/cli/src/hooks/helpers/send-message.ts +0 -553
- package/cli/src/hooks/run-outcome.ts +0 -64
- package/cli/src/hooks/stream-state.ts +0 -106
- package/cli/src/hooks/use-activity-query.ts +0 -696
- package/cli/src/hooks/use-agent-validation.ts +0 -80
- package/cli/src/hooks/use-ask-user-bridge.ts +0 -102
- package/cli/src/hooks/use-auth-query.ts +0 -261
- package/cli/src/hooks/use-auth-state.ts +0 -155
- package/cli/src/hooks/use-chat-input.ts +0 -87
- package/cli/src/hooks/use-chat-keyboard.ts +0 -325
- package/cli/src/hooks/use-chat-messages.ts +0 -273
- package/cli/src/hooks/use-chat-state.ts +0 -219
- package/cli/src/hooks/use-chat-streaming.ts +0 -270
- package/cli/src/hooks/use-chat-ui.ts +0 -136
- package/cli/src/hooks/use-clipboard.ts +0 -154
- package/cli/src/hooks/use-connection-status.ts +0 -156
- package/cli/src/hooks/use-directory-browser.ts +0 -88
- package/cli/src/hooks/use-elapsed-time.ts +0 -116
- package/cli/src/hooks/use-event.ts +0 -36
- package/cli/src/hooks/use-exit-handler.ts +0 -108
- package/cli/src/hooks/use-fetch-login-url.ts +0 -65
- package/cli/src/hooks/use-fids.ts +0 -48
- package/cli/src/hooks/use-fingerprint.ts +0 -64
- package/cli/src/hooks/use-gravity-ad.ts +0 -688
- package/cli/src/hooks/use-grid-layout.ts +0 -78
- package/cli/src/hooks/use-input-history.ts +0 -173
- package/cli/src/hooks/use-login-keyboard-handlers.ts +0 -74
- package/cli/src/hooks/use-login-polling.ts +0 -120
- package/cli/src/hooks/use-logo.tsx +0 -178
- package/cli/src/hooks/use-loop-scheduler.ts +0 -481
- package/cli/src/hooks/use-message-queue.ts +0 -301
- package/cli/src/hooks/use-now.ts +0 -20
- package/cli/src/hooks/use-path-tab-completion.ts +0 -88
- package/cli/src/hooks/use-publish-mutation.ts +0 -60
- package/cli/src/hooks/use-queue-controls.ts +0 -70
- package/cli/src/hooks/use-queue-ui.ts +0 -55
- package/cli/src/hooks/use-savant-free-ctrl-c-exit.ts +0 -23
- package/cli/src/hooks/use-savant-free-session-progress.ts +0 -34
- package/cli/src/hooks/use-savant-free-session.ts +0 -679
- package/cli/src/hooks/use-savant-free-streak-query.ts +0 -72
- package/cli/src/hooks/use-scaffold-confirm.ts +0 -62
- package/cli/src/hooks/use-scaffold-revert-subscriber.ts +0 -66
- package/cli/src/hooks/use-scroll-management.ts +0 -182
- package/cli/src/hooks/use-searchable-list.ts +0 -99
- package/cli/src/hooks/use-send-message.ts +0 -1038
- package/cli/src/hooks/use-sheen-animation.tsx +0 -88
- package/cli/src/hooks/use-subscription-query.ts +0 -106
- package/cli/src/hooks/use-suggestion-engine.ts +0 -793
- package/cli/src/hooks/use-terminal-breakpoints.ts +0 -77
- package/cli/src/hooks/use-terminal-dimensions.ts +0 -50
- package/cli/src/hooks/use-terminal-focus.ts +0 -146
- package/cli/src/hooks/use-terminal-layout.ts +0 -189
- package/cli/src/hooks/use-theme.tsx +0 -140
- package/cli/src/hooks/use-timeout.ts +0 -88
- package/cli/src/hooks/use-toast.ts +0 -114
- package/cli/src/hooks/use-update-preference.ts +0 -77
- package/cli/src/hooks/use-usage-monitor.ts +0 -59
- package/cli/src/hooks/use-usage-query.ts +0 -138
- package/cli/src/hooks/use-user-details-query.ts +0 -104
- package/cli/src/hooks/use-why-did-you-update.ts +0 -178
- package/cli/src/index.tsx +0 -484
- package/cli/src/init/__tests__/init-direnv.test.ts +0 -597
- package/cli/src/init/init-app.ts +0 -54
- package/cli/src/init/init-direnv.ts +0 -133
- package/cli/src/login/constants.ts +0 -71
- package/cli/src/login/login-flow.ts +0 -224
- package/cli/src/login/plain-login.ts +0 -107
- package/cli/src/login/utils.ts +0 -183
- package/cli/src/native/ripgrep.ts +0 -82
- package/cli/src/polyfills/bun-strip-ansi.ts +0 -12
- package/cli/src/pre-init/load-dev-env.ts +0 -98
- package/cli/src/pre-init/tree-sitter-wasm.ts +0 -98
- package/cli/src/project-files.ts +0 -102
- package/cli/src/state/__tests__/chat-store-focus.test.ts +0 -22
- package/cli/src/state/__tests__/feedback-store.test.ts +0 -260
- package/cli/src/state/chat-history-store.ts +0 -27
- package/cli/src/state/chat-store.ts +0 -791
- package/cli/src/state/feedback-store.ts +0 -162
- package/cli/src/state/gateway-catalog-store.ts +0 -45
- package/cli/src/state/login-store.ts +0 -150
- package/cli/src/state/message-block-store.ts +0 -143
- package/cli/src/state/model-picker-store.ts +0 -67
- package/cli/src/state/provider-picker-store.ts +0 -53
- package/cli/src/state/publish-store.ts +0 -141
- package/cli/src/state/review-store.ts +0 -24
- package/cli/src/state/rewind-picker-store.ts +0 -74
- package/cli/src/state/savant-free-model-store.ts +0 -59
- package/cli/src/state/savant-free-session-store.ts +0 -32
- package/cli/src/test-setup.ts +0 -20
- package/cli/src/testing/env.ts +0 -46
- package/cli/src/types/chat-state.ts +0 -15
- package/cli/src/types/chat.ts +0 -242
- package/cli/src/types/contracts/send-message.ts +0 -16
- package/cli/src/types/env.ts +0 -107
- package/cli/src/types/function-params.ts +0 -35
- package/cli/src/types/opentui-augmentation.d.ts +0 -11
- package/cli/src/types/react19-compat.d.ts +0 -19
- package/cli/src/types/savant-free-session.ts +0 -17
- package/cli/src/types/store.ts +0 -112
- package/cli/src/types/theme-system.ts +0 -194
- package/cli/src/types/utils.ts +0 -3
- package/cli/src/utils/__tests__/activity-tracker.test.ts +0 -440
- package/cli/src/utils/__tests__/agent-display.test.ts +0 -139
- package/cli/src/utils/__tests__/analytics-client.test.ts +0 -311
- package/cli/src/utils/__tests__/anonymous-id.test.ts +0 -74
- package/cli/src/utils/__tests__/arrays.test.ts +0 -264
- package/cli/src/utils/__tests__/bash-context-processor.test.ts +0 -38
- package/cli/src/utils/__tests__/block-processor.test.ts +0 -690
- package/cli/src/utils/__tests__/chat-history.test.ts +0 -247
- package/cli/src/utils/__tests__/chat-input-key-intercept.test.ts +0 -40
- package/cli/src/utils/__tests__/chat-layout.test.ts +0 -32
- package/cli/src/utils/__tests__/chat-meta.test.ts +0 -160
- package/cli/src/utils/__tests__/chatgpt-oauth.test.ts +0 -50
- package/cli/src/utils/__tests__/clipboard.test.ts +0 -998
- package/cli/src/utils/__tests__/code-search-summary.test.ts +0 -84
- package/cli/src/utils/__tests__/collapse-helpers.test.ts +0 -1272
- package/cli/src/utils/__tests__/error-handling.test.ts +0 -611
- package/cli/src/utils/__tests__/feedback-helpers.test.ts +0 -452
- package/cli/src/utils/__tests__/feedback-submission.test.ts +0 -26
- package/cli/src/utils/__tests__/fetch-usage.test.ts +0 -355
- package/cli/src/utils/__tests__/fingerprint.test.ts +0 -147
- package/cli/src/utils/__tests__/format-elapsed-time.test.ts +0 -103
- package/cli/src/utils/__tests__/format-timeout.test.ts +0 -87
- package/cli/src/utils/__tests__/image-dimensions.test.ts +0 -243
- package/cli/src/utils/__tests__/image-processor.test.ts +0 -250
- package/cli/src/utils/__tests__/implementor-helpers.test.ts +0 -1457
- package/cli/src/utils/__tests__/keyboard-actions.test.ts +0 -686
- package/cli/src/utils/__tests__/layout-helpers.test.ts +0 -36
- package/cli/src/utils/__tests__/lazy-response-ads.test.ts +0 -167
- package/cli/src/utils/__tests__/logger-sanitize-secrets.test.ts +0 -80
- package/cli/src/utils/__tests__/markdown-renderer.test.tsx +0 -518
- package/cli/src/utils/__tests__/markdown-streaming.test.ts +0 -64
- package/cli/src/utils/__tests__/message-block-helpers.test.ts +0 -1197
- package/cli/src/utils/__tests__/message-updater.test.ts +0 -659
- package/cli/src/utils/__tests__/ollama-onboarding.test.ts +0 -239
- package/cli/src/utils/__tests__/openrouter-models.test.ts +0 -295
- package/cli/src/utils/__tests__/osc-timeout-scenarios.test.ts +0 -172
- package/cli/src/utils/__tests__/pending-attachments.test.ts +0 -278
- package/cli/src/utils/__tests__/provider-setup.test.ts +0 -183
- package/cli/src/utils/__tests__/run-state-storage.test.ts +0 -741
- package/cli/src/utils/__tests__/savant-code-api.test.ts +0 -634
- package/cli/src/utils/__tests__/savant-free-instance-owner.test.ts +0 -69
- package/cli/src/utils/__tests__/savant-free-model-navigation.test.ts +0 -104
- package/cli/src/utils/__tests__/savant-free-premium-reset.test.ts +0 -81
- package/cli/src/utils/__tests__/savant-free-referral-cache.test.ts +0 -67
- package/cli/src/utils/__tests__/savant-free-session-display.test.ts +0 -23
- package/cli/src/utils/__tests__/savant-free-streak-line.test.ts +0 -76
- package/cli/src/utils/__tests__/sdk-event-handlers.test.ts +0 -615
- package/cli/src/utils/__tests__/send-message-helpers.test.ts +0 -1875
- package/cli/src/utils/__tests__/send-message-timer.test.ts +0 -68
- package/cli/src/utils/__tests__/settings.test.ts +0 -138
- package/cli/src/utils/__tests__/strings.test.ts +0 -210
- package/cli/src/utils/__tests__/syntax-theme.test.ts +0 -91
- package/cli/src/utils/__tests__/terminal-color-detection.test.ts +0 -425
- package/cli/src/utils/__tests__/terminal-enter-detection.test.ts +0 -77
- package/cli/src/utils/__tests__/text-layout.test.ts +0 -82
- package/cli/src/utils/__tests__/think-tag-parser.test.ts +0 -159
- package/cli/src/utils/__tests__/trace-writer.test.ts +0 -193
- package/cli/src/utils/__tests__/trim-chat-logs.test.ts +0 -79
- package/cli/src/utils/__tests__/usage-banner-state.test.ts +0 -298
- package/cli/src/utils/__tests__/validation-error-formatting.test.ts +0 -126
- package/cli/src/utils/__tests__/write-file-atomic.test.ts +0 -130
- package/cli/src/utils/active-run.ts +0 -22
- package/cli/src/utils/activity-tracker.ts +0 -66
- package/cli/src/utils/agent-display.ts +0 -87
- package/cli/src/utils/agent-helpers.ts +0 -47
- package/cli/src/utils/ai-message-id.ts +0 -12
- package/cli/src/utils/analytics.ts +0 -407
- package/cli/src/utils/anonymous-id.ts +0 -87
- package/cli/src/utils/arrays.ts +0 -117
- package/cli/src/utils/auth.ts +0 -258
- package/cli/src/utils/bash-context-processor.ts +0 -47
- package/cli/src/utils/bash-messages.ts +0 -108
- package/cli/src/utils/block-margins.ts +0 -35
- package/cli/src/utils/block-operations.ts +0 -548
- package/cli/src/utils/block-processor.ts +0 -212
- package/cli/src/utils/chat-history.ts +0 -265
- package/cli/src/utils/chat-input-key-intercept.ts +0 -52
- package/cli/src/utils/chat-layout.ts +0 -44
- package/cli/src/utils/chat-meta.ts +0 -101
- package/cli/src/utils/chat-scroll-accel.ts +0 -151
- package/cli/src/utils/chatgpt-oauth.ts +0 -350
- package/cli/src/utils/clipboard-image.ts +0 -610
- package/cli/src/utils/clipboard.ts +0 -307
- package/cli/src/utils/code-search-summary.ts +0 -69
- package/cli/src/utils/collapse-helpers.ts +0 -265
- package/cli/src/utils/config-dir.ts +0 -30
- package/cli/src/utils/constants.ts +0 -159
- package/cli/src/utils/create-event-handler-state.ts +0 -79
- package/cli/src/utils/create-run-config.ts +0 -160
- package/cli/src/utils/db-storage.ts +0 -254
- package/cli/src/utils/detect-shell.ts +0 -112
- package/cli/src/utils/directory-browser.ts +0 -74
- package/cli/src/utils/engagement.ts +0 -55
- package/cli/src/utils/env.ts +0 -109
- package/cli/src/utils/error-handling.ts +0 -246
- package/cli/src/utils/error-messages.ts +0 -84
- package/cli/src/utils/feedback-helpers.ts +0 -115
- package/cli/src/utils/feedback-submission.ts +0 -24
- package/cli/src/utils/fetch-usage.ts +0 -75
- package/cli/src/utils/fid-loader.ts +0 -135
- package/cli/src/utils/fingerprint.ts +0 -263
- package/cli/src/utils/finish-logic.ts +0 -154
- package/cli/src/utils/format-elapsed-time.ts +0 -33
- package/cli/src/utils/format-session-units.ts +0 -6
- package/cli/src/utils/format-timeout.ts +0 -28
- package/cli/src/utils/format-validation-errors-for-message.ts +0 -85
- package/cli/src/utils/git.ts +0 -17
- package/cli/src/utils/glyphs.ts +0 -188
- package/cli/src/utils/helpers.ts +0 -47
- package/cli/src/utils/image-display.ts +0 -73
- package/cli/src/utils/image-handler.ts +0 -336
- package/cli/src/utils/image-processor.ts +0 -133
- package/cli/src/utils/image-thumbnail.ts +0 -83
- package/cli/src/utils/implementor-helpers.ts +0 -817
- package/cli/src/utils/input-modes.ts +0 -196
- package/cli/src/utils/keyboard-actions.ts +0 -394
- package/cli/src/utils/keypad-keys.ts +0 -47
- package/cli/src/utils/layout-helpers.ts +0 -36
- package/cli/src/utils/lazy-response-ads.ts +0 -1
- package/cli/src/utils/loading-phrases.ts +0 -68
- package/cli/src/utils/local-agent-registry.ts +0 -611
- package/cli/src/utils/log-shipper.ts +0 -116
- package/cli/src/utils/logger.ts +0 -435
- package/cli/src/utils/markdown-renderer.tsx +0 -1315
- package/cli/src/utils/math.ts +0 -3
- package/cli/src/utils/message-block-helpers.ts +0 -667
- package/cli/src/utils/message-history.ts +0 -153
- package/cli/src/utils/message-tree-utils.ts +0 -67
- package/cli/src/utils/message-updater.ts +0 -279
- package/cli/src/utils/ollama-onboarding.ts +0 -215
- package/cli/src/utils/open-file.ts +0 -144
- package/cli/src/utils/open-url.ts +0 -63
- package/cli/src/utils/openrouter-models.ts +0 -945
- package/cli/src/utils/path-completion.ts +0 -111
- package/cli/src/utils/path-helpers.ts +0 -38
- package/cli/src/utils/pending-attachments.ts +0 -363
- package/cli/src/utils/post-processing.ts +0 -99
- package/cli/src/utils/project-picker.ts +0 -12
- package/cli/src/utils/provider-setup.ts +0 -259
- package/cli/src/utils/recent-projects.ts +0 -156
- package/cli/src/utils/renderer-cleanup.ts +0 -142
- package/cli/src/utils/response-ad-positions.ts +0 -1
- package/cli/src/utils/rewind.ts +0 -175
- package/cli/src/utils/run-state-storage.ts +0 -480
- package/cli/src/utils/savant-code-api.ts +0 -686
- package/cli/src/utils/savant-code-client.ts +0 -217
- package/cli/src/utils/savant-free-agent-selection.ts +0 -12
- package/cli/src/utils/savant-free-exit.ts +0 -24
- package/cli/src/utils/savant-free-instance-owner.ts +0 -66
- package/cli/src/utils/savant-free-model-navigation.ts +0 -46
- package/cli/src/utils/savant-free-premium-reset.ts +0 -52
- package/cli/src/utils/savant-free-referral-cache.ts +0 -35
- package/cli/src/utils/savant-free-session-display.ts +0 -21
- package/cli/src/utils/savant-free-streak-line.ts +0 -67
- package/cli/src/utils/sdk-event-handlers.ts +0 -587
- package/cli/src/utils/send-message-helpers.ts +0 -199
- package/cli/src/utils/send-message-timer.ts +0 -110
- package/cli/src/utils/settings.ts +0 -388
- package/cli/src/utils/skill-registry.ts +0 -100
- package/cli/src/utils/spawn-agent-matcher.ts +0 -56
- package/cli/src/utils/status-indicator-state.ts +0 -100
- package/cli/src/utils/stream-chunk-processor.ts +0 -65
- package/cli/src/utils/strings.ts +0 -272
- package/cli/src/utils/subscription.ts +0 -31
- package/cli/src/utils/syntax-highlighter.tsx +0 -19
- package/cli/src/utils/syntax-theme.ts +0 -131
- package/cli/src/utils/terminal-color-detection.ts +0 -472
- package/cli/src/utils/terminal-enter-detection.ts +0 -63
- package/cli/src/utils/terminal-images.ts +0 -223
- package/cli/src/utils/terminal-reset-sequences.ts +0 -33
- package/cli/src/utils/terminal-title.ts +0 -113
- package/cli/src/utils/terminal-watchdog.ts +0 -246
- package/cli/src/utils/text-layout.ts +0 -153
- package/cli/src/utils/theme-config.ts +0 -143
- package/cli/src/utils/theme-system.ts +0 -1265
- package/cli/src/utils/think-tag-parser.ts +0 -105
- package/cli/src/utils/trace-writer.ts +0 -147
- package/cli/src/utils/ui-constants.ts +0 -69
- package/cli/src/utils/usage-banner-state.ts +0 -146
- package/cli/src/utils/validation-error-formatting.ts +0 -92
- package/cli/src/utils/validation-error-helpers.ts +0 -19
- package/cli/src/utils/version.ts +0 -23
- package/cli/src/utils/word-wrap-utils.ts +0 -53
- package/cli/src/utils/write-file-atomic.ts +0 -82
- package/cli/src/utils/yield-to-event-loop.ts +0 -9
- package/cli/tsconfig.json +0 -26
- package/coding-standards/csharp.md +0 -77
- package/coding-standards/go.md +0 -71
- package/coding-standards/java.md +0 -74
- package/coding-standards/python.md +0 -82
- package/coding-standards/rust.md +0 -78
- package/coding-standards/typescript.md +0 -85
- package/coding-standards/x402.md +0 -227
- package/common/README.md +0 -41
- package/common/common_exit +0 -1
- package/common/package.json +0 -45
- package/common/src/__tests__/agent-validation.test.ts +0 -861
- package/common/src/__tests__/agents.test.ts +0 -16
- package/common/src/__tests__/dynamic-agent-template-schema.test.ts +0 -420
- package/common/src/__tests__/env-ci.test.ts +0 -167
- package/common/src/__tests__/env-process.test.ts +0 -145
- package/common/src/__tests__/free-agents.test.ts +0 -269
- package/common/src/__tests__/handlesteps-parsing.test.ts +0 -247
- package/common/src/__tests__/model-config.test.ts +0 -41
- package/common/src/__tests__/project-file-tree.test.ts +0 -82
- package/common/src/__tests__/response-ad-positions.test.ts +0 -78
- package/common/src/__tests__/savant-free-models.test.ts +0 -460
- package/common/src/__tests__/savant-free-referral-tiers.test.ts +0 -122
- package/common/src/__tests__/user-state.test.ts +0 -30
- package/common/src/actions.ts +0 -215
- package/common/src/analytics-core.ts +0 -73
- package/common/src/analytics.ts +0 -96
- package/common/src/api-keys/constants.ts +0 -26
- package/common/src/browser-actions.ts +0 -414
- package/common/src/constants/agents.ts +0 -250
- package/common/src/constants/analytics-events.ts +0 -318
- package/common/src/constants/anthropic.ts +0 -72
- package/common/src/constants/byok.ts +0 -2
- package/common/src/constants/chatgpt-oauth.ts +0 -85
- package/common/src/constants/composio.ts +0 -34
- package/common/src/constants/feedback.ts +0 -18
- package/common/src/constants/free-agents.ts +0 -347
- package/common/src/constants/gemini.ts +0 -6
- package/common/src/constants/grant-priorities.ts +0 -13
- package/common/src/constants/hosts.ts +0 -6
- package/common/src/constants/images.ts +0 -53
- package/common/src/constants/index.ts +0 -8
- package/common/src/constants/knowledge.ts +0 -46
- package/common/src/constants/limits.ts +0 -23
- package/common/src/constants/model-config.ts +0 -469
- package/common/src/constants/paths.ts +0 -69
- package/common/src/constants/savant-code-config.ts +0 -12
- package/common/src/constants/savant-free-gemini-thinker.ts +0 -30
- package/common/src/constants/savant-free-models.ts +0 -855
- package/common/src/constants/savant-free-referral-tiers.ts +0 -169
- package/common/src/constants/skills.ts +0 -60
- package/common/src/constants/subscription-plans.ts +0 -54
- package/common/src/constants/ui.ts +0 -25
- package/common/src/env-ci.ts +0 -36
- package/common/src/env-process.ts +0 -95
- package/common/src/env-schema.ts +0 -42
- package/common/src/env.ts +0 -69
- package/common/src/mcp/client.ts +0 -308
- package/common/src/old-constants.ts +0 -10
- package/common/src/project-file-tree.ts +0 -361
- package/common/src/reddit-capi.ts +0 -175
- package/common/src/schemas/feedback.ts +0 -57
- package/common/src/schemas/logs.ts +0 -66
- package/common/src/templates/agent-validation.ts +0 -436
- package/common/src/templates/initial-agents-dir/LICENSE +0 -202
- package/common/src/templates/initial-agents-dir/README.md +0 -314
- package/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +0 -17
- package/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +0 -78
- package/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +0 -76
- package/common/src/templates/initial-agents-dir/my-custom-agent.ts +0 -40
- package/common/src/templates/initial-agents-dir/package.json +0 -6
- package/common/src/templates/initial-agents-dir/skills/README.md +0 -66
- package/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +0 -29
- package/common/src/templates/initial-agents-dir/types/agent-definition.ts +0 -484
- package/common/src/templates/initial-agents-dir/types/tools.ts +0 -452
- package/common/src/templates/initial-agents-dir/types/util-types.ts +0 -167
- package/common/src/testing/TESTING_PATTERNS.md +0 -353
- package/common/src/testing/errors.ts +0 -33
- package/common/src/testing/fixtures/agent-runtime.ts +0 -325
- package/common/src/testing/impl/agent-runtime.ts +0 -6
- package/common/src/testing/index.ts +0 -84
- package/common/src/testing/mock-modules.ts +0 -54
- package/common/src/testing/mock-types.ts +0 -123
- package/common/src/testing/mocks/analytics.ts +0 -262
- package/common/src/testing/mocks/child-process.ts +0 -93
- package/common/src/testing/mocks/crypto.ts +0 -218
- package/common/src/testing/mocks/database.ts +0 -337
- package/common/src/testing/mocks/filesystem.ts +0 -166
- package/common/src/testing/mocks/index.ts +0 -83
- package/common/src/testing/mocks/logger.ts +0 -136
- package/common/src/testing/mocks/stream.ts +0 -314
- package/common/src/testing/mocks/timers.ts +0 -132
- package/common/src/testing/mocks/tree-sitter.ts +0 -127
- package/common/src/testing/setup.ts +0 -282
- package/common/src/testing-env-ci.ts +0 -15
- package/common/src/testing-env-process.ts +0 -78
- package/common/src/tools/__tests__/compile-tool-definitions.test.ts +0 -34
- package/common/src/tools/__tests__/thought-session.test.ts +0 -256
- package/common/src/tools/compile-tool-definitions.ts +0 -194
- package/common/src/tools/constants.ts +0 -132
- package/common/src/tools/list.ts +0 -193
- package/common/src/tools/params/__tests__/coerce-to-array.test.ts +0 -237
- package/common/src/tools/params/__tests__/sequential-thinking-coercion.test.ts +0 -98
- package/common/src/tools/params/tool/add-message.ts +0 -36
- package/common/src/tools/params/tool/add-subgoal.ts +0 -57
- package/common/src/tools/params/tool/apply-patch.ts +0 -110
- package/common/src/tools/params/tool/ask-user.ts +0 -181
- package/common/src/tools/params/tool/browser-logs.ts +0 -85
- package/common/src/tools/params/tool/code-search.ts +0 -144
- package/common/src/tools/params/tool/composio.ts +0 -131
- package/common/src/tools/params/tool/create-plan.ts +0 -80
- package/common/src/tools/params/tool/end-turn.ts +0 -54
- package/common/src/tools/params/tool/find-files.ts +0 -60
- package/common/src/tools/params/tool/glob.ts +0 -74
- package/common/src/tools/params/tool/gravity-index.ts +0 -92
- package/common/src/tools/params/tool/list-directory.ts +0 -58
- package/common/src/tools/params/tool/lookup-agent-info.ts +0 -37
- package/common/src/tools/params/tool/propose-str-replace.ts +0 -103
- package/common/src/tools/params/tool/propose-write-file.ts +0 -71
- package/common/src/tools/params/tool/read-docs.ts +0 -85
- package/common/src/tools/params/tool/read-files.ts +0 -61
- package/common/src/tools/params/tool/read-subtree.ts +0 -83
- package/common/src/tools/params/tool/read-url.ts +0 -81
- package/common/src/tools/params/tool/render-ui.ts +0 -203
- package/common/src/tools/params/tool/run-file-change-hooks.ts +0 -57
- package/common/src/tools/params/tool/run-readonly-command.ts +0 -76
- package/common/src/tools/params/tool/run-terminal-command.ts +0 -185
- package/common/src/tools/params/tool/sequential-thinking.ts +0 -110
- package/common/src/tools/params/tool/set-messages.ts +0 -42
- package/common/src/tools/params/tool/set-output.ts +0 -62
- package/common/src/tools/params/tool/set-scaffold-complete.ts +0 -51
- package/common/src/tools/params/tool/skill.ts +0 -56
- package/common/src/tools/params/tool/spawn-agent-inline.ts +0 -57
- package/common/src/tools/params/tool/spawn-agents.ts +0 -154
- package/common/src/tools/params/tool/str-replace.ts +0 -107
- package/common/src/tools/params/tool/suggest-followups.ts +0 -94
- package/common/src/tools/params/tool/task-completed.ts +0 -58
- package/common/src/tools/params/tool/think-deeply.ts +0 -53
- package/common/src/tools/params/tool/transition-phase.ts +0 -57
- package/common/src/tools/params/tool/update-subgoal.ts +0 -89
- package/common/src/tools/params/tool/web-search.ts +0 -73
- package/common/src/tools/params/tool/write-file.ts +0 -71
- package/common/src/tools/params/tool/write-todos.ts +0 -67
- package/common/src/tools/params/utils.ts +0 -152
- package/common/src/tools/safety-registry.ts +0 -274
- package/common/src/tools/safety.ts +0 -42
- package/common/src/tools/sequential-thinking.ts +0 -340
- package/common/src/tools/utils.ts +0 -25
- package/common/src/types/__tests__/dynamic-agent-template.test.ts +0 -20
- package/common/src/types/agent-template.ts +0 -223
- package/common/src/types/api/agents/publish.ts +0 -63
- package/common/src/types/contracts/agent-runtime.ts +0 -84
- package/common/src/types/contracts/analytics.ts +0 -12
- package/common/src/types/contracts/bigquery.ts +0 -55
- package/common/src/types/contracts/billing.ts +0 -46
- package/common/src/types/contracts/client.ts +0 -52
- package/common/src/types/contracts/database.ts +0 -104
- package/common/src/types/contracts/env.ts +0 -203
- package/common/src/types/contracts/llm.ts +0 -183
- package/common/src/types/contracts/logger.ts +0 -29
- package/common/src/types/contracts/logs.ts +0 -34
- package/common/src/types/contracts/trace.ts +0 -21
- package/common/src/types/dynamic-agent-template.ts +0 -290
- package/common/src/types/filesystem.ts +0 -10
- package/common/src/types/function-params.ts +0 -35
- package/common/src/types/grant.ts +0 -20
- package/common/src/types/gravity-index.ts +0 -170
- package/common/src/types/json.ts +0 -26
- package/common/src/types/mcp.ts +0 -26
- package/common/src/types/messages/content-part.ts +0 -59
- package/common/src/types/messages/data-content.ts +0 -14
- package/common/src/types/messages/provider-metadata.ts +0 -10
- package/common/src/types/messages/savant-code-message.ts +0 -55
- package/common/src/types/organization.ts +0 -118
- package/common/src/types/print-mode.ts +0 -167
- package/common/src/types/publisher.ts +0 -67
- package/common/src/types/savant-free-session.ts +0 -295
- package/common/src/types/savant-free-streak.ts +0 -6
- package/common/src/types/session-state.ts +0 -237
- package/common/src/types/skill.ts +0 -56
- package/common/src/types/source.ts +0 -11
- package/common/src/types/spawn.ts +0 -13
- package/common/src/types/subscription.ts +0 -68
- package/common/src/types/usage.ts +0 -16
- package/common/src/types/util.ts +0 -3
- package/common/src/util/__tests__/analytics-dispatcher.test.ts +0 -145
- package/common/src/util/__tests__/analytics-log.test.ts +0 -110
- package/common/src/util/__tests__/analytics-sampling.test.ts +0 -131
- package/common/src/util/__tests__/axiom-only-log.test.ts +0 -64
- package/common/src/util/__tests__/engagement-tracker.test.ts +0 -115
- package/common/src/util/__tests__/error-abort.test.ts +0 -822
- package/common/src/util/__tests__/error-api-details.test.ts +0 -190
- package/common/src/util/__tests__/format-code-search.test.ts +0 -60
- package/common/src/util/__tests__/log-mirror.test.ts +0 -31
- package/common/src/util/__tests__/messages.test.ts +0 -1118
- package/common/src/util/__tests__/partial-json-delta.test.ts +0 -505
- package/common/src/util/__tests__/paths.test.ts +0 -289
- package/common/src/util/__tests__/promise.test.ts +0 -334
- package/common/src/util/__tests__/protocol-config.test.ts +0 -119
- package/common/src/util/__tests__/rate-limit.test.ts +0 -28
- package/common/src/util/__tests__/reddit-savant-free-retention.test.ts +0 -120
- package/common/src/util/__tests__/savant-free-streak.test.ts +0 -142
- package/common/src/util/__tests__/saxy.test.ts +0 -1008
- package/common/src/util/__tests__/string.test.ts +0 -238
- package/common/src/util/__tests__/zoned-time.test.ts +0 -88
- package/common/src/util/agent-file-utils.ts +0 -110
- package/common/src/util/agent-id-parsing.ts +0 -147
- package/common/src/util/agent-name-normalization.ts +0 -39
- package/common/src/util/analytics-dispatcher.ts +0 -81
- package/common/src/util/analytics-log.ts +0 -84
- package/common/src/util/analytics-sampling.ts +0 -225
- package/common/src/util/array.ts +0 -63
- package/common/src/util/axiom-only-log.ts +0 -79
- package/common/src/util/cache-debug.ts +0 -191
- package/common/src/util/credentials.ts +0 -12
- package/common/src/util/currency.ts +0 -25
- package/common/src/util/dates.ts +0 -81
- package/common/src/util/engagement-tracker.ts +0 -133
- package/common/src/util/error.ts +0 -580
- package/common/src/util/file.ts +0 -363
- package/common/src/util/format-code-search.ts +0 -115
- package/common/src/util/lazy-response-ads.ts +0 -93
- package/common/src/util/log-data.ts +0 -57
- package/common/src/util/log-mirror.ts +0 -34
- package/common/src/util/lru-cache.ts +0 -67
- package/common/src/util/messages.ts +0 -600
- package/common/src/util/model-utils.ts +0 -25
- package/common/src/util/object.ts +0 -137
- package/common/src/util/param-helpers.ts +0 -49
- package/common/src/util/partial-json-delta.ts +0 -100
- package/common/src/util/paths.ts +0 -194
- package/common/src/util/promise.ts +0 -87
- package/common/src/util/protocol-config.ts +0 -141
- package/common/src/util/random.ts +0 -15
- package/common/src/util/rate-limit.ts +0 -56
- package/common/src/util/reddit-capi-events.ts +0 -40
- package/common/src/util/reddit-savant-free-retention.ts +0 -69
- package/common/src/util/response-ad-positions.ts +0 -54
- package/common/src/util/savant-free-privacy.ts +0 -78
- package/common/src/util/savant-free-streak.ts +0 -153
- package/common/src/util/saxy.ts +0 -739
- package/common/src/util/skills.ts +0 -32
- package/common/src/util/stop-sequence.ts +0 -60
- package/common/src/util/string.ts +0 -419
- package/common/src/util/system-info.ts +0 -51
- package/common/src/util/type-narrowing.ts +0 -125
- package/common/src/util/xml.ts +0 -17
- package/common/src/util/zod-schema.ts +0 -80
- package/common/src/util/zoned-time.ts +0 -136
- package/common/src/utils/ask-user-bridge.ts +0 -47
- package/common/tsconfig.json +0 -8
- package/database.db +0 -0
- package/dev/LEARNINGS.md +0 -309
- 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 +0 -238
- package/dev/fids/archive/FID-2026-0803-001-echo-enforcement-layer-drift.md +0 -404
- package/dev/fids/archive/FID-2026-0803-002-llm-providers-database-audit.md +0 -348
- package/dev/fids/archive/FID-2026-0803-003-sdk-impl-common-util-audit.md +0 -277
- package/dev/fids/archive/FID-2026-0803-004-checkpoint-rewind.md +0 -181
- package/dev/fids/archive/FID-2026-0803-005-quality-scan-hygiene-fixes.md +0 -265
- package/dev/fids/archive/FID-2026-0803-006-code-map-audit-hygiene.md +0 -243
- package/dev/fids/archive/FID-2026-0803-007-evals-benchmark-audit-hygiene.md +0 -296
- package/dev/fids/archive/FID-2026-0803-009-echo-enforcement-doc-drift.md +0 -112
- package/dev/fids/archive/FID-2026-0803-010-database-llm-providers-low-fixes.md +0 -255
- package/dev/fids/archive/FID-2026-0803-011-build-artifact-hygiene.md +0 -169
- package/dev/fids/archive/FID-2026-0803-012-release-readiness-audit.md +0 -162
- package/dev/fids/archive/FID-2026-0803-013-agent-roster-over-reporting.md +0 -146
- package/dev/fids/archive/FID-2026-0803-014-freebuff-to-savant-rebrand-sweep.md +0 -185
- package/dev/nova/reports/2026-08-02-top-25-ai-inference-providers-competitive-intel.md +0 -213
- package/dev/nova/specs/echo-v0.1.2-freebuff.md +0 -391
- package/dev/nova/specs/goal-loop-feature-spec.md +0 -245
- package/dev/nova/specs/launch-strategy-research-prompt.md +0 -88
- package/dev/releases/README.md +0 -50
- package/dev/scratchpad/.gitkeep +0 -0
- package/dev/session-summaries/.gitkeep +0 -0
- package/dev/session-summaries/2026-07-16-1255.md +0 -128
- package/dev/session-summaries/2026-07-17-1000.md +0 -64
- package/dev/session-summaries/2026-07-19-eslint-zero-tolerance-cleanup.md +0 -145
- package/dev/session-summaries/2026-07-19-fid-026-debugging-and-rename.md +0 -79
- package/dev/session-summaries/2026-07-19-fid-026-phase-b-rebrand.md +0 -76
- package/dev/session-summaries/2026-07-19-fid-027-clean-break.md +0 -47
- package/dev/session-summaries/2026-07-19-pre-push-house-cleaning.md +0 -100
- package/dev/session-summaries/2026-07-19-v0.0.2-release-session.md +0 -229
- package/dev/session-summaries/2026-07-20-1805-fid-loop-closure.md +0 -95
- package/dev/session-summaries/2026-07-22-1800.md +0 -52
- package/dev/session-summaries/2026-07-23-fsm-optimization.md +0 -88
- package/dev/session-summaries/2026-07-25-0000.md +0 -80
- package/dev/session-summaries/2026-07-25-1200-context-compaction.md +0 -154
- package/dev/session-summaries/2026-07-25-1600-layer4-reactive-compact.md +0 -96
- package/dev/session-summaries/2026-07-25-1700-dev-folder-audit.md +0 -161
- package/dev/session-summaries/2026-07-25-2000-benchmark-v2-filters.md +0 -147
- package/dev/session-summaries/2026-07-25-2000.md +0 -77
- package/dev/session-summaries/2026-07-27-0000.md +0 -63
- package/dev/session-summaries/2026-07-28-history-capture-handoff.md +0 -206
- package/dev/session-summaries/2026-07-31-freebuff-echo-compliance-remediation.md +0 -156
- package/dev/session-summaries/2026-07-31-pre-launch-optimization-execution.md +0 -46
- package/dev/session-summaries/2026-0721-1800.md +0 -44
- package/dev/session-summaries/2026-08-01-sidebar-folded-startup.md +0 -159
- package/dev/session-summaries/2026-08-02-0.0.15-release-closeout.md +0 -32
- package/dev/session-summaries/2026-08-02-repository-hygiene.md +0 -51
- package/dev/session-summaries/2026-08-03-agent-roster-fix-and-ready-check-closeout.md +0 -73
- package/dev/session-summaries/2026-08-03-build-artifact-hygiene-closeout.md +0 -40
- package/dev/session-summaries/2026-08-03-code-map-audit-closeout.md +0 -44
- package/dev/session-summaries/2026-08-03-database-llm-providers-low-fixes-closeout.md +0 -47
- package/dev/session-summaries/2026-08-03-echo-enforcement-doc-drift-closeout.md +0 -43
- package/dev/session-summaries/2026-08-03-evals-benchmark-audit-closeout.md +0 -50
- package/dev/session-summaries/2026-08-03-quality-scan-hygiene-fixes-closeout.md +0 -57
- package/dev/session-summaries/2026-08-03-quality-session-checkpoint-rewind-closeout.md +0 -56
- package/dev/session-summaries/2026-08-03-release-readiness-audit-closeout.md +0 -60
- package/dev/test-prompts/archive/0.0.2-final-pass.md +0 -209
- package/dev/test-prompts/archive/agent-capabilities-full-test.md +0 -361
- package/dev/test-prompts/archive/agent-capabilities-test.md +0 -471
- package/dev/test-prompts/archive/comprehensive-az-system-test-v1.md +0 -441
- package/dev/test-prompts/archive/comprehensive-az-system-test-v2-report.md +0 -377
- package/dev/test-prompts/archive/comprehensive-az-system-test-v2.md +0 -544
- package/dev/test-prompts/archive/comprehensive-az-system-test.md +0 -396
- package/dev/test-prompts/archive/comprehensive-az-test-final.md +0 -900
- package/dev/test-prompts/archive/comprehensive-az-test-v11.md +0 -141
- package/dev/test-prompts/archive/comprehensive-az-test-v12.md +0 -29
- package/dev/test-prompts/archive/comprehensive-az-test-v6.md +0 -631
- package/dev/test-prompts/archive/comprehensive-az-test-v7.md +0 -625
- package/dev/test-prompts/archive/fid-007-ability-confirmation.md +0 -248
- package/dev/test-prompts/archive/fid-2026-0801-006-thinker-tool-call-boundary.md +0 -86
- package/dev/test-prompts/archive/fid-2026-0801-007-child-tool-set-fallback-cli.md +0 -101
- package/dev/test-prompts/archive/fid-2026-0801-008-provider-tool-call-accumulation-cli.md +0 -111
- package/dev/test-prompts/archive/fid-2026-0801-012-thinker-state-output-cli.md +0 -134
- package/dev/test-prompts/archive/gemini-deep-research-sidebar-highlight.md +0 -598
- package/dev/test-prompts/archive/goal-loop-cli-test.md +0 -142
- package/dev/test-prompts/archive/rebrand-qa.md +0 -258
- package/dev/test-prompts/archive/release-az-test-fid-085.md +0 -306
- package/dev/test-prompts/archive/release-az-test-fid-087.md +0 -219
- package/dev/test-prompts/archive/release-az-test-fid-2026-0726-001.md +0 -270
- package/dev/test-prompts/archive/release-az-test-fid-2026-0728-008.md +0 -213
- package/dev/test-prompts/archive/release-az-test-fid-2026-0728-launch-tracks.md +0 -253
- package/dev/test-prompts/archive/release-az-test-fid-2026-0731-pre-launch.md +0 -102
- package/docs/AI Coding Agents Market Research.md +0 -516
- package/docs/Agent Harness Feature Pairing Research.md +0 -166
- package/docs/CLI Agent Inference Backend Research.md +0 -446
- package/docs/Codebuff Rebranding And Migration Plan.md +0 -418
- package/docs/ECHO-EVOLUTION-ARCH.md +0 -77
- package/docs/Harness Engineering for Coding Agents Research.md +0 -196
- package/docs/Launch Plan Review and Optimization.md +0 -178
- package/docs/OpenTUI Sidebar Bug Fix.md +0 -245
- package/docs/SAVANT-VERSIONING.md +0 -31
- package/docs/Savant Code Launch Strategy.md +0 -270
- package/docs/Savant-Code Business And Backend Research.md +0 -222
- package/docs/agents-and-tools.md +0 -217
- package/docs/cloudflare-llms-full.md +0 -9623
- package/docs/design/OpenTUI Terminal Visualization Guide.md +0 -471
- package/docs/design/database-architecture.md +0 -217
- package/docs/design/deep-research-report.md +0 -295
- package/docs/design/thinker-sequentialthinking-regression-diagnostic.md +0 -366
- package/docs/discord-server-design.md +0 -167
- package/docs/gravity-integration-starter.md +0 -202
- package/docs/launch/hn-first-comment.md +0 -44
- package/docs/launch/hn-post.md +0 -35
- package/docs/launch/incident-response.md +0 -88
- package/docs/launch/landing/index.html +0 -233
- package/docs/launch/mastodon-thread.md +0 -52
- package/docs/launch/newsletter-pitch.md +0 -49
- package/docs/launch/twitter-thread.md +0 -62
- package/docs/privacy.md +0 -186
- package/docs/reports/Savant-Code Benchmark Specification.md +0 -206
- package/docs/reports/Thinker Agent Architecture Research.md +0 -284
- package/docs/reports/adoptable-features-2026-07-25.md +0 -604
- package/docs/reports/adoptable-features-master.md +0 -480
- package/docs/reports/codebuff-discord-feedback.md +0 -43
- package/docs/reports/feature-parity-report.md +0 -810
- package/docs/reports/repos/AionUi.md +0 -75
- package/docs/reports/repos/OpenHands.md +0 -76
- package/docs/reports/repos/SWE-agent.md +0 -82
- package/docs/reports/repos/agno.md +0 -89
- package/docs/reports/repos/aider.md +0 -74
- package/docs/reports/repos/cline.md +0 -83
- package/docs/reports/repos/codex.md +0 -83
- package/docs/reports/repos/gemini-cli.md +0 -92
- package/docs/reports/repos/goose.md +0 -65
- package/docs/reports/repos/gpt-pilot.md +0 -52
- package/docs/reports/repos/hermes-agent.md +0 -101
- package/docs/reports/repos/kilocode.md +0 -79
- package/docs/reports/repos/openclaude.md +0 -99
- package/docs/reports/repos/openclaw.md +0 -100
- package/docs/reports/repos/opencode-dev.md +0 -78
- package/docs/reports/repos/zero.md +0 -123
- package/docs/reports/savant-code-benchmark-v2-2026-08-03.md +0 -76
- package/docs/savant-code-modes.md +0 -338
- package/docs/testing.md +0 -51
- package/docs/visual-mockup-neon-slate.txt +0 -41
- package/eslint.config.js +0 -211
- package/evals/README.md +0 -45
- package/evals/benchmark/README.md +0 -449
- package/evals/benchmark/agent-runner.ts +0 -217
- package/evals/benchmark/analyze-task-scores.ts +0 -496
- package/evals/benchmark/eval-codebuff-hard.json +0 -3343
- package/evals/benchmark/eval-codebuff.json +0 -3193
- package/evals/benchmark/eval-codebuff2.json +0 -2494
- package/evals/benchmark/eval-manifold-hard.json +0 -2525
- package/evals/benchmark/eval-manifold.json +0 -1675
- package/evals/benchmark/eval-manifold2.json +0 -1945
- package/evals/benchmark/eval-plane-hard.json +0 -4372
- package/evals/benchmark/eval-plane.json +0 -2028
- package/evals/benchmark/eval-plane2.json +0 -3517
- package/evals/benchmark/eval-saleor-hard.json +0 -6081
- package/evals/benchmark/eval-saleor.json +0 -1829
- package/evals/benchmark/eval-saleor2.json +0 -3273
- package/evals/benchmark/eval-task-generator.ts +0 -158
- package/evals/benchmark/filter-supplemental-files.ts +0 -225
- package/evals/benchmark/format-output.ts +0 -215
- package/evals/benchmark/gen-evals.ts +0 -294
- package/evals/benchmark/gen-repo-eval.ts +0 -71
- package/evals/benchmark/judge.ts +0 -308
- package/evals/benchmark/lessons-extractor.ts +0 -247
- package/evals/benchmark/main-hard-tasks.ts +0 -49
- package/evals/benchmark/main-single-eval.ts +0 -23
- package/evals/benchmark/main.ts +0 -29
- package/evals/benchmark/meta-analyzer.ts +0 -329
- package/evals/benchmark/pick-commits.ts +0 -627
- package/evals/benchmark/run-benchmark.ts +0 -657
- package/evals/benchmark/runners/claude.ts +0 -176
- package/evals/benchmark/runners/codex.ts +0 -143
- package/evals/benchmark/runners/index.ts +0 -4
- package/evals/benchmark/runners/opencode.ts +0 -253
- package/evals/benchmark/runners/runner.ts +0 -13
- package/evals/benchmark/runners/savant.ts +0 -148
- package/evals/benchmark/setup-test-repo.ts +0 -314
- package/evals/benchmark/trace-analyzer.ts +0 -257
- package/evals/benchmark/trace-utils.ts +0 -80
- package/evals/benchmark/types.ts +0 -83
- package/evals/bunfig.toml +0 -4
- package/evals/logger.ts +0 -87
- package/evals/package.json +0 -31
- package/evals/subagents/test-repo-utils.ts +0 -131
- package/evals/tsconfig.json +0 -13
- package/evals/v2/README.md +0 -149
- package/evals/v2/reports/report.json +0 -261
- package/evals/v2/reports/report.md +0 -15
- package/evals/v2/schema/task.schema.json +0 -172
- package/evals/v2/src/cli.ts +0 -216
- package/evals/v2/src/golden.ts +0 -73
- package/evals/v2/src/harness.ts +0 -293
- package/evals/v2/src/metrics.ts +0 -326
- package/evals/v2/src/registry.ts +0 -179
- package/evals/v2/src/reports.ts +0 -126
- package/evals/v2/src/runner.ts +0 -143
- package/evals/v2/src/runners/savant.ts +0 -105
- package/evals/v2/src/sandbox.ts +0 -42
- package/evals/v2/src/sandboxes/docker.ts +0 -49
- package/evals/v2/src/sandboxes/tempdir.ts +0 -120
- package/evals/v2/src/schema.ts +0 -83
- package/evals/v2/src/trace.ts +0 -186
- package/evals/v2/src/verify.ts +0 -199
- package/evals/v2/tasks/error_recovery/env-fault/calculator.js +0 -11
- package/evals/v2/tasks/error_recovery/env-fault/calculator.test.js +0 -15
- package/evals/v2/tasks/error_recovery/env-fault/golden.patch +0 -15
- package/evals/v2/tasks/error_recovery/env-fault/task.yaml +0 -20
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.js +0 -5
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.test.js +0 -7
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/golden.patch +0 -19
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/greet.js +0 -3
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/orchestration.test.js +0 -30
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/task.yaml +0 -29
- package/evals/v2/tasks/pure_coding/add-fix/add.js +0 -3
- package/evals/v2/tasks/pure_coding/add-fix/add.test.js +0 -11
- package/evals/v2/tasks/pure_coding/add-fix/golden.patch +0 -7
- package/evals/v2/tasks/pure_coding/add-fix/task.yaml +0 -20
- package/evals/v2/tasks/pure_coding/rename-greet/app.js +0 -5
- package/evals/v2/tasks/pure_coding/rename-greet/app.test.js +0 -32
- package/evals/v2/tasks/pure_coding/rename-greet/golden.patch +0 -19
- package/evals/v2/tasks/pure_coding/rename-greet/greet.js +0 -5
- package/evals/v2/tasks/pure_coding/rename-greet/task.yaml +0 -21
- package/evals/v2/tests/golden.test.ts +0 -104
- package/evals/v2/tests/harness.test.ts +0 -204
- package/evals/v2/tests/metrics.test.ts +0 -353
- package/evals/v2/tests/registry.test.ts +0 -210
- package/evals/v2/tests/reports.test.ts +0 -218
- package/evals/v2/tests/savant-runner.test.ts +0 -218
- package/evals/v2/tests/schema.test.ts +0 -127
- package/evals/v2/tests/tempdir-sandbox.test.ts +0 -49
- package/evals/v2/tests/trace.test.ts +0 -76
- package/evals/v2/tests/verify.test.ts +0 -224
- package/license +0 -202
- package/packages/agent-runtime/README.md +0 -46
- package/packages/agent-runtime/agent_exit +0 -1
- package/packages/agent-runtime/bunfig.toml +0 -2
- package/packages/agent-runtime/package.json +0 -34
- package/packages/agent-runtime/src/__tests__/apply-patch-tool.test.ts +0 -202
- package/packages/agent-runtime/src/__tests__/cost-aggregation.test.ts +0 -397
- package/packages/agent-runtime/src/__tests__/generate-diffs-prompt.test.ts +0 -107
- package/packages/agent-runtime/src/__tests__/get-file-reading-updates.test.ts +0 -59
- package/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts +0 -501
- package/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +0 -1512
- package/packages/agent-runtime/src/__tests__/main-prompt.test.ts +0 -452
- package/packages/agent-runtime/src/__tests__/n-parameter.test.ts +0 -984
- package/packages/agent-runtime/src/__tests__/process-file-block.test.ts +0 -196
- package/packages/agent-runtime/src/__tests__/process-str-replace.test.ts +0 -512
- package/packages/agent-runtime/src/__tests__/programmatic-tool-authorization.test.ts +0 -219
- package/packages/agent-runtime/src/__tests__/prompt-caching-subagents.test.ts +0 -749
- package/packages/agent-runtime/src/__tests__/prompts-schema-handling.test.ts +0 -454
- package/packages/agent-runtime/src/__tests__/propose-tools.test.ts +0 -824
- package/packages/agent-runtime/src/__tests__/read-docs-tool.test.ts +0 -394
- package/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts +0 -161
- package/packages/agent-runtime/src/__tests__/run-agent-step-tools.test.ts +0 -612
- package/packages/agent-runtime/src/__tests__/run-programmatic-step.test.ts +0 -1743
- package/packages/agent-runtime/src/__tests__/sandbox-generator.test.ts +0 -154
- package/packages/agent-runtime/src/__tests__/spawn-agents-image-content.test.ts +0 -354
- package/packages/agent-runtime/src/__tests__/spawn-agents-message-history.test.ts +0 -280
- package/packages/agent-runtime/src/__tests__/spawn-agents-permissions.test.ts +0 -664
- package/packages/agent-runtime/src/__tests__/stream-parser-abort.test.ts +0 -250
- package/packages/agent-runtime/src/__tests__/stream-parser-reasoning.test.ts +0 -194
- package/packages/agent-runtime/src/__tests__/subagent-streaming.test.ts +0 -230
- package/packages/agent-runtime/src/__tests__/test-utils.ts +0 -96
- package/packages/agent-runtime/src/__tests__/thinker-convergence-gate.test.ts +0 -242
- package/packages/agent-runtime/src/__tests__/to-token-count-input-schema.test.ts +0 -81
- package/packages/agent-runtime/src/__tests__/tool-executor-sandbox.test.ts +0 -167
- package/packages/agent-runtime/src/__tests__/tool-stream-parser.test.ts +0 -682
- package/packages/agent-runtime/src/__tests__/tool-validation-error.test.ts +0 -1380
- package/packages/agent-runtime/src/__tests__/web-search-tool.test.ts +0 -402
- package/packages/agent-runtime/src/__tests__/xml-tool-result-ordering.test.ts +0 -264
- package/packages/agent-runtime/src/constants.ts +0 -12
- package/packages/agent-runtime/src/context-compactor.ts +0 -425
- package/packages/agent-runtime/src/find-files/__tests__/request-files-prompt.test.ts +0 -190
- package/packages/agent-runtime/src/find-files/custom-file-picker-config.ts +0 -61
- package/packages/agent-runtime/src/find-files/request-files-prompt.ts +0 -462
- package/packages/agent-runtime/src/generate-diffs-prompt.ts +0 -38
- package/packages/agent-runtime/src/get-file-reading-updates.ts +0 -27
- package/packages/agent-runtime/src/llm-api/__tests__/gemini-with-fallbacks.test.ts +0 -267
- package/packages/agent-runtime/src/llm-api/__tests__/serper-api.test.ts +0 -297
- package/packages/agent-runtime/src/llm-api/claude.ts +0 -7
- package/packages/agent-runtime/src/llm-api/context7-api.ts +0 -290
- package/packages/agent-runtime/src/llm-api/gemini-with-fallbacks.ts +0 -104
- package/packages/agent-runtime/src/llm-api/savant-code-web-api.ts +0 -370
- package/packages/agent-runtime/src/llm-api/serper-api.ts +0 -193
- package/packages/agent-runtime/src/main-prompt.ts +0 -251
- package/packages/agent-runtime/src/mcp-constants.ts +0 -12
- package/packages/agent-runtime/src/mcp.ts +0 -83
- package/packages/agent-runtime/src/process-file-block.ts +0 -118
- package/packages/agent-runtime/src/process-str-replace.ts +0 -213
- package/packages/agent-runtime/src/prompt-agent-stream.ts +0 -119
- package/packages/agent-runtime/src/run-agent-step.ts +0 -1632
- package/packages/agent-runtime/src/run-programmatic-step.ts +0 -633
- package/packages/agent-runtime/src/system-prompt/prompts.ts +0 -215
- package/packages/agent-runtime/src/system-prompt/search-system-prompt.ts +0 -89
- package/packages/agent-runtime/src/system-prompt/truncate-file-tree.ts +0 -414
- package/packages/agent-runtime/src/templates/README.md +0 -160
- package/packages/agent-runtime/src/templates/__tests__/agent-registry.test.ts +0 -489
- package/packages/agent-runtime/src/templates/__tests__/strings.test.ts +0 -465
- package/packages/agent-runtime/src/templates/agent-registry.ts +0 -122
- package/packages/agent-runtime/src/templates/prompts.ts +0 -189
- package/packages/agent-runtime/src/templates/strings.ts +0 -292
- package/packages/agent-runtime/src/templates/types.ts +0 -61
- package/packages/agent-runtime/src/tool-stream-parser.ts +0 -260
- package/packages/agent-runtime/src/tools/filter-tool-set.ts +0 -18
- package/packages/agent-runtime/src/tools/handlers/__tests__/glob.test.ts +0 -331
- package/packages/agent-runtime/src/tools/handlers/__tests__/read-subtree.test.ts +0 -346
- package/packages/agent-runtime/src/tools/handlers/__tests__/run-readonly-command.test.ts +0 -284
- package/packages/agent-runtime/src/tools/handlers/handler-function-type.ts +0 -77
- package/packages/agent-runtime/src/tools/handlers/list.ts +0 -105
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/checkpoint-store.test.ts +0 -394
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/skill.test.ts +0 -98
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/write-file.test.ts +0 -24
- package/packages/agent-runtime/src/tools/handlers/tool/add-message.ts +0 -37
- package/packages/agent-runtime/src/tools/handlers/tool/add-subgoal.ts +0 -30
- package/packages/agent-runtime/src/tools/handlers/tool/apply-patch.ts +0 -120
- package/packages/agent-runtime/src/tools/handlers/tool/ask-user.ts +0 -25
- package/packages/agent-runtime/src/tools/handlers/tool/browser-logs.ts +0 -21
- package/packages/agent-runtime/src/tools/handlers/tool/checkpoint-store.ts +0 -378
- package/packages/agent-runtime/src/tools/handlers/tool/code-search.ts +0 -21
- package/packages/agent-runtime/src/tools/handlers/tool/composio.ts +0 -52
- package/packages/agent-runtime/src/tools/handlers/tool/create-plan.ts +0 -63
- package/packages/agent-runtime/src/tools/handlers/tool/end-turn.ts +0 -15
- package/packages/agent-runtime/src/tools/handlers/tool/find-files.ts +0 -161
- package/packages/agent-runtime/src/tools/handlers/tool/glob.ts +0 -22
- package/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts +0 -230
- package/packages/agent-runtime/src/tools/handlers/tool/list-directory.ts +0 -22
- package/packages/agent-runtime/src/tools/handlers/tool/lookup-agent-info.ts +0 -105
- package/packages/agent-runtime/src/tools/handlers/tool/propose-str-replace.ts +0 -111
- package/packages/agent-runtime/src/tools/handlers/tool/propose-write-file.ts +0 -89
- package/packages/agent-runtime/src/tools/handlers/tool/proposed-content-store.ts +0 -64
- package/packages/agent-runtime/src/tools/handlers/tool/read-docs.ts +0 -160
- package/packages/agent-runtime/src/tools/handlers/tool/read-files.ts +0 -43
- package/packages/agent-runtime/src/tools/handlers/tool/read-subtree.ts +0 -198
- package/packages/agent-runtime/src/tools/handlers/tool/read-url.ts +0 -21
- package/packages/agent-runtime/src/tools/handlers/tool/render-ui.ts +0 -15
- package/packages/agent-runtime/src/tools/handlers/tool/run-file-change-hooks.ts +0 -20
- package/packages/agent-runtime/src/tools/handlers/tool/run-readonly-command.ts +0 -215
- package/packages/agent-runtime/src/tools/handlers/tool/run-terminal-command.ts +0 -33
- package/packages/agent-runtime/src/tools/handlers/tool/sequential-thinking.ts +0 -53
- package/packages/agent-runtime/src/tools/handlers/tool/set-messages.ts +0 -19
- package/packages/agent-runtime/src/tools/handlers/tool/set-output.ts +0 -104
- package/packages/agent-runtime/src/tools/handlers/tool/set-scaffold-complete.ts +0 -32
- package/packages/agent-runtime/src/tools/handlers/tool/skill.ts +0 -146
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-inline.ts +0 -149
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts +0 -436
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agents.ts +0 -286
- package/packages/agent-runtime/src/tools/handlers/tool/str-replace.ts +0 -135
- package/packages/agent-runtime/src/tools/handlers/tool/suggest-followups.ts +0 -20
- package/packages/agent-runtime/src/tools/handlers/tool/task-completed.ts +0 -15
- package/packages/agent-runtime/src/tools/handlers/tool/think-deeply.ts +0 -25
- package/packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts +0 -160
- package/packages/agent-runtime/src/tools/handlers/tool/update-subgoal.ts +0 -48
- package/packages/agent-runtime/src/tools/handlers/tool/web-search.ts +0 -151
- package/packages/agent-runtime/src/tools/handlers/tool/write-file.ts +0 -281
- package/packages/agent-runtime/src/tools/handlers/tool/write-todos.ts +0 -19
- package/packages/agent-runtime/src/tools/prompts.ts +0 -233
- package/packages/agent-runtime/src/tools/sandbox/__tests__/engine.test.ts +0 -169
- package/packages/agent-runtime/src/tools/sandbox/__tests__/shell-denylist.test.ts +0 -104
- package/packages/agent-runtime/src/tools/sandbox/engine.ts +0 -109
- package/packages/agent-runtime/src/tools/sandbox/index.ts +0 -14
- package/packages/agent-runtime/src/tools/sandbox/shell-denylist.ts +0 -119
- package/packages/agent-runtime/src/tools/stream-parser.ts +0 -407
- package/packages/agent-runtime/src/tools/thinker-convergence-gate.ts +0 -162
- package/packages/agent-runtime/src/tools/thought-session-store.ts +0 -43
- package/packages/agent-runtime/src/tools/tool-executor.ts +0 -1098
- package/packages/agent-runtime/src/util/__tests__/messages.test.ts +0 -995
- package/packages/agent-runtime/src/util/__tests__/parse-tool-calls-from-text.test.ts +0 -363
- package/packages/agent-runtime/src/util/__tests__/simplify-tool-results.test.ts +0 -382
- package/packages/agent-runtime/src/util/__tests__/stream-xml-parser.test.ts +0 -285
- package/packages/agent-runtime/src/util/__tests__/think-tags.test.ts +0 -49
- package/packages/agent-runtime/src/util/__tests__/token-counter.test.ts +0 -121
- package/packages/agent-runtime/src/util/activity-tracking.ts +0 -252
- package/packages/agent-runtime/src/util/agent-output.ts +0 -102
- package/packages/agent-runtime/src/util/cache-debug.ts +0 -330
- package/packages/agent-runtime/src/util/format-value.ts +0 -16
- package/packages/agent-runtime/src/util/messages.ts +0 -461
- package/packages/agent-runtime/src/util/parse-tool-calls-from-text.ts +0 -122
- package/packages/agent-runtime/src/util/render-read-files-result.ts +0 -18
- package/packages/agent-runtime/src/util/simplify-tool-results.ts +0 -61
- package/packages/agent-runtime/src/util/stream-xml-parser.ts +0 -259
- package/packages/agent-runtime/src/util/think-tags.ts +0 -33
- package/packages/agent-runtime/src/util/token-counter.ts +0 -136
- package/packages/agent-runtime/tsconfig.json +0 -8
- package/packages/code-map/README.md +0 -43
- package/packages/code-map/__tests__/integration.test.ts +0 -278
- package/packages/code-map/__tests__/languages.test.ts +0 -240
- package/packages/code-map/__tests__/parse.test.ts +0 -640
- package/packages/code-map/__tests__/test-langs/test.c +0 -42
- package/packages/code-map/__tests__/test-langs/test.cpp +0 -34
- package/packages/code-map/__tests__/test-langs/test.cs +0 -34
- package/packages/code-map/__tests__/test-langs/test.go +0 -27
- package/packages/code-map/__tests__/test-langs/test.java +0 -31
- package/packages/code-map/__tests__/test-langs/test.js +0 -50
- package/packages/code-map/__tests__/test-langs/test.php +0 -34
- package/packages/code-map/__tests__/test-langs/test.py +0 -25
- package/packages/code-map/__tests__/test-langs/test.rb +0 -28
- package/packages/code-map/__tests__/test-langs/test.rs +0 -28
- package/packages/code-map/__tests__/test-langs/test.ts +0 -31
- package/packages/code-map/package.json +0 -33
- package/packages/code-map/src/index.ts +0 -4
- package/packages/code-map/src/init-node.ts +0 -185
- package/packages/code-map/src/languages.ts +0 -344
- package/packages/code-map/src/parse.ts +0 -410
- package/packages/code-map/src/tree-sitter-queries/readme.md +0 -24
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-c-tags.scm +0 -16
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +0 -23
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-cpp-tags.scm +0 -29
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-go-tags.scm +0 -26
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-java-tags.scm +0 -19
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-javascript-tags.scm +0 -16
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-php-tags.scm +0 -23
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-python-tags.scm +0 -12
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-ruby-tags.scm +0 -58
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-rust-tags.scm +0 -26
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-typescript-tags.scm +0 -22
- package/packages/code-map/src/types.ts +0 -11
- package/packages/code-map/src/utils.ts +0 -12
- package/packages/code-map/tsconfig.json +0 -10
- package/packages/database/README.md +0 -43
- package/packages/database/package.json +0 -28
- package/packages/database/src/__tests__/service.test.ts +0 -167
- package/packages/database/src/index.ts +0 -146
- package/packages/database/src/service.ts +0 -342
- package/packages/database/tsconfig.json +0 -9
- package/packages/llm-providers/README.md +0 -42
- package/packages/llm-providers/package.json +0 -42
- package/packages/llm-providers/src/ollama/__tests__/detect.test.ts +0 -59
- package/packages/llm-providers/src/ollama/detect.ts +0 -113
- package/packages/llm-providers/src/ollama/index.ts +0 -2
- package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.test.ts +0 -855
- package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.ts +0 -177
- package/packages/llm-providers/src/openai-compatible/chat/get-response-metadata.ts +0 -15
- package/packages/llm-providers/src/openai-compatible/chat/map-openai-compatible-finish-reason.ts +0 -19
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-api-types.ts +0 -60
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.test.ts +0 -549
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.ts +0 -474
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-options.ts +0 -25
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-metadata-extractor.ts +0 -49
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-prepare-tools.ts +0 -162
- package/packages/llm-providers/src/openai-compatible/chat/stream-transform.test.ts +0 -106
- package/packages/llm-providers/src/openai-compatible/chat/stream-transform.ts +0 -585
- package/packages/llm-providers/src/openai-compatible/completion/convert-to-openai-compatible-completion-prompt.ts +0 -98
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.test.ts +0 -173
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.ts +0 -414
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-options.ts +0 -33
- package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-model.ts +0 -143
- package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-options.ts +0 -21
- package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-model.ts +0 -129
- package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-settings.ts +0 -1
- package/packages/llm-providers/src/openai-compatible/index.ts +0 -27
- package/packages/llm-providers/src/openai-compatible/openai-compatible-error.ts +0 -34
- package/packages/llm-providers/src/openai-compatible/openai-compatible-provider.ts +0 -174
- package/packages/llm-providers/src/openai-compatible/version.ts +0 -5
- package/packages/llm-providers/tsconfig.json +0 -9
- package/protocol.config.yaml +0 -113
- package/savant-free/README.md +0 -73
- package/savant-free/SPEC.md +0 -385
- package/savant-free/cli/build.ts +0 -49
- package/savant-free/cli/release/README.md +0 -55
- package/savant-free/cli/release/index.js +0 -37
- package/savant-free/cli/release/package.json +0 -43
- package/savant-free/cli/release.ts +0 -128
- package/savant-free/cli/smoke-test.test.ts +0 -257
- package/savant-free/e2e/README.md +0 -173
- package/savant-free/e2e/agent/savant-free-tester.ts +0 -52
- package/savant-free/e2e/tests/ads-behavior.e2e.test.ts +0 -51
- package/savant-free/e2e/tests/agent-startup.e2e.test.ts +0 -61
- package/savant-free/e2e/tests/code-edit.e2e.test.ts +0 -78
- package/savant-free/e2e/tests/help-command.e2e.test.ts +0 -97
- package/savant-free/e2e/tests/knowledge-file.e2e.test.ts +0 -66
- package/savant-free/e2e/tests/slash-commands.e2e.test.ts +0 -119
- package/savant-free/e2e/tests/startup.e2e.test.ts +0 -56
- package/savant-free/e2e/tests/terminal-command.e2e.test.ts +0 -71
- package/savant-free/e2e/tests/version.e2e.test.ts +0 -50
- package/savant-free/e2e/utils/binary-helpers.ts +0 -24
- package/savant-free/e2e/utils/index.ts +0 -17
- package/savant-free/e2e/utils/savant-free-session.ts +0 -229
- package/savant-free/e2e/utils/tmux-custom-tools.ts +0 -156
- package/savant-free/e2e/utils/tmux-helpers.ts +0 -79
- package/savant-free/package.json +0 -20
- package/scripts/eslint-rules/__fixtures__/debug-ast.mjs +0 -20
- package/scripts/eslint-rules/__fixtures__/probe.mjs +0 -41
- package/scripts/eslint-rules/__fixtures__/probe2.mjs +0 -43
- package/scripts/eslint-rules/__fixtures__/rule-test.mjs +0 -44
- package/scripts/eslint-rules/__fixtures__/rule-test2.mjs +0 -27
- package/scripts/eslint-rules/__fixtures__/unknown-bad.ts +0 -21
- package/scripts/eslint-rules/__fixtures__/unknown-good.ts +0 -35
- package/scripts/eslint-rules/no-unknown-in-signatures.js +0 -141
- package/scripts/release.py +0 -360
- package/scripts/run-az-test.sh +0 -1150
- package/scripts/sync-agents.py +0 -337
- package/scripts/tmux/README.md +0 -359
- package/scripts/tmux/package.json +0 -9
- package/scripts/tmux/tmux-capture.sh +0 -231
- package/scripts/tmux/tmux-cli.sh +0 -160
- package/scripts/tmux/tmux-env.sh +0 -34
- package/scripts/tmux/tmux-send.sh +0 -339
- package/scripts/tmux/tmux-start.sh +0 -264
- package/scripts/tmux/tmux-stop.sh +0 -157
- package/scripts/tmux/tmux-viewer/README.md +0 -254
- package/scripts/tmux/tmux-viewer/components/session-viewer.tsx +0 -556
- package/scripts/tmux/tmux-viewer/components/theme.ts +0 -54
- package/scripts/tmux/tmux-viewer/gif-encoder-2.d.ts +0 -28
- package/scripts/tmux/tmux-viewer/gif-exporter.ts +0 -278
- package/scripts/tmux/tmux-viewer/index.tsx +0 -237
- package/scripts/tmux/tmux-viewer/package.json +0 -9
- package/scripts/tmux/tmux-viewer/session-loader.ts +0 -234
- package/scripts/tmux/tmux-viewer/tsconfig.json +0 -9
- package/scripts/tmux/tmux-viewer/types.ts +0 -76
- package/sdk/CHANGELOG.md +0 -126
- package/sdk/PUBLISHING.md +0 -55
- package/sdk/README.md +0 -334
- package/sdk/bunfig.toml +0 -6
- package/sdk/e2e/README.md +0 -158
- package/sdk/e2e/custom-agents/api-integration-agent.e2e.test.ts +0 -145
- package/sdk/e2e/custom-agents/apply-patch-tool.e2e.test.ts +0 -62
- package/sdk/e2e/custom-agents/database-query-agent.e2e.test.ts +0 -135
- package/sdk/e2e/custom-agents/weather-agent.e2e.test.ts +0 -120
- package/sdk/e2e/examples/code-explainer.example.ts +0 -62
- package/sdk/e2e/examples/code-reviewer.example.ts +0 -52
- package/sdk/e2e/examples/commit-message-generator.example.ts +0 -61
- package/sdk/e2e/examples/sdk-lint.example.ts +0 -65
- package/sdk/e2e/examples/sdk-refactor.example.ts +0 -63
- package/sdk/e2e/examples/sdk-test-gen.example.ts +0 -62
- package/sdk/e2e/features/knowledge-files.e2e.test.ts +0 -82
- package/sdk/e2e/features/max-agent-steps.e2e.test.ts +0 -65
- package/sdk/e2e/features/project-files.e2e.test.ts +0 -80
- package/sdk/e2e/integration/connection-check.integration.test.ts +0 -33
- package/sdk/e2e/integration/event-ordering.integration.test.ts +0 -186
- package/sdk/e2e/integration/event-types.integration.test.ts +0 -183
- package/sdk/e2e/integration/stream-chunks.integration.test.ts +0 -191
- package/sdk/e2e/streaming/concurrent-streams.e2e.test.ts +0 -164
- package/sdk/e2e/streaming/subagent-streaming.e2e.test.ts +0 -158
- package/sdk/e2e/utils/__tests__/event-collector.test.ts +0 -297
- package/sdk/e2e/utils/e2e-mocks.ts +0 -458
- package/sdk/e2e/utils/event-collector.ts +0 -145
- package/sdk/e2e/utils/get-api-key.ts +0 -76
- package/sdk/e2e/utils/index.ts +0 -3
- package/sdk/e2e/utils/test-fixtures.ts +0 -196
- package/sdk/e2e/workflows/error-recovery.e2e.test.ts +0 -112
- package/sdk/e2e/workflows/multi-turn-conversation.e2e.test.ts +0 -132
- package/sdk/examples/readme-example-1.ts +0 -34
- package/sdk/examples/readme-example-2.ts +0 -76
- package/sdk/package.json +0 -82
- package/sdk/scripts/build.ts +0 -349
- package/sdk/scripts/fetch-ripgrep.ts +0 -172
- package/sdk/scripts/publish.ts +0 -51
- package/sdk/scripts/release.js +0 -100
- package/sdk/scripts/verify.ts +0 -204
- package/sdk/sdk_exit +0 -1
- package/sdk/smoke-test-dist.ts +0 -248
- package/sdk/src/__tests__/apply-overrides-resume.test.ts +0 -83
- package/sdk/src/__tests__/apply-patch.test.ts +0 -438
- package/sdk/src/__tests__/build-file-tree.test.ts +0 -31
- package/sdk/src/__tests__/change-file.test.ts +0 -212
- package/sdk/src/__tests__/client.test.ts +0 -142
- package/sdk/src/__tests__/clone-session-state.test.ts +0 -158
- package/sdk/src/__tests__/code-search.test.ts +0 -896
- package/sdk/src/__tests__/composio.test.ts +0 -86
- package/sdk/src/__tests__/credentials.test.ts +0 -344
- package/sdk/src/__tests__/database.test.ts +0 -153
- package/sdk/src/__tests__/env.test.ts +0 -137
- package/sdk/src/__tests__/error-utils.test.ts +0 -253
- package/sdk/src/__tests__/fixtures/windows-stubborn-grandchild.ts +0 -26
- package/sdk/src/__tests__/initial-session-state.test.ts +0 -447
- package/sdk/src/__tests__/knowledge-file-selection.test.ts +0 -335
- package/sdk/src/__tests__/load-agents.test.ts +0 -935
- package/sdk/src/__tests__/load-mcp-config.test.ts +0 -285
- package/sdk/src/__tests__/load-skills.test.ts +0 -325
- package/sdk/src/__tests__/model-provider.test.ts +0 -44
- package/sdk/src/__tests__/path-utils.test.ts +0 -66
- package/sdk/src/__tests__/read-files.test.ts +0 -573
- package/sdk/src/__tests__/read-url.test.ts +0 -371
- package/sdk/src/__tests__/researcher-web.integration.test.ts +0 -130
- package/sdk/src/__tests__/run-cancellation.test.ts +0 -1321
- package/sdk/src/__tests__/run-error-preserves-history.test.ts +0 -335
- package/sdk/src/__tests__/run-event-dispatch.test.ts +0 -80
- package/sdk/src/__tests__/run-file-filter.test.ts +0 -530
- package/sdk/src/__tests__/run-handle-event.test.ts +0 -142
- package/sdk/src/__tests__/run-mcp-tool-filter.test.ts +0 -124
- package/sdk/src/__tests__/run-state-child-process.test.ts +0 -72
- package/sdk/src/__tests__/run-terminal-command.test.ts +0 -236
- package/sdk/src/__tests__/run.integration.test.ts +0 -170
- package/sdk/src/__tests__/user-knowledge-files.test.ts +0 -361
- package/sdk/src/__tests__/validate-agents.test.ts +0 -943
- package/sdk/src/agents/load-agents.ts +0 -339
- package/sdk/src/agents/load-mcp-config.ts +0 -275
- package/sdk/src/client.ts +0 -87
- package/sdk/src/composio.ts +0 -78
- package/sdk/src/constants.ts +0 -29
- package/sdk/src/credentials.ts +0 -303
- package/sdk/src/custom-tool.ts +0 -66
- package/sdk/src/env.ts +0 -116
- package/sdk/src/error-utils.ts +0 -127
- package/sdk/src/impl/__tests__/llm-chatgpt-oauth-policy.test.ts +0 -67
- package/sdk/src/impl/__tests__/llm-native-tool-call.test.ts +0 -38
- package/sdk/src/impl/__tests__/llm-stream-yielded-content.test.ts +0 -118
- package/sdk/src/impl/__tests__/model-provider-free-mode.test.ts +0 -166
- package/sdk/src/impl/__tests__/prompt-result.test.ts +0 -210
- package/sdk/src/impl/__tests__/provider-options-metadata.test.ts +0 -67
- package/sdk/src/impl/agent-runtime.ts +0 -159
- package/sdk/src/impl/chatgpt-backend-fetch.ts +0 -588
- package/sdk/src/impl/database.ts +0 -516
- package/sdk/src/impl/llm.ts +0 -852
- package/sdk/src/impl/model-provider.ts +0 -638
- package/sdk/src/impl/openrouter-key-resolver.ts +0 -78
- package/sdk/src/index.ts +0 -133
- package/sdk/src/native/ripgrep.ts +0 -141
- package/sdk/src/retry-config.ts +0 -51
- package/sdk/src/run-state.ts +0 -897
- package/sdk/src/run.ts +0 -1222
- package/sdk/src/skills/load-skills.ts +0 -253
- package/sdk/src/testing/env.ts +0 -19
- package/sdk/src/tools/apply-patch.ts +0 -690
- package/sdk/src/tools/change-file.ts +0 -155
- package/sdk/src/tools/code-search.ts +0 -547
- package/sdk/src/tools/glob.ts +0 -58
- package/sdk/src/tools/index.ts +0 -19
- package/sdk/src/tools/list-directory.ts +0 -52
- package/sdk/src/tools/path-utils.ts +0 -101
- package/sdk/src/tools/read-files.ts +0 -110
- package/sdk/src/tools/read-url.ts +0 -469
- package/sdk/src/tools/run-file-change-hooks.ts +0 -22
- package/sdk/src/tools/run-terminal-command.ts +0 -483
- package/sdk/src/tools/ssrf.ts +0 -120
- package/sdk/src/types/env.ts +0 -40
- package/sdk/src/utils/logger.ts +0 -15
- package/sdk/src/validate-agents.ts +0 -157
- package/sdk/test/cjs-compatibility/package-lock.json +0 -423
- package/sdk/test/cjs-compatibility/package.json +0 -21
- package/sdk/test/cjs-compatibility/test-imports.js +0 -77
- package/sdk/test/cjs-compatibility/test-types.ts +0 -54
- package/sdk/test/cjs-compatibility/tsconfig.json +0 -17
- package/sdk/test/esm-compatibility/package-lock.json +0 -423
- package/sdk/test/esm-compatibility/package.json +0 -21
- package/sdk/test/esm-compatibility/test-imports.js +0 -83
- package/sdk/test/esm-compatibility/test-types.ts +0 -59
- package/sdk/test/esm-compatibility/tsconfig.json +0 -17
- package/sdk/test/ripgrep-bundling/package-lock.json +0 -423
- package/sdk/test/ripgrep-bundling/package.json +0 -21
- package/sdk/test/ripgrep-bundling/test-ripgrep-types.ts +0 -132
- package/sdk/test/ripgrep-bundling/test-ripgrep.js +0 -257
- package/sdk/test/ripgrep-bundling/tsconfig.json +0 -15
- package/sdk/test/setup-env.ts +0 -54
- package/sdk/test/test-sdk.ts +0 -25
- package/sdk/test/tree-sitter-queries/package-lock.json +0 -47
- package/sdk/test/tree-sitter-queries/package.json +0 -12
- package/sdk/test/tree-sitter-queries/test-query-files.js +0 -256
- package/sdk/tsconfig.build.json +0 -32
- package/sdk/tsconfig.json +0 -27
- 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 +0 -125
- package/templates/README-TEMPLATE.md +0 -87
- package/templates/SESSION-SUMMARY.md +0 -135
- package/tsconfig.base.json +0 -18
- package/tsconfig.json +0 -27
- /package/{cli/release-core/http.js → http.js} +0 -0
|
@@ -1,1512 +0,0 @@
|
|
|
1
|
-
import * as analytics from '@savant-code/common/analytics'
|
|
2
|
-
import { TEST_USER_ID } from '@savant-code/common/old-constants'
|
|
3
|
-
import {
|
|
4
|
-
createTestAgentRuntimeParams,
|
|
5
|
-
emptyMcpServers,
|
|
6
|
-
} from '@savant-code/common/testing/fixtures/agent-runtime'
|
|
7
|
-
import { clearMockedModules } from '@savant-code/common/testing/mock-modules'
|
|
8
|
-
import {
|
|
9
|
-
createMockDbOperations,
|
|
10
|
-
setupDbSpies,
|
|
11
|
-
} from '@savant-code/common/testing/mocks/database'
|
|
12
|
-
import { getInitialSessionState } from '@savant-code/common/types/session-state'
|
|
13
|
-
import { AbortError, promptSuccess } from '@savant-code/common/util/error'
|
|
14
|
-
import {
|
|
15
|
-
assistantMessage,
|
|
16
|
-
userMessage,
|
|
17
|
-
} from '@savant-code/common/util/messages'
|
|
18
|
-
import { APICallError, RetryError } from 'ai'
|
|
19
|
-
import {
|
|
20
|
-
afterAll,
|
|
21
|
-
afterEach,
|
|
22
|
-
beforeAll,
|
|
23
|
-
beforeEach,
|
|
24
|
-
describe,
|
|
25
|
-
expect,
|
|
26
|
-
it,
|
|
27
|
-
mock,
|
|
28
|
-
spyOn,
|
|
29
|
-
} from 'bun:test'
|
|
30
|
-
import { z } from 'zod/v4'
|
|
31
|
-
|
|
32
|
-
import { createToolCallChunk, mockFileContext } from './test-utils'
|
|
33
|
-
import { loopAgentSteps } from '../run-agent-step'
|
|
34
|
-
import { clearAgentGeneratorCache } from '../run-programmatic-step'
|
|
35
|
-
import { clearThinkerConvergenceStateForTests } from '../tools/thinker-convergence-gate'
|
|
36
|
-
import { clearAllThoughtSessionsForTests } from '../tools/thought-session-store'
|
|
37
|
-
|
|
38
|
-
import type { AgentTemplate } from '../templates/types'
|
|
39
|
-
import type { DbSpies } from '@savant-code/common/testing/mocks/database'
|
|
40
|
-
import type { StepGenerator } from '@savant-code/common/types/agent-template'
|
|
41
|
-
import type { AgentState } from '@savant-code/common/types/session-state'
|
|
42
|
-
|
|
43
|
-
describe('loopAgentSteps - runAgentStep vs runProgrammaticStep behavior', () => {
|
|
44
|
-
let mockTemplate: AgentTemplate
|
|
45
|
-
let mockAgentState: AgentState
|
|
46
|
-
let llmCallCount: number
|
|
47
|
-
let agentRuntimeImpl: Omit<
|
|
48
|
-
ReturnType<typeof createTestAgentRuntimeParams>,
|
|
49
|
-
'agentTemplate' | 'localAgentTemplates'
|
|
50
|
-
> & {
|
|
51
|
-
promptAiSdkStream?: ReturnType<typeof mock>
|
|
52
|
-
}
|
|
53
|
-
let loopAgentStepsBaseParams: Parameters<typeof loopAgentSteps>[0]
|
|
54
|
-
let dbSpies: DbSpies
|
|
55
|
-
|
|
56
|
-
beforeAll(async () => {
|
|
57
|
-
// Set up mocks.
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
beforeEach(() => {
|
|
61
|
-
const {
|
|
62
|
-
agentTemplate: _,
|
|
63
|
-
localAgentTemplates: __,
|
|
64
|
-
...baseRuntimeParams
|
|
65
|
-
} = createTestAgentRuntimeParams()
|
|
66
|
-
|
|
67
|
-
agentRuntimeImpl = {
|
|
68
|
-
...baseRuntimeParams,
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
llmCallCount = 0
|
|
72
|
-
|
|
73
|
-
// Setup spies for database operations using typed helper
|
|
74
|
-
dbSpies = setupDbSpies(createMockDbOperations())
|
|
75
|
-
|
|
76
|
-
agentRuntimeImpl.promptAiSdkStream = mock(async function* ({}) {
|
|
77
|
-
llmCallCount++
|
|
78
|
-
yield { type: 'text' as const, text: 'LLM response\n\n' }
|
|
79
|
-
yield createToolCallChunk('end_turn', {})
|
|
80
|
-
return promptSuccess('mock-message-id')
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
// Mock analytics
|
|
84
|
-
spyOn(analytics, 'trackEvent').mockImplementation(() => {})
|
|
85
|
-
|
|
86
|
-
// Mock crypto.randomUUID
|
|
87
|
-
spyOn(crypto, 'randomUUID').mockImplementation(
|
|
88
|
-
() => 'mock-uuid-0000-0000-0000-000000000000' as const,
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
// Create mock template with programmatic agent
|
|
92
|
-
mockTemplate = {
|
|
93
|
-
id: 'test-agent',
|
|
94
|
-
displayName: 'Test Agent',
|
|
95
|
-
spawnerPrompt: 'Testing',
|
|
96
|
-
model: 'claude-3-5-sonnet-20241022',
|
|
97
|
-
inputSchema: {},
|
|
98
|
-
outputMode: 'structured_output',
|
|
99
|
-
includeMessageHistory: true,
|
|
100
|
-
inheritParentSystemPrompt: false,
|
|
101
|
-
mcpServers: emptyMcpServers,
|
|
102
|
-
toolNames: ['read_files', 'write_file', 'end_turn'],
|
|
103
|
-
spawnableAgents: [],
|
|
104
|
-
systemPrompt: 'Test system prompt',
|
|
105
|
-
instructionsPrompt: 'Test user prompt',
|
|
106
|
-
stepPrompt: 'Test agent step prompt',
|
|
107
|
-
handleSteps: undefined, // Will be set in individual tests
|
|
108
|
-
} satisfies AgentTemplate as AgentTemplate
|
|
109
|
-
|
|
110
|
-
// Create mock agent state
|
|
111
|
-
const sessionState = getInitialSessionState(mockFileContext)
|
|
112
|
-
mockAgentState = {
|
|
113
|
-
...sessionState.mainAgentState,
|
|
114
|
-
agentId: 'test-agent-id',
|
|
115
|
-
messageHistory: [
|
|
116
|
-
userMessage('Initial message'),
|
|
117
|
-
assistantMessage('Initial response'),
|
|
118
|
-
],
|
|
119
|
-
output: undefined,
|
|
120
|
-
stepsRemaining: 10, // Ensure we don't hit the limit
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
loopAgentStepsBaseParams = {
|
|
124
|
-
...agentRuntimeImpl,
|
|
125
|
-
agentType: 'test-agent',
|
|
126
|
-
localAgentTemplates: { 'test-agent': mockTemplate },
|
|
127
|
-
repoId: undefined,
|
|
128
|
-
repoUrl: undefined,
|
|
129
|
-
userInputId: 'test-user-input',
|
|
130
|
-
agentState: mockAgentState,
|
|
131
|
-
prompt: 'Test prompt',
|
|
132
|
-
spawnParams: undefined,
|
|
133
|
-
fingerprintId: 'test-fingerprint',
|
|
134
|
-
fileContext: mockFileContext,
|
|
135
|
-
userId: TEST_USER_ID,
|
|
136
|
-
clientSessionId: 'test-session',
|
|
137
|
-
ancestorRunIds: [],
|
|
138
|
-
onResponseChunk: () => {},
|
|
139
|
-
signal: new AbortController().signal,
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
afterEach(() => {
|
|
144
|
-
clearAgentGeneratorCache(agentRuntimeImpl)
|
|
145
|
-
dbSpies.restore()
|
|
146
|
-
mock.restore()
|
|
147
|
-
const {
|
|
148
|
-
agentTemplate: _,
|
|
149
|
-
localAgentTemplates: __,
|
|
150
|
-
...baseRuntimeParams
|
|
151
|
-
} = createTestAgentRuntimeParams()
|
|
152
|
-
agentRuntimeImpl = {
|
|
153
|
-
...baseRuntimeParams,
|
|
154
|
-
}
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
afterAll(() => {
|
|
158
|
-
clearMockedModules()
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
it('should verify correct STEP behavior - LLM called once after STEP', async () => {
|
|
162
|
-
// This test verifies that when a programmatic agent yields STEP,
|
|
163
|
-
// the LLM should be called once in the next iteration
|
|
164
|
-
|
|
165
|
-
let stepCount = 0
|
|
166
|
-
const mockGeneratorFunction = function* () {
|
|
167
|
-
stepCount++
|
|
168
|
-
// Execute a tool, then STEP
|
|
169
|
-
yield { toolName: 'read_files', input: { paths: ['file1.txt'] } }
|
|
170
|
-
yield 'STEP' // Should pause here and let LLM run
|
|
171
|
-
// Continue after LLM runs (this won't be reached in this test since LLM ends turn)
|
|
172
|
-
yield {
|
|
173
|
-
toolName: 'write_file',
|
|
174
|
-
input: { path: 'output.txt', content: 'test' },
|
|
175
|
-
}
|
|
176
|
-
yield { toolName: 'end_turn', input: {} }
|
|
177
|
-
} as () => StepGenerator
|
|
178
|
-
|
|
179
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
180
|
-
|
|
181
|
-
const localAgentTemplates = {
|
|
182
|
-
'test-agent': mockTemplate,
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const _result = await loopAgentSteps({
|
|
186
|
-
...loopAgentStepsBaseParams,
|
|
187
|
-
agentType: 'test-agent',
|
|
188
|
-
localAgentTemplates,
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
console.log(`LLM calls made: ${llmCallCount}`)
|
|
192
|
-
console.log(`Step count: ${stepCount}`)
|
|
193
|
-
|
|
194
|
-
// CORRECT BEHAVIOR: After STEP, LLM should be called once
|
|
195
|
-
// The programmatic agent yields STEP, then LLM runs once and ends turn
|
|
196
|
-
expect(llmCallCount).toBe(1) // LLM called once after STEP
|
|
197
|
-
|
|
198
|
-
// The programmatic agent should have been called once (yielded STEP)
|
|
199
|
-
expect(stepCount).toBe(1)
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
it('should demonstrate correct behavior when programmatic agent completes without STEP', async () => {
|
|
203
|
-
// This test shows that when a programmatic agent doesn't yield STEP,
|
|
204
|
-
// it should complete without calling the LLM at all (since it ends with end_turn)
|
|
205
|
-
|
|
206
|
-
const mockGeneratorFunction = function* () {
|
|
207
|
-
yield { toolName: 'read_files', input: { paths: ['file1.txt'] } }
|
|
208
|
-
yield {
|
|
209
|
-
toolName: 'write_file',
|
|
210
|
-
input: { path: 'output.txt', content: 'test' },
|
|
211
|
-
}
|
|
212
|
-
yield { toolName: 'end_turn', input: {} }
|
|
213
|
-
} as () => StepGenerator
|
|
214
|
-
|
|
215
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
216
|
-
|
|
217
|
-
const localAgentTemplates = {
|
|
218
|
-
'test-agent': mockTemplate,
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const result = await loopAgentSteps({
|
|
222
|
-
...loopAgentStepsBaseParams,
|
|
223
|
-
agentType: 'test-agent',
|
|
224
|
-
localAgentTemplates,
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
// Should NOT call LLM since the programmatic agent ended with end_turn
|
|
228
|
-
expect(llmCallCount).toBe(0)
|
|
229
|
-
// The result should have agentState
|
|
230
|
-
expect(result.agentState).toBeDefined()
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
it('should run programmatic step first, then LLM step, then continue', async () => {
|
|
234
|
-
// This test verifies the correct execution order in loopAgentSteps:
|
|
235
|
-
// 1. Programmatic step runs first and yields STEP
|
|
236
|
-
// 2. LLM step runs once
|
|
237
|
-
// 3. Loop continues but generator is complete after first STEP
|
|
238
|
-
|
|
239
|
-
let stepCount = 0
|
|
240
|
-
const mockGeneratorFunction = function* () {
|
|
241
|
-
stepCount++
|
|
242
|
-
// First execution: do some work, then STEP
|
|
243
|
-
yield { toolName: 'read_files', input: { paths: ['file1.txt'] } }
|
|
244
|
-
yield 'STEP' // Hand control to LLM
|
|
245
|
-
// After LLM runs, continue (this happens in the same generator instance)
|
|
246
|
-
yield {
|
|
247
|
-
toolName: 'write_file',
|
|
248
|
-
input: { path: 'output.txt', content: 'updated by LLM' },
|
|
249
|
-
}
|
|
250
|
-
yield { toolName: 'end_turn', input: {} }
|
|
251
|
-
} as () => StepGenerator
|
|
252
|
-
|
|
253
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
254
|
-
|
|
255
|
-
const localAgentTemplates = {
|
|
256
|
-
'test-agent': mockTemplate,
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const result = await loopAgentSteps({
|
|
260
|
-
...loopAgentStepsBaseParams,
|
|
261
|
-
agentType: 'test-agent',
|
|
262
|
-
localAgentTemplates,
|
|
263
|
-
})
|
|
264
|
-
|
|
265
|
-
// Verify execution order:
|
|
266
|
-
// 1. Programmatic step function was called once (creates generator)
|
|
267
|
-
// 2. LLM was called once after STEP
|
|
268
|
-
// 3. Generator continued after LLM step
|
|
269
|
-
expect(stepCount).toBe(1) // Generator function called once
|
|
270
|
-
expect(llmCallCount).toBe(1) // LLM called once after first STEP
|
|
271
|
-
expect(result.agentState).toBeDefined()
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
it('should handle programmatic agent that yields STEP_ALL', async () => {
|
|
275
|
-
// Test STEP_ALL behavior - should run LLM then continue with programmatic step
|
|
276
|
-
|
|
277
|
-
let stepCount = 0
|
|
278
|
-
const mockGeneratorFunction = function* () {
|
|
279
|
-
stepCount++
|
|
280
|
-
yield { toolName: 'read_files', input: { paths: ['file1.txt'] } }
|
|
281
|
-
yield 'STEP_ALL' // Hand all remaining control to LLM
|
|
282
|
-
// Should continue after LLM completes all its steps
|
|
283
|
-
yield {
|
|
284
|
-
toolName: 'write_file',
|
|
285
|
-
input: { path: 'final.txt', content: 'done' },
|
|
286
|
-
}
|
|
287
|
-
yield { toolName: 'end_turn', input: {} }
|
|
288
|
-
} as () => StepGenerator
|
|
289
|
-
|
|
290
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
291
|
-
|
|
292
|
-
const localAgentTemplates = {
|
|
293
|
-
'test-agent': mockTemplate,
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const result = await loopAgentSteps({
|
|
297
|
-
...loopAgentStepsBaseParams,
|
|
298
|
-
agentType: 'test-agent',
|
|
299
|
-
localAgentTemplates,
|
|
300
|
-
})
|
|
301
|
-
|
|
302
|
-
expect(stepCount).toBe(1) // Generator function called once
|
|
303
|
-
expect(llmCallCount).toBe(1) // LLM should be called once
|
|
304
|
-
expect(result.agentState).toBeDefined()
|
|
305
|
-
})
|
|
306
|
-
|
|
307
|
-
it('should not call LLM when programmatic agent returns without STEP', async () => {
|
|
308
|
-
// Test that programmatic agents that don't yield STEP don't trigger LLM
|
|
309
|
-
|
|
310
|
-
const mockGeneratorFunction = function* () {
|
|
311
|
-
yield { toolName: 'read_files', input: { paths: ['test.txt'] } }
|
|
312
|
-
yield {
|
|
313
|
-
toolName: 'write_file',
|
|
314
|
-
input: { path: 'result.txt', content: 'processed' },
|
|
315
|
-
}
|
|
316
|
-
// No STEP - agent completes without LLM involvement
|
|
317
|
-
yield { toolName: 'end_turn', input: {} }
|
|
318
|
-
} as () => StepGenerator
|
|
319
|
-
|
|
320
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
321
|
-
|
|
322
|
-
const localAgentTemplates = {
|
|
323
|
-
'test-agent': mockTemplate,
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const result = await loopAgentSteps({
|
|
327
|
-
...loopAgentStepsBaseParams,
|
|
328
|
-
agentType: 'test-agent',
|
|
329
|
-
localAgentTemplates,
|
|
330
|
-
})
|
|
331
|
-
|
|
332
|
-
expect(llmCallCount).toBe(0) // No LLM calls should be made
|
|
333
|
-
expect(result.agentState).toBeDefined()
|
|
334
|
-
})
|
|
335
|
-
|
|
336
|
-
it('should handle LLM-only agent (no handleSteps)', async () => {
|
|
337
|
-
// Test traditional LLM-based agents that don't have handleSteps
|
|
338
|
-
|
|
339
|
-
const llmOnlyTemplate = {
|
|
340
|
-
...mockTemplate,
|
|
341
|
-
handleSteps: undefined, // No programmatic step function
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const localAgentTemplates = {
|
|
345
|
-
'test-agent': llmOnlyTemplate,
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const result = await loopAgentSteps({
|
|
349
|
-
...loopAgentStepsBaseParams,
|
|
350
|
-
agentType: 'test-agent',
|
|
351
|
-
localAgentTemplates,
|
|
352
|
-
})
|
|
353
|
-
|
|
354
|
-
expect(llmCallCount).toBe(1) // LLM should be called once
|
|
355
|
-
expect(result.agentState).toBeDefined()
|
|
356
|
-
})
|
|
357
|
-
|
|
358
|
-
it('should pass the full message history to the traceWriter when provided', async () => {
|
|
359
|
-
const recordedSteps: Array<{ agentId: string; messages: unknown[] }> = []
|
|
360
|
-
const traceWriter = {
|
|
361
|
-
recordStep: (params: { agentId: string; messages: unknown[] }) => {
|
|
362
|
-
recordedSteps.push(params)
|
|
363
|
-
},
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
const result = await loopAgentSteps({
|
|
367
|
-
...loopAgentStepsBaseParams,
|
|
368
|
-
traceWriter,
|
|
369
|
-
agentType: 'test-agent',
|
|
370
|
-
localAgentTemplates: {
|
|
371
|
-
'test-agent': { ...mockTemplate, handleSteps: undefined },
|
|
372
|
-
},
|
|
373
|
-
})
|
|
374
|
-
|
|
375
|
-
expect(result.agentState).toBeDefined()
|
|
376
|
-
// Called at least at the start and end of the step
|
|
377
|
-
expect(recordedSteps.length).toBeGreaterThanOrEqual(2)
|
|
378
|
-
expect(recordedSteps[0]!.agentId).toBe('test-agent-id')
|
|
379
|
-
// End-of-step call sees the assistant response appended to the history
|
|
380
|
-
const lastMessages = recordedSteps[recordedSteps.length - 1]!.messages
|
|
381
|
-
expect(lastMessages.length).toBeGreaterThan(
|
|
382
|
-
recordedSteps[0]!.messages.length,
|
|
383
|
-
)
|
|
384
|
-
})
|
|
385
|
-
|
|
386
|
-
it('should handle programmatic agent error and still call LLM', async () => {
|
|
387
|
-
// Test error handling in programmatic step - should still allow LLM to run
|
|
388
|
-
|
|
389
|
-
const mockGeneratorFunction = function* () {
|
|
390
|
-
yield { toolName: 'read_files', input: { paths: ['file1.txt'] } }
|
|
391
|
-
throw new Error('Programmatic step failed')
|
|
392
|
-
} as () => StepGenerator
|
|
393
|
-
|
|
394
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
395
|
-
|
|
396
|
-
const localAgentTemplates = {
|
|
397
|
-
'test-agent': mockTemplate,
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
const result = await loopAgentSteps({
|
|
401
|
-
...loopAgentStepsBaseParams,
|
|
402
|
-
agentType: 'test-agent',
|
|
403
|
-
localAgentTemplates,
|
|
404
|
-
})
|
|
405
|
-
|
|
406
|
-
// After programmatic step error, should end turn and not call LLM
|
|
407
|
-
expect(llmCallCount).toBe(0)
|
|
408
|
-
expect(result.agentState).toBeDefined()
|
|
409
|
-
expect(result.agentState.output?.error).toContain(
|
|
410
|
-
'Error executing handleSteps for agent test-agent',
|
|
411
|
-
)
|
|
412
|
-
})
|
|
413
|
-
|
|
414
|
-
it('should handle mixed execution with multiple STEP yields', async () => {
|
|
415
|
-
// Test complex scenario with multiple STEP yields and LLM interactions
|
|
416
|
-
// Note: In current implementation, LLM typically ends turn after running,
|
|
417
|
-
// so this tests the first STEP interaction
|
|
418
|
-
|
|
419
|
-
let stepCount = 0
|
|
420
|
-
const mockGeneratorFunction = function* () {
|
|
421
|
-
stepCount++
|
|
422
|
-
yield { toolName: 'read_files', input: { paths: ['input.txt'] } }
|
|
423
|
-
yield 'STEP' // First LLM interaction
|
|
424
|
-
yield {
|
|
425
|
-
toolName: 'write_file',
|
|
426
|
-
input: { path: 'temp.txt', content: 'intermediate' },
|
|
427
|
-
}
|
|
428
|
-
yield {
|
|
429
|
-
toolName: 'write_file',
|
|
430
|
-
input: { path: 'final.txt', content: 'complete' },
|
|
431
|
-
}
|
|
432
|
-
yield { toolName: 'end_turn', input: {} }
|
|
433
|
-
} as () => StepGenerator
|
|
434
|
-
|
|
435
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
436
|
-
|
|
437
|
-
const localAgentTemplates = {
|
|
438
|
-
'test-agent': mockTemplate,
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
const result = await loopAgentSteps({
|
|
442
|
-
...loopAgentStepsBaseParams,
|
|
443
|
-
agentType: 'test-agent',
|
|
444
|
-
localAgentTemplates,
|
|
445
|
-
})
|
|
446
|
-
|
|
447
|
-
expect(stepCount).toBe(1) // Generator function called once
|
|
448
|
-
expect(llmCallCount).toBe(1) // LLM called once after STEP
|
|
449
|
-
expect(result.agentState).toBeDefined()
|
|
450
|
-
})
|
|
451
|
-
|
|
452
|
-
it('should pass shouldEndTurn: true as stepsComplete when end_turn tool is called', async () => {
|
|
453
|
-
// Test that when LLM calls end_turn, shouldEndTurn (stepsComplete) is correctly passed
|
|
454
|
-
// to the handleSteps generator via the step result.
|
|
455
|
-
//
|
|
456
|
-
// Flow:
|
|
457
|
-
// 1. Generator yields 'STEP', runProgrammaticStep returns
|
|
458
|
-
// 2. loopAgentSteps calls runAgentStep (LLM), which calls end_turn -> shouldEndTurn = true
|
|
459
|
-
// 3. loopAgentSteps calls runProgrammaticStep again with stepsComplete: true
|
|
460
|
-
// 4. Generator resumes from yield 'STEP' and receives { stepsComplete: true }
|
|
461
|
-
|
|
462
|
-
let stepsCompleteValues: boolean[] = []
|
|
463
|
-
|
|
464
|
-
const mockGeneratorFunction = function* () {
|
|
465
|
-
// First STEP - after LLM runs and calls end_turn, we receive stepsComplete: true
|
|
466
|
-
const result1 = yield 'STEP'
|
|
467
|
-
stepsCompleteValues.push(result1.stepsComplete)
|
|
468
|
-
|
|
469
|
-
// Since stepsComplete was true, we should end gracefully
|
|
470
|
-
yield { toolName: 'end_turn', input: {} }
|
|
471
|
-
} as () => StepGenerator
|
|
472
|
-
|
|
473
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
474
|
-
|
|
475
|
-
const localAgentTemplates = {
|
|
476
|
-
'test-agent': mockTemplate,
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
await loopAgentSteps({
|
|
480
|
-
...loopAgentStepsBaseParams,
|
|
481
|
-
agentType: 'test-agent',
|
|
482
|
-
localAgentTemplates,
|
|
483
|
-
})
|
|
484
|
-
|
|
485
|
-
// Verify that stepsComplete was passed correctly:
|
|
486
|
-
// After yielding STEP and LLM running (which calls end_turn),
|
|
487
|
-
// the generator receives stepsComplete: true
|
|
488
|
-
expect(stepsCompleteValues).toHaveLength(1)
|
|
489
|
-
expect(stepsCompleteValues[0]).toBe(true)
|
|
490
|
-
})
|
|
491
|
-
|
|
492
|
-
it('should continue loop when handleSteps returns endTurn: false even if LLM calls end_turn', async () => {
|
|
493
|
-
// Test that handleSteps endTurn: false takes precedence over LLM end_turn tool call
|
|
494
|
-
|
|
495
|
-
let programmaticStepCount = 0
|
|
496
|
-
let llmStepCount = 0
|
|
497
|
-
|
|
498
|
-
const mockGeneratorFunction = function* () {
|
|
499
|
-
// First iteration: return endTurn: false
|
|
500
|
-
programmaticStepCount++
|
|
501
|
-
yield 'STEP'
|
|
502
|
-
|
|
503
|
-
// Second iteration: also return endTurn: false
|
|
504
|
-
programmaticStepCount++
|
|
505
|
-
yield 'STEP'
|
|
506
|
-
|
|
507
|
-
// Third iteration: finally return endTurn: true to end the loop
|
|
508
|
-
programmaticStepCount++
|
|
509
|
-
yield { toolName: 'end_turn', input: {} }
|
|
510
|
-
} as () => StepGenerator
|
|
511
|
-
|
|
512
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
513
|
-
|
|
514
|
-
const localAgentTemplates = {
|
|
515
|
-
'test-agent': mockTemplate,
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
// Mock LLM to always call end_turn, but handleSteps should override it
|
|
519
|
-
let promptCallCount = 0
|
|
520
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
521
|
-
promptCallCount++
|
|
522
|
-
llmStepCount++
|
|
523
|
-
|
|
524
|
-
// LLM always tries to end turn
|
|
525
|
-
yield { type: 'text' as const, text: 'LLM response\n\n' }
|
|
526
|
-
yield createToolCallChunk('end_turn', {})
|
|
527
|
-
return promptSuccess(`mock-message-id-${promptCallCount}`)
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
await loopAgentSteps({
|
|
531
|
-
...loopAgentStepsBaseParams,
|
|
532
|
-
agentType: 'test-agent',
|
|
533
|
-
localAgentTemplates,
|
|
534
|
-
})
|
|
535
|
-
|
|
536
|
-
// Verify handleSteps ran 3 times (yielded STEP twice, then end_turn)
|
|
537
|
-
expect(programmaticStepCount).toBe(3)
|
|
538
|
-
|
|
539
|
-
// Verify LLM was called 2 times (once per STEP yield)
|
|
540
|
-
expect(llmStepCount).toBe(2)
|
|
541
|
-
|
|
542
|
-
// This confirms that even though LLM called end_turn every time,
|
|
543
|
-
// the loop continued because handleSteps kept yielding STEP before finally ending
|
|
544
|
-
})
|
|
545
|
-
|
|
546
|
-
it('should restart loop when agent finishes without setting required output', async () => {
|
|
547
|
-
// Test that when an agent has outputSchema but finishes without calling set_output,
|
|
548
|
-
// the loop restarts with a system message
|
|
549
|
-
|
|
550
|
-
const outputSchema = z.object({
|
|
551
|
-
result: z.string(),
|
|
552
|
-
status: z.string(),
|
|
553
|
-
})
|
|
554
|
-
|
|
555
|
-
const templateWithOutputSchema = {
|
|
556
|
-
...mockTemplate,
|
|
557
|
-
outputSchema,
|
|
558
|
-
toolNames: ['set_output', 'end_turn'], // Add set_output to available tools
|
|
559
|
-
handleSteps: undefined, // LLM-only agent
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
const localAgentTemplates = {
|
|
563
|
-
'test-agent': templateWithOutputSchema,
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
let llmCallNumber = 0
|
|
567
|
-
let capturedAgentState: AgentState | null = null
|
|
568
|
-
|
|
569
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* ({}) {
|
|
570
|
-
llmCallNumber++
|
|
571
|
-
if (llmCallNumber === 1) {
|
|
572
|
-
// First call: agent tries to end turn without setting output
|
|
573
|
-
yield {
|
|
574
|
-
type: 'text' as const,
|
|
575
|
-
text: 'First response without output\n\n',
|
|
576
|
-
}
|
|
577
|
-
yield createToolCallChunk('end_turn', {})
|
|
578
|
-
} else if (llmCallNumber === 2) {
|
|
579
|
-
// Second call: agent sets output after being reminded
|
|
580
|
-
// Manually set the output to simulate the set_output tool execution
|
|
581
|
-
if (capturedAgentState) {
|
|
582
|
-
capturedAgentState.output = {
|
|
583
|
-
result: 'test result',
|
|
584
|
-
status: 'success',
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
yield { type: 'text' as const, text: 'Setting output now\n\n' }
|
|
588
|
-
yield createToolCallChunk('set_output', {
|
|
589
|
-
result: 'test result',
|
|
590
|
-
status: 'success',
|
|
591
|
-
})
|
|
592
|
-
yield { type: 'text' as const, text: '\n\n' }
|
|
593
|
-
yield createToolCallChunk('end_turn', {})
|
|
594
|
-
} else {
|
|
595
|
-
// Safety: if called more than twice, just end
|
|
596
|
-
yield { type: 'text' as const, text: 'Ending\n\n' }
|
|
597
|
-
yield createToolCallChunk('end_turn', {})
|
|
598
|
-
}
|
|
599
|
-
return promptSuccess('mock-message-id')
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
mockAgentState.output = undefined
|
|
603
|
-
capturedAgentState = mockAgentState
|
|
604
|
-
|
|
605
|
-
const result = await loopAgentSteps({
|
|
606
|
-
...loopAgentStepsBaseParams,
|
|
607
|
-
agentType: 'test-agent',
|
|
608
|
-
localAgentTemplates,
|
|
609
|
-
})
|
|
610
|
-
|
|
611
|
-
// Should call LLM twice: once to try ending without output, once after reminder
|
|
612
|
-
expect(llmCallNumber).toBe(2)
|
|
613
|
-
|
|
614
|
-
// Should have output set after the second attempt
|
|
615
|
-
expect(result.agentState.output).toEqual({
|
|
616
|
-
result: 'test result',
|
|
617
|
-
status: 'success',
|
|
618
|
-
})
|
|
619
|
-
|
|
620
|
-
// Check that a system message was added to message history
|
|
621
|
-
const systemMessages = result.agentState.messageHistory.filter(
|
|
622
|
-
(msg) =>
|
|
623
|
-
msg.role === 'user' &&
|
|
624
|
-
msg.content[0].type === 'text' &&
|
|
625
|
-
msg.content[0].text.includes('set_output'),
|
|
626
|
-
)
|
|
627
|
-
expect(systemMessages.length).toBeGreaterThan(0)
|
|
628
|
-
})
|
|
629
|
-
|
|
630
|
-
it('should not restart loop if output is set correctly', async () => {
|
|
631
|
-
// Test that when an agent has outputSchema and sets output correctly,
|
|
632
|
-
// the loop ends normally without restarting
|
|
633
|
-
|
|
634
|
-
const outputSchema = z.object({
|
|
635
|
-
result: z.string(),
|
|
636
|
-
})
|
|
637
|
-
|
|
638
|
-
const templateWithOutputSchema = {
|
|
639
|
-
...mockTemplate,
|
|
640
|
-
outputSchema,
|
|
641
|
-
toolNames: ['set_output', 'end_turn'],
|
|
642
|
-
handleSteps: undefined,
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
const localAgentTemplates = {
|
|
646
|
-
'test-agent': templateWithOutputSchema,
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
let llmCallNumber = 0
|
|
650
|
-
let capturedAgentState: AgentState | null = null
|
|
651
|
-
|
|
652
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* ({}) {
|
|
653
|
-
llmCallNumber++
|
|
654
|
-
// Agent sets output correctly on first call
|
|
655
|
-
if (capturedAgentState) {
|
|
656
|
-
capturedAgentState.output = { result: 'success' }
|
|
657
|
-
}
|
|
658
|
-
yield { type: 'text' as const, text: 'Setting output\n\n' }
|
|
659
|
-
yield createToolCallChunk('set_output', { result: 'success' })
|
|
660
|
-
yield { type: 'text' as const, text: '\n\n' }
|
|
661
|
-
yield createToolCallChunk('end_turn', {})
|
|
662
|
-
return promptSuccess('mock-message-id')
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
mockAgentState.output = undefined
|
|
666
|
-
capturedAgentState = mockAgentState
|
|
667
|
-
|
|
668
|
-
const result = await loopAgentSteps({
|
|
669
|
-
...loopAgentStepsBaseParams,
|
|
670
|
-
agentType: 'test-agent',
|
|
671
|
-
localAgentTemplates,
|
|
672
|
-
})
|
|
673
|
-
|
|
674
|
-
// Should only call LLM once since output was set correctly
|
|
675
|
-
expect(llmCallNumber).toBe(1)
|
|
676
|
-
|
|
677
|
-
// Should have output set
|
|
678
|
-
expect(result.agentState.output).toEqual({ result: 'success' })
|
|
679
|
-
})
|
|
680
|
-
|
|
681
|
-
it('should pass generateN from programmatic step to runAgentStep as n parameter', async () => {
|
|
682
|
-
// Test that when programmatic step returns generateN, it's passed to runAgentStep
|
|
683
|
-
|
|
684
|
-
let agentStepN: number | undefined
|
|
685
|
-
|
|
686
|
-
const mockGeneratorFunction = function* () {
|
|
687
|
-
// Yield GENERATE_N to trigger n parameter
|
|
688
|
-
yield { type: 'GENERATE_N', n: 5 }
|
|
689
|
-
} as () => StepGenerator
|
|
690
|
-
|
|
691
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
692
|
-
|
|
693
|
-
const localAgentTemplates = {
|
|
694
|
-
'test-agent': mockTemplate,
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
// Mock promptAiSdk to capture the n parameter
|
|
698
|
-
loopAgentStepsBaseParams.promptAiSdk = async (params: any) => {
|
|
699
|
-
agentStepN = params.n
|
|
700
|
-
return promptSuccess(
|
|
701
|
-
JSON.stringify([
|
|
702
|
-
'Response 1',
|
|
703
|
-
'Response 2',
|
|
704
|
-
'Response 3',
|
|
705
|
-
'Response 4',
|
|
706
|
-
'Response 5',
|
|
707
|
-
]),
|
|
708
|
-
)
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
await loopAgentSteps({
|
|
712
|
-
...loopAgentStepsBaseParams,
|
|
713
|
-
agentType: 'test-agent',
|
|
714
|
-
localAgentTemplates,
|
|
715
|
-
})
|
|
716
|
-
|
|
717
|
-
// Verify generateN was passed to runAgentStep as n
|
|
718
|
-
expect(agentStepN).toBe(5)
|
|
719
|
-
})
|
|
720
|
-
|
|
721
|
-
it('should pass nResponses from runAgentStep back to programmatic step', async () => {
|
|
722
|
-
// Test that nResponses returned by runAgentStep are passed to next programmatic step
|
|
723
|
-
|
|
724
|
-
let receivedNResponses: string[] | undefined
|
|
725
|
-
|
|
726
|
-
const mockGeneratorFunction = function* () {
|
|
727
|
-
const { nResponses } = yield { type: 'GENERATE_N', n: 3 }
|
|
728
|
-
receivedNResponses = nResponses
|
|
729
|
-
const _step = yield {
|
|
730
|
-
toolName: 'read_files',
|
|
731
|
-
input: { paths: ['test.txt'] },
|
|
732
|
-
}
|
|
733
|
-
yield { toolName: 'end_turn', input: {} }
|
|
734
|
-
} as () => StepGenerator
|
|
735
|
-
|
|
736
|
-
mockTemplate.handleSteps = mockGeneratorFunction
|
|
737
|
-
|
|
738
|
-
const localAgentTemplates = {
|
|
739
|
-
'test-agent': mockTemplate,
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
const expectedResponses = [
|
|
743
|
-
'Implementation A',
|
|
744
|
-
'Implementation B',
|
|
745
|
-
'Implementation C',
|
|
746
|
-
]
|
|
747
|
-
loopAgentStepsBaseParams.promptAiSdk = async () => {
|
|
748
|
-
return promptSuccess(JSON.stringify(expectedResponses))
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
await loopAgentSteps({
|
|
752
|
-
...loopAgentStepsBaseParams,
|
|
753
|
-
agentType: 'test-agent',
|
|
754
|
-
localAgentTemplates,
|
|
755
|
-
})
|
|
756
|
-
|
|
757
|
-
expect(receivedNResponses).toEqual(expectedResponses)
|
|
758
|
-
})
|
|
759
|
-
|
|
760
|
-
it('should allow agents without outputSchema to end normally', async () => {
|
|
761
|
-
// Test that agents without outputSchema can end without setting output
|
|
762
|
-
|
|
763
|
-
const templateWithoutOutputSchema = {
|
|
764
|
-
...mockTemplate,
|
|
765
|
-
outputSchema: undefined,
|
|
766
|
-
handleSteps: undefined,
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
const localAgentTemplates = {
|
|
770
|
-
'test-agent': templateWithoutOutputSchema,
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
let llmCallNumber = 0
|
|
774
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* ({}) {
|
|
775
|
-
llmCallNumber++
|
|
776
|
-
yield { type: 'text' as const, text: 'Response without output\n\n' }
|
|
777
|
-
yield createToolCallChunk('end_turn', {})
|
|
778
|
-
return promptSuccess('mock-message-id')
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
const result = await loopAgentSteps({
|
|
782
|
-
...loopAgentStepsBaseParams,
|
|
783
|
-
agentType: 'test-agent',
|
|
784
|
-
localAgentTemplates,
|
|
785
|
-
})
|
|
786
|
-
|
|
787
|
-
// Should only call LLM once and end normally
|
|
788
|
-
expect(llmCallNumber).toBe(1)
|
|
789
|
-
|
|
790
|
-
// Output should be undefined since no outputSchema required
|
|
791
|
-
expect(result.agentState.output).toBeUndefined()
|
|
792
|
-
})
|
|
793
|
-
|
|
794
|
-
it('should continue loop if agent does not end turn (has more work)', async () => {
|
|
795
|
-
// Test that validation only triggers when shouldEndTurn is true
|
|
796
|
-
|
|
797
|
-
const outputSchema = z.object({
|
|
798
|
-
result: z.string(),
|
|
799
|
-
})
|
|
800
|
-
|
|
801
|
-
const templateWithOutputSchema = {
|
|
802
|
-
...mockTemplate,
|
|
803
|
-
outputSchema,
|
|
804
|
-
toolNames: ['read_files', 'set_output', 'end_turn'],
|
|
805
|
-
handleSteps: undefined,
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
const localAgentTemplates = {
|
|
809
|
-
'test-agent': templateWithOutputSchema,
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
let llmCallNumber = 0
|
|
813
|
-
let capturedAgentState: AgentState | null = null
|
|
814
|
-
|
|
815
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* ({}) {
|
|
816
|
-
llmCallNumber++
|
|
817
|
-
if (llmCallNumber === 1) {
|
|
818
|
-
// First call: agent does some work but doesn't end turn
|
|
819
|
-
yield { type: 'text' as const, text: 'Doing work\n\n' }
|
|
820
|
-
yield createToolCallChunk('read_files', { paths: ['test.txt'] })
|
|
821
|
-
} else {
|
|
822
|
-
// Second call: agent sets output and ends
|
|
823
|
-
if (capturedAgentState) {
|
|
824
|
-
capturedAgentState.output = { result: 'done' }
|
|
825
|
-
}
|
|
826
|
-
yield { type: 'text' as const, text: 'Finishing\n\n' }
|
|
827
|
-
yield createToolCallChunk('set_output', { result: 'done' })
|
|
828
|
-
yield { type: 'text' as const, text: '\n\n' }
|
|
829
|
-
yield createToolCallChunk('end_turn', {})
|
|
830
|
-
}
|
|
831
|
-
return promptSuccess('mock-message-id')
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
mockAgentState.output = undefined
|
|
835
|
-
capturedAgentState = mockAgentState
|
|
836
|
-
|
|
837
|
-
const result = await loopAgentSteps({
|
|
838
|
-
...loopAgentStepsBaseParams,
|
|
839
|
-
agentType: 'test-agent',
|
|
840
|
-
localAgentTemplates,
|
|
841
|
-
})
|
|
842
|
-
|
|
843
|
-
// Should call LLM twice: once for work, once to set output and end
|
|
844
|
-
expect(llmCallNumber).toBe(2)
|
|
845
|
-
|
|
846
|
-
// Should have output set
|
|
847
|
-
expect(result.agentState.output).toEqual({ result: 'done' })
|
|
848
|
-
})
|
|
849
|
-
|
|
850
|
-
describe('abort handling', () => {
|
|
851
|
-
it('should handle AbortError and finish with cancelled status', async () => {
|
|
852
|
-
// Test that when an AbortError is thrown (e.g., from a tool handler),
|
|
853
|
-
// loopAgentSteps catches it, finishes with 'cancelled' status, and returns
|
|
854
|
-
// an error output indicating the run was cancelled.
|
|
855
|
-
|
|
856
|
-
const llmOnlyTemplate = {
|
|
857
|
-
...mockTemplate,
|
|
858
|
-
handleSteps: undefined,
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
const localAgentTemplates = {
|
|
862
|
-
'test-agent': llmOnlyTemplate,
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
// Track finishAgentRun calls
|
|
866
|
-
let finishAgentRunStatus: string | undefined
|
|
867
|
-
const mockFinishAgentRun = mock(async (params: { status: string }) => {
|
|
868
|
-
finishAgentRunStatus = params.status
|
|
869
|
-
})
|
|
870
|
-
|
|
871
|
-
// Mock promptAiSdkStream to throw an AbortError (simulating user cancellation mid-stream)
|
|
872
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
873
|
-
// Yield some content first
|
|
874
|
-
yield { type: 'text' as const, text: 'Starting work...\n' }
|
|
875
|
-
// Then throw AbortError to simulate user cancellation
|
|
876
|
-
throw new AbortError('User pressed Ctrl+C')
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
const result = await loopAgentSteps({
|
|
880
|
-
...loopAgentStepsBaseParams,
|
|
881
|
-
agentType: 'test-agent',
|
|
882
|
-
localAgentTemplates,
|
|
883
|
-
finishAgentRun: mockFinishAgentRun,
|
|
884
|
-
})
|
|
885
|
-
|
|
886
|
-
// Verify the output indicates cancellation
|
|
887
|
-
expect(result.output.type).toBe('error')
|
|
888
|
-
if (result.output.type === 'error') {
|
|
889
|
-
expect(result.output.message).toBe('Run cancelled by user')
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
// Verify finishAgentRun was called with 'cancelled' status
|
|
893
|
-
expect(mockFinishAgentRun).toHaveBeenCalled()
|
|
894
|
-
expect(finishAgentRunStatus).toBe('cancelled')
|
|
895
|
-
})
|
|
896
|
-
|
|
897
|
-
it('should distinguish AbortError from other errors', async () => {
|
|
898
|
-
// Test that non-abort errors are NOT treated as cancellations
|
|
899
|
-
|
|
900
|
-
const llmOnlyTemplate = {
|
|
901
|
-
...mockTemplate,
|
|
902
|
-
handleSteps: undefined,
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
const localAgentTemplates = {
|
|
906
|
-
'test-agent': llmOnlyTemplate,
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
// Track finishAgentRun calls
|
|
910
|
-
let finishAgentRunStatus: string | undefined
|
|
911
|
-
const mockFinishAgentRun = mock(async (params: { status: string }) => {
|
|
912
|
-
finishAgentRunStatus = params.status
|
|
913
|
-
})
|
|
914
|
-
|
|
915
|
-
// Mock promptAiSdkStream to throw a regular error (not AbortError)
|
|
916
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
917
|
-
yield { type: 'text' as const, text: 'Starting...\n' }
|
|
918
|
-
throw new Error('Network connection failed')
|
|
919
|
-
}
|
|
920
|
-
|
|
921
|
-
const result = await loopAgentSteps({
|
|
922
|
-
...loopAgentStepsBaseParams,
|
|
923
|
-
agentType: 'test-agent',
|
|
924
|
-
localAgentTemplates,
|
|
925
|
-
finishAgentRun: mockFinishAgentRun,
|
|
926
|
-
})
|
|
927
|
-
|
|
928
|
-
// Verify the output indicates an error (not cancellation)
|
|
929
|
-
expect(result.output.type).toBe('error')
|
|
930
|
-
if (result.output.type === 'error') {
|
|
931
|
-
expect(result.output.message).toContain('Network connection failed')
|
|
932
|
-
expect(result.output.message).not.toBe('Run cancelled by user')
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
// Verify finishAgentRun was called with 'failed' status (not 'cancelled')
|
|
936
|
-
expect(mockFinishAgentRun).toHaveBeenCalled()
|
|
937
|
-
expect(finishAgentRunStatus).toBe('failed')
|
|
938
|
-
})
|
|
939
|
-
|
|
940
|
-
it('should handle signal.aborted before loop starts', async () => {
|
|
941
|
-
// Test that if signal is already aborted when loopAgentSteps is called,
|
|
942
|
-
// it returns immediately with a cancelled message
|
|
943
|
-
|
|
944
|
-
const abortController = new AbortController()
|
|
945
|
-
abortController.abort() // Abort immediately
|
|
946
|
-
|
|
947
|
-
const llmOnlyTemplate = {
|
|
948
|
-
...mockTemplate,
|
|
949
|
-
handleSteps: undefined,
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
const localAgentTemplates = {
|
|
953
|
-
'test-agent': llmOnlyTemplate,
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
const result = await loopAgentSteps({
|
|
957
|
-
...loopAgentStepsBaseParams,
|
|
958
|
-
agentType: 'test-agent',
|
|
959
|
-
localAgentTemplates,
|
|
960
|
-
signal: abortController.signal,
|
|
961
|
-
})
|
|
962
|
-
|
|
963
|
-
// Verify the output indicates cancellation
|
|
964
|
-
expect(result.output.type).toBe('error')
|
|
965
|
-
if (result.output.type === 'error') {
|
|
966
|
-
expect(result.output.message).toBe('Run cancelled by user')
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
// LLM should not have been called since we aborted before starting
|
|
970
|
-
expect(llmCallCount).toBe(0)
|
|
971
|
-
})
|
|
972
|
-
})
|
|
973
|
-
|
|
974
|
-
describe('API error handling', () => {
|
|
975
|
-
it('should propagate error code and server message from 403 APICallError responseBody', async () => {
|
|
976
|
-
const llmOnlyTemplate = {
|
|
977
|
-
...mockTemplate,
|
|
978
|
-
handleSteps: undefined,
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
const localAgentTemplates = {
|
|
982
|
-
'test-agent': llmOnlyTemplate,
|
|
983
|
-
}
|
|
984
|
-
|
|
985
|
-
// Mock promptAiSdkStream to throw an APICallError with a 403 status
|
|
986
|
-
// and a responseBody containing the server's structured error
|
|
987
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
988
|
-
throw new APICallError({
|
|
989
|
-
statusCode: 403,
|
|
990
|
-
message: 'Forbidden',
|
|
991
|
-
url: 'https://api.savant-code.com/v1/chat/completions',
|
|
992
|
-
requestBodyValues: {},
|
|
993
|
-
responseBody: JSON.stringify({
|
|
994
|
-
error: 'free_mode_unavailable',
|
|
995
|
-
message: 'Free mode is not available in your country.',
|
|
996
|
-
countryCode: 'US',
|
|
997
|
-
countryBlockReason: 'anonymous_network',
|
|
998
|
-
ipPrivacySignals: ['vpn', 'hosting'],
|
|
999
|
-
}),
|
|
1000
|
-
isRetryable: false,
|
|
1001
|
-
})
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
const result = await loopAgentSteps({
|
|
1005
|
-
...loopAgentStepsBaseParams,
|
|
1006
|
-
agentType: 'test-agent',
|
|
1007
|
-
localAgentTemplates,
|
|
1008
|
-
})
|
|
1009
|
-
|
|
1010
|
-
expect(result.output.type).toBe('error')
|
|
1011
|
-
if (result.output.type === 'error') {
|
|
1012
|
-
// Should use the server's message, NOT the generic "Forbidden"
|
|
1013
|
-
expect(result.output.message).toBe(
|
|
1014
|
-
'Free mode is not available in your country.',
|
|
1015
|
-
)
|
|
1016
|
-
// Should NOT have the 'Agent run error: ' prefix since message came from responseBody
|
|
1017
|
-
expect(result.output.message).not.toContain('Agent run error:')
|
|
1018
|
-
// Should propagate the error code so the CLI can match on it
|
|
1019
|
-
expect(result.output.error).toBe('free_mode_unavailable')
|
|
1020
|
-
// Should propagate the status code
|
|
1021
|
-
expect(result.output.statusCode).toBe(403)
|
|
1022
|
-
expect(result.output.countryCode).toBe('US')
|
|
1023
|
-
expect(result.output.countryBlockReason).toBe('anonymous_network')
|
|
1024
|
-
expect(result.output.ipPrivacySignals).toEqual(['vpn', 'hosting'])
|
|
1025
|
-
}
|
|
1026
|
-
})
|
|
1027
|
-
|
|
1028
|
-
it('should prefix with "Agent run error:" when responseBody has no parseable message', async () => {
|
|
1029
|
-
const llmOnlyTemplate = {
|
|
1030
|
-
...mockTemplate,
|
|
1031
|
-
handleSteps: undefined,
|
|
1032
|
-
}
|
|
1033
|
-
|
|
1034
|
-
const localAgentTemplates = {
|
|
1035
|
-
'test-agent': llmOnlyTemplate,
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
// APICallError with no responseBody
|
|
1039
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1040
|
-
throw new APICallError({
|
|
1041
|
-
statusCode: 500,
|
|
1042
|
-
message: 'Internal Server Error',
|
|
1043
|
-
url: 'https://api.savant-code.com/v1/chat/completions',
|
|
1044
|
-
requestBodyValues: {},
|
|
1045
|
-
responseBody: undefined,
|
|
1046
|
-
isRetryable: true,
|
|
1047
|
-
})
|
|
1048
|
-
}
|
|
1049
|
-
|
|
1050
|
-
const result = await loopAgentSteps({
|
|
1051
|
-
...loopAgentStepsBaseParams,
|
|
1052
|
-
agentType: 'test-agent',
|
|
1053
|
-
localAgentTemplates,
|
|
1054
|
-
})
|
|
1055
|
-
|
|
1056
|
-
expect(result.output.type).toBe('error')
|
|
1057
|
-
if (result.output.type === 'error') {
|
|
1058
|
-
// Should have the prefix since there's no server message
|
|
1059
|
-
expect(result.output.message).toContain('Agent run error:')
|
|
1060
|
-
expect(result.output.message).toContain('Internal Server Error')
|
|
1061
|
-
// No error code since responseBody wasn't parseable
|
|
1062
|
-
expect(result.output.error).toBeUndefined()
|
|
1063
|
-
}
|
|
1064
|
-
})
|
|
1065
|
-
|
|
1066
|
-
it('should unwrap retry errors to propagate underlying 409 gate errors', async () => {
|
|
1067
|
-
const llmOnlyTemplate = {
|
|
1068
|
-
...mockTemplate,
|
|
1069
|
-
handleSteps: undefined,
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
const localAgentTemplates = {
|
|
1073
|
-
'test-agent': llmOnlyTemplate,
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
|
-
const apiError = new APICallError({
|
|
1077
|
-
statusCode: 409,
|
|
1078
|
-
message: 'Conflict',
|
|
1079
|
-
url: 'https://api.savant-code.com/v1/chat/completions',
|
|
1080
|
-
requestBodyValues: {},
|
|
1081
|
-
responseBody: JSON.stringify({
|
|
1082
|
-
error: 'session_superseded',
|
|
1083
|
-
message:
|
|
1084
|
-
'Another instance of savant-free has taken over this session. Only one instance per account is allowed.',
|
|
1085
|
-
}),
|
|
1086
|
-
isRetryable: true,
|
|
1087
|
-
})
|
|
1088
|
-
|
|
1089
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1090
|
-
throw new RetryError({
|
|
1091
|
-
message: 'Failed after 4 attempts. Last error: Conflict',
|
|
1092
|
-
reason: 'maxRetriesExceeded',
|
|
1093
|
-
errors: [apiError],
|
|
1094
|
-
})
|
|
1095
|
-
}
|
|
1096
|
-
|
|
1097
|
-
const result = await loopAgentSteps({
|
|
1098
|
-
...loopAgentStepsBaseParams,
|
|
1099
|
-
agentType: 'test-agent',
|
|
1100
|
-
localAgentTemplates,
|
|
1101
|
-
})
|
|
1102
|
-
|
|
1103
|
-
expect(result.output.type).toBe('error')
|
|
1104
|
-
if (result.output.type === 'error') {
|
|
1105
|
-
expect(result.output.message).toBe(
|
|
1106
|
-
'Another instance of savant-free has taken over this session. Only one instance per account is allowed.',
|
|
1107
|
-
)
|
|
1108
|
-
expect(result.output.message).not.toContain('Agent run error:')
|
|
1109
|
-
expect(result.output.error).toBe('session_superseded')
|
|
1110
|
-
expect(result.output.statusCode).toBe(409)
|
|
1111
|
-
}
|
|
1112
|
-
})
|
|
1113
|
-
|
|
1114
|
-
it('should explain fetch idle timeouts instead of showing the raw runtime message', async () => {
|
|
1115
|
-
const llmOnlyTemplate = {
|
|
1116
|
-
...mockTemplate,
|
|
1117
|
-
handleSteps: undefined,
|
|
1118
|
-
}
|
|
1119
|
-
|
|
1120
|
-
const localAgentTemplates = {
|
|
1121
|
-
'test-agent': llmOnlyTemplate,
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
|
-
// Bun aborts a fetch after 5 minutes without receiving bytes, throwing a
|
|
1125
|
-
// DOMException named TimeoutError with this exact message.
|
|
1126
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1127
|
-
const timeoutError = new Error('The operation timed out.')
|
|
1128
|
-
timeoutError.name = 'TimeoutError'
|
|
1129
|
-
throw timeoutError
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
const result = await loopAgentSteps({
|
|
1133
|
-
...loopAgentStepsBaseParams,
|
|
1134
|
-
agentType: 'test-agent',
|
|
1135
|
-
localAgentTemplates,
|
|
1136
|
-
})
|
|
1137
|
-
|
|
1138
|
-
expect(result.output.type).toBe('error')
|
|
1139
|
-
if (result.output.type === 'error') {
|
|
1140
|
-
expect(result.output.message).toContain(
|
|
1141
|
-
'no data was received from the server for 5 minutes',
|
|
1142
|
-
)
|
|
1143
|
-
expect(result.output.message).not.toContain('Agent run error:')
|
|
1144
|
-
expect(result.output.message).not.toBe('The operation timed out.')
|
|
1145
|
-
}
|
|
1146
|
-
})
|
|
1147
|
-
|
|
1148
|
-
it('should explain dropped socket connections instead of showing the raw runtime message', async () => {
|
|
1149
|
-
const llmOnlyTemplate = {
|
|
1150
|
-
...mockTemplate,
|
|
1151
|
-
handleSteps: undefined,
|
|
1152
|
-
}
|
|
1153
|
-
|
|
1154
|
-
const localAgentTemplates = {
|
|
1155
|
-
'test-agent': llmOnlyTemplate,
|
|
1156
|
-
}
|
|
1157
|
-
|
|
1158
|
-
// Bun's fetch throws a plain Error with this message (and code
|
|
1159
|
-
// ECONNRESET/ConnectionClosed) when the TCP connection is dropped.
|
|
1160
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1161
|
-
const socketError = new Error(
|
|
1162
|
-
'The socket connection was closed unexpectedly. For more information, pass `verbose: true` in the second argument to fetch()',
|
|
1163
|
-
) as Error & { code: string }
|
|
1164
|
-
socketError.code = 'ECONNRESET'
|
|
1165
|
-
throw socketError
|
|
1166
|
-
}
|
|
1167
|
-
|
|
1168
|
-
const result = await loopAgentSteps({
|
|
1169
|
-
...loopAgentStepsBaseParams,
|
|
1170
|
-
agentType: 'test-agent',
|
|
1171
|
-
localAgentTemplates,
|
|
1172
|
-
})
|
|
1173
|
-
|
|
1174
|
-
expect(result.output.type).toBe('error')
|
|
1175
|
-
if (result.output.type === 'error') {
|
|
1176
|
-
expect(result.output.message).toContain('Connection interrupted')
|
|
1177
|
-
expect(result.output.message).not.toContain('Agent run error:')
|
|
1178
|
-
expect(result.output.message).not.toContain(
|
|
1179
|
-
'pass `verbose: true` in the second argument to fetch()',
|
|
1180
|
-
)
|
|
1181
|
-
}
|
|
1182
|
-
})
|
|
1183
|
-
})
|
|
1184
|
-
|
|
1185
|
-
describe('native tool-call recovery (FID-2026-0801-010)', () => {
|
|
1186
|
-
it('retries once, then fails visibly without a third model call', async () => {
|
|
1187
|
-
const llmOnlyTemplate = {
|
|
1188
|
-
...mockTemplate,
|
|
1189
|
-
handleSteps: undefined,
|
|
1190
|
-
}
|
|
1191
|
-
let finishStatus: string | undefined
|
|
1192
|
-
let finishError: string | undefined
|
|
1193
|
-
|
|
1194
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1195
|
-
llmCallCount++
|
|
1196
|
-
yield {
|
|
1197
|
-
type: 'error' as const,
|
|
1198
|
-
message: 'Incomplete arguments for tool sequentialthinking',
|
|
1199
|
-
errorClass: 'native-incomplete' as const,
|
|
1200
|
-
toolName: 'sequentialthinking',
|
|
1201
|
-
}
|
|
1202
|
-
return promptSuccess(`native-incomplete-${llmCallCount}`)
|
|
1203
|
-
}
|
|
1204
|
-
|
|
1205
|
-
const result = await loopAgentSteps({
|
|
1206
|
-
...loopAgentStepsBaseParams,
|
|
1207
|
-
agentTemplate: llmOnlyTemplate,
|
|
1208
|
-
localAgentTemplates: { 'test-agent': llmOnlyTemplate },
|
|
1209
|
-
finishAgentRun: mock(
|
|
1210
|
-
async (params: { status: string; errorMessage?: string }) => {
|
|
1211
|
-
finishStatus = params.status
|
|
1212
|
-
finishError = params.errorMessage
|
|
1213
|
-
},
|
|
1214
|
-
),
|
|
1215
|
-
})
|
|
1216
|
-
|
|
1217
|
-
expect(llmCallCount).toBe(2)
|
|
1218
|
-
expect(result.output.type).toBe('error')
|
|
1219
|
-
if (result.output.type === 'error') {
|
|
1220
|
-
expect(result.output.message).toContain(
|
|
1221
|
-
'Native tool-call recovery failed twice consecutively',
|
|
1222
|
-
)
|
|
1223
|
-
}
|
|
1224
|
-
expect(finishStatus).toBe('failed')
|
|
1225
|
-
expect(finishError).toContain(
|
|
1226
|
-
'Native tool-call recovery failed twice consecutively',
|
|
1227
|
-
)
|
|
1228
|
-
|
|
1229
|
-
const history = result.agentState.messageHistory
|
|
1230
|
-
expect(
|
|
1231
|
-
history.some(
|
|
1232
|
-
(message) =>
|
|
1233
|
-
message.role === 'assistant' &&
|
|
1234
|
-
message.content.some((part) => part.type === 'tool-call'),
|
|
1235
|
-
),
|
|
1236
|
-
).toBe(false)
|
|
1237
|
-
expect(history.some((message) => message.role === 'tool')).toBe(false)
|
|
1238
|
-
expect(
|
|
1239
|
-
history.some(
|
|
1240
|
-
(message) =>
|
|
1241
|
-
message.role === 'user' &&
|
|
1242
|
-
message.tags?.includes('TOOL_CALL_ERROR'),
|
|
1243
|
-
),
|
|
1244
|
-
).toBe(true)
|
|
1245
|
-
})
|
|
1246
|
-
|
|
1247
|
-
it('recovers on the next step with one valid sequentialthinking result', async () => {
|
|
1248
|
-
const llmOnlyTemplate = {
|
|
1249
|
-
...mockTemplate,
|
|
1250
|
-
id: 'thinker-test-agent',
|
|
1251
|
-
handleSteps: undefined,
|
|
1252
|
-
toolNames: ['sequentialthinking', 'end_turn'],
|
|
1253
|
-
} satisfies AgentTemplate
|
|
1254
|
-
|
|
1255
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1256
|
-
llmCallCount++
|
|
1257
|
-
if (llmCallCount === 1) {
|
|
1258
|
-
yield {
|
|
1259
|
-
type: 'error' as const,
|
|
1260
|
-
message: 'Incomplete arguments for tool sequentialthinking',
|
|
1261
|
-
errorClass: 'native-incomplete' as const,
|
|
1262
|
-
toolName: 'sequentialthinking',
|
|
1263
|
-
}
|
|
1264
|
-
} else {
|
|
1265
|
-
yield createToolCallChunk('sequentialthinking', {
|
|
1266
|
-
thought: 'The continuation is executing the complete native call.',
|
|
1267
|
-
thoughtNumber: 1,
|
|
1268
|
-
totalThoughts: 1,
|
|
1269
|
-
nextThoughtNeeded: false,
|
|
1270
|
-
})
|
|
1271
|
-
yield createToolCallChunk('end_turn', {})
|
|
1272
|
-
}
|
|
1273
|
-
return promptSuccess(`recovery-${llmCallCount}`)
|
|
1274
|
-
}
|
|
1275
|
-
|
|
1276
|
-
const result = await loopAgentSteps({
|
|
1277
|
-
...loopAgentStepsBaseParams,
|
|
1278
|
-
agentTemplate: llmOnlyTemplate,
|
|
1279
|
-
localAgentTemplates: { 'test-agent': llmOnlyTemplate },
|
|
1280
|
-
})
|
|
1281
|
-
|
|
1282
|
-
expect(llmCallCount).toBe(2)
|
|
1283
|
-
expect(result.output.type).not.toBe('error')
|
|
1284
|
-
|
|
1285
|
-
const assistantToolCalls = result.agentState.messageHistory.filter(
|
|
1286
|
-
(message) =>
|
|
1287
|
-
message.role === 'assistant' &&
|
|
1288
|
-
message.content.some(
|
|
1289
|
-
(part) =>
|
|
1290
|
-
part.type === 'tool-call' &&
|
|
1291
|
-
part.toolName === 'sequentialthinking',
|
|
1292
|
-
),
|
|
1293
|
-
)
|
|
1294
|
-
const sequentialThinkingResults = result.agentState.messageHistory.filter(
|
|
1295
|
-
(message) =>
|
|
1296
|
-
message.role === 'tool' && message.toolName === 'sequentialthinking',
|
|
1297
|
-
)
|
|
1298
|
-
|
|
1299
|
-
expect(assistantToolCalls).toHaveLength(1)
|
|
1300
|
-
expect(sequentialThinkingResults).toHaveLength(1)
|
|
1301
|
-
expect(
|
|
1302
|
-
result.agentState.messageHistory.some(
|
|
1303
|
-
(message) =>
|
|
1304
|
-
message.role === 'user' &&
|
|
1305
|
-
message.tags?.includes('TOOL_CALL_ERROR'),
|
|
1306
|
-
),
|
|
1307
|
-
).toBe(true)
|
|
1308
|
-
})
|
|
1309
|
-
|
|
1310
|
-
it('resets the native-incomplete streak after an unrelated tool error', async () => {
|
|
1311
|
-
const llmOnlyTemplate = {
|
|
1312
|
-
...mockTemplate,
|
|
1313
|
-
handleSteps: undefined,
|
|
1314
|
-
}
|
|
1315
|
-
let finishStatus: string | undefined
|
|
1316
|
-
|
|
1317
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1318
|
-
llmCallCount++
|
|
1319
|
-
if (llmCallCount === 2) {
|
|
1320
|
-
yield {
|
|
1321
|
-
type: 'error' as const,
|
|
1322
|
-
message: 'An unrelated tool validation error',
|
|
1323
|
-
}
|
|
1324
|
-
} else {
|
|
1325
|
-
yield {
|
|
1326
|
-
type: 'error' as const,
|
|
1327
|
-
message: 'Incomplete arguments for tool sequentialthinking',
|
|
1328
|
-
errorClass: 'native-incomplete' as const,
|
|
1329
|
-
toolName: 'sequentialthinking',
|
|
1330
|
-
}
|
|
1331
|
-
}
|
|
1332
|
-
return promptSuccess(`recovery-${llmCallCount}`)
|
|
1333
|
-
}
|
|
1334
|
-
|
|
1335
|
-
const result = await loopAgentSteps({
|
|
1336
|
-
...loopAgentStepsBaseParams,
|
|
1337
|
-
agentTemplate: llmOnlyTemplate,
|
|
1338
|
-
localAgentTemplates: { 'test-agent': llmOnlyTemplate },
|
|
1339
|
-
finishAgentRun: mock(async (params: { status: string }) => {
|
|
1340
|
-
finishStatus = params.status
|
|
1341
|
-
}),
|
|
1342
|
-
})
|
|
1343
|
-
|
|
1344
|
-
expect(llmCallCount).toBe(4)
|
|
1345
|
-
expect(result.output.type).toBe('error')
|
|
1346
|
-
expect(finishStatus).toBe('failed')
|
|
1347
|
-
})
|
|
1348
|
-
})
|
|
1349
|
-
|
|
1350
|
-
describe('Thinker convergence gate integration (FID-2026-0801-012)', () => {
|
|
1351
|
-
const thinkerTemplate = (): AgentTemplate => ({
|
|
1352
|
-
...mockTemplate,
|
|
1353
|
-
id: 'thinker-test-agent',
|
|
1354
|
-
outputMode: 'structured_output',
|
|
1355
|
-
outputSchema: z.object({
|
|
1356
|
-
status: z.string(),
|
|
1357
|
-
payload: z.object({ message: z.string() }).nullable(),
|
|
1358
|
-
}),
|
|
1359
|
-
toolNames: ['sequentialthinking', 'end_turn'],
|
|
1360
|
-
handleSteps: undefined,
|
|
1361
|
-
})
|
|
1362
|
-
|
|
1363
|
-
afterEach(() => {
|
|
1364
|
-
clearAllThoughtSessionsForTests()
|
|
1365
|
-
clearThinkerConvergenceStateForTests()
|
|
1366
|
-
})
|
|
1367
|
-
|
|
1368
|
-
it('sets output from the session snapshot and breaks without the set_output restart', async () => {
|
|
1369
|
-
// The Thinker converges with a single nextThoughtNeeded=false thought and
|
|
1370
|
-
// ends its turn. The gate must build the FinalArtifact from the session
|
|
1371
|
-
// snapshot and set agentState.output BEFORE the loop-top
|
|
1372
|
-
// `output === undefined && shouldEndTurn` restart check can inject the
|
|
1373
|
-
// "You must use set_output" message (which would reintroduce the null).
|
|
1374
|
-
const template = thinkerTemplate()
|
|
1375
|
-
let llmCallNumber = 0
|
|
1376
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1377
|
-
llmCallNumber++
|
|
1378
|
-
yield createToolCallChunk('sequentialthinking', {
|
|
1379
|
-
thought: 'Conclusion: use the hybrid approach.',
|
|
1380
|
-
thoughtNumber: 1,
|
|
1381
|
-
totalThoughts: 1,
|
|
1382
|
-
nextThoughtNeeded: false,
|
|
1383
|
-
})
|
|
1384
|
-
yield { type: 'text' as const, text: '\n\n' }
|
|
1385
|
-
yield createToolCallChunk('end_turn', {})
|
|
1386
|
-
return promptSuccess('mock-message-id')
|
|
1387
|
-
}
|
|
1388
|
-
|
|
1389
|
-
const result = await loopAgentSteps({
|
|
1390
|
-
...loopAgentStepsBaseParams,
|
|
1391
|
-
agentType: 'thinker-test-agent',
|
|
1392
|
-
localAgentTemplates: { 'thinker-test-agent': template },
|
|
1393
|
-
})
|
|
1394
|
-
|
|
1395
|
-
// Exactly one LLM call: the loop must NOT have restarted.
|
|
1396
|
-
expect(llmCallNumber).toBe(1)
|
|
1397
|
-
expect(result.agentState.output).toBeDefined()
|
|
1398
|
-
expect((result.agentState.output as { status?: string }).status).toBe(
|
|
1399
|
-
'success',
|
|
1400
|
-
)
|
|
1401
|
-
const restartMessages = result.agentState.messageHistory.filter(
|
|
1402
|
-
(m) =>
|
|
1403
|
-
m.role === 'user' &&
|
|
1404
|
-
m.content[0].type === 'text' &&
|
|
1405
|
-
m.content[0].text.includes('set_output'),
|
|
1406
|
-
)
|
|
1407
|
-
expect(restartMessages.length).toBe(0)
|
|
1408
|
-
})
|
|
1409
|
-
|
|
1410
|
-
it('retries on non-convergence instead of restarting, then converges', async () => {
|
|
1411
|
-
// First turn: the model thinks (nextThoughtNeeded=true) and ends the turn
|
|
1412
|
-
// unconverged. The gate appends a typed retry message and keeps the loop
|
|
1413
|
-
// going — it must NOT hit the set_output restart path. Second turn
|
|
1414
|
-
// converges and the gate sets the artifact.
|
|
1415
|
-
const template = thinkerTemplate()
|
|
1416
|
-
let llmCallNumber = 0
|
|
1417
|
-
loopAgentStepsBaseParams.promptAiSdkStream = async function* () {
|
|
1418
|
-
llmCallNumber++
|
|
1419
|
-
if (llmCallNumber === 1) {
|
|
1420
|
-
yield createToolCallChunk('sequentialthinking', {
|
|
1421
|
-
thought: 'Partial analysis, not done yet.',
|
|
1422
|
-
thoughtNumber: 1,
|
|
1423
|
-
totalThoughts: 2,
|
|
1424
|
-
nextThoughtNeeded: true,
|
|
1425
|
-
})
|
|
1426
|
-
} else {
|
|
1427
|
-
yield createToolCallChunk('sequentialthinking', {
|
|
1428
|
-
thought: 'Final conclusion: hybrid wins.',
|
|
1429
|
-
thoughtNumber: 2,
|
|
1430
|
-
totalThoughts: 2,
|
|
1431
|
-
nextThoughtNeeded: false,
|
|
1432
|
-
})
|
|
1433
|
-
}
|
|
1434
|
-
yield { type: 'text' as const, text: '\n\n' }
|
|
1435
|
-
yield createToolCallChunk('end_turn', {})
|
|
1436
|
-
return promptSuccess('mock-message-id')
|
|
1437
|
-
}
|
|
1438
|
-
|
|
1439
|
-
const result = await loopAgentSteps({
|
|
1440
|
-
...loopAgentStepsBaseParams,
|
|
1441
|
-
agentType: 'thinker-test-agent',
|
|
1442
|
-
localAgentTemplates: { 'thinker-test-agent': template },
|
|
1443
|
-
})
|
|
1444
|
-
|
|
1445
|
-
// Two LLM calls: first unconverged turn + retry, second converged turn.
|
|
1446
|
-
expect(llmCallNumber).toBe(2)
|
|
1447
|
-
expect(result.agentState.output).toBeDefined()
|
|
1448
|
-
expect((result.agentState.output as { status?: string }).status).toBe(
|
|
1449
|
-
'success',
|
|
1450
|
-
)
|
|
1451
|
-
// The typed retry message was appended after the first turn...
|
|
1452
|
-
const retryMessages = result.agentState.messageHistory.filter(
|
|
1453
|
-
(m) =>
|
|
1454
|
-
m.role === 'user' &&
|
|
1455
|
-
m.content[0].type === 'text' &&
|
|
1456
|
-
m.content[0].text.includes('nextThoughtNeeded=false'),
|
|
1457
|
-
)
|
|
1458
|
-
expect(retryMessages.length).toBeGreaterThan(0)
|
|
1459
|
-
// ...and the set_output restart message was never injected.
|
|
1460
|
-
const restartMessages = result.agentState.messageHistory.filter(
|
|
1461
|
-
(m) =>
|
|
1462
|
-
m.role === 'user' &&
|
|
1463
|
-
m.content[0].type === 'text' &&
|
|
1464
|
-
m.content[0].text.includes('set_output'),
|
|
1465
|
-
)
|
|
1466
|
-
expect(restartMessages.length).toBe(0)
|
|
1467
|
-
})
|
|
1468
|
-
})
|
|
1469
|
-
|
|
1470
|
-
describe('steering (drainSteeringMessages)', () => {
|
|
1471
|
-
it('appends a steering message at the step boundary and continues the turn', async () => {
|
|
1472
|
-
// The mock LLM ends the turn after one step. A steering message that arrives
|
|
1473
|
-
// during that step should be appended to history and keep the turn going, so
|
|
1474
|
-
// the agent runs a second step that can see (and act on) the new message.
|
|
1475
|
-
const steerText = 'Also rename the variable to fooBar'
|
|
1476
|
-
let drainCalls = 0
|
|
1477
|
-
const drainSteeringMessages = () => {
|
|
1478
|
-
drainCalls++
|
|
1479
|
-
return drainCalls === 1 ? [steerText] : []
|
|
1480
|
-
}
|
|
1481
|
-
|
|
1482
|
-
const result = await loopAgentSteps({
|
|
1483
|
-
...loopAgentStepsBaseParams,
|
|
1484
|
-
agentType: 'test-agent',
|
|
1485
|
-
drainSteeringMessages,
|
|
1486
|
-
})
|
|
1487
|
-
|
|
1488
|
-
// Step 1 wanted to end the turn, but the steer kept it going → a 2nd step ran.
|
|
1489
|
-
expect(llmCallCount).toBe(2)
|
|
1490
|
-
|
|
1491
|
-
// The steered text landed in history as a user message.
|
|
1492
|
-
const steered = result.agentState.messageHistory.find(
|
|
1493
|
-
(m) =>
|
|
1494
|
-
m.role === 'user' && JSON.stringify(m.content).includes(steerText),
|
|
1495
|
-
)
|
|
1496
|
-
expect(steered).toBeDefined()
|
|
1497
|
-
expect((steered as { tags?: string[] }).tags).toContain('USER_PROMPT')
|
|
1498
|
-
})
|
|
1499
|
-
|
|
1500
|
-
it('does not extend the turn when no steering messages arrive', async () => {
|
|
1501
|
-
const result = await loopAgentSteps({
|
|
1502
|
-
...loopAgentStepsBaseParams,
|
|
1503
|
-
agentType: 'test-agent',
|
|
1504
|
-
drainSteeringMessages: () => [],
|
|
1505
|
-
})
|
|
1506
|
-
|
|
1507
|
-
// No steer → the agent ends the turn after its single step, as usual.
|
|
1508
|
-
expect(llmCallCount).toBe(1)
|
|
1509
|
-
expect(result.agentState).toBeDefined()
|
|
1510
|
-
})
|
|
1511
|
-
})
|
|
1512
|
-
})
|