savant-code 0.0.16 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/coding-csharp/SKILL.md +82 -0
- package/.agents/skills/coding-go/SKILL.md +76 -0
- package/.agents/skills/coding-java/SKILL.md +79 -0
- package/.agents/skills/coding-python/SKILL.md +87 -0
- package/.agents/skills/coding-rust/SKILL.md +83 -0
- package/.agents/skills/coding-typescript/SKILL.md +90 -0
- package/.agents/skills/release-workflow/SKILL.md +69 -0
- package/.bun-version +1 -0
- package/.commandcode/settings.json +11 -0
- package/.commandcode/taste/workflow/taste.md +6 -0
- package/.env.example +95 -0
- package/.gitattributes +43 -0
- package/.githooks/pre-push +35 -0
- package/.github/workflows/build-release-binaries.yml +163 -0
- package/.markdownlint.json +42 -0
- package/.markdownlintignore +21 -0
- package/.prettierignore +9 -0
- package/.prettierrc +23 -0
- package/.savantignore +3 -0
- package/AGENTS.md +97 -0
- package/ARCHITECTURE.md +241 -0
- package/CHANGELOG.md +2631 -0
- package/CONTRIBUTING.md +88 -0
- package/ECHO-freebuff.md +22 -0
- package/ECHO.md +722 -0
- package/FREEREADME.md +35 -0
- package/LEARNINGS.md +345 -0
- package/NOTICE +15 -0
- package/README.md +550 -216
- package/README.zh-CN.md +479 -0
- package/SECURITY.md +8 -0
- package/VERSION +1 -0
- package/WINDOWS.md +238 -0
- package/agents/README.md +41 -0
- package/agents/base-chat.ts +44 -0
- package/agents/basher.ts +107 -0
- package/agents/browser-use/browser-use.test.ts +211 -0
- package/agents/browser-use/browser-use.ts +259 -0
- package/agents/constants.ts +1 -0
- package/agents/context-pruner.ts +1076 -0
- package/agents/detective/detective.ts +168 -0
- package/agents/editor/best-of-n/best-of-n-selector2.ts +148 -0
- package/agents/editor/best-of-n/editor-implementor-gpt-5.ts +7 -0
- package/agents/editor/best-of-n/editor-implementor-opus.ts +7 -0
- package/agents/editor/best-of-n/editor-implementor.ts +196 -0
- package/agents/editor/best-of-n/editor-multi-prompt.ts +265 -0
- package/agents/file-explorer/directory-lister.ts +92 -0
- package/agents/file-explorer/glob-matcher.ts +96 -0
- package/agents/forge/forge.ts +146 -0
- package/agents/librarian/librarian.test.ts +289 -0
- package/agents/librarian/librarian.ts +158 -0
- package/agents/package.json +11 -0
- package/agents/recorder/recorder.ts +104 -0
- package/agents/researcher/researcher-docs.ts +32 -0
- package/agents/researcher/researcher-web.ts +40 -0
- package/agents/savant/savant-analyze.ts +11 -0
- package/agents/savant/savant-free-deepseek-flash.ts +13 -0
- package/agents/savant/savant-free-deepseek.ts +13 -0
- package/agents/savant/savant-free-evals.ts +9 -0
- package/agents/savant/savant-free-glm.ts +13 -0
- package/agents/savant/savant-free-kimi.ts +13 -0
- package/agents/savant/savant-free-mimo-pro.ts +13 -0
- package/agents/savant/savant-free-mimo.ts +13 -0
- package/agents/savant/savant-free-minimax-m3.ts +13 -0
- package/agents/savant/savant-free.ts +9 -0
- package/agents/savant/savant-scaffold.ts +15 -0
- package/agents/savant/savant.ts +706 -0
- package/agents/scout/scout.ts +305 -0
- package/agents/scribe/scribe.ts +54 -0
- package/agents/thinker/thinker-gemini.ts +26 -0
- package/agents/thinker/thinker-gpt.ts +21 -0
- package/agents/thinker/thinker-with-files-gemini.ts +66 -0
- package/agents/thinker/thinker.ts +99 -0
- package/agents/tmux-cli.ts +724 -0
- package/agents/tsconfig.json +12 -0
- package/agents/types/agent-definition.ts +1 -0
- package/agents/types/secret-agent-definition.ts +103 -0
- package/agents/types/tools.ts +465 -0
- package/agents/types/util-types.ts +167 -0
- package/agents/verifier/verifier.ts +80 -0
- package/art/savant-redesign.md +7 -0
- package/art/savant-text-graf.md +5 -0
- package/art/savant_ascii.md +88 -0
- package/assets/banner.png +0 -0
- package/bun.lock +1979 -0
- package/bunfig.toml +7 -0
- package/cli/README.md +111 -0
- package/cli/bunfig.toml +2 -0
- package/cli/cli_exit +1 -0
- package/cli/package.json +66 -0
- package/cli/release/README.md +348 -0
- package/{index.js → cli/release/index.js} +0 -0
- package/cli/release/package.json +56 -0
- package/cli/release-core/README.md +20 -0
- package/cli/release-core/package.json +4 -0
- package/cli/release-core/prepare-package.js +31 -0
- package/cli/release-staging/README.md +70 -0
- package/cli/release-staging/index.js +42 -0
- package/cli/release-staging/package.json +43 -0
- package/cli/scripts/build-binary.ts +469 -0
- package/cli/scripts/clean.ts +16 -0
- package/cli/scripts/prebuild-agents.ts +250 -0
- package/cli/scripts/release.ts +103 -0
- package/cli/scripts/smoke-binary.ts +280 -0
- package/cli/scripts/test-sdk-file-hooks.sh +87 -0
- package/cli/scripts/validate-cli-with-tmux.sh +43 -0
- package/cli/src/__tests__/README.md +256 -0
- package/cli/src/__tests__/bash-mode.test.ts +442 -0
- package/cli/src/__tests__/cli-args.test.ts +241 -0
- package/cli/src/__tests__/e2e/first-time-login.test.ts +173 -0
- package/cli/src/__tests__/e2e/logout-relogin-flow.test.ts +110 -0
- package/cli/src/__tests__/e2e/returning-user-auth.test.ts +111 -0
- package/cli/src/__tests__/e2e-cli.test.ts +185 -0
- package/cli/src/__tests__/helpers/mock-api-client.ts +64 -0
- package/cli/src/__tests__/helpers/terminal-watchdog-fixture.ts +50 -0
- package/cli/src/__tests__/home-directory-detection.test.ts +213 -0
- package/cli/src/__tests__/integration/agent-toolnames-validation.test.ts +63 -0
- package/cli/src/__tests__/integration/api-integration.test.ts +289 -0
- package/cli/src/__tests__/integration/credentials-storage.test.ts +453 -0
- package/cli/src/__tests__/integration/local-agents.test.ts +1187 -0
- package/cli/src/__tests__/integration/login-flow-instrumentation.test.ts +146 -0
- package/cli/src/__tests__/integration/login-polling-working.test.ts +287 -0
- package/cli/src/__tests__/integration/usage-refresh-on-completion.test.ts +177 -0
- package/cli/src/__tests__/integration-tmux.test.ts +186 -0
- package/cli/src/__tests__/mocks/hover-toggle-controller.ts +71 -0
- package/cli/src/__tests__/path-completion.test.ts +243 -0
- package/cli/src/__tests__/project-files-chat-id.test.ts +34 -0
- package/cli/src/__tests__/release/proxy-http-get.test.ts +670 -0
- package/cli/src/__tests__/release/wrapper-safety.test.ts +177 -0
- package/cli/src/__tests__/rerender-perf.integration.test.ts +283 -0
- package/cli/src/__tests__/terminal-reset-sequences.test.ts +36 -0
- package/cli/src/__tests__/terminal-watchdog.test.ts +114 -0
- package/cli/src/__tests__/test-utils.ts +266 -0
- package/cli/src/__tests__/tmux-poc.ts +150 -0
- package/cli/src/__tests__/unit/agent-mode-toggle.test.ts +138 -0
- package/cli/src/__tests__/unit/copy-button.test.tsx +188 -0
- package/cli/src/__tests__/unit/create-run-config.test.ts +77 -0
- package/cli/src/__tests__/unit/publish-confirmation.test.ts +70 -0
- package/cli/src/__tests__/unit/segmented-control.test.ts +167 -0
- package/cli/src/__tests__/utils/env.test.ts +210 -0
- package/cli/src/__tests__/utils/project-picker.test.ts +39 -0
- package/cli/src/agents/bundled-agents.generated.d.ts +14 -0
- package/cli/src/agents/bundled-agents.generated.ts +1962 -0
- package/cli/src/app.tsx +383 -0
- package/cli/src/chat.tsx +2008 -0
- package/cli/src/cli-args.ts +183 -0
- package/cli/src/commands/__tests__/bash-command.test.ts +449 -0
- package/cli/src/commands/__tests__/command-args.test.ts +325 -0
- package/cli/src/commands/__tests__/copy-conversation.test.ts +240 -0
- package/cli/src/commands/__tests__/dev-command.test.ts +128 -0
- package/cli/src/commands/__tests__/diagnostics-command.test.ts +35 -0
- package/cli/src/commands/__tests__/image.test.ts +99 -0
- package/cli/src/commands/__tests__/init.test.ts +479 -0
- package/cli/src/commands/__tests__/loop-command.test.ts +89 -0
- package/cli/src/commands/__tests__/new-command-rotates-chat.test.ts +87 -0
- package/cli/src/commands/__tests__/permissions-command.test.ts +93 -0
- package/cli/src/commands/__tests__/process-diagnostics.test.ts +54 -0
- package/cli/src/commands/__tests__/prompt-builders.test.ts +69 -0
- package/cli/src/commands/__tests__/registry-gating.test.ts +125 -0
- package/cli/src/commands/__tests__/rewind-command.test.ts +227 -0
- package/cli/src/commands/__tests__/router-connect-chatgpt.test.ts +72 -0
- package/cli/src/commands/__tests__/router-input.test.ts +302 -0
- package/cli/src/commands/__tests__/router-provider-setup.test.ts +180 -0
- package/cli/src/commands/__tests__/savant-free-command-aliases.test.ts +56 -0
- package/cli/src/commands/ads.ts +45 -0
- package/cli/src/commands/command-registry.ts +1112 -0
- package/cli/src/commands/copy-conversation.ts +386 -0
- package/cli/src/commands/goal.ts +87 -0
- package/cli/src/commands/health-command.ts +61 -0
- package/cli/src/commands/help.ts +13 -0
- package/cli/src/commands/image.ts +20 -0
- package/cli/src/commands/init.ts +121 -0
- package/cli/src/commands/loop.ts +182 -0
- package/cli/src/commands/process-diagnostics.ts +120 -0
- package/cli/src/commands/prompt-builders.ts +140 -0
- package/cli/src/commands/publish.ts +261 -0
- package/cli/src/commands/rewind.ts +130 -0
- package/cli/src/commands/router-utils.ts +80 -0
- package/cli/src/commands/router.ts +589 -0
- package/cli/src/commands/telemetry.ts +68 -0
- package/cli/src/commands/usage.ts +26 -0
- package/cli/src/components/__tests__/ad-banner.test.tsx +84 -0
- package/cli/src/components/__tests__/block-helpers.test.tsx +139 -0
- package/cli/src/components/__tests__/clickable.test.tsx +39 -0
- package/cli/src/components/__tests__/grid-layout.integration.test.tsx +365 -0
- package/cli/src/components/__tests__/grid-layout.test.tsx +1033 -0
- package/cli/src/components/__tests__/markdown-content.test.tsx +163 -0
- package/cli/src/components/__tests__/message-block.completion.test.tsx +104 -0
- package/cli/src/components/__tests__/message-block.streaming.test.tsx +78 -0
- package/cli/src/components/__tests__/message-with-agents.test.tsx +571 -0
- package/cli/src/components/__tests__/multiline-input.test.tsx +1129 -0
- package/cli/src/components/__tests__/selectable-list.test.ts +232 -0
- package/cli/src/components/__tests__/shimmer-text.test.tsx +32 -0
- package/cli/src/components/__tests__/status-indicator.test.tsx +184 -0
- package/cli/src/components/__tests__/user-error-banner.test.tsx +100 -0
- package/cli/src/components/ad-banner.tsx +351 -0
- package/cli/src/components/agent-checklist.tsx +385 -0
- package/cli/src/components/agent-mode-toggle.tsx +294 -0
- package/cli/src/components/ask-user/__tests__/multiple-choice-form.test.ts +432 -0
- package/cli/src/components/ask-user/__tests__/validation.test.ts +213 -0
- package/cli/src/components/ask-user/components/accordion-question.tsx +153 -0
- package/cli/src/components/ask-user/components/custom-answer-input.tsx +66 -0
- package/cli/src/components/ask-user/components/options-list.tsx +139 -0
- package/cli/src/components/ask-user/components/question-header.tsx +80 -0
- package/cli/src/components/ask-user/components/question-option.tsx +94 -0
- package/cli/src/components/ask-user/constants.ts +35 -0
- package/cli/src/components/ask-user/index.tsx +660 -0
- package/cli/src/components/ask-user/utils/validation.ts +85 -0
- package/cli/src/components/attachment-card.tsx +67 -0
- package/cli/src/components/blocks/agent-block-grid.tsx +58 -0
- package/cli/src/components/blocks/agent-branch-item.tsx +230 -0
- package/cli/src/components/blocks/agent-branch-wrapper.tsx +524 -0
- package/cli/src/components/blocks/agent-list-branch.tsx +77 -0
- package/cli/src/components/blocks/ask-user-branch.tsx +98 -0
- package/cli/src/components/blocks/block-helpers.tsx +257 -0
- package/cli/src/components/blocks/blocks-renderer.tsx +296 -0
- package/cli/src/components/blocks/content-with-markdown.tsx +34 -0
- package/cli/src/components/blocks/copy-button.tsx +106 -0
- package/cli/src/components/blocks/copyable-block.tsx +47 -0
- package/cli/src/components/blocks/image-block.tsx +128 -0
- package/cli/src/components/blocks/implementor-row.tsx +453 -0
- package/cli/src/components/blocks/markdown-content.tsx +360 -0
- package/cli/src/components/blocks/markdown-renderables.tsx +347 -0
- package/cli/src/components/blocks/single-block.tsx +210 -0
- package/cli/src/components/blocks/thinking-block.tsx +77 -0
- package/cli/src/components/blocks/tool-block-group.tsx +72 -0
- package/cli/src/components/blocks/tool-branch.tsx +196 -0
- package/cli/src/components/blocks/user-content-copy.tsx +171 -0
- package/cli/src/components/bottom-banner.tsx +145 -0
- package/cli/src/components/build-mode-buttons.tsx +110 -0
- package/cli/src/components/button.tsx +75 -0
- package/cli/src/components/chat-header.tsx +11 -0
- package/cli/src/components/chat-history-screen.tsx +417 -0
- package/cli/src/components/chat-input-bar.tsx +535 -0
- package/cli/src/components/chatgpt-connect-banner.tsx +234 -0
- package/cli/src/components/clickable.tsx +149 -0
- package/cli/src/components/collapse-button.tsx +36 -0
- package/cli/src/components/command-palette.tsx +166 -0
- package/cli/src/components/copy-button.tsx +219 -0
- package/cli/src/components/dialog.tsx +111 -0
- package/cli/src/components/elapsed-timer.tsx +56 -0
- package/cli/src/components/error-boundary.tsx +63 -0
- package/cli/src/components/feedback-container.tsx +206 -0
- package/cli/src/components/feedback-icon-button.tsx +89 -0
- package/cli/src/components/feedback-input-mode.tsx +352 -0
- package/cli/src/components/file-attachment-card.tsx +89 -0
- package/cli/src/components/grid-layout.tsx +83 -0
- package/cli/src/components/help-banner.tsx +136 -0
- package/cli/src/components/highlighted-text.tsx +52 -0
- package/cli/src/components/image-card.tsx +167 -0
- package/cli/src/components/image-thumbnail.tsx +112 -0
- package/cli/src/components/input-cursor.tsx +77 -0
- package/cli/src/components/input-mode-banner.tsx +70 -0
- package/cli/src/components/load-previous-button.tsx +48 -0
- package/cli/src/components/login-modal.tsx +450 -0
- package/cli/src/components/message-block.tsx +337 -0
- package/cli/src/components/message-footer.tsx +269 -0
- package/cli/src/components/message-with-agents.tsx +594 -0
- package/cli/src/components/mode-divider.tsx +43 -0
- package/cli/src/components/model-picker.tsx +371 -0
- package/cli/src/components/multiline-input.tsx +1276 -0
- package/cli/src/components/out-of-credits-banner.tsx +155 -0
- package/cli/src/components/pending-attachments-banner.tsx +125 -0
- package/cli/src/components/pending-bash-message.tsx +57 -0
- package/cli/src/components/progress-bar.tsx +81 -0
- package/cli/src/components/project-picker-screen.tsx +469 -0
- package/cli/src/components/provider-picker.tsx +139 -0
- package/cli/src/components/publish-confirmation.tsx +514 -0
- package/cli/src/components/publish-container.tsx +737 -0
- package/cli/src/components/raised-pill.tsx +89 -0
- package/cli/src/components/renderers/plan-box.tsx +70 -0
- package/cli/src/components/review-screen.tsx +114 -0
- package/cli/src/components/rewind-picker.tsx +276 -0
- package/cli/src/components/right-sidebar.tsx +296 -0
- package/cli/src/components/savant-free-active-session-summary.tsx +63 -0
- package/cli/src/components/savant-free-landing-screen.tsx +756 -0
- package/cli/src/components/savant-free-model-selector.tsx +815 -0
- package/cli/src/components/savant-free-referral-banner.tsx +423 -0
- package/cli/src/components/savant-free-superseded-screen.tsx +62 -0
- package/cli/src/components/savant-ui/animation/pulse.tsx +26 -0
- package/cli/src/components/savant-ui/animation/typewriter.tsx +40 -0
- package/cli/src/components/savant-ui/branding.tsx +59 -0
- package/cli/src/components/savant-ui/data-display/badge.tsx +52 -0
- package/cli/src/components/savant-ui/data-display/code-block.tsx +55 -0
- package/cli/src/components/savant-ui/data-display/key-value.tsx +34 -0
- package/cli/src/components/savant-ui/data-display/sparkline.tsx +42 -0
- package/cli/src/components/savant-ui/data-display/timeline.tsx +44 -0
- package/cli/src/components/savant-ui/data-display/tree-view.tsx +55 -0
- package/cli/src/components/savant-ui/echo/__tests__/sidebar-collapse.test.tsx +90 -0
- package/cli/src/components/savant-ui/echo/agent-stack.tsx +72 -0
- package/cli/src/components/savant-ui/echo/agent-status.tsx +66 -0
- package/cli/src/components/savant-ui/echo/fid-card.tsx +89 -0
- package/cli/src/components/savant-ui/echo/fid-list.tsx +68 -0
- package/cli/src/components/savant-ui/echo/loop-status-panel.tsx +64 -0
- package/cli/src/components/savant-ui/echo/perfection-loop.tsx +118 -0
- package/cli/src/components/savant-ui/echo/phase-indicator.tsx +68 -0
- package/cli/src/components/savant-ui/echo/phase-info.ts +72 -0
- package/cli/src/components/savant-ui/echo/token-meter.tsx +39 -0
- package/cli/src/components/savant-ui/feedback/alert.tsx +45 -0
- package/cli/src/components/savant-ui/feedback/cost-tracker.tsx +54 -0
- package/cli/src/components/savant-ui/feedback/progress-bar.tsx +71 -0
- package/cli/src/components/savant-ui/feedback/spinner.tsx +40 -0
- package/cli/src/components/savant-ui/icon-theme-keys.ts +67 -0
- package/cli/src/components/savant-ui/icon.tsx +53 -0
- package/cli/src/components/savant-ui/index.ts +75 -0
- package/cli/src/components/savant-ui/input/select.tsx +26 -0
- package/cli/src/components/savant-ui/input/toggle.tsx +28 -0
- package/cli/src/components/savant-ui/layout/grid.tsx +52 -0
- package/cli/src/components/savant-ui/layout/header.tsx +28 -0
- package/cli/src/components/savant-ui/navigation/stepper.tsx +41 -0
- package/cli/src/components/savant-ui/primitives/key-hint.tsx +45 -0
- package/cli/src/components/savant-ui/primitives/key-value-row.tsx +41 -0
- package/cli/src/components/savant-ui/primitives/panel.tsx +42 -0
- package/cli/src/components/savant-ui/primitives/separator.tsx +34 -0
- package/cli/src/components/savant-ui/primitives/sidebar-section.tsx +64 -0
- package/cli/src/components/savant-ui/primitives/spacer.tsx +13 -0
- package/cli/src/components/savant-ui/primitives/stack.tsx +35 -0
- package/cli/src/components/savant-ui/theme.ts +45 -0
- package/cli/src/components/scroll-to-bottom-button.tsx +34 -0
- package/cli/src/components/segmented-control.tsx +199 -0
- package/cli/src/components/selectable-list.tsx +249 -0
- package/cli/src/components/selected-chips.tsx +86 -0
- package/cli/src/components/separator.tsx +40 -0
- package/cli/src/components/session-ended-banner.tsx +183 -0
- package/cli/src/components/shimmer-text.tsx +254 -0
- package/cli/src/components/status-bar.tsx +279 -0
- package/cli/src/components/subscription-limit-banner.tsx +269 -0
- package/cli/src/components/suggested-prompts.tsx +184 -0
- package/cli/src/components/suggestion-menu.tsx +219 -0
- package/cli/src/components/terminal-command-display.tsx +152 -0
- package/cli/src/components/terminal-link.tsx +97 -0
- package/cli/src/components/text-attachment-card.tsx +77 -0
- package/cli/src/components/thinking.tsx +108 -0
- package/cli/src/components/toast.tsx +109 -0
- package/cli/src/components/tools/__tests__/apply-patch.test.tsx +97 -0
- package/cli/src/components/tools/__tests__/code-search.test.tsx +45 -0
- package/cli/src/components/tools/__tests__/gravity-index.test.ts +76 -0
- package/cli/src/components/tools/__tests__/render-ui.test.tsx +556 -0
- package/cli/src/components/tools/__tests__/run-terminal-command.test.ts +274 -0
- package/cli/src/components/tools/__tests__/tool-call-item.test.tsx +73 -0
- package/cli/src/components/tools/apply-patch.tsx +101 -0
- package/cli/src/components/tools/code-search.tsx +50 -0
- package/cli/src/components/tools/composio.tsx +140 -0
- package/cli/src/components/tools/diff-viewer.tsx +21 -0
- package/cli/src/components/tools/glob.tsx +66 -0
- package/cli/src/components/tools/gravity-index.tsx +80 -0
- package/cli/src/components/tools/list-directory.tsx +66 -0
- package/cli/src/components/tools/read-docs.tsx +36 -0
- package/cli/src/components/tools/read-files.tsx +97 -0
- package/cli/src/components/tools/read-subtree.tsx +40 -0
- package/cli/src/components/tools/read-url.tsx +32 -0
- package/cli/src/components/tools/registry.ts +131 -0
- package/cli/src/components/tools/render-ui.tsx +466 -0
- package/cli/src/components/tools/run-terminal-command.tsx +86 -0
- package/cli/src/components/tools/skill.tsx +26 -0
- package/cli/src/components/tools/str-replace.tsx +77 -0
- package/cli/src/components/tools/suggest-followups.tsx +373 -0
- package/cli/src/components/tools/task-completed.tsx +16 -0
- package/cli/src/components/tools/tool-call-item.tsx +163 -0
- package/cli/src/components/tools/types.ts +100 -0
- package/cli/src/components/tools/web-search.tsx +32 -0
- package/cli/src/components/tools/write-file.tsx +20 -0
- package/cli/src/components/tools/write-todos.tsx +105 -0
- package/cli/src/components/top-banner.tsx +187 -0
- package/cli/src/components/usage-banner.tsx +296 -0
- package/cli/src/components/user-error-banner.tsx +54 -0
- package/cli/src/components/validation-error-popover.tsx +191 -0
- package/cli/src/data/slash-commands.ts +306 -0
- package/cli/src/hooks/__tests__/holds-live-savant-free-slot.test.ts +49 -0
- package/cli/src/hooks/__tests__/run-outcome.test.ts +178 -0
- package/cli/src/hooks/__tests__/session-fetch-signal.test.ts +45 -0
- package/cli/src/hooks/__tests__/use-activity-query.test.ts +810 -0
- package/cli/src/hooks/__tests__/use-ask-user-bridge.test.ts +175 -0
- package/cli/src/hooks/__tests__/use-auth-query.test.ts +21 -0
- package/cli/src/hooks/__tests__/use-chat-messages-collapse.test.ts +96 -0
- package/cli/src/hooks/__tests__/use-connection-status.test.ts +112 -0
- package/cli/src/hooks/__tests__/use-directory-browser.test.ts +215 -0
- package/cli/src/hooks/__tests__/use-gravity-ad.test.ts +73 -0
- package/cli/src/hooks/__tests__/use-grid-layout.test.ts +346 -0
- package/cli/src/hooks/__tests__/use-input-history.test.ts +704 -0
- package/cli/src/hooks/__tests__/use-loop-scheduler.test.ts +247 -0
- package/cli/src/hooks/__tests__/use-path-tab-completion.test.ts +324 -0
- package/cli/src/hooks/__tests__/use-queue-controls.test.ts +68 -0
- package/cli/src/hooks/__tests__/use-searchable-list.test.ts +364 -0
- package/cli/src/hooks/__tests__/use-send-message-timer.test.ts +146 -0
- package/cli/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +364 -0
- package/cli/src/hooks/__tests__/use-suggestion-engine.test.ts +485 -0
- package/cli/src/hooks/__tests__/use-terminal-focus.test.ts +66 -0
- package/cli/src/hooks/__tests__/use-terminal-layout.test.ts +675 -0
- package/cli/src/hooks/__tests__/use-timeout.test.ts +330 -0
- package/cli/src/hooks/__tests__/use-usage-query.test.ts +526 -0
- package/cli/src/hooks/__tests__/use-user-details-query.test.ts +225 -0
- package/cli/src/hooks/helpers/__tests__/send-message.test.ts +1851 -0
- package/cli/src/hooks/helpers/send-message.ts +553 -0
- package/cli/src/hooks/run-outcome.ts +64 -0
- package/cli/src/hooks/stream-state.ts +106 -0
- package/cli/src/hooks/use-activity-query.ts +696 -0
- package/cli/src/hooks/use-agent-validation.ts +80 -0
- package/cli/src/hooks/use-ask-user-bridge.ts +102 -0
- package/cli/src/hooks/use-auth-query.ts +261 -0
- package/cli/src/hooks/use-auth-state.ts +155 -0
- package/cli/src/hooks/use-chat-input.ts +87 -0
- package/cli/src/hooks/use-chat-keyboard.ts +325 -0
- package/cli/src/hooks/use-chat-messages.ts +273 -0
- package/cli/src/hooks/use-chat-state.ts +219 -0
- package/cli/src/hooks/use-chat-streaming.ts +270 -0
- package/cli/src/hooks/use-chat-ui.ts +136 -0
- package/cli/src/hooks/use-clipboard.ts +154 -0
- package/cli/src/hooks/use-connection-status.ts +156 -0
- package/cli/src/hooks/use-directory-browser.ts +88 -0
- package/cli/src/hooks/use-elapsed-time.ts +116 -0
- package/cli/src/hooks/use-event.ts +36 -0
- package/cli/src/hooks/use-exit-handler.ts +108 -0
- package/cli/src/hooks/use-fetch-login-url.ts +65 -0
- package/cli/src/hooks/use-fids.ts +48 -0
- package/cli/src/hooks/use-fingerprint.ts +64 -0
- package/cli/src/hooks/use-gravity-ad.ts +688 -0
- package/cli/src/hooks/use-grid-layout.ts +78 -0
- package/cli/src/hooks/use-input-history.ts +173 -0
- package/cli/src/hooks/use-login-keyboard-handlers.ts +74 -0
- package/cli/src/hooks/use-login-polling.ts +120 -0
- package/cli/src/hooks/use-logo.tsx +178 -0
- package/cli/src/hooks/use-loop-scheduler.ts +481 -0
- package/cli/src/hooks/use-message-queue.ts +301 -0
- package/cli/src/hooks/use-now.ts +20 -0
- package/cli/src/hooks/use-path-tab-completion.ts +88 -0
- package/cli/src/hooks/use-publish-mutation.ts +60 -0
- package/cli/src/hooks/use-queue-controls.ts +70 -0
- package/cli/src/hooks/use-queue-ui.ts +55 -0
- package/cli/src/hooks/use-savant-free-ctrl-c-exit.ts +23 -0
- package/cli/src/hooks/use-savant-free-session-progress.ts +34 -0
- package/cli/src/hooks/use-savant-free-session.ts +679 -0
- package/cli/src/hooks/use-savant-free-streak-query.ts +72 -0
- package/cli/src/hooks/use-scaffold-confirm.ts +62 -0
- package/cli/src/hooks/use-scaffold-revert-subscriber.ts +66 -0
- package/cli/src/hooks/use-scroll-management.ts +182 -0
- package/cli/src/hooks/use-searchable-list.ts +99 -0
- package/cli/src/hooks/use-send-message.ts +1038 -0
- package/cli/src/hooks/use-sheen-animation.tsx +88 -0
- package/cli/src/hooks/use-subscription-query.ts +106 -0
- package/cli/src/hooks/use-suggestion-engine.ts +793 -0
- package/cli/src/hooks/use-terminal-breakpoints.ts +77 -0
- package/cli/src/hooks/use-terminal-dimensions.ts +50 -0
- package/cli/src/hooks/use-terminal-focus.ts +146 -0
- package/cli/src/hooks/use-terminal-layout.ts +189 -0
- package/cli/src/hooks/use-theme.tsx +140 -0
- package/cli/src/hooks/use-timeout.ts +88 -0
- package/cli/src/hooks/use-toast.ts +114 -0
- package/cli/src/hooks/use-update-preference.ts +77 -0
- package/cli/src/hooks/use-usage-monitor.ts +59 -0
- package/cli/src/hooks/use-usage-query.ts +138 -0
- package/cli/src/hooks/use-user-details-query.ts +104 -0
- package/cli/src/hooks/use-why-did-you-update.ts +178 -0
- package/cli/src/index.tsx +484 -0
- package/cli/src/init/__tests__/init-direnv.test.ts +597 -0
- package/cli/src/init/init-app.ts +54 -0
- package/cli/src/init/init-direnv.ts +133 -0
- package/cli/src/login/constants.ts +71 -0
- package/cli/src/login/login-flow.ts +224 -0
- package/cli/src/login/plain-login.ts +107 -0
- package/cli/src/login/utils.ts +183 -0
- package/cli/src/native/ripgrep.ts +82 -0
- package/cli/src/polyfills/bun-strip-ansi.ts +12 -0
- package/cli/src/pre-init/load-dev-env.ts +98 -0
- package/cli/src/pre-init/tree-sitter-wasm.ts +98 -0
- package/cli/src/project-files.ts +102 -0
- package/cli/src/state/__tests__/chat-store-focus.test.ts +22 -0
- package/cli/src/state/__tests__/feedback-store.test.ts +260 -0
- package/cli/src/state/chat-history-store.ts +27 -0
- package/cli/src/state/chat-store.ts +791 -0
- package/cli/src/state/feedback-store.ts +162 -0
- package/cli/src/state/gateway-catalog-store.ts +45 -0
- package/cli/src/state/login-store.ts +150 -0
- package/cli/src/state/message-block-store.ts +143 -0
- package/cli/src/state/model-picker-store.ts +67 -0
- package/cli/src/state/provider-picker-store.ts +53 -0
- package/cli/src/state/publish-store.ts +141 -0
- package/cli/src/state/review-store.ts +24 -0
- package/cli/src/state/rewind-picker-store.ts +74 -0
- package/cli/src/state/savant-free-model-store.ts +59 -0
- package/cli/src/state/savant-free-session-store.ts +32 -0
- package/cli/src/test-setup.ts +20 -0
- package/cli/src/testing/env.ts +46 -0
- package/cli/src/types/chat-state.ts +15 -0
- package/cli/src/types/chat.ts +242 -0
- package/cli/src/types/contracts/send-message.ts +16 -0
- package/cli/src/types/env.ts +107 -0
- package/cli/src/types/function-params.ts +35 -0
- package/cli/src/types/opentui-augmentation.d.ts +11 -0
- package/cli/src/types/react19-compat.d.ts +19 -0
- package/cli/src/types/savant-free-session.ts +17 -0
- package/cli/src/types/store.ts +112 -0
- package/cli/src/types/theme-system.ts +194 -0
- package/cli/src/types/utils.ts +3 -0
- package/cli/src/utils/__tests__/activity-tracker.test.ts +440 -0
- package/cli/src/utils/__tests__/agent-display.test.ts +139 -0
- package/cli/src/utils/__tests__/analytics-client.test.ts +311 -0
- package/cli/src/utils/__tests__/anonymous-id.test.ts +74 -0
- package/cli/src/utils/__tests__/arrays.test.ts +264 -0
- package/cli/src/utils/__tests__/bash-context-processor.test.ts +38 -0
- package/cli/src/utils/__tests__/block-processor.test.ts +690 -0
- package/cli/src/utils/__tests__/chat-history.test.ts +247 -0
- package/cli/src/utils/__tests__/chat-input-key-intercept.test.ts +40 -0
- package/cli/src/utils/__tests__/chat-layout.test.ts +32 -0
- package/cli/src/utils/__tests__/chat-meta.test.ts +160 -0
- package/cli/src/utils/__tests__/chatgpt-oauth.test.ts +50 -0
- package/cli/src/utils/__tests__/clipboard.test.ts +998 -0
- package/cli/src/utils/__tests__/code-search-summary.test.ts +84 -0
- package/cli/src/utils/__tests__/collapse-helpers.test.ts +1272 -0
- package/cli/src/utils/__tests__/error-handling.test.ts +611 -0
- package/cli/src/utils/__tests__/feedback-helpers.test.ts +452 -0
- package/cli/src/utils/__tests__/feedback-submission.test.ts +26 -0
- package/cli/src/utils/__tests__/fetch-usage.test.ts +355 -0
- package/cli/src/utils/__tests__/fingerprint.test.ts +147 -0
- package/cli/src/utils/__tests__/format-elapsed-time.test.ts +103 -0
- package/cli/src/utils/__tests__/format-timeout.test.ts +87 -0
- package/cli/src/utils/__tests__/image-dimensions.test.ts +243 -0
- package/cli/src/utils/__tests__/image-processor.test.ts +250 -0
- package/cli/src/utils/__tests__/implementor-helpers.test.ts +1457 -0
- package/cli/src/utils/__tests__/keyboard-actions.test.ts +686 -0
- package/cli/src/utils/__tests__/layout-helpers.test.ts +36 -0
- package/cli/src/utils/__tests__/lazy-response-ads.test.ts +167 -0
- package/cli/src/utils/__tests__/logger-sanitize-secrets.test.ts +80 -0
- package/cli/src/utils/__tests__/markdown-renderer.test.tsx +518 -0
- package/cli/src/utils/__tests__/markdown-streaming.test.ts +64 -0
- package/cli/src/utils/__tests__/message-block-helpers.test.ts +1197 -0
- package/cli/src/utils/__tests__/message-updater.test.ts +659 -0
- package/cli/src/utils/__tests__/ollama-onboarding.test.ts +239 -0
- package/cli/src/utils/__tests__/openrouter-models.test.ts +295 -0
- package/cli/src/utils/__tests__/osc-timeout-scenarios.test.ts +172 -0
- package/cli/src/utils/__tests__/pending-attachments.test.ts +278 -0
- package/cli/src/utils/__tests__/provider-setup.test.ts +183 -0
- package/cli/src/utils/__tests__/run-state-storage.test.ts +741 -0
- package/cli/src/utils/__tests__/savant-code-api.test.ts +634 -0
- package/cli/src/utils/__tests__/savant-free-instance-owner.test.ts +69 -0
- package/cli/src/utils/__tests__/savant-free-model-navigation.test.ts +104 -0
- package/cli/src/utils/__tests__/savant-free-premium-reset.test.ts +81 -0
- package/cli/src/utils/__tests__/savant-free-referral-cache.test.ts +67 -0
- package/cli/src/utils/__tests__/savant-free-session-display.test.ts +23 -0
- package/cli/src/utils/__tests__/savant-free-streak-line.test.ts +76 -0
- package/cli/src/utils/__tests__/sdk-event-handlers.test.ts +615 -0
- package/cli/src/utils/__tests__/send-message-helpers.test.ts +1875 -0
- package/cli/src/utils/__tests__/send-message-timer.test.ts +68 -0
- package/cli/src/utils/__tests__/settings.test.ts +138 -0
- package/cli/src/utils/__tests__/strings.test.ts +210 -0
- package/cli/src/utils/__tests__/syntax-theme.test.ts +91 -0
- package/cli/src/utils/__tests__/terminal-color-detection.test.ts +425 -0
- package/cli/src/utils/__tests__/terminal-enter-detection.test.ts +77 -0
- package/cli/src/utils/__tests__/text-layout.test.ts +82 -0
- package/cli/src/utils/__tests__/think-tag-parser.test.ts +159 -0
- package/cli/src/utils/__tests__/trace-writer.test.ts +193 -0
- package/cli/src/utils/__tests__/trim-chat-logs.test.ts +79 -0
- package/cli/src/utils/__tests__/usage-banner-state.test.ts +298 -0
- package/cli/src/utils/__tests__/validation-error-formatting.test.ts +126 -0
- package/cli/src/utils/__tests__/write-file-atomic.test.ts +130 -0
- package/cli/src/utils/active-run.ts +22 -0
- package/cli/src/utils/activity-tracker.ts +66 -0
- package/cli/src/utils/agent-display.ts +87 -0
- package/cli/src/utils/agent-helpers.ts +47 -0
- package/cli/src/utils/ai-message-id.ts +12 -0
- package/cli/src/utils/analytics.ts +407 -0
- package/cli/src/utils/anonymous-id.ts +87 -0
- package/cli/src/utils/arrays.ts +117 -0
- package/cli/src/utils/auth.ts +258 -0
- package/cli/src/utils/bash-context-processor.ts +47 -0
- package/cli/src/utils/bash-messages.ts +108 -0
- package/cli/src/utils/block-margins.ts +35 -0
- package/cli/src/utils/block-operations.ts +548 -0
- package/cli/src/utils/block-processor.ts +212 -0
- package/cli/src/utils/chat-history.ts +265 -0
- package/cli/src/utils/chat-input-key-intercept.ts +52 -0
- package/cli/src/utils/chat-layout.ts +44 -0
- package/cli/src/utils/chat-meta.ts +101 -0
- package/cli/src/utils/chat-scroll-accel.ts +151 -0
- package/cli/src/utils/chatgpt-oauth.ts +350 -0
- package/cli/src/utils/clipboard-image.ts +610 -0
- package/cli/src/utils/clipboard.ts +307 -0
- package/cli/src/utils/code-search-summary.ts +69 -0
- package/cli/src/utils/collapse-helpers.ts +265 -0
- package/cli/src/utils/config-dir.ts +30 -0
- package/cli/src/utils/constants.ts +159 -0
- package/cli/src/utils/create-event-handler-state.ts +79 -0
- package/cli/src/utils/create-run-config.ts +160 -0
- package/cli/src/utils/db-storage.ts +254 -0
- package/cli/src/utils/detect-shell.ts +112 -0
- package/cli/src/utils/directory-browser.ts +74 -0
- package/cli/src/utils/engagement.ts +55 -0
- package/cli/src/utils/env.ts +109 -0
- package/cli/src/utils/error-handling.ts +246 -0
- package/cli/src/utils/error-messages.ts +84 -0
- package/cli/src/utils/feedback-helpers.ts +115 -0
- package/cli/src/utils/feedback-submission.ts +24 -0
- package/cli/src/utils/fetch-usage.ts +75 -0
- package/cli/src/utils/fid-loader.ts +135 -0
- package/cli/src/utils/fingerprint.ts +263 -0
- package/cli/src/utils/finish-logic.ts +154 -0
- package/cli/src/utils/format-elapsed-time.ts +33 -0
- package/cli/src/utils/format-session-units.ts +6 -0
- package/cli/src/utils/format-timeout.ts +28 -0
- package/cli/src/utils/format-validation-errors-for-message.ts +85 -0
- package/cli/src/utils/git.ts +17 -0
- package/cli/src/utils/glyphs.ts +188 -0
- package/cli/src/utils/helpers.ts +47 -0
- package/cli/src/utils/image-display.ts +73 -0
- package/cli/src/utils/image-handler.ts +336 -0
- package/cli/src/utils/image-processor.ts +133 -0
- package/cli/src/utils/image-thumbnail.ts +83 -0
- package/cli/src/utils/implementor-helpers.ts +817 -0
- package/cli/src/utils/input-modes.ts +196 -0
- package/cli/src/utils/keyboard-actions.ts +394 -0
- package/cli/src/utils/keypad-keys.ts +47 -0
- package/cli/src/utils/layout-helpers.ts +36 -0
- package/cli/src/utils/lazy-response-ads.ts +1 -0
- package/cli/src/utils/loading-phrases.ts +68 -0
- package/cli/src/utils/local-agent-registry.ts +611 -0
- package/cli/src/utils/log-shipper.ts +116 -0
- package/cli/src/utils/logger.ts +435 -0
- package/cli/src/utils/markdown-renderer.tsx +1315 -0
- package/cli/src/utils/math.ts +3 -0
- package/cli/src/utils/message-block-helpers.ts +667 -0
- package/cli/src/utils/message-history.ts +153 -0
- package/cli/src/utils/message-tree-utils.ts +67 -0
- package/cli/src/utils/message-updater.ts +279 -0
- package/cli/src/utils/ollama-onboarding.ts +215 -0
- package/cli/src/utils/open-file.ts +144 -0
- package/cli/src/utils/open-url.ts +63 -0
- package/cli/src/utils/openrouter-models.ts +945 -0
- package/cli/src/utils/path-completion.ts +111 -0
- package/cli/src/utils/path-helpers.ts +38 -0
- package/cli/src/utils/pending-attachments.ts +363 -0
- package/cli/src/utils/post-processing.ts +99 -0
- package/cli/src/utils/project-picker.ts +12 -0
- package/cli/src/utils/provider-setup.ts +259 -0
- package/cli/src/utils/recent-projects.ts +156 -0
- package/cli/src/utils/renderer-cleanup.ts +142 -0
- package/cli/src/utils/response-ad-positions.ts +1 -0
- package/cli/src/utils/rewind.ts +175 -0
- package/cli/src/utils/run-state-storage.ts +480 -0
- package/cli/src/utils/savant-code-api.ts +686 -0
- package/cli/src/utils/savant-code-client.ts +217 -0
- package/cli/src/utils/savant-free-agent-selection.ts +12 -0
- package/cli/src/utils/savant-free-exit.ts +24 -0
- package/cli/src/utils/savant-free-instance-owner.ts +66 -0
- package/cli/src/utils/savant-free-model-navigation.ts +46 -0
- package/cli/src/utils/savant-free-premium-reset.ts +52 -0
- package/cli/src/utils/savant-free-referral-cache.ts +35 -0
- package/cli/src/utils/savant-free-session-display.ts +21 -0
- package/cli/src/utils/savant-free-streak-line.ts +67 -0
- package/cli/src/utils/sdk-event-handlers.ts +587 -0
- package/cli/src/utils/send-message-helpers.ts +199 -0
- package/cli/src/utils/send-message-timer.ts +110 -0
- package/cli/src/utils/settings.ts +388 -0
- package/cli/src/utils/skill-registry.ts +100 -0
- package/cli/src/utils/spawn-agent-matcher.ts +56 -0
- package/cli/src/utils/status-indicator-state.ts +100 -0
- package/cli/src/utils/stream-chunk-processor.ts +65 -0
- package/cli/src/utils/strings.ts +272 -0
- package/cli/src/utils/subscription.ts +31 -0
- package/cli/src/utils/syntax-highlighter.tsx +19 -0
- package/cli/src/utils/syntax-theme.ts +131 -0
- package/cli/src/utils/terminal-color-detection.ts +472 -0
- package/cli/src/utils/terminal-enter-detection.ts +63 -0
- package/cli/src/utils/terminal-images.ts +223 -0
- package/cli/src/utils/terminal-reset-sequences.ts +33 -0
- package/cli/src/utils/terminal-title.ts +113 -0
- package/cli/src/utils/terminal-watchdog.ts +246 -0
- package/cli/src/utils/text-layout.ts +153 -0
- package/cli/src/utils/theme-config.ts +143 -0
- package/cli/src/utils/theme-system.ts +1265 -0
- package/cli/src/utils/think-tag-parser.ts +105 -0
- package/cli/src/utils/trace-writer.ts +147 -0
- package/cli/src/utils/ui-constants.ts +69 -0
- package/cli/src/utils/usage-banner-state.ts +146 -0
- package/cli/src/utils/validation-error-formatting.ts +92 -0
- package/cli/src/utils/validation-error-helpers.ts +19 -0
- package/cli/src/utils/version.ts +23 -0
- package/cli/src/utils/word-wrap-utils.ts +53 -0
- package/cli/src/utils/write-file-atomic.ts +82 -0
- package/cli/src/utils/yield-to-event-loop.ts +9 -0
- package/cli/tsconfig.json +26 -0
- package/coding-standards/csharp.md +77 -0
- package/coding-standards/go.md +71 -0
- package/coding-standards/java.md +74 -0
- package/coding-standards/python.md +82 -0
- package/coding-standards/rust.md +78 -0
- package/coding-standards/typescript.md +85 -0
- package/coding-standards/x402.md +227 -0
- package/common/README.md +41 -0
- package/common/common_exit +1 -0
- package/common/package.json +45 -0
- package/common/src/__tests__/agent-validation.test.ts +861 -0
- package/common/src/__tests__/agents.test.ts +16 -0
- package/common/src/__tests__/dynamic-agent-template-schema.test.ts +420 -0
- package/common/src/__tests__/env-ci.test.ts +167 -0
- package/common/src/__tests__/env-process.test.ts +145 -0
- package/common/src/__tests__/free-agents.test.ts +269 -0
- package/common/src/__tests__/handlesteps-parsing.test.ts +247 -0
- package/common/src/__tests__/model-config.test.ts +41 -0
- package/common/src/__tests__/project-file-tree.test.ts +82 -0
- package/common/src/__tests__/response-ad-positions.test.ts +78 -0
- package/common/src/__tests__/savant-free-models.test.ts +460 -0
- package/common/src/__tests__/savant-free-referral-tiers.test.ts +122 -0
- package/common/src/__tests__/user-state.test.ts +30 -0
- package/common/src/actions.ts +215 -0
- package/common/src/analytics-core.ts +73 -0
- package/common/src/analytics.ts +96 -0
- package/common/src/api-keys/constants.ts +26 -0
- package/common/src/browser-actions.ts +414 -0
- package/common/src/constants/agents.ts +250 -0
- package/common/src/constants/analytics-events.ts +318 -0
- package/common/src/constants/anthropic.ts +72 -0
- package/common/src/constants/byok.ts +2 -0
- package/common/src/constants/chatgpt-oauth.ts +85 -0
- package/common/src/constants/composio.ts +34 -0
- package/common/src/constants/feedback.ts +18 -0
- package/common/src/constants/free-agents.ts +347 -0
- package/common/src/constants/gemini.ts +6 -0
- package/common/src/constants/grant-priorities.ts +13 -0
- package/common/src/constants/hosts.ts +6 -0
- package/common/src/constants/images.ts +53 -0
- package/common/src/constants/index.ts +8 -0
- package/common/src/constants/knowledge.ts +46 -0
- package/common/src/constants/limits.ts +23 -0
- package/common/src/constants/model-config.ts +469 -0
- package/common/src/constants/paths.ts +69 -0
- package/common/src/constants/savant-code-config.ts +12 -0
- package/common/src/constants/savant-free-gemini-thinker.ts +30 -0
- package/common/src/constants/savant-free-models.ts +855 -0
- package/common/src/constants/savant-free-referral-tiers.ts +169 -0
- package/common/src/constants/skills.ts +60 -0
- package/common/src/constants/subscription-plans.ts +54 -0
- package/common/src/constants/ui.ts +25 -0
- package/common/src/env-ci.ts +36 -0
- package/common/src/env-process.ts +95 -0
- package/common/src/env-schema.ts +42 -0
- package/common/src/env.ts +69 -0
- package/common/src/mcp/client.ts +308 -0
- package/common/src/old-constants.ts +10 -0
- package/common/src/project-file-tree.ts +361 -0
- package/common/src/reddit-capi.ts +175 -0
- package/common/src/schemas/feedback.ts +57 -0
- package/common/src/schemas/logs.ts +66 -0
- package/common/src/templates/agent-validation.ts +436 -0
- package/common/src/templates/initial-agents-dir/LICENSE +202 -0
- package/common/src/templates/initial-agents-dir/README.md +314 -0
- package/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +17 -0
- package/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +78 -0
- package/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +76 -0
- package/common/src/templates/initial-agents-dir/my-custom-agent.ts +40 -0
- package/common/src/templates/initial-agents-dir/package.json +6 -0
- package/common/src/templates/initial-agents-dir/skills/README.md +66 -0
- package/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +29 -0
- package/common/src/templates/initial-agents-dir/types/agent-definition.ts +484 -0
- package/common/src/templates/initial-agents-dir/types/tools.ts +452 -0
- package/common/src/templates/initial-agents-dir/types/util-types.ts +167 -0
- package/common/src/testing/TESTING_PATTERNS.md +353 -0
- package/common/src/testing/errors.ts +33 -0
- package/common/src/testing/fixtures/agent-runtime.ts +325 -0
- package/common/src/testing/impl/agent-runtime.ts +6 -0
- package/common/src/testing/index.ts +84 -0
- package/common/src/testing/mock-modules.ts +54 -0
- package/common/src/testing/mock-types.ts +123 -0
- package/common/src/testing/mocks/analytics.ts +262 -0
- package/common/src/testing/mocks/child-process.ts +93 -0
- package/common/src/testing/mocks/crypto.ts +218 -0
- package/common/src/testing/mocks/database.ts +337 -0
- package/common/src/testing/mocks/filesystem.ts +166 -0
- package/common/src/testing/mocks/index.ts +83 -0
- package/common/src/testing/mocks/logger.ts +136 -0
- package/common/src/testing/mocks/stream.ts +314 -0
- package/common/src/testing/mocks/timers.ts +132 -0
- package/common/src/testing/mocks/tree-sitter.ts +127 -0
- package/common/src/testing/setup.ts +282 -0
- package/common/src/testing-env-ci.ts +15 -0
- package/common/src/testing-env-process.ts +78 -0
- package/common/src/tools/__tests__/compile-tool-definitions.test.ts +34 -0
- package/common/src/tools/__tests__/thought-session.test.ts +256 -0
- package/common/src/tools/compile-tool-definitions.ts +194 -0
- package/common/src/tools/constants.ts +132 -0
- package/common/src/tools/list.ts +193 -0
- package/common/src/tools/params/__tests__/coerce-to-array.test.ts +237 -0
- package/common/src/tools/params/__tests__/sequential-thinking-coercion.test.ts +98 -0
- package/common/src/tools/params/tool/add-message.ts +36 -0
- package/common/src/tools/params/tool/add-subgoal.ts +57 -0
- package/common/src/tools/params/tool/apply-patch.ts +110 -0
- package/common/src/tools/params/tool/ask-user.ts +181 -0
- package/common/src/tools/params/tool/browser-logs.ts +85 -0
- package/common/src/tools/params/tool/code-search.ts +144 -0
- package/common/src/tools/params/tool/composio.ts +131 -0
- package/common/src/tools/params/tool/create-plan.ts +80 -0
- package/common/src/tools/params/tool/end-turn.ts +54 -0
- package/common/src/tools/params/tool/find-files.ts +60 -0
- package/common/src/tools/params/tool/glob.ts +74 -0
- package/common/src/tools/params/tool/gravity-index.ts +92 -0
- package/common/src/tools/params/tool/list-directory.ts +58 -0
- package/common/src/tools/params/tool/lookup-agent-info.ts +37 -0
- package/common/src/tools/params/tool/propose-str-replace.ts +103 -0
- package/common/src/tools/params/tool/propose-write-file.ts +71 -0
- package/common/src/tools/params/tool/read-docs.ts +85 -0
- package/common/src/tools/params/tool/read-files.ts +61 -0
- package/common/src/tools/params/tool/read-subtree.ts +83 -0
- package/common/src/tools/params/tool/read-url.ts +81 -0
- package/common/src/tools/params/tool/render-ui.ts +203 -0
- package/common/src/tools/params/tool/run-file-change-hooks.ts +57 -0
- package/common/src/tools/params/tool/run-readonly-command.ts +76 -0
- package/common/src/tools/params/tool/run-terminal-command.ts +185 -0
- package/common/src/tools/params/tool/sequential-thinking.ts +110 -0
- package/common/src/tools/params/tool/set-messages.ts +42 -0
- package/common/src/tools/params/tool/set-output.ts +62 -0
- package/common/src/tools/params/tool/set-scaffold-complete.ts +51 -0
- package/common/src/tools/params/tool/skill.ts +56 -0
- package/common/src/tools/params/tool/spawn-agent-inline.ts +57 -0
- package/common/src/tools/params/tool/spawn-agents.ts +154 -0
- package/common/src/tools/params/tool/str-replace.ts +107 -0
- package/common/src/tools/params/tool/suggest-followups.ts +94 -0
- package/common/src/tools/params/tool/task-completed.ts +58 -0
- package/common/src/tools/params/tool/think-deeply.ts +53 -0
- package/common/src/tools/params/tool/transition-phase.ts +57 -0
- package/common/src/tools/params/tool/update-subgoal.ts +89 -0
- package/common/src/tools/params/tool/web-search.ts +73 -0
- package/common/src/tools/params/tool/write-file.ts +71 -0
- package/common/src/tools/params/tool/write-todos.ts +67 -0
- package/common/src/tools/params/utils.ts +152 -0
- package/common/src/tools/safety-registry.ts +274 -0
- package/common/src/tools/safety.ts +42 -0
- package/common/src/tools/sequential-thinking.ts +340 -0
- package/common/src/tools/utils.ts +25 -0
- package/common/src/types/__tests__/dynamic-agent-template.test.ts +20 -0
- package/common/src/types/agent-template.ts +223 -0
- package/common/src/types/api/agents/publish.ts +63 -0
- package/common/src/types/contracts/agent-runtime.ts +84 -0
- package/common/src/types/contracts/analytics.ts +12 -0
- package/common/src/types/contracts/bigquery.ts +55 -0
- package/common/src/types/contracts/billing.ts +46 -0
- package/common/src/types/contracts/client.ts +52 -0
- package/common/src/types/contracts/database.ts +104 -0
- package/common/src/types/contracts/env.ts +203 -0
- package/common/src/types/contracts/llm.ts +183 -0
- package/common/src/types/contracts/logger.ts +29 -0
- package/common/src/types/contracts/logs.ts +34 -0
- package/common/src/types/contracts/trace.ts +21 -0
- package/common/src/types/dynamic-agent-template.ts +290 -0
- package/common/src/types/filesystem.ts +10 -0
- package/common/src/types/function-params.ts +35 -0
- package/common/src/types/grant.ts +20 -0
- package/common/src/types/gravity-index.ts +170 -0
- package/common/src/types/json.ts +26 -0
- package/common/src/types/mcp.ts +26 -0
- package/common/src/types/messages/content-part.ts +59 -0
- package/common/src/types/messages/data-content.ts +14 -0
- package/common/src/types/messages/provider-metadata.ts +10 -0
- package/common/src/types/messages/savant-code-message.ts +55 -0
- package/common/src/types/organization.ts +118 -0
- package/common/src/types/print-mode.ts +167 -0
- package/common/src/types/publisher.ts +67 -0
- package/common/src/types/savant-free-session.ts +295 -0
- package/common/src/types/savant-free-streak.ts +6 -0
- package/common/src/types/session-state.ts +237 -0
- package/common/src/types/skill.ts +56 -0
- package/common/src/types/source.ts +11 -0
- package/common/src/types/spawn.ts +13 -0
- package/common/src/types/subscription.ts +68 -0
- package/common/src/types/usage.ts +16 -0
- package/common/src/types/util.ts +3 -0
- package/common/src/util/__tests__/analytics-dispatcher.test.ts +145 -0
- package/common/src/util/__tests__/analytics-log.test.ts +110 -0
- package/common/src/util/__tests__/analytics-sampling.test.ts +131 -0
- package/common/src/util/__tests__/axiom-only-log.test.ts +64 -0
- package/common/src/util/__tests__/engagement-tracker.test.ts +115 -0
- package/common/src/util/__tests__/error-abort.test.ts +822 -0
- package/common/src/util/__tests__/error-api-details.test.ts +190 -0
- package/common/src/util/__tests__/format-code-search.test.ts +60 -0
- package/common/src/util/__tests__/log-mirror.test.ts +31 -0
- package/common/src/util/__tests__/messages.test.ts +1118 -0
- package/common/src/util/__tests__/partial-json-delta.test.ts +505 -0
- package/common/src/util/__tests__/paths.test.ts +289 -0
- package/common/src/util/__tests__/promise.test.ts +334 -0
- package/common/src/util/__tests__/protocol-config.test.ts +119 -0
- package/common/src/util/__tests__/rate-limit.test.ts +28 -0
- package/common/src/util/__tests__/reddit-savant-free-retention.test.ts +120 -0
- package/common/src/util/__tests__/savant-free-streak.test.ts +142 -0
- package/common/src/util/__tests__/saxy.test.ts +1008 -0
- package/common/src/util/__tests__/string.test.ts +238 -0
- package/common/src/util/__tests__/zoned-time.test.ts +88 -0
- package/common/src/util/agent-file-utils.ts +110 -0
- package/common/src/util/agent-id-parsing.ts +147 -0
- package/common/src/util/agent-name-normalization.ts +39 -0
- package/common/src/util/analytics-dispatcher.ts +81 -0
- package/common/src/util/analytics-log.ts +84 -0
- package/common/src/util/analytics-sampling.ts +225 -0
- package/common/src/util/array.ts +63 -0
- package/common/src/util/axiom-only-log.ts +79 -0
- package/common/src/util/cache-debug.ts +191 -0
- package/common/src/util/credentials.ts +12 -0
- package/common/src/util/currency.ts +25 -0
- package/common/src/util/dates.ts +81 -0
- package/common/src/util/engagement-tracker.ts +133 -0
- package/common/src/util/error.ts +580 -0
- package/common/src/util/file.ts +363 -0
- package/common/src/util/format-code-search.ts +115 -0
- package/common/src/util/lazy-response-ads.ts +93 -0
- package/common/src/util/log-data.ts +57 -0
- package/common/src/util/log-mirror.ts +34 -0
- package/common/src/util/lru-cache.ts +67 -0
- package/common/src/util/messages.ts +600 -0
- package/common/src/util/model-utils.ts +25 -0
- package/common/src/util/object.ts +137 -0
- package/common/src/util/param-helpers.ts +49 -0
- package/common/src/util/partial-json-delta.ts +100 -0
- package/common/src/util/paths.ts +194 -0
- package/common/src/util/promise.ts +87 -0
- package/common/src/util/protocol-config.ts +141 -0
- package/common/src/util/random.ts +15 -0
- package/common/src/util/rate-limit.ts +56 -0
- package/common/src/util/reddit-capi-events.ts +40 -0
- package/common/src/util/reddit-savant-free-retention.ts +69 -0
- package/common/src/util/response-ad-positions.ts +54 -0
- package/common/src/util/savant-free-privacy.ts +78 -0
- package/common/src/util/savant-free-streak.ts +153 -0
- package/common/src/util/saxy.ts +739 -0
- package/common/src/util/skills.ts +32 -0
- package/common/src/util/stop-sequence.ts +60 -0
- package/common/src/util/string.ts +419 -0
- package/common/src/util/system-info.ts +51 -0
- package/common/src/util/type-narrowing.ts +125 -0
- package/common/src/util/xml.ts +17 -0
- package/common/src/util/zod-schema.ts +80 -0
- package/common/src/util/zoned-time.ts +136 -0
- package/common/src/utils/ask-user-bridge.ts +47 -0
- package/common/tsconfig.json +8 -0
- package/database.db +0 -0
- package/dev/LEARNINGS.md +309 -0
- package/dev/fids/.gitkeep +0 -0
- package/dev/fids/archive/.gitkeep +0 -0
- package/dev/fids/archive/FID-2026-0802-008-sdk-package-audit-client-run-run-state.md +238 -0
- package/dev/fids/archive/FID-2026-0803-001-echo-enforcement-layer-drift.md +404 -0
- package/dev/fids/archive/FID-2026-0803-002-llm-providers-database-audit.md +348 -0
- package/dev/fids/archive/FID-2026-0803-003-sdk-impl-common-util-audit.md +277 -0
- package/dev/fids/archive/FID-2026-0803-004-checkpoint-rewind.md +181 -0
- package/dev/fids/archive/FID-2026-0803-005-quality-scan-hygiene-fixes.md +265 -0
- package/dev/fids/archive/FID-2026-0803-006-code-map-audit-hygiene.md +243 -0
- package/dev/fids/archive/FID-2026-0803-007-evals-benchmark-audit-hygiene.md +296 -0
- package/dev/fids/archive/FID-2026-0803-009-echo-enforcement-doc-drift.md +112 -0
- package/dev/fids/archive/FID-2026-0803-010-database-llm-providers-low-fixes.md +255 -0
- package/dev/fids/archive/FID-2026-0803-011-build-artifact-hygiene.md +169 -0
- package/dev/fids/archive/FID-2026-0803-012-release-readiness-audit.md +162 -0
- package/dev/fids/archive/FID-2026-0803-013-agent-roster-over-reporting.md +146 -0
- package/dev/fids/archive/FID-2026-0803-014-freebuff-to-savant-rebrand-sweep.md +185 -0
- package/dev/nova/reports/2026-08-02-top-25-ai-inference-providers-competitive-intel.md +213 -0
- package/dev/nova/specs/echo-v0.1.2-freebuff.md +391 -0
- package/dev/nova/specs/goal-loop-feature-spec.md +245 -0
- package/dev/nova/specs/launch-strategy-research-prompt.md +88 -0
- package/dev/releases/README.md +50 -0
- package/dev/scratchpad/.gitkeep +0 -0
- package/dev/session-summaries/.gitkeep +0 -0
- package/dev/session-summaries/2026-07-16-1255.md +128 -0
- package/dev/session-summaries/2026-07-17-1000.md +64 -0
- package/dev/session-summaries/2026-07-19-eslint-zero-tolerance-cleanup.md +145 -0
- package/dev/session-summaries/2026-07-19-fid-026-debugging-and-rename.md +79 -0
- package/dev/session-summaries/2026-07-19-fid-026-phase-b-rebrand.md +76 -0
- package/dev/session-summaries/2026-07-19-fid-027-clean-break.md +47 -0
- package/dev/session-summaries/2026-07-19-pre-push-house-cleaning.md +100 -0
- package/dev/session-summaries/2026-07-19-v0.0.2-release-session.md +229 -0
- package/dev/session-summaries/2026-07-20-1805-fid-loop-closure.md +95 -0
- package/dev/session-summaries/2026-07-22-1800.md +52 -0
- package/dev/session-summaries/2026-07-23-fsm-optimization.md +88 -0
- package/dev/session-summaries/2026-07-25-0000.md +80 -0
- package/dev/session-summaries/2026-07-25-1200-context-compaction.md +154 -0
- package/dev/session-summaries/2026-07-25-1600-layer4-reactive-compact.md +96 -0
- package/dev/session-summaries/2026-07-25-1700-dev-folder-audit.md +161 -0
- package/dev/session-summaries/2026-07-25-2000-benchmark-v2-filters.md +147 -0
- package/dev/session-summaries/2026-07-25-2000.md +77 -0
- package/dev/session-summaries/2026-07-27-0000.md +63 -0
- package/dev/session-summaries/2026-07-28-history-capture-handoff.md +206 -0
- package/dev/session-summaries/2026-07-31-freebuff-echo-compliance-remediation.md +156 -0
- package/dev/session-summaries/2026-07-31-pre-launch-optimization-execution.md +46 -0
- package/dev/session-summaries/2026-0721-1800.md +44 -0
- package/dev/session-summaries/2026-08-01-sidebar-folded-startup.md +159 -0
- package/dev/session-summaries/2026-08-02-0.0.15-release-closeout.md +32 -0
- package/dev/session-summaries/2026-08-02-repository-hygiene.md +51 -0
- package/dev/session-summaries/2026-08-03-agent-roster-fix-and-ready-check-closeout.md +73 -0
- package/dev/session-summaries/2026-08-03-build-artifact-hygiene-closeout.md +40 -0
- package/dev/session-summaries/2026-08-03-code-map-audit-closeout.md +44 -0
- package/dev/session-summaries/2026-08-03-database-llm-providers-low-fixes-closeout.md +47 -0
- package/dev/session-summaries/2026-08-03-echo-enforcement-doc-drift-closeout.md +43 -0
- package/dev/session-summaries/2026-08-03-evals-benchmark-audit-closeout.md +50 -0
- package/dev/session-summaries/2026-08-03-quality-scan-hygiene-fixes-closeout.md +57 -0
- package/dev/session-summaries/2026-08-03-quality-session-checkpoint-rewind-closeout.md +56 -0
- package/dev/session-summaries/2026-08-03-release-readiness-audit-closeout.md +60 -0
- package/dev/test-prompts/archive/0.0.2-final-pass.md +209 -0
- package/dev/test-prompts/archive/agent-capabilities-full-test.md +361 -0
- package/dev/test-prompts/archive/agent-capabilities-test.md +471 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test-v1.md +441 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test-v2-report.md +377 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test-v2.md +544 -0
- package/dev/test-prompts/archive/comprehensive-az-system-test.md +396 -0
- package/dev/test-prompts/archive/comprehensive-az-test-final.md +900 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v11.md +141 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v12.md +29 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v6.md +631 -0
- package/dev/test-prompts/archive/comprehensive-az-test-v7.md +625 -0
- package/dev/test-prompts/archive/fid-007-ability-confirmation.md +248 -0
- package/dev/test-prompts/archive/fid-2026-0801-006-thinker-tool-call-boundary.md +86 -0
- package/dev/test-prompts/archive/fid-2026-0801-007-child-tool-set-fallback-cli.md +101 -0
- package/dev/test-prompts/archive/fid-2026-0801-008-provider-tool-call-accumulation-cli.md +111 -0
- package/dev/test-prompts/archive/fid-2026-0801-012-thinker-state-output-cli.md +134 -0
- package/dev/test-prompts/archive/gemini-deep-research-sidebar-highlight.md +598 -0
- package/dev/test-prompts/archive/goal-loop-cli-test.md +142 -0
- package/dev/test-prompts/archive/rebrand-qa.md +258 -0
- package/dev/test-prompts/archive/release-az-test-fid-085.md +306 -0
- package/dev/test-prompts/archive/release-az-test-fid-087.md +219 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0726-001.md +270 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0728-008.md +213 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0728-launch-tracks.md +253 -0
- package/dev/test-prompts/archive/release-az-test-fid-2026-0731-pre-launch.md +102 -0
- package/docs/AI Coding Agents Market Research.md +516 -0
- package/docs/Agent Harness Feature Pairing Research.md +166 -0
- package/docs/CLI Agent Inference Backend Research.md +446 -0
- package/docs/Codebuff Rebranding And Migration Plan.md +418 -0
- package/docs/ECHO-EVOLUTION-ARCH.md +77 -0
- package/docs/Harness Engineering for Coding Agents Research.md +196 -0
- package/docs/Launch Plan Review and Optimization.md +178 -0
- package/docs/OpenTUI Sidebar Bug Fix.md +245 -0
- package/docs/SAVANT-VERSIONING.md +31 -0
- package/docs/Savant Code Launch Strategy.md +270 -0
- package/docs/Savant-Code Business And Backend Research.md +222 -0
- package/docs/agents-and-tools.md +217 -0
- package/docs/cloudflare-llms-full.md +9623 -0
- package/docs/design/OpenTUI Terminal Visualization Guide.md +471 -0
- package/docs/design/database-architecture.md +217 -0
- package/docs/design/deep-research-report.md +295 -0
- package/docs/design/thinker-sequentialthinking-regression-diagnostic.md +366 -0
- package/docs/discord-server-design.md +167 -0
- package/docs/gravity-integration-starter.md +202 -0
- package/docs/launch/hn-first-comment.md +44 -0
- package/docs/launch/hn-post.md +35 -0
- package/docs/launch/incident-response.md +88 -0
- package/docs/launch/landing/index.html +233 -0
- package/docs/launch/mastodon-thread.md +52 -0
- package/docs/launch/newsletter-pitch.md +49 -0
- package/docs/launch/twitter-thread.md +62 -0
- package/docs/privacy.md +186 -0
- package/docs/reports/Savant-Code Benchmark Specification.md +206 -0
- package/docs/reports/Thinker Agent Architecture Research.md +284 -0
- package/docs/reports/adoptable-features-2026-07-25.md +604 -0
- package/docs/reports/adoptable-features-master.md +480 -0
- package/docs/reports/codebuff-discord-feedback.md +43 -0
- package/docs/reports/feature-parity-report.md +810 -0
- package/docs/reports/repos/AionUi.md +75 -0
- package/docs/reports/repos/OpenHands.md +76 -0
- package/docs/reports/repos/SWE-agent.md +82 -0
- package/docs/reports/repos/agno.md +89 -0
- package/docs/reports/repos/aider.md +74 -0
- package/docs/reports/repos/cline.md +83 -0
- package/docs/reports/repos/codex.md +83 -0
- package/docs/reports/repos/gemini-cli.md +92 -0
- package/docs/reports/repos/goose.md +65 -0
- package/docs/reports/repos/gpt-pilot.md +52 -0
- package/docs/reports/repos/hermes-agent.md +101 -0
- package/docs/reports/repos/kilocode.md +79 -0
- package/docs/reports/repos/openclaude.md +99 -0
- package/docs/reports/repos/openclaw.md +100 -0
- package/docs/reports/repos/opencode-dev.md +78 -0
- package/docs/reports/repos/zero.md +123 -0
- package/docs/reports/savant-code-benchmark-v2-2026-08-03.md +76 -0
- package/docs/savant-code-modes.md +338 -0
- package/docs/testing.md +51 -0
- package/docs/visual-mockup-neon-slate.txt +41 -0
- package/eslint.config.js +211 -0
- package/evals/README.md +45 -0
- package/evals/benchmark/README.md +449 -0
- package/evals/benchmark/agent-runner.ts +217 -0
- package/evals/benchmark/analyze-task-scores.ts +496 -0
- package/evals/benchmark/eval-codebuff-hard.json +3343 -0
- package/evals/benchmark/eval-codebuff.json +3193 -0
- package/evals/benchmark/eval-codebuff2.json +2494 -0
- package/evals/benchmark/eval-manifold-hard.json +2525 -0
- package/evals/benchmark/eval-manifold.json +1675 -0
- package/evals/benchmark/eval-manifold2.json +1945 -0
- package/evals/benchmark/eval-plane-hard.json +4372 -0
- package/evals/benchmark/eval-plane.json +2028 -0
- package/evals/benchmark/eval-plane2.json +3517 -0
- package/evals/benchmark/eval-saleor-hard.json +6081 -0
- package/evals/benchmark/eval-saleor.json +1829 -0
- package/evals/benchmark/eval-saleor2.json +3273 -0
- package/evals/benchmark/eval-task-generator.ts +158 -0
- package/evals/benchmark/filter-supplemental-files.ts +225 -0
- package/evals/benchmark/format-output.ts +215 -0
- package/evals/benchmark/gen-evals.ts +294 -0
- package/evals/benchmark/gen-repo-eval.ts +71 -0
- package/evals/benchmark/judge.ts +308 -0
- package/evals/benchmark/lessons-extractor.ts +247 -0
- package/evals/benchmark/main-hard-tasks.ts +49 -0
- package/evals/benchmark/main-single-eval.ts +23 -0
- package/evals/benchmark/main.ts +29 -0
- package/evals/benchmark/meta-analyzer.ts +329 -0
- package/evals/benchmark/pick-commits.ts +627 -0
- package/evals/benchmark/run-benchmark.ts +657 -0
- package/evals/benchmark/runners/claude.ts +176 -0
- package/evals/benchmark/runners/codex.ts +143 -0
- package/evals/benchmark/runners/index.ts +4 -0
- package/evals/benchmark/runners/opencode.ts +253 -0
- package/evals/benchmark/runners/runner.ts +13 -0
- package/evals/benchmark/runners/savant.ts +148 -0
- package/evals/benchmark/setup-test-repo.ts +314 -0
- package/evals/benchmark/trace-analyzer.ts +257 -0
- package/evals/benchmark/trace-utils.ts +80 -0
- package/evals/benchmark/types.ts +83 -0
- package/evals/bunfig.toml +4 -0
- package/evals/logger.ts +87 -0
- package/evals/package.json +31 -0
- package/evals/subagents/test-repo-utils.ts +131 -0
- package/evals/tsconfig.json +13 -0
- package/evals/v2/README.md +149 -0
- package/evals/v2/reports/report.json +261 -0
- package/evals/v2/reports/report.md +15 -0
- package/evals/v2/schema/task.schema.json +172 -0
- package/evals/v2/src/cli.ts +216 -0
- package/evals/v2/src/golden.ts +73 -0
- package/evals/v2/src/harness.ts +293 -0
- package/evals/v2/src/metrics.ts +326 -0
- package/evals/v2/src/registry.ts +179 -0
- package/evals/v2/src/reports.ts +126 -0
- package/evals/v2/src/runner.ts +143 -0
- package/evals/v2/src/runners/savant.ts +105 -0
- package/evals/v2/src/sandbox.ts +42 -0
- package/evals/v2/src/sandboxes/docker.ts +49 -0
- package/evals/v2/src/sandboxes/tempdir.ts +120 -0
- package/evals/v2/src/schema.ts +83 -0
- package/evals/v2/src/trace.ts +186 -0
- package/evals/v2/src/verify.ts +199 -0
- package/evals/v2/tasks/error_recovery/env-fault/calculator.js +11 -0
- package/evals/v2/tasks/error_recovery/env-fault/calculator.test.js +15 -0
- package/evals/v2/tasks/error_recovery/env-fault/golden.patch +15 -0
- package/evals/v2/tasks/error_recovery/env-fault/task.yaml +20 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.js +5 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.test.js +7 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/golden.patch +19 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/greet.js +3 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/orchestration.test.js +30 -0
- package/evals/v2/tasks/multi_agent_orchestration/options-contract/task.yaml +29 -0
- package/evals/v2/tasks/pure_coding/add-fix/add.js +3 -0
- package/evals/v2/tasks/pure_coding/add-fix/add.test.js +11 -0
- package/evals/v2/tasks/pure_coding/add-fix/golden.patch +7 -0
- package/evals/v2/tasks/pure_coding/add-fix/task.yaml +20 -0
- package/evals/v2/tasks/pure_coding/rename-greet/app.js +5 -0
- package/evals/v2/tasks/pure_coding/rename-greet/app.test.js +32 -0
- package/evals/v2/tasks/pure_coding/rename-greet/golden.patch +19 -0
- package/evals/v2/tasks/pure_coding/rename-greet/greet.js +5 -0
- package/evals/v2/tasks/pure_coding/rename-greet/task.yaml +21 -0
- package/evals/v2/tests/golden.test.ts +104 -0
- package/evals/v2/tests/harness.test.ts +204 -0
- package/evals/v2/tests/metrics.test.ts +353 -0
- package/evals/v2/tests/registry.test.ts +210 -0
- package/evals/v2/tests/reports.test.ts +218 -0
- package/evals/v2/tests/savant-runner.test.ts +218 -0
- package/evals/v2/tests/schema.test.ts +127 -0
- package/evals/v2/tests/tempdir-sandbox.test.ts +49 -0
- package/evals/v2/tests/trace.test.ts +76 -0
- package/evals/v2/tests/verify.test.ts +224 -0
- package/license +202 -0
- package/package.json +71 -44
- package/packages/agent-runtime/README.md +46 -0
- package/packages/agent-runtime/agent_exit +1 -0
- package/packages/agent-runtime/bunfig.toml +2 -0
- package/packages/agent-runtime/package.json +34 -0
- package/packages/agent-runtime/src/__tests__/apply-patch-tool.test.ts +202 -0
- package/packages/agent-runtime/src/__tests__/cost-aggregation.test.ts +397 -0
- package/packages/agent-runtime/src/__tests__/generate-diffs-prompt.test.ts +107 -0
- package/packages/agent-runtime/src/__tests__/get-file-reading-updates.test.ts +59 -0
- package/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts +501 -0
- package/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +1512 -0
- package/packages/agent-runtime/src/__tests__/main-prompt.test.ts +452 -0
- package/packages/agent-runtime/src/__tests__/n-parameter.test.ts +984 -0
- package/packages/agent-runtime/src/__tests__/process-file-block.test.ts +196 -0
- package/packages/agent-runtime/src/__tests__/process-str-replace.test.ts +512 -0
- package/packages/agent-runtime/src/__tests__/programmatic-tool-authorization.test.ts +219 -0
- package/packages/agent-runtime/src/__tests__/prompt-caching-subagents.test.ts +749 -0
- package/packages/agent-runtime/src/__tests__/prompts-schema-handling.test.ts +454 -0
- package/packages/agent-runtime/src/__tests__/propose-tools.test.ts +824 -0
- package/packages/agent-runtime/src/__tests__/read-docs-tool.test.ts +394 -0
- package/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts +161 -0
- package/packages/agent-runtime/src/__tests__/run-agent-step-tools.test.ts +612 -0
- package/packages/agent-runtime/src/__tests__/run-programmatic-step.test.ts +1743 -0
- package/packages/agent-runtime/src/__tests__/sandbox-generator.test.ts +154 -0
- package/packages/agent-runtime/src/__tests__/spawn-agents-image-content.test.ts +354 -0
- package/packages/agent-runtime/src/__tests__/spawn-agents-message-history.test.ts +280 -0
- package/packages/agent-runtime/src/__tests__/spawn-agents-permissions.test.ts +664 -0
- package/packages/agent-runtime/src/__tests__/stream-parser-abort.test.ts +250 -0
- package/packages/agent-runtime/src/__tests__/stream-parser-reasoning.test.ts +194 -0
- package/packages/agent-runtime/src/__tests__/subagent-streaming.test.ts +230 -0
- package/packages/agent-runtime/src/__tests__/test-utils.ts +96 -0
- package/packages/agent-runtime/src/__tests__/thinker-convergence-gate.test.ts +242 -0
- package/packages/agent-runtime/src/__tests__/to-token-count-input-schema.test.ts +81 -0
- package/packages/agent-runtime/src/__tests__/tool-executor-sandbox.test.ts +167 -0
- package/packages/agent-runtime/src/__tests__/tool-stream-parser.test.ts +682 -0
- package/packages/agent-runtime/src/__tests__/tool-validation-error.test.ts +1380 -0
- package/packages/agent-runtime/src/__tests__/web-search-tool.test.ts +402 -0
- package/packages/agent-runtime/src/__tests__/xml-tool-result-ordering.test.ts +264 -0
- package/packages/agent-runtime/src/constants.ts +12 -0
- package/packages/agent-runtime/src/context-compactor.ts +425 -0
- package/packages/agent-runtime/src/find-files/__tests__/request-files-prompt.test.ts +190 -0
- package/packages/agent-runtime/src/find-files/custom-file-picker-config.ts +61 -0
- package/packages/agent-runtime/src/find-files/request-files-prompt.ts +462 -0
- package/packages/agent-runtime/src/generate-diffs-prompt.ts +38 -0
- package/packages/agent-runtime/src/get-file-reading-updates.ts +27 -0
- package/packages/agent-runtime/src/llm-api/__tests__/gemini-with-fallbacks.test.ts +267 -0
- package/packages/agent-runtime/src/llm-api/__tests__/serper-api.test.ts +297 -0
- package/packages/agent-runtime/src/llm-api/claude.ts +7 -0
- package/packages/agent-runtime/src/llm-api/context7-api.ts +290 -0
- package/packages/agent-runtime/src/llm-api/gemini-with-fallbacks.ts +104 -0
- package/packages/agent-runtime/src/llm-api/savant-code-web-api.ts +370 -0
- package/packages/agent-runtime/src/llm-api/serper-api.ts +193 -0
- package/packages/agent-runtime/src/main-prompt.ts +251 -0
- package/packages/agent-runtime/src/mcp-constants.ts +12 -0
- package/packages/agent-runtime/src/mcp.ts +83 -0
- package/packages/agent-runtime/src/process-file-block.ts +118 -0
- package/packages/agent-runtime/src/process-str-replace.ts +213 -0
- package/packages/agent-runtime/src/prompt-agent-stream.ts +119 -0
- package/packages/agent-runtime/src/run-agent-step.ts +1632 -0
- package/packages/agent-runtime/src/run-programmatic-step.ts +633 -0
- package/packages/agent-runtime/src/system-prompt/prompts.ts +215 -0
- package/packages/agent-runtime/src/system-prompt/search-system-prompt.ts +89 -0
- package/packages/agent-runtime/src/system-prompt/truncate-file-tree.ts +414 -0
- package/packages/agent-runtime/src/templates/README.md +160 -0
- package/packages/agent-runtime/src/templates/__tests__/agent-registry.test.ts +489 -0
- package/packages/agent-runtime/src/templates/__tests__/strings.test.ts +465 -0
- package/packages/agent-runtime/src/templates/agent-registry.ts +122 -0
- package/packages/agent-runtime/src/templates/prompts.ts +189 -0
- package/packages/agent-runtime/src/templates/strings.ts +292 -0
- package/packages/agent-runtime/src/templates/types.ts +61 -0
- package/packages/agent-runtime/src/tool-stream-parser.ts +260 -0
- package/packages/agent-runtime/src/tools/filter-tool-set.ts +18 -0
- package/packages/agent-runtime/src/tools/handlers/__tests__/glob.test.ts +331 -0
- package/packages/agent-runtime/src/tools/handlers/__tests__/read-subtree.test.ts +346 -0
- package/packages/agent-runtime/src/tools/handlers/__tests__/run-readonly-command.test.ts +284 -0
- package/packages/agent-runtime/src/tools/handlers/handler-function-type.ts +77 -0
- package/packages/agent-runtime/src/tools/handlers/list.ts +105 -0
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/checkpoint-store.test.ts +394 -0
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/skill.test.ts +98 -0
- package/packages/agent-runtime/src/tools/handlers/tool/__tests__/write-file.test.ts +24 -0
- package/packages/agent-runtime/src/tools/handlers/tool/add-message.ts +37 -0
- package/packages/agent-runtime/src/tools/handlers/tool/add-subgoal.ts +30 -0
- package/packages/agent-runtime/src/tools/handlers/tool/apply-patch.ts +120 -0
- package/packages/agent-runtime/src/tools/handlers/tool/ask-user.ts +25 -0
- package/packages/agent-runtime/src/tools/handlers/tool/browser-logs.ts +21 -0
- package/packages/agent-runtime/src/tools/handlers/tool/checkpoint-store.ts +378 -0
- package/packages/agent-runtime/src/tools/handlers/tool/code-search.ts +21 -0
- package/packages/agent-runtime/src/tools/handlers/tool/composio.ts +52 -0
- package/packages/agent-runtime/src/tools/handlers/tool/create-plan.ts +63 -0
- package/packages/agent-runtime/src/tools/handlers/tool/end-turn.ts +15 -0
- package/packages/agent-runtime/src/tools/handlers/tool/find-files.ts +161 -0
- package/packages/agent-runtime/src/tools/handlers/tool/glob.ts +22 -0
- package/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts +230 -0
- package/packages/agent-runtime/src/tools/handlers/tool/list-directory.ts +22 -0
- package/packages/agent-runtime/src/tools/handlers/tool/lookup-agent-info.ts +105 -0
- package/packages/agent-runtime/src/tools/handlers/tool/propose-str-replace.ts +111 -0
- package/packages/agent-runtime/src/tools/handlers/tool/propose-write-file.ts +89 -0
- package/packages/agent-runtime/src/tools/handlers/tool/proposed-content-store.ts +64 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-docs.ts +160 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-files.ts +43 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-subtree.ts +198 -0
- package/packages/agent-runtime/src/tools/handlers/tool/read-url.ts +21 -0
- package/packages/agent-runtime/src/tools/handlers/tool/render-ui.ts +15 -0
- package/packages/agent-runtime/src/tools/handlers/tool/run-file-change-hooks.ts +20 -0
- package/packages/agent-runtime/src/tools/handlers/tool/run-readonly-command.ts +215 -0
- package/packages/agent-runtime/src/tools/handlers/tool/run-terminal-command.ts +33 -0
- package/packages/agent-runtime/src/tools/handlers/tool/sequential-thinking.ts +53 -0
- package/packages/agent-runtime/src/tools/handlers/tool/set-messages.ts +19 -0
- package/packages/agent-runtime/src/tools/handlers/tool/set-output.ts +104 -0
- package/packages/agent-runtime/src/tools/handlers/tool/set-scaffold-complete.ts +32 -0
- package/packages/agent-runtime/src/tools/handlers/tool/skill.ts +146 -0
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-inline.ts +149 -0
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts +436 -0
- package/packages/agent-runtime/src/tools/handlers/tool/spawn-agents.ts +286 -0
- package/packages/agent-runtime/src/tools/handlers/tool/str-replace.ts +135 -0
- package/packages/agent-runtime/src/tools/handlers/tool/suggest-followups.ts +20 -0
- package/packages/agent-runtime/src/tools/handlers/tool/task-completed.ts +15 -0
- package/packages/agent-runtime/src/tools/handlers/tool/think-deeply.ts +25 -0
- package/packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts +160 -0
- package/packages/agent-runtime/src/tools/handlers/tool/update-subgoal.ts +48 -0
- package/packages/agent-runtime/src/tools/handlers/tool/web-search.ts +151 -0
- package/packages/agent-runtime/src/tools/handlers/tool/write-file.ts +281 -0
- package/packages/agent-runtime/src/tools/handlers/tool/write-todos.ts +19 -0
- package/packages/agent-runtime/src/tools/prompts.ts +233 -0
- package/packages/agent-runtime/src/tools/sandbox/__tests__/engine.test.ts +169 -0
- package/packages/agent-runtime/src/tools/sandbox/__tests__/shell-denylist.test.ts +104 -0
- package/packages/agent-runtime/src/tools/sandbox/engine.ts +109 -0
- package/packages/agent-runtime/src/tools/sandbox/index.ts +14 -0
- package/packages/agent-runtime/src/tools/sandbox/shell-denylist.ts +119 -0
- package/packages/agent-runtime/src/tools/stream-parser.ts +407 -0
- package/packages/agent-runtime/src/tools/thinker-convergence-gate.ts +162 -0
- package/packages/agent-runtime/src/tools/thought-session-store.ts +43 -0
- package/packages/agent-runtime/src/tools/tool-executor.ts +1098 -0
- package/packages/agent-runtime/src/util/__tests__/messages.test.ts +995 -0
- package/packages/agent-runtime/src/util/__tests__/parse-tool-calls-from-text.test.ts +363 -0
- package/packages/agent-runtime/src/util/__tests__/simplify-tool-results.test.ts +382 -0
- package/packages/agent-runtime/src/util/__tests__/stream-xml-parser.test.ts +285 -0
- package/packages/agent-runtime/src/util/__tests__/think-tags.test.ts +49 -0
- package/packages/agent-runtime/src/util/__tests__/token-counter.test.ts +121 -0
- package/packages/agent-runtime/src/util/activity-tracking.ts +252 -0
- package/packages/agent-runtime/src/util/agent-output.ts +102 -0
- package/packages/agent-runtime/src/util/cache-debug.ts +330 -0
- package/packages/agent-runtime/src/util/format-value.ts +16 -0
- package/packages/agent-runtime/src/util/messages.ts +461 -0
- package/packages/agent-runtime/src/util/parse-tool-calls-from-text.ts +122 -0
- package/packages/agent-runtime/src/util/render-read-files-result.ts +18 -0
- package/packages/agent-runtime/src/util/simplify-tool-results.ts +61 -0
- package/packages/agent-runtime/src/util/stream-xml-parser.ts +259 -0
- package/packages/agent-runtime/src/util/think-tags.ts +33 -0
- package/packages/agent-runtime/src/util/token-counter.ts +136 -0
- package/packages/agent-runtime/tsconfig.json +8 -0
- package/packages/code-map/README.md +43 -0
- package/packages/code-map/__tests__/integration.test.ts +278 -0
- package/packages/code-map/__tests__/languages.test.ts +240 -0
- package/packages/code-map/__tests__/parse.test.ts +640 -0
- package/packages/code-map/__tests__/test-langs/test.c +42 -0
- package/packages/code-map/__tests__/test-langs/test.cpp +34 -0
- package/packages/code-map/__tests__/test-langs/test.cs +34 -0
- package/packages/code-map/__tests__/test-langs/test.go +27 -0
- package/packages/code-map/__tests__/test-langs/test.java +31 -0
- package/packages/code-map/__tests__/test-langs/test.js +50 -0
- package/packages/code-map/__tests__/test-langs/test.php +34 -0
- package/packages/code-map/__tests__/test-langs/test.py +25 -0
- package/packages/code-map/__tests__/test-langs/test.rb +28 -0
- package/packages/code-map/__tests__/test-langs/test.rs +28 -0
- package/packages/code-map/__tests__/test-langs/test.ts +31 -0
- package/packages/code-map/package.json +33 -0
- package/packages/code-map/src/index.ts +4 -0
- package/packages/code-map/src/init-node.ts +185 -0
- package/packages/code-map/src/languages.ts +344 -0
- package/packages/code-map/src/parse.ts +410 -0
- package/packages/code-map/src/tree-sitter-queries/readme.md +24 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-c-tags.scm +16 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +23 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-cpp-tags.scm +29 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-go-tags.scm +26 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-java-tags.scm +19 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-javascript-tags.scm +16 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-php-tags.scm +23 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-python-tags.scm +12 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-ruby-tags.scm +58 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-rust-tags.scm +26 -0
- package/packages/code-map/src/tree-sitter-queries/tree-sitter-typescript-tags.scm +22 -0
- package/packages/code-map/src/types.ts +11 -0
- package/packages/code-map/src/utils.ts +12 -0
- package/packages/code-map/tsconfig.json +10 -0
- package/packages/database/README.md +43 -0
- package/packages/database/package.json +28 -0
- package/packages/database/src/__tests__/service.test.ts +167 -0
- package/packages/database/src/index.ts +146 -0
- package/packages/database/src/service.ts +342 -0
- package/packages/database/tsconfig.json +9 -0
- package/packages/llm-providers/README.md +42 -0
- package/packages/llm-providers/package.json +42 -0
- package/packages/llm-providers/src/ollama/__tests__/detect.test.ts +59 -0
- package/packages/llm-providers/src/ollama/detect.ts +113 -0
- package/packages/llm-providers/src/ollama/index.ts +2 -0
- package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.test.ts +855 -0
- package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.ts +177 -0
- package/packages/llm-providers/src/openai-compatible/chat/get-response-metadata.ts +15 -0
- package/packages/llm-providers/src/openai-compatible/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-api-types.ts +60 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.test.ts +549 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.ts +474 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-options.ts +25 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-metadata-extractor.ts +49 -0
- package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-prepare-tools.ts +162 -0
- package/packages/llm-providers/src/openai-compatible/chat/stream-transform.test.ts +106 -0
- package/packages/llm-providers/src/openai-compatible/chat/stream-transform.ts +585 -0
- package/packages/llm-providers/src/openai-compatible/completion/convert-to-openai-compatible-completion-prompt.ts +98 -0
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.test.ts +173 -0
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.ts +414 -0
- package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-options.ts +33 -0
- package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-model.ts +143 -0
- package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-options.ts +21 -0
- package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-model.ts +129 -0
- package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-settings.ts +1 -0
- package/packages/llm-providers/src/openai-compatible/index.ts +27 -0
- package/packages/llm-providers/src/openai-compatible/openai-compatible-error.ts +34 -0
- package/packages/llm-providers/src/openai-compatible/openai-compatible-provider.ts +174 -0
- package/packages/llm-providers/src/openai-compatible/version.ts +5 -0
- package/packages/llm-providers/tsconfig.json +9 -0
- package/protocol.config.yaml +113 -0
- package/savant-free/README.md +73 -0
- package/savant-free/SPEC.md +385 -0
- package/savant-free/cli/build.ts +49 -0
- package/savant-free/cli/release/README.md +55 -0
- package/savant-free/cli/release/index.js +37 -0
- package/savant-free/cli/release/package.json +43 -0
- package/savant-free/cli/release.ts +128 -0
- package/savant-free/cli/smoke-test.test.ts +257 -0
- package/savant-free/e2e/README.md +173 -0
- package/savant-free/e2e/agent/savant-free-tester.ts +52 -0
- package/savant-free/e2e/tests/ads-behavior.e2e.test.ts +51 -0
- package/savant-free/e2e/tests/agent-startup.e2e.test.ts +61 -0
- package/savant-free/e2e/tests/code-edit.e2e.test.ts +78 -0
- package/savant-free/e2e/tests/help-command.e2e.test.ts +97 -0
- package/savant-free/e2e/tests/knowledge-file.e2e.test.ts +66 -0
- package/savant-free/e2e/tests/slash-commands.e2e.test.ts +119 -0
- package/savant-free/e2e/tests/startup.e2e.test.ts +56 -0
- package/savant-free/e2e/tests/terminal-command.e2e.test.ts +71 -0
- package/savant-free/e2e/tests/version.e2e.test.ts +50 -0
- package/savant-free/e2e/utils/binary-helpers.ts +24 -0
- package/savant-free/e2e/utils/index.ts +17 -0
- package/savant-free/e2e/utils/savant-free-session.ts +229 -0
- package/savant-free/e2e/utils/tmux-custom-tools.ts +156 -0
- package/savant-free/e2e/utils/tmux-helpers.ts +79 -0
- package/savant-free/package.json +20 -0
- package/scripts/eslint-rules/__fixtures__/debug-ast.mjs +20 -0
- package/scripts/eslint-rules/__fixtures__/probe.mjs +41 -0
- package/scripts/eslint-rules/__fixtures__/probe2.mjs +43 -0
- package/scripts/eslint-rules/__fixtures__/rule-test.mjs +44 -0
- package/scripts/eslint-rules/__fixtures__/rule-test2.mjs +27 -0
- package/scripts/eslint-rules/__fixtures__/unknown-bad.ts +21 -0
- package/scripts/eslint-rules/__fixtures__/unknown-good.ts +35 -0
- package/scripts/eslint-rules/no-unknown-in-signatures.js +141 -0
- package/scripts/release.py +360 -0
- package/scripts/run-az-test.sh +1150 -0
- package/scripts/sync-agents.py +337 -0
- package/scripts/tmux/README.md +359 -0
- package/scripts/tmux/package.json +9 -0
- package/scripts/tmux/tmux-capture.sh +231 -0
- package/scripts/tmux/tmux-cli.sh +160 -0
- package/scripts/tmux/tmux-env.sh +34 -0
- package/scripts/tmux/tmux-send.sh +339 -0
- package/scripts/tmux/tmux-start.sh +264 -0
- package/scripts/tmux/tmux-stop.sh +157 -0
- package/scripts/tmux/tmux-viewer/README.md +254 -0
- package/scripts/tmux/tmux-viewer/components/session-viewer.tsx +556 -0
- package/scripts/tmux/tmux-viewer/components/theme.ts +54 -0
- package/scripts/tmux/tmux-viewer/gif-encoder-2.d.ts +28 -0
- package/scripts/tmux/tmux-viewer/gif-exporter.ts +278 -0
- package/scripts/tmux/tmux-viewer/index.tsx +237 -0
- package/scripts/tmux/tmux-viewer/package.json +9 -0
- package/scripts/tmux/tmux-viewer/session-loader.ts +234 -0
- package/scripts/tmux/tmux-viewer/tsconfig.json +9 -0
- package/scripts/tmux/tmux-viewer/types.ts +76 -0
- package/sdk/CHANGELOG.md +126 -0
- package/sdk/PUBLISHING.md +55 -0
- package/sdk/README.md +334 -0
- package/sdk/bunfig.toml +6 -0
- package/sdk/e2e/README.md +158 -0
- package/sdk/e2e/custom-agents/api-integration-agent.e2e.test.ts +145 -0
- package/sdk/e2e/custom-agents/apply-patch-tool.e2e.test.ts +62 -0
- package/sdk/e2e/custom-agents/database-query-agent.e2e.test.ts +135 -0
- package/sdk/e2e/custom-agents/weather-agent.e2e.test.ts +120 -0
- package/sdk/e2e/examples/code-explainer.example.ts +62 -0
- package/sdk/e2e/examples/code-reviewer.example.ts +52 -0
- package/sdk/e2e/examples/commit-message-generator.example.ts +61 -0
- package/sdk/e2e/examples/sdk-lint.example.ts +65 -0
- package/sdk/e2e/examples/sdk-refactor.example.ts +63 -0
- package/sdk/e2e/examples/sdk-test-gen.example.ts +62 -0
- package/sdk/e2e/features/knowledge-files.e2e.test.ts +82 -0
- package/sdk/e2e/features/max-agent-steps.e2e.test.ts +65 -0
- package/sdk/e2e/features/project-files.e2e.test.ts +80 -0
- package/sdk/e2e/integration/connection-check.integration.test.ts +33 -0
- package/sdk/e2e/integration/event-ordering.integration.test.ts +186 -0
- package/sdk/e2e/integration/event-types.integration.test.ts +183 -0
- package/sdk/e2e/integration/stream-chunks.integration.test.ts +191 -0
- package/sdk/e2e/streaming/concurrent-streams.e2e.test.ts +164 -0
- package/sdk/e2e/streaming/subagent-streaming.e2e.test.ts +158 -0
- package/sdk/e2e/utils/__tests__/event-collector.test.ts +297 -0
- package/sdk/e2e/utils/e2e-mocks.ts +458 -0
- package/sdk/e2e/utils/event-collector.ts +145 -0
- package/sdk/e2e/utils/get-api-key.ts +76 -0
- package/sdk/e2e/utils/index.ts +3 -0
- package/sdk/e2e/utils/test-fixtures.ts +196 -0
- package/sdk/e2e/workflows/error-recovery.e2e.test.ts +112 -0
- package/sdk/e2e/workflows/multi-turn-conversation.e2e.test.ts +132 -0
- package/sdk/examples/readme-example-1.ts +34 -0
- package/sdk/examples/readme-example-2.ts +76 -0
- package/sdk/package.json +82 -0
- package/sdk/scripts/build.ts +349 -0
- package/sdk/scripts/fetch-ripgrep.ts +172 -0
- package/sdk/scripts/publish.ts +51 -0
- package/sdk/scripts/release.js +100 -0
- package/sdk/scripts/verify.ts +204 -0
- package/sdk/sdk_exit +1 -0
- package/sdk/smoke-test-dist.ts +248 -0
- package/sdk/src/__tests__/apply-overrides-resume.test.ts +83 -0
- package/sdk/src/__tests__/apply-patch.test.ts +438 -0
- package/sdk/src/__tests__/build-file-tree.test.ts +31 -0
- package/sdk/src/__tests__/change-file.test.ts +212 -0
- package/sdk/src/__tests__/client.test.ts +142 -0
- package/sdk/src/__tests__/clone-session-state.test.ts +158 -0
- package/sdk/src/__tests__/code-search.test.ts +896 -0
- package/sdk/src/__tests__/composio.test.ts +86 -0
- package/sdk/src/__tests__/credentials.test.ts +344 -0
- package/sdk/src/__tests__/database.test.ts +153 -0
- package/sdk/src/__tests__/env.test.ts +137 -0
- package/sdk/src/__tests__/error-utils.test.ts +253 -0
- package/sdk/src/__tests__/fixtures/windows-stubborn-grandchild.ts +26 -0
- package/sdk/src/__tests__/initial-session-state.test.ts +447 -0
- package/sdk/src/__tests__/knowledge-file-selection.test.ts +335 -0
- package/sdk/src/__tests__/load-agents.test.ts +935 -0
- package/sdk/src/__tests__/load-mcp-config.test.ts +285 -0
- package/sdk/src/__tests__/load-skills.test.ts +325 -0
- package/sdk/src/__tests__/model-provider.test.ts +44 -0
- package/sdk/src/__tests__/path-utils.test.ts +66 -0
- package/sdk/src/__tests__/read-files.test.ts +573 -0
- package/sdk/src/__tests__/read-url.test.ts +371 -0
- package/sdk/src/__tests__/researcher-web.integration.test.ts +130 -0
- package/sdk/src/__tests__/run-cancellation.test.ts +1321 -0
- package/sdk/src/__tests__/run-error-preserves-history.test.ts +335 -0
- package/sdk/src/__tests__/run-event-dispatch.test.ts +80 -0
- package/sdk/src/__tests__/run-file-filter.test.ts +530 -0
- package/sdk/src/__tests__/run-handle-event.test.ts +142 -0
- package/sdk/src/__tests__/run-mcp-tool-filter.test.ts +124 -0
- package/sdk/src/__tests__/run-state-child-process.test.ts +72 -0
- package/sdk/src/__tests__/run-terminal-command.test.ts +236 -0
- package/sdk/src/__tests__/run.integration.test.ts +170 -0
- package/sdk/src/__tests__/user-knowledge-files.test.ts +361 -0
- package/sdk/src/__tests__/validate-agents.test.ts +943 -0
- package/sdk/src/agents/load-agents.ts +339 -0
- package/sdk/src/agents/load-mcp-config.ts +275 -0
- package/sdk/src/client.ts +87 -0
- package/sdk/src/composio.ts +78 -0
- package/sdk/src/constants.ts +29 -0
- package/sdk/src/credentials.ts +303 -0
- package/sdk/src/custom-tool.ts +66 -0
- package/sdk/src/env.ts +116 -0
- package/sdk/src/error-utils.ts +127 -0
- package/sdk/src/impl/__tests__/llm-chatgpt-oauth-policy.test.ts +67 -0
- package/sdk/src/impl/__tests__/llm-native-tool-call.test.ts +38 -0
- package/sdk/src/impl/__tests__/llm-stream-yielded-content.test.ts +118 -0
- package/sdk/src/impl/__tests__/model-provider-free-mode.test.ts +166 -0
- package/sdk/src/impl/__tests__/prompt-result.test.ts +210 -0
- package/sdk/src/impl/__tests__/provider-options-metadata.test.ts +67 -0
- package/sdk/src/impl/agent-runtime.ts +159 -0
- package/sdk/src/impl/chatgpt-backend-fetch.ts +588 -0
- package/sdk/src/impl/database.ts +516 -0
- package/sdk/src/impl/llm.ts +852 -0
- package/sdk/src/impl/model-provider.ts +638 -0
- package/sdk/src/impl/openrouter-key-resolver.ts +78 -0
- package/sdk/src/index.ts +133 -0
- package/sdk/src/native/ripgrep.ts +141 -0
- package/sdk/src/retry-config.ts +51 -0
- package/sdk/src/run-state.ts +897 -0
- package/sdk/src/run.ts +1222 -0
- package/sdk/src/skills/load-skills.ts +253 -0
- package/sdk/src/testing/env.ts +19 -0
- package/sdk/src/tools/apply-patch.ts +690 -0
- package/sdk/src/tools/change-file.ts +155 -0
- package/sdk/src/tools/code-search.ts +547 -0
- package/sdk/src/tools/glob.ts +58 -0
- package/sdk/src/tools/index.ts +19 -0
- package/sdk/src/tools/list-directory.ts +52 -0
- package/sdk/src/tools/path-utils.ts +101 -0
- package/sdk/src/tools/read-files.ts +110 -0
- package/sdk/src/tools/read-url.ts +469 -0
- package/sdk/src/tools/run-file-change-hooks.ts +22 -0
- package/sdk/src/tools/run-terminal-command.ts +483 -0
- package/sdk/src/tools/ssrf.ts +120 -0
- package/sdk/src/types/env.ts +40 -0
- package/sdk/src/utils/logger.ts +15 -0
- package/sdk/src/validate-agents.ts +157 -0
- package/sdk/test/cjs-compatibility/package-lock.json +423 -0
- package/sdk/test/cjs-compatibility/package.json +21 -0
- package/sdk/test/cjs-compatibility/test-imports.js +77 -0
- package/sdk/test/cjs-compatibility/test-types.ts +54 -0
- package/sdk/test/cjs-compatibility/tsconfig.json +17 -0
- package/sdk/test/esm-compatibility/package-lock.json +423 -0
- package/sdk/test/esm-compatibility/package.json +21 -0
- package/sdk/test/esm-compatibility/test-imports.js +83 -0
- package/sdk/test/esm-compatibility/test-types.ts +59 -0
- package/sdk/test/esm-compatibility/tsconfig.json +17 -0
- package/sdk/test/ripgrep-bundling/package-lock.json +423 -0
- package/sdk/test/ripgrep-bundling/package.json +21 -0
- package/sdk/test/ripgrep-bundling/test-ripgrep-types.ts +132 -0
- package/sdk/test/ripgrep-bundling/test-ripgrep.js +257 -0
- package/sdk/test/ripgrep-bundling/tsconfig.json +15 -0
- package/sdk/test/setup-env.ts +54 -0
- package/sdk/test/test-sdk.ts +25 -0
- package/sdk/test/tree-sitter-queries/package-lock.json +47 -0
- package/sdk/test/tree-sitter-queries/package.json +12 -0
- package/sdk/test/tree-sitter-queries/test-query-files.js +256 -0
- package/sdk/tsconfig.build.json +32 -0
- package/sdk/tsconfig.json +27 -0
- package/sdk/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/sdk/vendor/ripgrep/arm64-linux/rg +0 -0
- package/sdk/vendor/ripgrep/x64-darwin/rg +0 -0
- package/sdk/vendor/ripgrep/x64-linux/rg +0 -0
- package/sdk/vendor/ripgrep/x64-win32/rg.exe +0 -0
- package/templates/FID-TEMPLATE.md +125 -0
- package/templates/README-TEMPLATE.md +87 -0
- package/templates/SESSION-SUMMARY.md +135 -0
- package/tsconfig.base.json +18 -0
- package/tsconfig.json +27 -0
- /package/{http.js → cli/release-core/http.js} +0 -0
- /package/{launcher.js → cli/release-core/launcher.js} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# FID: SDK Package Audit — client.ts, run.ts, run-state.ts (0-EOF)
|
|
2
|
+
|
|
3
|
+
**Filename:** `FID-2026-0802-008-sdk-package-audit-client-run-run-state.md`
|
|
4
|
+
**ID:** FID-2026-0802-008
|
|
5
|
+
**Severity:** high
|
|
6
|
+
**Status:** verified
|
|
7
|
+
**Created:** 2026-08-02
|
|
8
|
+
**Author:** Savant
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
FID-2026-0802-006 (quality sweep) noted the SDK (`@savant-code/sdk`) as a
|
|
15
|
+
remaining audit surface. This FID is the 0-EOF pass over the SDK's public
|
|
16
|
+
execution path — `client.ts` (87 lines), `run.ts` (1,175), `run-state.ts`
|
|
17
|
+
(863) — plus the impl layer they call into (`database.ts`, `llm.ts`,
|
|
18
|
+
`model-provider.ts`, `credentials.ts`, `agent-runtime.ts`, `composio.ts`,
|
|
19
|
+
`openrouter-key-resolver.ts`, `validate-agents.ts`, `custom-tool.ts`,
|
|
20
|
+
`error-utils.ts`, `env.ts`, `constants.ts`, `retry-config.ts`) and the CLI's
|
|
21
|
+
integration points (`use-send-message.ts`, `savant-code-client.ts`,
|
|
22
|
+
`chatgpt-oauth.ts`, `provider-setup.ts`).
|
|
23
|
+
|
|
24
|
+
The SDK is in good shape — the hot paths are already hardened (bounded agent
|
|
25
|
+
cache, retryable network-error wrapping, server-trusted metadata ordering,
|
|
26
|
+
OAuth recursion guards, identity-checked snapshots). The defects found cluster
|
|
27
|
+
in three places: **event-dispatch error handling** (1 HIGH), **credentials
|
|
28
|
+
file permissions** (1 HIGH), and **resume-path cloning + setup-error contract +
|
|
29
|
+
process robustness** (4 MED). 20 items total: 2 high, 4 medium, 10 low,
|
|
30
|
+
4 verify.
|
|
31
|
+
|
|
32
|
+
## Environment
|
|
33
|
+
|
|
34
|
+
- **OS:** Windows (host) / POSIX targets (SDK is cross-platform)
|
|
35
|
+
- **Language/Runtime:** TypeScript `strict: true` + Bun ≥ 1.3.11
|
|
36
|
+
- **Package:** `@savant-code/sdk` (client.ts / run.ts / run-state.ts / impl/*)
|
|
37
|
+
- **Commit/State:** uncommitted working tree (FIDs 005-007 changes present)
|
|
38
|
+
|
|
39
|
+
## Detailed Description
|
|
40
|
+
|
|
41
|
+
### Findings table (20 items: 2 high / 4 med / 10 low / 4 verify)
|
|
42
|
+
|
|
43
|
+
| ID | Sev | Location | Finding |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| E1 | HIGH | client.ts:26-32 + run.ts:419/590/1117/1139 | Default `handleEvent` **throws** on error events (client.ts:27-31), but run.ts dispatches it fire-and-forget — `onError` (run.ts:419) is called without `await` at 590/1117/1139 — the throw becomes an **unhandled promise rejection** (process-crash risk in Bun/Node 15+) and the intended "surface the error" never reaches the run() caller |
|
|
46
|
+
| SEC1 | HIGH | credentials.ts:37 + 169 | `saveChatGptOAuthCredentials` writes OAuth tokens with **default file perms** (`writeFileSync` at credentials.ts:169, no mode; POSIX 0644 typical) — world-readable `credentials.json` containing ChatGPT OAuth refresh token; the CLI provider path chmods 0600 (provider-setup.ts:236) but this path does not; the config dir is also created 0755 by `ensureDirectoryExistsSync` (credentials.ts:37) |
|
|
47
|
+
| R1 | MED | run-state.ts:722 | `applyOverridesToSessionState` JSON-round-trip clone (run-state.ts:722) **drops `handleStepsFn`** (function-valued) on every in-process resume — same bug class FID-006 SDK1 fixed in `withMessageHistory`; runtime then evals the stringified `handleSteps`, which `processAgentDefinitions` explicitly warns can fail for bundled fns |
|
|
48
|
+
| E2 | MED | run.ts:645-651 | **Inconsistent error contract:** runtime errors resolve `output.error`, but setup errors (`initialSessionState`, `getUserInfoFromApiKey` 401/5xx throws) **reject** the run() promise — JSDoc says "resolves to a RunState"; the `!userInfo` branch (run.ts:651) is nearly dead (the fn throws instead of returning null) |
|
|
49
|
+
| T1 | MED | run-state.ts:245-265 | `childProcessToPromise` (run-state.ts:245) has **no timeout and unbounded stdout buffering** — a hung `git` (huge repo, network FS, git hooks) blocks `initialSessionState` forever → run() hangs; a giant diff accumulates in memory |
|
|
50
|
+
| OAUTH1 | MED | cli chatgpt-oauth.ts:78-80 | OAuth `state` param is set to the **PKCE code_verifier** — any observer of the auth URL or redirect query learns the verifier; state should be an independent random value |
|
|
51
|
+
| P1 | LOW | run-state.ts:832 | `buildFileTree` O(n²) — `parent.children.some(...)` dedup scan (run-state.ts:832) per node; quadratic on flat directories (only the explicit `projectFiles` path) |
|
|
52
|
+
| D1 | LOW | constants.ts:18-20 | `getWebsiteUrl()` calls `.replace` on `(env ?? bundled)` with no guard — **unreachable today** (env-schema requires the URL; module load fails first with a clear error) but fragile for remote bundlers |
|
|
53
|
+
| D2 | LOW | run.ts:277-281 | Pre-abort `run()` returns `sessionState: undefined` (type-legal — optional — but callers may not expect an undefined sessionState) |
|
|
54
|
+
| D3 | LOW | run.ts:642 | `promptId` uses `Math.random()` — non-crypto id (traceSessionId correctly uses `crypto.randomUUID()`) |
|
|
55
|
+
| D4 | LOW | run.ts:1162 | `handlePromptResponse` else-branch (`action satisfies never`) is dead code — defensive runtime guard, unreachable by types |
|
|
56
|
+
| D5 | LOW | database.ts:119 | BYOK/dev-mode `getUserInfoFromApiKey` stub logs at **warn** level on every run — noisy; should be debug/info |
|
|
57
|
+
| D6 | LOW | openrouter-key-resolver.ts:16-18 | No **negative caching** — a failed master-key exchange re-attempts the network call on every `resolveOpenRouterApiKey()` invocation |
|
|
58
|
+
| D7 | LOW | run.ts:1001-1028 | `getString`/`getOptionalString`/`getOptionalNumber` duplicate helpers that also exist in agent-runtime tool-executor — extract to a shared util |
|
|
59
|
+
| D8 | LOW | validate-agents.ts:66 | Falsy definitions stored as `undefined` into a `Record<string, AgentDefinition>` (type says non-null) — runtime-undefined entries flow into common validation |
|
|
60
|
+
| D9 | LOW | database.ts:131 + 226 | Dead null-cache branches: `if (cached === null) throw createAuthError()` (131) and `if (userInfo === null) throw createAuthError()` (226) can never fire — failures `delete` the cache key, successes store an object; `null` is never stored |
|
|
61
|
+
| V1 | VERIFY | run-state.ts:381-385 | `loadSkills` / `loadLocalAgents` throw-safety in `initialSessionState` (system-info verified safe — pure fs/existsSync) |
|
|
62
|
+
| V2 | VERIFY | database.ts:131-158 | `userInfoCache` never expires and merges per-field — plan/credits fields stay cached for the process lifetime; the savant-free chat server is a long-lived in-process runtime, so confirm whether stale plan/credits matter there (may warrant a MED fix) |
|
|
63
|
+
| V3 | VERIFY | model-provider.ts:269 | ChatGPT OAuth request header `originator: 'codex_cli_rs'` (model-provider.ts:269) — confirm this is an intentional compatibility shim (impersonating the Codex CLI), not accidental |
|
|
64
|
+
| V4 | VERIFY | llm.ts:322-344 | `experimental_repairToolCall` `deepParseJson` recursion — bounded by LLM output depth in practice, but unguarded for adversarial `toolCall.input` |
|
|
65
|
+
|
|
66
|
+
### Expected Behavior
|
|
67
|
+
|
|
68
|
+
- Error events with the default client either reject `run()` with a clear
|
|
69
|
+
message or resolve `output.error` — never an unhandled rejection.
|
|
70
|
+
- In-process resumes preserve `handleStepsFn` exactly like `withMessageHistory`
|
|
71
|
+
(FID-006 SDK1 parity).
|
|
72
|
+
- OAuth tokens are written 0600 on POSIX; OAuth `state` is independent of the
|
|
73
|
+
PKCE verifier.
|
|
74
|
+
- `run()` has a single documented error contract; git discovery is bounded in
|
|
75
|
+
time and memory.
|
|
76
|
+
|
|
77
|
+
### Root Cause
|
|
78
|
+
|
|
79
|
+
- E1: async event dispatch is fire-and-forget (`sendAction` is sync; `onError`
|
|
80
|
+
is async) combined with a deliberately-throwing default handler.
|
|
81
|
+
- R1: `applyOverridesToSessionState` predates the SDK1 cloneDeep fix; the JSON
|
|
82
|
+
clone was chosen for speed without accounting for function-valued fields.
|
|
83
|
+
- SEC1: file writes default to `0o666 & ~umask`; no chmod was added on the
|
|
84
|
+
OAuth write path (the provider path got one, the OAuth path didn't).
|
|
85
|
+
- T1: git collection is best-effort by design, but the "best effort" is
|
|
86
|
+
unbounded in the time dimension.
|
|
87
|
+
|
|
88
|
+
## Impact Assessment
|
|
89
|
+
|
|
90
|
+
### Affected Components
|
|
91
|
+
|
|
92
|
+
- `sdk/src/client.ts`, `sdk/src/run.ts`, `sdk/src/run-state.ts`
|
|
93
|
+
- `sdk/src/impl/database.ts`, `sdk/src/impl/llm.ts`, `sdk/src/impl/model-provider.ts`
|
|
94
|
+
- `sdk/src/credentials.ts`, `sdk/src/validate-agents.ts`, `sdk/src/constants.ts`
|
|
95
|
+
- `sdk/src/impl/openrouter-key-resolver.ts`
|
|
96
|
+
- `cli/src/utils/chatgpt-oauth.ts` (OAUTH1)
|
|
97
|
+
- New tests: `sdk/src/__tests__/` additions (event-dispatch, resume-clone,
|
|
98
|
+
credentials mode, file-tree) + `cli/src/utils/__tests__/` (oauth state)
|
|
99
|
+
|
|
100
|
+
### Risk Level
|
|
101
|
+
|
|
102
|
+
- [ ] Critical: System crash, data loss, or security vulnerability
|
|
103
|
+
- [x] High: unhandled-rejection crash path on error events with the default
|
|
104
|
+
client (E1); security-relevant file permissions (SEC1)
|
|
105
|
+
- [x] Medium: resume-path function loss (R1), error-contract inconsistency
|
|
106
|
+
(E2), unbounded session init (T1), OAuth state leak (OAUTH1)
|
|
107
|
+
- [x] Low: hygiene items (P1, D1-D8)
|
|
108
|
+
|
|
109
|
+
## Proposed Solution
|
|
110
|
+
|
|
111
|
+
### Approach
|
|
112
|
+
|
|
113
|
+
Three stages, no new dependencies. Stage A fixes correctness + security first
|
|
114
|
+
(E1, R1, SEC1, E2, OAUTH1), Stage B bounds process robustness (T1, P1, D5,
|
|
115
|
+
D6), Stage C is hygiene + verify evidence (D1-D4, D7, D8, V1-V4).
|
|
116
|
+
|
|
117
|
+
### Steps
|
|
118
|
+
|
|
119
|
+
1. **Stage A — Correctness & security**
|
|
120
|
+
- E1: wrap the `handleEvent` dispatch in `onError`/`onResponseChunk` with
|
|
121
|
+
rejection routing: with the default client (no user handler), let the
|
|
122
|
+
throw **reject the run() promise** with the message; with a user handler
|
|
123
|
+
that throws, log + reject. No path may produce an unhandled rejection.
|
|
124
|
+
New test: default client + error event → `run()` rejects with the
|
|
125
|
+
"Provide a handleEvent function" message; assert via a
|
|
126
|
+
`process.on('unhandledRejection')` listener that no unhandled rejection
|
|
127
|
+
fires (a plain `expect(...).rejects` cannot prove the absence of an
|
|
128
|
+
unhandled rejection).
|
|
129
|
+
- R1: `applyOverridesToSessionState` clone → `cloneDeep` (SDK1 parity), or
|
|
130
|
+
documented function-preserving clone. New test: resume with a
|
|
131
|
+
`handleStepsFn` template preserves the function.
|
|
132
|
+
- SEC1: `saveChatGptOAuthCredentials` (and the refresh path) write with
|
|
133
|
+
`mode: 0o600` on POSIX (chmod after write), and
|
|
134
|
+
`ensureDirectoryExistsSync` creates the config dir with `mode: 0o700`.
|
|
135
|
+
New test: file mode is 0600 + dir mode is 0700 on POSIX.
|
|
136
|
+
- E2: wrap the setup phase (`initialSessionState`, `getUserInfoFromApiKey`,
|
|
137
|
+
overrides) in try/catch → resolve an error RunState (consistent with the
|
|
138
|
+
runtime error path) and update the JSDoc to document the single
|
|
139
|
+
contract. Align the abort messages in the same pass (`createAbortError`
|
|
140
|
+
uses `signal.reason`'s message while the runOnce post-userInfo check
|
|
141
|
+
hardcodes 'Run cancelled by user.'). Verify the CLI's user-facing message
|
|
142
|
+
for a setup failure (e.g., backend unreachable at run start) still
|
|
143
|
+
renders well — the source changes from a caught exception to a resolved
|
|
144
|
+
error output, though `reportRunOutcome` labels both 'failure'.
|
|
145
|
+
- OAUTH1: generate a separate `crypto.randomBytes` state; keep the verifier
|
|
146
|
+
private. New test: `state !== codeVerifier`.
|
|
147
|
+
2. **Stage B — Process robustness**
|
|
148
|
+
- T1: add a timeout (e.g. 10s) + max-buffer cap to `childProcessToPromise`;
|
|
149
|
+
on timeout kill the child and resolve `''` (git is best-effort).
|
|
150
|
+
- P1: dedupe `buildFileTree` children via a Set (O(n)).
|
|
151
|
+
- D5: downgrade the BYOK stub log to debug.
|
|
152
|
+
- D6: cache failed key resolution (negative cache) for the process lifetime.
|
|
153
|
+
3. **Stage C — Hygiene + verify evidence**
|
|
154
|
+
- D1: guard `getWebsiteUrl` with a fallback + `String(...)` (defensive).
|
|
155
|
+
- D2: omit/guard the undefined `sessionState` on pre-abort (or document).
|
|
156
|
+
- D3: `crypto.randomUUID()` for `promptId` (or shared id helper).
|
|
157
|
+
- D4: remove the dead else-branch (keep the `satisfies never` assertion).
|
|
158
|
+
- D7: extract shared `getString`-style helpers into `common` and reuse.
|
|
159
|
+
- D8: skip falsy definitions with a typed guard in `validateAgents`.
|
|
160
|
+
- V1-V4: record evidence in the FID (system-info closed; loadSkills /
|
|
161
|
+
loadLocalAgents grep confirmation; cache-staleness reasoning; V3
|
|
162
|
+
operator decision on the `codex_cli_rs` originator header; recursion
|
|
163
|
+
depth argument).
|
|
164
|
+
|
|
165
|
+
### Verification
|
|
166
|
+
|
|
167
|
+
- `cd sdk && bun run typecheck` + `bun test src/` (new + existing, 418+)
|
|
168
|
+
- `cd cli && bun run typecheck` + `NODE_ENV=production bun test` (oauth test)
|
|
169
|
+
- ESLint zero-warnings, Prettier on changed files, markdownlint on the FID
|
|
170
|
+
- Independent code-reviewer-glm AUDIT of the implementation
|
|
171
|
+
|
|
172
|
+
## Perfection Loop
|
|
173
|
+
|
|
174
|
+
### Loop 1
|
|
175
|
+
|
|
176
|
+
- **RED:** 0-EOF reads of client.ts, run.ts, run-state.ts + impl layer;
|
|
177
|
+
20 items identified (2 high / 4 med / 10 low / 4 verify), every citation
|
|
178
|
+
grounded via grep during the read pass.
|
|
179
|
+
- **GREEN:** staged plan above; no new deps; tests added per fix.
|
|
180
|
+
- **AUDIT:** independent review — **no blockers**; count math verified
|
|
181
|
+
(20 = 2H/4M/10L/4V), citations match read evidence, severity defensible.
|
|
182
|
+
- **SELF-CORRECT:** all 7 optionals folded in — SEC1 elevated to HIGH with
|
|
183
|
+
config-dir 0700 added; D9 dead null-cache branches added; V2 staleness note
|
|
184
|
+
for long-lived processes; E1 test mechanism (unhandledRejection listener);
|
|
185
|
+
E2 abort-message alignment + CLI message-source check; OAUTH1 mitigation
|
|
186
|
+
context added.
|
|
187
|
+
|
|
188
|
+
### Verification Checklist
|
|
189
|
+
|
|
190
|
+
- [x] Files referenced above exist (verified via 0-EOF reads + grep evidence)
|
|
191
|
+
- [x] Implementation matches the proposed solution (approved, all 3 stages)
|
|
192
|
+
- [x] SDK typecheck + test suite passes (429 pass / 1 skip / 0 fail; typecheck clean)
|
|
193
|
+
- [x] New event-dispatch, resume-clone, credentials-mode, file-tree, oauth-state
|
|
194
|
+
tests pass (11 new SDK + 1 new CLI test)
|
|
195
|
+
- [x] FID status updated to reflect actual implementation state (verified)
|
|
196
|
+
|
|
197
|
+
## Lessons Learned (RED phase)
|
|
198
|
+
|
|
199
|
+
1. **The SDK's hardening history is visible in the hot path.** Bounded caches,
|
|
200
|
+
retryable-error wrapping, identity-checked snapshots, and server-trusted
|
|
201
|
+
metadata ordering all read as deliberate — the audit's job was to find what
|
|
202
|
+
the hardening passes missed, not re-litigate them.
|
|
203
|
+
2. **Async dispatch is the silent failure zone.** Every "call a callback
|
|
204
|
+
without awaiting it" site is a potential unhandled rejection; the default
|
|
205
|
+
throwing handler turned a designed error into a process-crash risk.
|
|
206
|
+
3. **Clone strategy is a correctness contract, not a perf detail.** The JSON
|
|
207
|
+
round-trip is 50x faster than cloneDeep but silently drops function-valued
|
|
208
|
+
fields — exactly how `handleStepsFn` got lost on the resume path while the
|
|
209
|
+
sibling path was already fixed.
|
|
210
|
+
4. **Credentials hygiene diverges by path.** The provider path chmods 0600;
|
|
211
|
+
the OAuth path doesn't. File-permission fixes need a cross-path sweep, not
|
|
212
|
+
a single-site fix.
|
|
213
|
+
|
|
214
|
+
## Resolution
|
|
215
|
+
|
|
216
|
+
- **Fixed By:** Savant — approved by operator ("Approve — implement all")
|
|
217
|
+
- **Fixed Date:** 2026-08-02
|
|
218
|
+
- **Fix Description:** All 20 items implemented across the SDK execution path:
|
|
219
|
+
Stage A correctness/security (E1 event-dispatch rejection routing with the
|
|
220
|
+
settled guard; SEC1 credentials 0600/0700; R1 cloneDeep resume; E2 single
|
|
221
|
+
error contract + aligned abort messages; OAUTH1 independent OAuth state),
|
|
222
|
+
Stage B robustness (T1 bounded child processes; P1 O(n) file-tree; D5 log
|
|
223
|
+
level; D6 negative cache), Stage C hygiene (D1-D4, D7-D9, V4 depth cap) plus
|
|
224
|
+
V1-V3 evidence recorded. 9 source files + 1 new shared util in `common/`,
|
|
225
|
+
1 CLI source file, 5 new SDK test files + 1 new CLI test.
|
|
226
|
+
- **Tests Added:** `sdk/src/__tests__/run-event-dispatch.test.ts` (3: default
|
|
227
|
+
client rejects + no unhandled rejection, throwing user handler, resolving
|
|
228
|
+
no-throw handler), `apply-overrides-resume.test.ts` (2: handleStepsFn
|
|
229
|
+
identity + non-shared history), `run-state-child-process.test.ts` (3:
|
|
230
|
+
timeout / close / buffer cap), `build-file-tree.test.ts` (2: flat + nested),
|
|
231
|
+
credentials SEC1 block (1: modes 0600/0700, skipIf win32),
|
|
232
|
+
`cli/src/utils/__tests__/chatgpt-oauth.test.ts` (1: state ≠ verifier).
|
|
233
|
+
- **Verified By:** 4-way typecheck (sdk/common/agent-runtime/cli) clean; SDK
|
|
234
|
+
suite **429 pass / 1 skip / 0 fail**; CLI suite **2728 pass / 0 fail**;
|
|
235
|
+
ESLint **0 warnings**; Prettier clean; independent code-reviewer-glm AUDIT
|
|
236
|
+
(no CRITICAL/HIGH; 1 MED + 4 LOWs all closed).
|
|
237
|
+
- **Commit/PR:** uncommitted working tree at close-out (alongside FIDs 005-007)
|
|
238
|
+
- **Archived:** dev/fids/archive/FID-2026-0802-008-sdk-package-audit-client-run-run-state.md
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
# FID: ECHO Protocol Enforcement Layer Drift
|
|
2
|
+
|
|
3
|
+
**Filename:** `FID-2026-0803-001-echo-enforcement-layer-drift.md`
|
|
4
|
+
**ID:** FID-2026-0803-001
|
|
5
|
+
**Severity:** high
|
|
6
|
+
**Status:** verified
|
|
7
|
+
**Created:** 2026-08-03
|
|
8
|
+
**Author:** Savant
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
Audit the live ECHO enforcement contract across `agents/savant/savant.ts`,
|
|
15
|
+
`protocol.config.yaml`, `ARCHITECTURE.md`, `ECHO.md`, and the runtime enforcement
|
|
16
|
+
paths. The audit found that the source-of-truth documents, agent capability
|
|
17
|
+
metadata, protocol configuration loader, and runtime gates have drifted apart.
|
|
18
|
+
One finding concerns an inert policy contract at runtime; the remaining
|
|
19
|
+
findings are trusted-capability, lifecycle, and documentation mismatches that
|
|
20
|
+
can cause agents, operators, or future maintainers to make incorrect decisions.
|
|
21
|
+
|
|
22
|
+
Historical FIDs deleted by the operator as intentional cleanup are explicitly
|
|
23
|
+
out of scope. This FID audits only live source files and current runtime paths.
|
|
24
|
+
|
|
25
|
+
## Environment
|
|
26
|
+
|
|
27
|
+
- **OS:** Windows (`win32`), Bash-compatible shell
|
|
28
|
+
- **Language/Runtime:** TypeScript monorepo, Bun 1.3.x
|
|
29
|
+
- **Protocol:** Savant ECHO v0.2.0; Savant contract v0.1.2-freebuff
|
|
30
|
+
- **Project version:** 0.0.15
|
|
31
|
+
- **Commit/State:** `4aaa3f9` plus the existing uncommitted quality-session change set
|
|
32
|
+
- **Scope:** `agents/savant/savant.ts`, `protocol.config.yaml`, `ARCHITECTURE.md`,
|
|
33
|
+
`ECHO.md`, protocol loader, FSM transition handler, tool executor, and
|
|
34
|
+
programmatic-step execution
|
|
35
|
+
|
|
36
|
+
## Detailed Description
|
|
37
|
+
|
|
38
|
+
### Problem
|
|
39
|
+
|
|
40
|
+
ECHO claims to be a non-negotiable, machine-enforced protocol, but the current
|
|
41
|
+
contracts disagree in several places:
|
|
42
|
+
|
|
43
|
+
- The runtime intentionally bypasses an agent template's declared `toolNames`
|
|
44
|
+
for all `handleSteps` tool calls.
|
|
45
|
+
- `protocol.config.yaml` declares commands, quality thresholds, testing policy,
|
|
46
|
+
FID policy, sandbox policy, perfection-loop limits, and session policy, but
|
|
47
|
+
the production loader parses only `strict_mode`, `language`, Savant fields,
|
|
48
|
+
and top-level FID filenames. Most configuration changes therefore have no
|
|
49
|
+
runtime effect.
|
|
50
|
+
- The documented agent roster and tool restrictions do not match the actual
|
|
51
|
+
agent definitions and `createSavant()` tool set.
|
|
52
|
+
- Recorder is documented as controlling FID archiving, but no registered tool
|
|
53
|
+
gives it a filesystem move/archive operation.
|
|
54
|
+
|
|
55
|
+
### Evidence and Findings
|
|
56
|
+
|
|
57
|
+
#### ECHO-1 — Programmatic `handleSteps` capabilities lack a separate allowlist
|
|
58
|
+
|
|
59
|
+
- **Severity:** medium
|
|
60
|
+
- **Files/lines:**
|
|
61
|
+
- `packages/agent-runtime/src/tools/tool-executor.ts:367-380`
|
|
62
|
+
- `packages/agent-runtime/src/run-programmatic-step.ts:353-382`
|
|
63
|
+
- `agents/thinker/thinker-with-files-gemini.ts:40-57`
|
|
64
|
+
- **Evidence:** The executor rejects a tool absent from
|
|
65
|
+
`agentTemplate.toolNames` only when `!fromHandleSteps` is true. The
|
|
66
|
+
programmatic executor sets `fromHandleSteps: true` for every generator yield.
|
|
67
|
+
`thinker-with-files-gemini` declares `toolNames: []` but its generator yields
|
|
68
|
+
`read_files`.
|
|
69
|
+
- **Problem:** The model-visible tool filter remains strict, but a trusted
|
|
70
|
+
programmatic generator can invoke any registered tool without declaring that
|
|
71
|
+
capability in `toolNames`. This is an intentional internal-generator escape
|
|
72
|
+
hatch, not conclusively an untrusted-template vulnerability; however, the
|
|
73
|
+
exception is not represented as a separate, auditable capability allowlist.
|
|
74
|
+
- **Impact:** Capability reviews cannot tell which tools are model-callable
|
|
75
|
+
versus trusted programmatic primitives. If a local or database template is
|
|
76
|
+
ever treated as untrusted, the broad bypass becomes a real authorization risk;
|
|
77
|
+
until then this is a separation-of-duties and auditability gap.
|
|
78
|
+
|
|
79
|
+
#### ECHO-2 — Thinker-with-files capability declaration contradicts its generator
|
|
80
|
+
|
|
81
|
+
- **Severity:** medium
|
|
82
|
+
- **Files/lines:**
|
|
83
|
+
- `agents/thinker/thinker-with-files-gemini.ts:40-57`
|
|
84
|
+
- `packages/agent-runtime/src/run-programmatic-step.ts:353-382`
|
|
85
|
+
- `packages/agent-runtime/src/run-agent-step.ts:905-923`
|
|
86
|
+
- **Evidence:** The agent declares `toolNames: []`, while `handleSteps` yields
|
|
87
|
+
`read_files` when `filePaths` are present. The runtime's `fromHandleSteps`
|
|
88
|
+
bypass currently makes this call executable, even though the model-visible
|
|
89
|
+
child tool set is empty.
|
|
90
|
+
- **Problem:** The agent metadata says the child has no tools, the instructions
|
|
91
|
+
say it should not call tools, and the generator secretly performs a read. This
|
|
92
|
+
makes capability audits and FID-007 child-tool-set reasoning incomplete.
|
|
93
|
+
- **Impact:** Future tightening of ECHO-1 can silently break this thinker; current
|
|
94
|
+
audits can incorrectly conclude that the agent is fully toolless. The fix must
|
|
95
|
+
distinguish internal programmatic capabilities from model-callable capabilities.
|
|
96
|
+
|
|
97
|
+
#### ECHO-3 — `strict_mode` and most protocol configuration are not live enforcement
|
|
98
|
+
|
|
99
|
+
- **Severity:** high
|
|
100
|
+
- **Files/lines:**
|
|
101
|
+
- `protocol.config.yaml:14-16,27-87`
|
|
102
|
+
- `common/src/util/protocol-config.ts:46-99`
|
|
103
|
+
- `packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts:12-21,87-99`
|
|
104
|
+
- **Evidence:** `readProtocolConfig()` parses only Savant `strict_mode`, language,
|
|
105
|
+
Savant protocol values, and open FID filenames. Code search found no
|
|
106
|
+
production caller of `readProtocolConfig()`; the only reference is its test.
|
|
107
|
+
`MAX_ITERATIONS = 10` is hardcoded in the transition handler while
|
|
108
|
+
`perfection_loop.max_iterations: 10` in YAML is not parsed. Commands, paths,
|
|
109
|
+
quality, testing, fid policy, sandbox permission mode, convergence settings,
|
|
110
|
+
and session settings are likewise not parsed or consumed.
|
|
111
|
+
- **Problem:** Operators can change the documented configuration and receive no
|
|
112
|
+
corresponding runtime behavior. Even the parsed `strict_mode` value is not
|
|
113
|
+
connected to the phase gates or prompt law activation in production.
|
|
114
|
+
- **Impact:** The project can claim strict ECHO enforcement while running with
|
|
115
|
+
hardcoded defaults and inert policy fields. This is a protocol governance gap,
|
|
116
|
+
not merely stale documentation.
|
|
117
|
+
|
|
118
|
+
#### ECHO-4 — Hybrid idle-to-green policy is not objectively documented
|
|
119
|
+
|
|
120
|
+
- **Severity:** medium
|
|
121
|
+
- **Files/lines:**
|
|
122
|
+
- `packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts:14-21,56-78`
|
|
123
|
+
- `protocol.config.yaml:64-67`
|
|
124
|
+
- `ARCHITECTURE.md:7-9,145-164`
|
|
125
|
+
- `ECHO.md:16-19,245-255`
|
|
126
|
+
- **Evidence:** The FSM allows `idle → green`. The no-open-FID check runs only
|
|
127
|
+
when `phase === 'green' && currentPhase !== 'idle'`, so `idle → green` bypasses
|
|
128
|
+
the open-FID requirement. The architecture overview says code is never
|
|
129
|
+
written until a converged FID, while ECHO's Hybrid Mode separately permits
|
|
130
|
+
direct orchestrator writes for simple tasks.
|
|
131
|
+
- **Problem:** The runtime has a deliberate Hybrid Mode exception, but the
|
|
132
|
+
architecture overview still says code is never written before a converged FID.
|
|
133
|
+
The exception is not represented as one consistent, objective policy, and the
|
|
134
|
+
YAML `fid.auto_create`/`max_open_fids` fields do not govern it.
|
|
135
|
+
- **Impact:** Agents and reviewers cannot reliably determine whether a write is
|
|
136
|
+
protocol-compliant. A future documentation or gate change may accidentally
|
|
137
|
+
remove the intended Hybrid Mode or allow complex work to skip FID review. The
|
|
138
|
+
fix must define objective routing criteria and make the exception explicit in
|
|
139
|
+
the enforcement path and documentation.
|
|
140
|
+
|
|
141
|
+
#### ECHO-5 — Roster/tool tables are materially stale
|
|
142
|
+
|
|
143
|
+
- **Severity:** medium
|
|
144
|
+
- **Files/lines:**
|
|
145
|
+
- `agents/savant/savant.ts:100-119,122-136`
|
|
146
|
+
- `ARCHITECTURE.md:19-31,177-186`
|
|
147
|
+
- `ECHO.md:55-67`
|
|
148
|
+
- `agents/recorder/recorder.ts:12-21`
|
|
149
|
+
- `agents/detective/detective.ts:57-67`
|
|
150
|
+
- `agents/scribe/scribe.ts:12-21`
|
|
151
|
+
- **Evidence:** `createSavant()` includes `run_readonly_command`, conditional
|
|
152
|
+
`gravity_index`, `apply_patch`, and other tools absent from the Orchestrator
|
|
153
|
+
rows in `ARCHITECTURE.md` and `ECHO.md`. The docs list Detective as only
|
|
154
|
+
`code_search`/`set_output`, while the definition also grants list, glob, read,
|
|
155
|
+
and subtree tools. Docs list Recorder `grep` and `transition_phase`, while
|
|
156
|
+
the definition grants `code_search` and neither of those two. Scribe has the
|
|
157
|
+
same `grep` versus `code_search` mismatch.
|
|
158
|
+
- **Impact:** Capability reviews, incident response, and future agent prompts can
|
|
159
|
+
be based on false permissions. This directly undermines separation-of-duties
|
|
160
|
+
documentation even where runtime filtering is correct.
|
|
161
|
+
|
|
162
|
+
#### ECHO-6 — Recorder FID lifecycle claims are not executable
|
|
163
|
+
|
|
164
|
+
- **Severity:** medium
|
|
165
|
+
- **Files/lines:**
|
|
166
|
+
- `ARCHITECTURE.md:25-31,181-186`
|
|
167
|
+
- `ECHO.md:61,72-75,475-519`
|
|
168
|
+
- `agents/recorder/recorder.ts:12-21,31-46`
|
|
169
|
+
- `common/src/tools/constants.ts:40-82`
|
|
170
|
+
- **Evidence:** The docs say Recorder creates, updates, archives, and controls
|
|
171
|
+
FID lifecycle. Recorder's actual `toolNames` are only
|
|
172
|
+
`write_file`, `read_files`, `glob`, `code_search`, and `set_output`. Search
|
|
173
|
+
found no registered `create_fid`, `update_fid`, or `archive_fid` tool and no
|
|
174
|
+
runtime rename/move handler. `protocol.config.yaml`'s FID policy is not parsed.
|
|
175
|
+
- **Problem:** Recorder can write an FID and CHANGELOG content if path gating
|
|
176
|
+
permits it, but cannot perform the documented archive move itself. The
|
|
177
|
+
lifecycle is procedural/orchestrator- or CLI-driven, not Recorder-exclusive
|
|
178
|
+
as the docs claim.
|
|
179
|
+
- **Impact:** The protocol's separation-of-duties claim is false at the archive
|
|
180
|
+
boundary, and the documented Recorder workflow is incomplete unless another
|
|
181
|
+
explicitly identified actor performs the move.
|
|
182
|
+
|
|
183
|
+
#### ECHO-7 — Open-FID detection checks filenames, not FID status or convergence
|
|
184
|
+
|
|
185
|
+
- **Severity:** medium
|
|
186
|
+
- **Files/lines:**
|
|
187
|
+
- `common/src/util/protocol-config.ts:103-115`
|
|
188
|
+
- `packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts:56-78`
|
|
189
|
+
- **Evidence:** `scanOpenFids()` returns every top-level `FID-*.md` file outside
|
|
190
|
+
an `archive` path. It does not parse `**Status:**`, Perfection Loop state,
|
|
191
|
+
unresolved work, or convergence evidence.
|
|
192
|
+
- **Problem:** Any FID-shaped file counts as open. A closed/stale/incomplete FID
|
|
193
|
+
left in `dev/fids/` satisfies the green-transition precondition, while a
|
|
194
|
+
valid FID with a nonstandard status is indistinguishable from an open one.
|
|
195
|
+
- **Impact:** FID-bound gating is presence-based rather than state-based and can
|
|
196
|
+
be bypassed by stale files or fail to recognize lifecycle state accurately.
|
|
197
|
+
|
|
198
|
+
#### ECHO-8 — Protocol command and quality claims do not match the real gates
|
|
199
|
+
|
|
200
|
+
- **Severity:** low
|
|
201
|
+
- **Files/lines:**
|
|
202
|
+
- `protocol.config.yaml:27-62`
|
|
203
|
+
- `package.json:20-33`
|
|
204
|
+
- `AGENTS.md:81-94`
|
|
205
|
+
- **Evidence:** YAML `commands.build` is `bun run ci`, whose root script builds
|
|
206
|
+
SDK and Savant-Free only. YAML `commands.type_check` omits
|
|
207
|
+
`packages/database`, while the root typecheck includes it. YAML lint says
|
|
208
|
+
`bunx eslint .` without the repository's `--max-warnings 0` gate. YAML format
|
|
209
|
+
says `bunx prettier --check .`, while the repository currently has known
|
|
210
|
+
Prettier warnings and AGENTS documents changed-file formatting as the
|
|
211
|
+
practical gate.
|
|
212
|
+
- **Impact:** ECHO audit instructions can report a green result using commands
|
|
213
|
+
that do not cover the same surface as the actual project quality gates.
|
|
214
|
+
|
|
215
|
+
#### ECHO-9 — Helper/legacy architecture references are stale
|
|
216
|
+
|
|
217
|
+
- **Severity:** low
|
|
218
|
+
- **Files/lines:**
|
|
219
|
+
- `ARCHITECTURE.md:208-220`
|
|
220
|
+
- `docs/agents-and-tools.md:35,41`
|
|
221
|
+
- `CHANGELOG.md:454,880,992,1000`
|
|
222
|
+
- filesystem: `agents/debug/browser-agent-traces/`
|
|
223
|
+
- **Evidence:** ARCHITECTURE references missing
|
|
224
|
+
`agents/savant/savant-deep.ts`, missing `agents/__tests__/context-pruner.test.ts`,
|
|
225
|
+
and missing `evals/benchmark/eval-savant-code-hard.json`. The current tree
|
|
226
|
+
still contains a `debug/` directory not included in the documented 9+5
|
|
227
|
+
hierarchy. `docs/agents-and-tools.md` still documents `savant-deep`.
|
|
228
|
+
- **Impact:** Repository navigation, cleanup audits, and agent-roster reasoning
|
|
229
|
+
use paths and counts that no longer describe the live tree. This is
|
|
230
|
+
documentation debt, not an archive-restoration request.
|
|
231
|
+
|
|
232
|
+
### Root Cause
|
|
233
|
+
|
|
234
|
+
The ECHO contract evolved through several targeted FIDs and product/rebrand
|
|
235
|
+
changes, but source-of-truth synchronization was manual. Runtime policy was
|
|
236
|
+
added as local constants and path gates while the YAML schema and architecture
|
|
237
|
+
pages retained broader aspirational settings. Agent templates also gained
|
|
238
|
+
programmatic `handleSteps` capabilities without a separate declaration for
|
|
239
|
+
internal tool calls.
|
|
240
|
+
|
|
241
|
+
## Impact Assessment
|
|
242
|
+
|
|
243
|
+
### Affected Components
|
|
244
|
+
|
|
245
|
+
- Orchestrator definition and generated agent capabilities
|
|
246
|
+
- Programmatic and model-visible tool authorization
|
|
247
|
+
- FSM phase transitions and FID preconditions
|
|
248
|
+
- Protocol configuration loading
|
|
249
|
+
- Recorder/FID lifecycle workflow
|
|
250
|
+
- Architecture and agent capability documentation
|
|
251
|
+
|
|
252
|
+
### Risk Level
|
|
253
|
+
|
|
254
|
+
- [ ] Critical: System crash, data loss, or security vulnerability
|
|
255
|
+
- [x] High: protocol configuration claims can be inert (`strict_mode`/policy fields)
|
|
256
|
+
- [x] Medium: trusted capability metadata, Hybrid Mode policy, and FID lifecycle semantics are inconsistent
|
|
257
|
+
- [x] Low: command/documentation/helper-tree drift
|
|
258
|
+
|
|
259
|
+
## Proposed Solution
|
|
260
|
+
|
|
261
|
+
### Approach
|
|
262
|
+
|
|
263
|
+
Establish one machine-readable capability and policy contract, while preserving
|
|
264
|
+
intentional Hybrid Mode behavior explicitly:
|
|
265
|
+
|
|
266
|
+
1. Define separate model-visible tools and trusted programmatic tools in the
|
|
267
|
+
agent template schema, or validate every `handleSteps` yield against an
|
|
268
|
+
explicit internal-tool allowlist rather than bypassing `toolNames` globally.
|
|
269
|
+
2. Add the required internal capability to `thinker-with-files-gemini` or make
|
|
270
|
+
its read operation a dedicated runtime primitive with an auditable name.
|
|
271
|
+
3. Extend the protocol config loader to parse only policy fields the runtime
|
|
272
|
+
will actually honor, and wire strict mode, perfection-loop limits, commands,
|
|
273
|
+
and FID policy to their production consumers. If a field is intentionally
|
|
274
|
+
advisory, rename/document it as advisory instead of presenting it as active.
|
|
275
|
+
4. Make Hybrid Mode a named, objective policy: document when `idle → green` is
|
|
276
|
+
legal, enforce complex-task/FID criteria where possible, and align the
|
|
277
|
+
architecture overview with ECHO's hybrid exception.
|
|
278
|
+
5. Generate or test architecture/tool tables from live agent definitions and
|
|
279
|
+
canonical tool constants. Correct Recorder, Detective, Scribe, Orchestrator,
|
|
280
|
+
helper-directory, and legacy-path references.
|
|
281
|
+
6. Give the FID lifecycle an explicit executable boundary: either add safe
|
|
282
|
+
Recorder-scoped lifecycle tools or revise the docs so archive movement is an
|
|
283
|
+
orchestrator/CLI operation with Recorder approval/documentation.
|
|
284
|
+
7. Parse FID status/convergence before treating a file as an open-FID gate.
|
|
285
|
+
8. Align `protocol.config.yaml` commands with the actual hard gates, including
|
|
286
|
+
database typecheck and zero-warning ESLint; document the intentional
|
|
287
|
+
changed-file Prettier boundary if full-repository formatting remains
|
|
288
|
+
deferred.
|
|
289
|
+
|
|
290
|
+
### Verification
|
|
291
|
+
|
|
292
|
+
- Add focused tests proving model-visible tools cannot expand through
|
|
293
|
+
`handleSteps` and that approved internal programmatic tools remain executable.
|
|
294
|
+
- Add tests for `thinker-with-files-gemini` capability metadata and FID-007 child
|
|
295
|
+
tool filtering.
|
|
296
|
+
- Add protocol-config tests proving every claimed enforced field is parsed and
|
|
297
|
+
consumed, or explicitly classify non-consumed fields as advisory.
|
|
298
|
+
- Add transition tests for idle-to-green Hybrid Mode, open-FID status parsing,
|
|
299
|
+
maximum iterations, and missing/invalid config behavior.
|
|
300
|
+
- Run all commands from the corrected config plus the repository's hard gates:
|
|
301
|
+
four-way typecheck, focused common/agent-runtime/agents tests, full affected
|
|
302
|
+
package tests, zero-warning ESLint, Prettier on changed files, and markdownlint.
|
|
303
|
+
- Grep every documented agent/tool/path reference against the live tree and
|
|
304
|
+
generated bundle.
|
|
305
|
+
|
|
306
|
+
## Perfection Loop
|
|
307
|
+
|
|
308
|
+
### Loop 1
|
|
309
|
+
|
|
310
|
+
- **RED:** Completed 0-EOF reads of the primary ECHO sources and runtime paths;
|
|
311
|
+
independently grounded 9 findings with line citations, code search, and
|
|
312
|
+
package/tool evidence. Historical deleted FIDs were excluded per operator
|
|
313
|
+
instruction.
|
|
314
|
+
- **GREEN:** Proposed solution recorded; no source/config/documentation files
|
|
315
|
+
were changed.
|
|
316
|
+
- **AUDIT:** Independent review found no blocking omission. It required
|
|
317
|
+
severity/framing corrections: ECHO-1 changed from high to medium as an
|
|
318
|
+
intentional trusted-generator capability gap; ECHO-4 changed from high to
|
|
319
|
+
medium as intentional Hybrid Mode policy ambiguity; ECHO-6 narrowed to
|
|
320
|
+
lifecycle ownership; ECHO-2 retained as the concrete metadata contradiction.
|
|
321
|
+
- **SELF-CORRECT:** Applied all four audit corrections and preserved the
|
|
322
|
+
operator's intentional archive cleanup as out of scope.
|
|
323
|
+
- **IMPLEMENTATION AUDIT (code-reviewer-deepseek-flash):** No blockers. One
|
|
324
|
+
MED (transition-phase `maxIterationsCache` not cwd-keyed → fixed with a
|
|
325
|
+
per-cwd Map) + 3 LOWs (end_turn declaration-required contract tightening
|
|
326
|
+
documented; docs/agents-and-tools.md thinker-variant classification
|
|
327
|
+
relabeled; bundle regen diff confirmed clean — generated file is gitignored).
|
|
328
|
+
- **CHANGE DELTA:** 0% of runtime semantics beyond the approved contract; all
|
|
329
|
+
9 findings implemented.
|
|
330
|
+
|
|
331
|
+
### Missed Questions
|
|
332
|
+
|
|
333
|
+
1. **Which ECHO settings are normative versus advisory?** The robust default is
|
|
334
|
+
that every field presented as a gate must have a production consumer; fields
|
|
335
|
+
that cannot be enforced should be explicitly labeled advisory.
|
|
336
|
+
2. **Are programmatic generator tools part of an agent's public capability?** The
|
|
337
|
+
robust default is to treat them as a separate trusted capability surface with
|
|
338
|
+
explicit allowlists and tests, not as an unconditional bypass.
|
|
339
|
+
3. **Is Hybrid Mode an exception to FID-bound execution?** Yes, but only for
|
|
340
|
+
objectively simple tasks; the exception must be represented in both runtime
|
|
341
|
+
policy and documentation.
|
|
342
|
+
4. **Who owns archive movement?** The robust default is one executable owner
|
|
343
|
+
(CLI/runtime lifecycle handler) plus Recorder-authored evidence, rather than
|
|
344
|
+
claiming Recorder can perform an operation it cannot execute.
|
|
345
|
+
5. **What makes an FID open?** A filename alone is insufficient; the status and
|
|
346
|
+
Perfection Loop state must be parsed or the gate must be described as a
|
|
347
|
+
presence check rather than an open-FID check.
|
|
348
|
+
|
|
349
|
+
### Code Verification Evidence
|
|
350
|
+
|
|
351
|
+
- [x] Files referenced in Affected Components exist in the live tree
|
|
352
|
+
- [x] Runtime citations verified with direct reads/grep
|
|
353
|
+
- [x] Historical deleted FIDs intentionally excluded from scope
|
|
354
|
+
- [x] Implementation matches the proposed solution (approved, all 3 stages)
|
|
355
|
+
- [x] Typecheck ×4 green (common/agents/agent-runtime/cli); agent-runtime suite
|
|
356
|
+
566 pass / 0 fail; CLI suite 2748 pass / 0 fail; focused common 0 fail;
|
|
357
|
+
zero-warning ESLint; `bun run lint:md` exit 0; bundle regenerated
|
|
358
|
+
- [x] FID status reflects actual implementation state (`verified`)
|
|
359
|
+
|
|
360
|
+
## Resolution
|
|
361
|
+
|
|
362
|
+
- **Fixed By:** Savant — approved via "resume"
|
|
363
|
+
- **Fixed Date:** 2026-08-03
|
|
364
|
+
- **Fix Description:** All 9 findings implemented across three stages.
|
|
365
|
+
Stage 1 (ECHO-1/2): new `PROGRAMMATIC_PRIMITIVES` single source in
|
|
366
|
+
`common/src/tools/constants.ts`; new optional `programmaticToolNames` field
|
|
367
|
+
on AgentTemplate/DynamicAgentTemplate/AgentDefinition/SecretAgentDefinition;
|
|
368
|
+
fail-closed validation in `run-programmatic-step.ts` (handleSteps yields must
|
|
369
|
+
be in toolNames ∪ programmaticToolNames ∪ primitives);
|
|
370
|
+
`thinker-with-files-gemini` declares `read_files` programmatically (ECHO-2
|
|
371
|
+
metadata honesty). Stage 2 (ECHO-3/7/8): `readProtocolConfig` parses
|
|
372
|
+
`perfection_loop.max_iterations`; transition handler uses it via a per-cwd
|
|
373
|
+
cache; FID gate reworded as presence-based with Hybrid Mode documented;
|
|
374
|
+
`protocol.config.yaml` type_check now includes packages/database, lint uses
|
|
375
|
+
`--max-warnings 0`, advisory fields annotated. Stage 3 (ECHO-4/5/6/9):
|
|
376
|
+
ARCHITECTURE.md/ECHO.md/AGENTS.md roster + helper-dir + archive-ownership +
|
|
377
|
+
Hybrid Mode corrections; docs/agents-and-tools.md savant-deep references
|
|
378
|
+
removed; MIGRATION.md quick-reference row replaced.
|
|
379
|
+
- **Tests Added:** Yes — `programmatic-tool-authorization.test.ts` (4:
|
|
380
|
+
declared-tool, primitive, programmaticToolNames, undeclared-rejection);
|
|
381
|
+
`agent-toolnames-validation.test.ts` +2 (programmaticToolNames allowlist +
|
|
382
|
+
thinker ECHO-2 metadata); `protocol-config.test.ts` updated for maxIterations.
|
|
383
|
+
- **Verified By:** 4-way typecheck, agent-runtime 566/0, CLI 2748/0, focused
|
|
384
|
+
common 0 fail, ESLint 0 warnings, lint:md 0, bundle regenerated + validated.
|
|
385
|
+
- **Commit/PR:** None
|
|
386
|
+
- **Archived:** 2026-08-03 (moved to `dev/fids/archive/` by orchestrator per
|
|
387
|
+
ECHO-6 ownership note)
|
|
388
|
+
|
|
389
|
+
## Lessons Learned
|
|
390
|
+
|
|
391
|
+
1. A protocol document, YAML schema, prompt constant, agent definition, and
|
|
392
|
+
runtime gate are separate sources of truth unless a test or generator ties
|
|
393
|
+
them together.
|
|
394
|
+
2. `toolNames` filtering must distinguish model-visible capabilities from
|
|
395
|
+
trusted programmatic primitives; otherwise either the runtime is too loose
|
|
396
|
+
or legitimate internal generators are forced to lie in their metadata.
|
|
397
|
+
(`end_turn` stays declaration-required — a deliberate contract tightening
|
|
398
|
+
for user-authored dynamic templates, surfaced via an actionable error.)
|
|
399
|
+
3. “Open FID” is a semantic state, not merely a filename. Presence checks are
|
|
400
|
+
useful fail-safe defaults but should not be described as convergence-aware
|
|
401
|
+
enforcement.
|
|
402
|
+
4. The operator's intentional deletion of poisoned historical FIDs is not a
|
|
403
|
+
protocol defect. Future archive-integrity checks must audit live files and
|
|
404
|
+
explicit retention policy, not assume historical records remain on disk.
|