@alumbwe/anvil 1.0.20 → 1.0.22
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/package.json +74 -70
- package/src/agents/bundled-agents.generated.ts +4 -4
- package/src/chat.tsx +1703 -1698
- package/src/cli-args.ts +134 -134
- package/src/components/status-bar.tsx +331 -313
- package/src/hooks/helpers/send-message.ts +663 -654
- package/src/hooks/use-send-message.ts +806 -773
- package/src/index.tsx +473 -473
- package/src/state/chat-store.ts +553 -544
- package/src/utils/create-run-config.ts +121 -121
- package/src/utils/format-compact-number.ts +37 -0
- package/vendor/@anvil/common/package.json +27 -0
- package/vendor/@anvil/common/src/__tests__/agent-validation.test.ts +846 -0
- package/vendor/@anvil/common/src/__tests__/anvil-model-availability.test.ts +101 -0
- package/vendor/@anvil/common/src/__tests__/anvil-models.test.ts +1408 -0
- package/vendor/@anvil/common/src/__tests__/anvil-public-data-use-copy.test.ts +258 -0
- package/vendor/@anvil/common/src/__tests__/anvil-referral-tiers.test.ts +48 -0
- package/vendor/@anvil/common/src/__tests__/anvil-spend-ceilings.test.ts +282 -0
- package/vendor/@anvil/common/src/__tests__/anvil-trust.test.ts +526 -0
- package/vendor/@anvil/common/src/__tests__/deepseek-direct.test.ts +68 -0
- package/vendor/@anvil/common/src/__tests__/disposable-email.test.ts +132 -0
- package/vendor/@anvil/common/src/__tests__/dynamic-agent-template-schema.test.ts +422 -0
- package/vendor/@anvil/common/src/__tests__/env-ci.test.ts +167 -0
- package/vendor/@anvil/common/src/__tests__/env-process.test.ts +145 -0
- package/vendor/@anvil/common/src/__tests__/foreign-client-shipped-agents.test.ts +234 -0
- package/vendor/@anvil/common/src/__tests__/foreign-client-signals.test.ts +379 -0
- package/vendor/@anvil/common/src/__tests__/free-agents.test.ts +807 -0
- package/vendor/@anvil/common/src/__tests__/gravity-capi.test.ts +154 -0
- package/vendor/@anvil/common/src/__tests__/handlesteps-parsing.test.ts +246 -0
- package/vendor/@anvil/common/src/__tests__/kimi-k3-god-only.test.ts +77 -0
- package/vendor/@anvil/common/src/__tests__/model-config.test.ts +89 -0
- package/vendor/@anvil/common/src/__tests__/project-file-tree.test.ts +298 -0
- package/vendor/@anvil/common/src/__tests__/provisioned-model-tiers.test.ts +116 -0
- package/vendor/@anvil/common/src/__tests__/reasoning-effort.test.ts +167 -0
- package/vendor/@anvil/common/src/__tests__/reddit-capi.test.ts +132 -0
- package/vendor/@anvil/common/src/__tests__/response-ad-positions.test.ts +72 -0
- package/vendor/@anvil/common/src/__tests__/user-state.test.ts +30 -0
- package/vendor/@anvil/common/src/actions.ts +215 -0
- package/vendor/@anvil/common/src/analytics-core.ts +69 -0
- package/vendor/@anvil/common/src/analytics.ts +93 -0
- package/vendor/@anvil/common/src/api-keys/constants.ts +26 -0
- package/vendor/@anvil/common/src/browser-actions.ts +413 -0
- package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding-gate.test.ts +63 -0
- package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding.test.ts +246 -0
- package/vendor/@anvil/common/src/constants/__tests__/cf-worker-signals.test.ts +106 -0
- package/vendor/@anvil/common/src/constants/agents.ts +99 -0
- package/vendor/@anvil/common/src/constants/analytics-events.ts +435 -0
- package/vendor/@anvil/common/src/constants/anthropic.ts +73 -0
- package/vendor/@anvil/common/src/constants/anvil-data-use.ts +81 -0
- package/vendor/@anvil/common/src/constants/anvil-errors.ts +7 -0
- package/vendor/@anvil/common/src/constants/anvil-gemini-thinker.ts +21 -0
- package/vendor/@anvil/common/src/constants/anvil-model-ids.ts +11 -0
- package/vendor/@anvil/common/src/constants/anvil-models.ts +2130 -0
- package/vendor/@anvil/common/src/constants/anvil-onboarding-gate.ts +55 -0
- package/vendor/@anvil/common/src/constants/anvil-onboarding.ts +307 -0
- package/vendor/@anvil/common/src/constants/anvil-referral-tiers.ts +87 -0
- package/vendor/@anvil/common/src/constants/anvil-signup-block.ts +68 -0
- package/vendor/@anvil/common/src/constants/anvil-spend-ceilings.ts +450 -0
- package/vendor/@anvil/common/src/constants/anvil-trust.ts +976 -0
- package/vendor/@anvil/common/src/constants/auth.ts +18 -0
- package/vendor/@anvil/common/src/constants/byok.ts +2 -0
- package/vendor/@anvil/common/src/constants/cf-worker-signals.ts +132 -0
- package/vendor/@anvil/common/src/constants/composio.ts +34 -0
- package/vendor/@anvil/common/src/constants/deepseek-direct.ts +55 -0
- package/vendor/@anvil/common/src/constants/feedback.ts +13 -0
- package/vendor/@anvil/common/src/constants/foreign-client-signals.ts +272 -0
- package/vendor/@anvil/common/src/constants/free-agents.ts +777 -0
- package/vendor/@anvil/common/src/constants/gemini.ts +15 -0
- package/vendor/@anvil/common/src/constants/grant-priorities.ts +13 -0
- package/vendor/@anvil/common/src/constants/hosts.ts +6 -0
- package/vendor/@anvil/common/src/constants/images.ts +51 -0
- package/vendor/@anvil/common/src/constants/index.ts +7 -0
- package/vendor/@anvil/common/src/constants/knowledge.ts +35 -0
- package/vendor/@anvil/common/src/constants/limits.ts +23 -0
- package/vendor/@anvil/common/src/constants/model-config.ts +277 -0
- package/vendor/@anvil/common/src/constants/openrouter-attribution.ts +8 -0
- package/vendor/@anvil/common/src/constants/paths.ts +69 -0
- package/vendor/@anvil/common/src/constants/provider-routes.ts +317 -0
- package/vendor/@anvil/common/src/constants/reasoning-effort.ts +79 -0
- package/vendor/@anvil/common/src/constants/skills.ts +60 -0
- package/vendor/@anvil/common/src/constants/subscription-plans.ts +49 -0
- package/vendor/@anvil/common/src/constants/ui.ts +25 -0
- package/vendor/@anvil/common/src/env-ci.ts +36 -0
- package/vendor/@anvil/common/src/env-process.ts +95 -0
- package/vendor/@anvil/common/src/env-schema.ts +95 -0
- package/vendor/@anvil/common/src/env.ts +24 -0
- package/vendor/@anvil/common/src/gravity-capi.ts +207 -0
- package/vendor/@anvil/common/src/mcp/client.ts +233 -0
- package/vendor/@anvil/common/src/old-constants.ts +10 -0
- package/vendor/@anvil/common/src/project-file-tree.ts +355 -0
- package/vendor/@anvil/common/src/reddit-capi.ts +254 -0
- package/vendor/@anvil/common/src/schemas/feedback.ts +52 -0
- package/vendor/@anvil/common/src/schemas/logs.ts +66 -0
- package/vendor/@anvil/common/src/templates/agent-validation.ts +392 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/LICENSE +202 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/README.md +294 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +17 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +78 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +73 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/my-custom-agent.ts +40 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/package.json +6 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/skills/README.md +65 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +29 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/types/agent-definition.ts +497 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/types/tools.ts +444 -0
- package/vendor/@anvil/common/src/templates/initial-agents-dir/types/util-types.ts +178 -0
- package/vendor/@anvil/common/src/testing/TESTING_PATTERNS.md +351 -0
- package/vendor/@anvil/common/src/testing/anvil-offer-invariants.ts +169 -0
- package/vendor/@anvil/common/src/testing/errors.ts +33 -0
- package/vendor/@anvil/common/src/testing/fixtures/agent-runtime.ts +334 -0
- package/vendor/@anvil/common/src/testing/impl/agent-runtime.ts +6 -0
- package/vendor/@anvil/common/src/testing/index.ts +84 -0
- package/vendor/@anvil/common/src/testing/mock-modules.ts +53 -0
- package/vendor/@anvil/common/src/testing/mock-types.ts +123 -0
- package/vendor/@anvil/common/src/testing/mocks/analytics.ts +261 -0
- package/vendor/@anvil/common/src/testing/mocks/child-process.ts +93 -0
- package/vendor/@anvil/common/src/testing/mocks/crypto.ts +218 -0
- package/vendor/@anvil/common/src/testing/mocks/database.ts +337 -0
- package/vendor/@anvil/common/src/testing/mocks/fetch.ts +219 -0
- package/vendor/@anvil/common/src/testing/mocks/filesystem.ts +166 -0
- package/vendor/@anvil/common/src/testing/mocks/index.ts +101 -0
- package/vendor/@anvil/common/src/testing/mocks/logger.ts +135 -0
- package/vendor/@anvil/common/src/testing/mocks/stream.ts +313 -0
- package/vendor/@anvil/common/src/testing/mocks/timers.ts +132 -0
- package/vendor/@anvil/common/src/testing/mocks/tree-sitter.ts +127 -0
- package/vendor/@anvil/common/src/testing/setup.ts +282 -0
- package/vendor/@anvil/common/src/testing-env-ci.ts +15 -0
- package/vendor/@anvil/common/src/testing-env-process.ts +78 -0
- package/vendor/@anvil/common/src/tools/__tests__/compile-tool-definitions.test.ts +34 -0
- package/vendor/@anvil/common/src/tools/compile-tool-definitions.ts +157 -0
- package/vendor/@anvil/common/src/tools/constants.ts +117 -0
- package/vendor/@anvil/common/src/tools/list.ts +190 -0
- package/vendor/@anvil/common/src/tools/params/__tests__/coerce-to-array.test.ts +213 -0
- package/vendor/@anvil/common/src/tools/params/__tests__/read-docs.test.ts +47 -0
- package/vendor/@anvil/common/src/tools/params/__tests__/render-ui.test.ts +65 -0
- package/vendor/@anvil/common/src/tools/params/tool/__tests__/run-terminal-command-timeout.test.ts +49 -0
- package/vendor/@anvil/common/src/tools/params/tool/add-message.ts +39 -0
- package/vendor/@anvil/common/src/tools/params/tool/add-subgoal.ts +57 -0
- package/vendor/@anvil/common/src/tools/params/tool/apply-patch.ts +110 -0
- package/vendor/@anvil/common/src/tools/params/tool/ask-user.ts +181 -0
- package/vendor/@anvil/common/src/tools/params/tool/browser-logs.ts +85 -0
- package/vendor/@anvil/common/src/tools/params/tool/cloud-plan-ready.ts +94 -0
- package/vendor/@anvil/common/src/tools/params/tool/code-search.ts +159 -0
- package/vendor/@anvil/common/src/tools/params/tool/composio.ts +131 -0
- package/vendor/@anvil/common/src/tools/params/tool/create-plan.ts +80 -0
- package/vendor/@anvil/common/src/tools/params/tool/end-turn.ts +57 -0
- package/vendor/@anvil/common/src/tools/params/tool/find-files.ts +60 -0
- package/vendor/@anvil/common/src/tools/params/tool/glob.ts +80 -0
- package/vendor/@anvil/common/src/tools/params/tool/gravity-index.ts +93 -0
- package/vendor/@anvil/common/src/tools/params/tool/list-directory.ts +58 -0
- package/vendor/@anvil/common/src/tools/params/tool/lookup-agent-info.ts +37 -0
- package/vendor/@anvil/common/src/tools/params/tool/propose-str-replace.ts +103 -0
- package/vendor/@anvil/common/src/tools/params/tool/propose-write-file.ts +71 -0
- package/vendor/@anvil/common/src/tools/params/tool/read-docs.ts +90 -0
- package/vendor/@anvil/common/src/tools/params/tool/read-files.ts +109 -0
- package/vendor/@anvil/common/src/tools/params/tool/read-subtree.ts +79 -0
- package/vendor/@anvil/common/src/tools/params/tool/read-url.ts +81 -0
- package/vendor/@anvil/common/src/tools/params/tool/render-ui.ts +168 -0
- package/vendor/@anvil/common/src/tools/params/tool/run-file-change-hooks.ts +57 -0
- package/vendor/@anvil/common/src/tools/params/tool/run-terminal-command.ts +211 -0
- package/vendor/@anvil/common/src/tools/params/tool/screenshot.ts +97 -0
- package/vendor/@anvil/common/src/tools/params/tool/set-messages.ts +44 -0
- package/vendor/@anvil/common/src/tools/params/tool/set-output.ts +61 -0
- package/vendor/@anvil/common/src/tools/params/tool/skill.ts +59 -0
- package/vendor/@anvil/common/src/tools/params/tool/spawn-agent-inline.ts +56 -0
- package/vendor/@anvil/common/src/tools/params/tool/spawn-agents.ts +154 -0
- package/vendor/@anvil/common/src/tools/params/tool/str-replace.ts +107 -0
- package/vendor/@anvil/common/src/tools/params/tool/suggest-followups.ts +97 -0
- package/vendor/@anvil/common/src/tools/params/tool/task-completed.ts +61 -0
- package/vendor/@anvil/common/src/tools/params/tool/think-deeply.ts +56 -0
- package/vendor/@anvil/common/src/tools/params/tool/update-subgoal.ts +89 -0
- package/vendor/@anvil/common/src/tools/params/tool/vision-analyze.ts +82 -0
- package/vendor/@anvil/common/src/tools/params/tool/web-search.ts +73 -0
- package/vendor/@anvil/common/src/tools/params/tool/write-file.ts +71 -0
- package/vendor/@anvil/common/src/tools/params/tool/write-todos.ts +67 -0
- package/vendor/@anvil/common/src/tools/params/utils.ts +150 -0
- package/vendor/@anvil/common/src/tools/utils.ts +24 -0
- package/vendor/@anvil/common/src/types/__tests__/dynamic-agent-template.test.ts +20 -0
- package/vendor/@anvil/common/src/types/agent-template.ts +215 -0
- package/vendor/@anvil/common/src/types/anvil-session.ts +535 -0
- package/vendor/@anvil/common/src/types/anvil-streak.ts +6 -0
- package/vendor/@anvil/common/src/types/anvil-usage.ts +64 -0
- package/vendor/@anvil/common/src/types/api/agents/publish.ts +61 -0
- package/vendor/@anvil/common/src/types/bun-test.d.ts +5 -0
- package/vendor/@anvil/common/src/types/contracts/agent-runtime.ts +75 -0
- package/vendor/@anvil/common/src/types/contracts/analytics.ts +9 -0
- package/vendor/@anvil/common/src/types/contracts/bigquery.ts +55 -0
- package/vendor/@anvil/common/src/types/contracts/billing.ts +46 -0
- package/vendor/@anvil/common/src/types/contracts/client.ts +53 -0
- package/vendor/@anvil/common/src/types/contracts/database.ts +112 -0
- package/vendor/@anvil/common/src/types/contracts/env.ts +203 -0
- package/vendor/@anvil/common/src/types/contracts/llm.ts +191 -0
- package/vendor/@anvil/common/src/types/contracts/logger.ts +14 -0
- package/vendor/@anvil/common/src/types/contracts/logs.ts +34 -0
- package/vendor/@anvil/common/src/types/contracts/trace.ts +21 -0
- package/vendor/@anvil/common/src/types/dynamic-agent-template.ts +328 -0
- package/vendor/@anvil/common/src/types/filesystem.ts +10 -0
- package/vendor/@anvil/common/src/types/function-params.ts +33 -0
- package/vendor/@anvil/common/src/types/grant.ts +20 -0
- package/vendor/@anvil/common/src/types/gravity-index.ts +170 -0
- package/vendor/@anvil/common/src/types/json.ts +29 -0
- package/vendor/@anvil/common/src/types/mcp.ts +24 -0
- package/vendor/@anvil/common/src/types/messages/anvil-message.ts +58 -0
- package/vendor/@anvil/common/src/types/messages/content-part.ts +59 -0
- package/vendor/@anvil/common/src/types/messages/data-content.ts +14 -0
- package/vendor/@anvil/common/src/types/messages/provider-metadata.ts +13 -0
- package/vendor/@anvil/common/src/types/organization.ts +118 -0
- package/vendor/@anvil/common/src/types/print-mode.ts +121 -0
- package/vendor/@anvil/common/src/types/publisher.ts +67 -0
- package/vendor/@anvil/common/src/types/session-state.ts +149 -0
- package/vendor/@anvil/common/src/types/skill.ts +86 -0
- package/vendor/@anvil/common/src/types/source.ts +11 -0
- package/vendor/@anvil/common/src/types/spawn.ts +13 -0
- package/vendor/@anvil/common/src/types/subscription.ts +67 -0
- package/vendor/@anvil/common/src/types/usage.ts +16 -0
- package/vendor/@anvil/common/src/types/util.ts +3 -0
- package/vendor/@anvil/common/src/util/__tests__/ad-user-agent.test.ts +26 -0
- package/vendor/@anvil/common/src/util/__tests__/analytics-dispatcher.test.ts +122 -0
- package/vendor/@anvil/common/src/util/__tests__/analytics-log.test.ts +102 -0
- package/vendor/@anvil/common/src/util/__tests__/analytics-sampling.test.ts +143 -0
- package/vendor/@anvil/common/src/util/__tests__/anvil-streak.test.ts +202 -0
- package/vendor/@anvil/common/src/util/__tests__/anvil-usage-summary.test.ts +193 -0
- package/vendor/@anvil/common/src/util/__tests__/axiom-only-log.test.ts +140 -0
- package/vendor/@anvil/common/src/util/__tests__/client-user-agent.test.ts +148 -0
- package/vendor/@anvil/common/src/util/__tests__/engagement-tracker.test.ts +115 -0
- package/vendor/@anvil/common/src/util/__tests__/env-file-path.test.ts +57 -0
- package/vendor/@anvil/common/src/util/__tests__/error-abort.test.ts +774 -0
- package/vendor/@anvil/common/src/util/__tests__/error-api-details.test.ts +206 -0
- package/vendor/@anvil/common/src/util/__tests__/file-read-limits.test.ts +173 -0
- package/vendor/@anvil/common/src/util/__tests__/format-code-search.test.ts +60 -0
- package/vendor/@anvil/common/src/util/__tests__/log-mirror.test.ts +31 -0
- package/vendor/@anvil/common/src/util/__tests__/messages.test.ts +1252 -0
- package/vendor/@anvil/common/src/util/__tests__/partial-json-delta.test.ts +505 -0
- package/vendor/@anvil/common/src/util/__tests__/path.test.ts +22 -0
- package/vendor/@anvil/common/src/util/__tests__/project-ignore.test.ts +90 -0
- package/vendor/@anvil/common/src/util/__tests__/promise.test.ts +325 -0
- package/vendor/@anvil/common/src/util/__tests__/rate-limit.test.ts +28 -0
- package/vendor/@anvil/common/src/util/__tests__/reddit-anvil-retention.test.ts +130 -0
- package/vendor/@anvil/common/src/util/__tests__/saxy.test.ts +1008 -0
- package/vendor/@anvil/common/src/util/__tests__/split-data.test.ts +289 -0
- package/vendor/@anvil/common/src/util/__tests__/string.test.ts +239 -0
- package/vendor/@anvil/common/src/util/__tests__/thread-title.test.ts +70 -0
- package/vendor/@anvil/common/src/util/__tests__/tool-result-media-order.test.ts +108 -0
- package/vendor/@anvil/common/src/util/__tests__/ttft-histogram.test.ts +180 -0
- package/vendor/@anvil/common/src/util/__tests__/with-timeout.test.ts +24 -0
- package/vendor/@anvil/common/src/util/__tests__/zoned-time.test.ts +88 -0
- package/vendor/@anvil/common/src/util/ad-user-agent.ts +25 -0
- package/vendor/@anvil/common/src/util/agent-file-utils.ts +110 -0
- package/vendor/@anvil/common/src/util/agent-id-parsing.ts +136 -0
- package/vendor/@anvil/common/src/util/agent-name-normalization.ts +38 -0
- package/vendor/@anvil/common/src/util/agent-name-resolver.ts +86 -0
- package/vendor/@anvil/common/src/util/analytics-dispatcher.ts +82 -0
- package/vendor/@anvil/common/src/util/analytics-log.ts +78 -0
- package/vendor/@anvil/common/src/util/analytics-sampling.ts +255 -0
- package/vendor/@anvil/common/src/util/anvil-model-availability.ts +102 -0
- package/vendor/@anvil/common/src/util/anvil-privacy.ts +82 -0
- package/vendor/@anvil/common/src/util/anvil-streak-line.ts +103 -0
- package/vendor/@anvil/common/src/util/anvil-streak.ts +156 -0
- package/vendor/@anvil/common/src/util/anvil-usage-summary.ts +125 -0
- package/vendor/@anvil/common/src/util/array.ts +31 -0
- package/vendor/@anvil/common/src/util/axiom-only-log.ts +124 -0
- package/vendor/@anvil/common/src/util/cache-debug.ts +171 -0
- package/vendor/@anvil/common/src/util/client-user-agent.ts +114 -0
- package/vendor/@anvil/common/src/util/credentials.ts +26 -0
- package/vendor/@anvil/common/src/util/currency.ts +25 -0
- package/vendor/@anvil/common/src/util/dates.ts +81 -0
- package/vendor/@anvil/common/src/util/disposable-email.ts +277 -0
- package/vendor/@anvil/common/src/util/engagement-tracker.ts +129 -0
- package/vendor/@anvil/common/src/util/env-file-path.ts +40 -0
- package/vendor/@anvil/common/src/util/error.ts +562 -0
- package/vendor/@anvil/common/src/util/file-read-limits.ts +236 -0
- package/vendor/@anvil/common/src/util/file.ts +339 -0
- package/vendor/@anvil/common/src/util/format-code-search.ts +115 -0
- package/vendor/@anvil/common/src/util/lazy-response-ads.ts +92 -0
- package/vendor/@anvil/common/src/util/log-data.ts +57 -0
- package/vendor/@anvil/common/src/util/log-ingest.ts +58 -0
- package/vendor/@anvil/common/src/util/log-mirror.ts +34 -0
- package/vendor/@anvil/common/src/util/lru-cache.ts +67 -0
- package/vendor/@anvil/common/src/util/messages.ts +685 -0
- package/vendor/@anvil/common/src/util/min-heap.ts +87 -0
- package/vendor/@anvil/common/src/util/model-utils.ts +4 -0
- package/vendor/@anvil/common/src/util/object.ts +128 -0
- package/vendor/@anvil/common/src/util/partial-json-delta.ts +89 -0
- package/vendor/@anvil/common/src/util/path.ts +15 -0
- package/vendor/@anvil/common/src/util/project-ignore.ts +119 -0
- package/vendor/@anvil/common/src/util/promise.ts +73 -0
- package/vendor/@anvil/common/src/util/random.ts +15 -0
- package/vendor/@anvil/common/src/util/rate-limit.ts +56 -0
- package/vendor/@anvil/common/src/util/reddit-anvil-retention.ts +60 -0
- package/vendor/@anvil/common/src/util/reddit-capi-events.ts +36 -0
- package/vendor/@anvil/common/src/util/response-ad-positions.ts +54 -0
- package/vendor/@anvil/common/src/util/saxy.ts +741 -0
- package/vendor/@anvil/common/src/util/skills.test.ts +44 -0
- package/vendor/@anvil/common/src/util/skills.ts +36 -0
- package/vendor/@anvil/common/src/util/split-data.ts +259 -0
- package/vendor/@anvil/common/src/util/stop-sequence.ts +61 -0
- package/vendor/@anvil/common/src/util/string.ts +426 -0
- package/vendor/@anvil/common/src/util/system-info.ts +53 -0
- package/vendor/@anvil/common/src/util/thread-title.ts +46 -0
- package/vendor/@anvil/common/src/util/ttft-histogram.ts +73 -0
- package/vendor/@anvil/common/src/util/xml-parser.ts +27 -0
- package/vendor/@anvil/common/src/util/xml.ts +17 -0
- package/vendor/@anvil/common/src/util/zod-schema.ts +25 -0
- package/vendor/@anvil/common/src/util/zoned-time.ts +136 -0
- package/vendor/@anvil/common/src/utils/ask-user-bridge.ts +44 -0
- package/vendor/@anvil/sdk/dist/index.cjs +52297 -0
- package/vendor/@anvil/sdk/dist/index.cjs.map +440 -0
- package/vendor/@anvil/sdk/dist/index.d.ts +4277 -0
- package/vendor/@anvil/sdk/dist/index.mjs +52290 -0
- package/vendor/@anvil/sdk/dist/index.mjs.map +440 -0
- package/vendor/@anvil/sdk/dist/vendor/ai.cjs +30886 -0
- package/vendor/@anvil/sdk/dist/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/vendor/@anvil/sdk/dist/vendor/ripgrep/arm64-linux/rg +0 -0
- package/vendor/@anvil/sdk/dist/vendor/ripgrep/x64-darwin/rg +0 -0
- package/vendor/@anvil/sdk/dist/vendor/ripgrep/x64-linux/rg +0 -0
- package/vendor/@anvil/sdk/dist/vendor/ripgrep/x64-win32/rg.exe +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-c-sharp.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-cpp.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-go.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-java.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-javascript.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-python.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-ruby.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-rust.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-tsx.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter-typescript.wasm +0 -0
- package/vendor/@anvil/sdk/dist/wasm/tree-sitter.wasm +0 -0
- package/vendor/@anvil/sdk/package.json +21 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock utilities index.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all mock factories for convenient importing.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
createMockLogger,
|
|
9
|
+
createMockLoggerWithCapture,
|
|
10
|
+
restoreMockLogger,
|
|
11
|
+
clearMockLogger,
|
|
12
|
+
} from './logger'
|
|
13
|
+
export type {
|
|
14
|
+
LogLevel,
|
|
15
|
+
LogMethod,
|
|
16
|
+
MockLogMethod,
|
|
17
|
+
MockLogger,
|
|
18
|
+
CreateMockLoggerOptions,
|
|
19
|
+
CapturedLogEntry,
|
|
20
|
+
MockLoggerWithCapture,
|
|
21
|
+
} from './logger'
|
|
22
|
+
|
|
23
|
+
export {
|
|
24
|
+
createMockAnalytics,
|
|
25
|
+
createMockAnalyticsWithCapture,
|
|
26
|
+
setupAnalyticsMocks,
|
|
27
|
+
restoreMockAnalytics,
|
|
28
|
+
} from './analytics'
|
|
29
|
+
export type {
|
|
30
|
+
MockAnalytics,
|
|
31
|
+
MockAnalyticsWithCapture,
|
|
32
|
+
AnalyticsSpies,
|
|
33
|
+
CreateMockAnalyticsOptions,
|
|
34
|
+
TrackedEvent,
|
|
35
|
+
EventProperties,
|
|
36
|
+
} from './analytics'
|
|
37
|
+
|
|
38
|
+
export { createMockDbOperations, setupDbSpies } from './database'
|
|
39
|
+
export type { MockDbOperations, DbSpies, CreateMockDbOptions } from './database'
|
|
40
|
+
|
|
41
|
+
export { setupCryptoMocks, createMockUuid, TEST_UUIDS } from './crypto'
|
|
42
|
+
export type { CryptoMockSpies, UUID, SetupCryptoMocksOptions } from './crypto'
|
|
43
|
+
export { createUuidGenerator, setupSequentialCryptoMocks } from './crypto'
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
createToolCallChunk,
|
|
47
|
+
createMockStream,
|
|
48
|
+
createMockTextStream,
|
|
49
|
+
} from './stream'
|
|
50
|
+
|
|
51
|
+
export { createMockTimers, installMockTimers } from './timers'
|
|
52
|
+
export type { PendingTimer, MockTimers } from './timers'
|
|
53
|
+
|
|
54
|
+
export { createMockFs, restoreMockFs, clearMockFs } from './filesystem'
|
|
55
|
+
export type { MockFs, MockFsWithMocks, CreateMockFsOptions } from './filesystem'
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
createMockFetch,
|
|
59
|
+
installMockFetch,
|
|
60
|
+
mockJsonResponse,
|
|
61
|
+
mockTextResponse,
|
|
62
|
+
mockErrorResponse,
|
|
63
|
+
} from './fetch'
|
|
64
|
+
export type {
|
|
65
|
+
MockFetch,
|
|
66
|
+
MockFetchCall,
|
|
67
|
+
MockResponseOptions,
|
|
68
|
+
CreateMockFetchOptions,
|
|
69
|
+
InstallMockFetchResult,
|
|
70
|
+
} from './fetch'
|
|
71
|
+
|
|
72
|
+
export {
|
|
73
|
+
createMockCapture,
|
|
74
|
+
createMockTreeSitterCaptures,
|
|
75
|
+
createMockTree,
|
|
76
|
+
createMockTreeSitterParser,
|
|
77
|
+
createMockTreeSitterQuery,
|
|
78
|
+
createMockLanguageConfig,
|
|
79
|
+
} from './tree-sitter'
|
|
80
|
+
export type {
|
|
81
|
+
MockTreeNode,
|
|
82
|
+
MockTree,
|
|
83
|
+
MockCapture,
|
|
84
|
+
MockParser,
|
|
85
|
+
MockQuery,
|
|
86
|
+
CreateMockParserOptions,
|
|
87
|
+
CreateMockQueryOptions,
|
|
88
|
+
CreateMockLanguageConfigOptions,
|
|
89
|
+
} from './tree-sitter'
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
createMockChildProcess,
|
|
93
|
+
createMockSpawn,
|
|
94
|
+
asCodeSearchResult,
|
|
95
|
+
createRgJsonMatch,
|
|
96
|
+
createRgJsonContext,
|
|
97
|
+
} from './child-process'
|
|
98
|
+
export type {
|
|
99
|
+
MockChildProcess,
|
|
100
|
+
CodeSearchResult,
|
|
101
|
+
} from './child-process'
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { mock } from 'bun:test'
|
|
2
|
+
|
|
3
|
+
import type { Mock } from 'bun:test'
|
|
4
|
+
|
|
5
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'
|
|
6
|
+
|
|
7
|
+
export type LogMethod = (
|
|
8
|
+
data: unknown,
|
|
9
|
+
msg?: string,
|
|
10
|
+
...args: unknown[]
|
|
11
|
+
) => unknown
|
|
12
|
+
|
|
13
|
+
export type MockLogMethod = Mock<LogMethod>
|
|
14
|
+
|
|
15
|
+
export interface MockLogger {
|
|
16
|
+
trace: MockLogMethod
|
|
17
|
+
debug: MockLogMethod
|
|
18
|
+
info: MockLogMethod
|
|
19
|
+
warn: MockLogMethod
|
|
20
|
+
error: MockLogMethod
|
|
21
|
+
fatal: MockLogMethod
|
|
22
|
+
child: Mock<(bindings: Record<string, unknown>) => MockLogger>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface CreateMockLoggerOptions {
|
|
26
|
+
captureOutput?: boolean
|
|
27
|
+
customImplementations?: Partial<Record<LogLevel, LogMethod>>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface CapturedLogEntry {
|
|
31
|
+
level: LogLevel
|
|
32
|
+
message: string
|
|
33
|
+
meta?: Record<string, unknown>
|
|
34
|
+
timestamp: Date
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function createMockLogger(
|
|
38
|
+
options: CreateMockLoggerOptions = {},
|
|
39
|
+
): MockLogger {
|
|
40
|
+
const { customImplementations = {} } = options
|
|
41
|
+
|
|
42
|
+
const createLogMethod = (level: LogLevel): MockLogMethod => {
|
|
43
|
+
const customImpl = customImplementations[level]
|
|
44
|
+
if (customImpl) {
|
|
45
|
+
return mock(customImpl)
|
|
46
|
+
}
|
|
47
|
+
return mock(() => {})
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const mockLogger: MockLogger = {
|
|
51
|
+
trace: createLogMethod('trace'),
|
|
52
|
+
debug: createLogMethod('debug'),
|
|
53
|
+
info: createLogMethod('info'),
|
|
54
|
+
warn: createLogMethod('warn'),
|
|
55
|
+
error: createLogMethod('error'),
|
|
56
|
+
fatal: createLogMethod('fatal'),
|
|
57
|
+
child: mock(() => createMockLogger(options)),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return mockLogger
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface MockLoggerWithCapture {
|
|
64
|
+
logger: MockLogger
|
|
65
|
+
captured: CapturedLogEntry[]
|
|
66
|
+
clearCaptured: () => void
|
|
67
|
+
getByLevel: (level: LogLevel) => CapturedLogEntry[]
|
|
68
|
+
getByMessage: (pattern: string | RegExp) => CapturedLogEntry[]
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Creates a mock logger that captures all output for inspection. */
|
|
72
|
+
export function createMockLoggerWithCapture(): MockLoggerWithCapture {
|
|
73
|
+
const captured: CapturedLogEntry[] = []
|
|
74
|
+
|
|
75
|
+
const createCapturingLogMethod = (level: LogLevel): MockLogMethod => {
|
|
76
|
+
return mock((data: unknown, msg?: string) => {
|
|
77
|
+
const message = typeof data === 'string' ? data : (msg ?? String(data))
|
|
78
|
+
const meta =
|
|
79
|
+
typeof data === 'object' && data !== null
|
|
80
|
+
? (data as Record<string, unknown>)
|
|
81
|
+
: undefined
|
|
82
|
+
captured.push({
|
|
83
|
+
level,
|
|
84
|
+
message,
|
|
85
|
+
meta,
|
|
86
|
+
timestamp: new Date(),
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const logger: MockLogger = {
|
|
92
|
+
trace: createCapturingLogMethod('trace'),
|
|
93
|
+
debug: createCapturingLogMethod('debug'),
|
|
94
|
+
info: createCapturingLogMethod('info'),
|
|
95
|
+
warn: createCapturingLogMethod('warn'),
|
|
96
|
+
error: createCapturingLogMethod('error'),
|
|
97
|
+
fatal: createCapturingLogMethod('fatal'),
|
|
98
|
+
child: mock(() => createMockLoggerWithCapture().logger),
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
logger,
|
|
103
|
+
captured,
|
|
104
|
+
clearCaptured: () => {
|
|
105
|
+
captured.length = 0
|
|
106
|
+
},
|
|
107
|
+
getByLevel: (level: LogLevel) => captured.filter((e) => e.level === level),
|
|
108
|
+
getByMessage: (pattern: string | RegExp) =>
|
|
109
|
+
captured.filter((e) =>
|
|
110
|
+
typeof pattern === 'string'
|
|
111
|
+
? e.message.includes(pattern)
|
|
112
|
+
: pattern.test(e.message),
|
|
113
|
+
),
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function restoreMockLogger(logger: MockLogger): void {
|
|
118
|
+
logger.trace.mockRestore()
|
|
119
|
+
logger.debug.mockRestore()
|
|
120
|
+
logger.info.mockRestore()
|
|
121
|
+
logger.warn.mockRestore()
|
|
122
|
+
logger.error.mockRestore()
|
|
123
|
+
logger.fatal.mockRestore()
|
|
124
|
+
logger.child.mockRestore()
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function clearMockLogger(logger: MockLogger): void {
|
|
128
|
+
logger.trace.mockClear()
|
|
129
|
+
logger.debug.mockClear()
|
|
130
|
+
logger.info.mockClear()
|
|
131
|
+
logger.warn.mockClear()
|
|
132
|
+
logger.error.mockClear()
|
|
133
|
+
logger.fatal.mockClear()
|
|
134
|
+
logger.child.mockClear()
|
|
135
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed stream mock factory for testing LLM streaming.
|
|
3
|
+
*
|
|
4
|
+
* Provides type-safe utilities for creating mock LLM streams
|
|
5
|
+
* and testing streaming behavior.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockStream, createToolCallChunk } from '@anvil/common/testing/mocks/stream'
|
|
10
|
+
*
|
|
11
|
+
* // Create a mock stream with text and tool calls
|
|
12
|
+
* const stream = createMockStream([
|
|
13
|
+
* { type: 'text', text: 'Hello ' },
|
|
14
|
+
* { type: 'text', text: 'world!' },
|
|
15
|
+
* createToolCallChunk('end_turn', {}),
|
|
16
|
+
* ])
|
|
17
|
+
*
|
|
18
|
+
* // Use in tests
|
|
19
|
+
* for await (const chunk of stream) {
|
|
20
|
+
* console.log(chunk)
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { mock } from 'bun:test'
|
|
26
|
+
|
|
27
|
+
import type { Mock } from 'bun:test'
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A text chunk from an LLM stream.
|
|
31
|
+
*/
|
|
32
|
+
export interface TextChunk {
|
|
33
|
+
type: 'text'
|
|
34
|
+
text: string
|
|
35
|
+
agentId?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A tool call chunk from an LLM stream.
|
|
40
|
+
*/
|
|
41
|
+
export interface ToolCallChunk {
|
|
42
|
+
type: 'tool-call'
|
|
43
|
+
toolName: string
|
|
44
|
+
toolCallId: string
|
|
45
|
+
input: Record<string, unknown>
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* A reasoning chunk from an LLM stream.
|
|
50
|
+
*/
|
|
51
|
+
export interface ReasoningChunk {
|
|
52
|
+
type: 'reasoning'
|
|
53
|
+
text: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Union of all stream chunk types.
|
|
58
|
+
*/
|
|
59
|
+
export type StreamChunk = TextChunk | ToolCallChunk | ReasoningChunk
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Options for creating a tool call chunk.
|
|
63
|
+
*/
|
|
64
|
+
export interface CreateToolCallOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Custom tool call ID. If not provided, a random one is generated.
|
|
67
|
+
*/
|
|
68
|
+
toolCallId?: string
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let toolCallIdCounter = 0
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Creates a tool call chunk for testing.
|
|
75
|
+
*
|
|
76
|
+
* @param toolName - The name of the tool being called
|
|
77
|
+
* @param input - The input parameters for the tool
|
|
78
|
+
* @param options - Additional options
|
|
79
|
+
* @returns A properly typed tool call chunk
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const chunk = createToolCallChunk('read_files', { paths: ['file.ts'] })
|
|
84
|
+
* // { type: 'tool-call', toolName: 'read_files', toolCallId: 'tool-call-1', input: { paths: ['file.ts'] } }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export function createToolCallChunk(
|
|
88
|
+
toolName: string,
|
|
89
|
+
input: Record<string, unknown>,
|
|
90
|
+
options: CreateToolCallOptions = {},
|
|
91
|
+
): ToolCallChunk {
|
|
92
|
+
const { toolCallId = `tool-call-${++toolCallIdCounter}` } = options
|
|
93
|
+
return {
|
|
94
|
+
type: 'tool-call',
|
|
95
|
+
toolName,
|
|
96
|
+
toolCallId,
|
|
97
|
+
input,
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Creates a text chunk for testing.
|
|
103
|
+
*
|
|
104
|
+
* @param text - The text content
|
|
105
|
+
* @param agentId - Optional agent ID for subagent chunks
|
|
106
|
+
* @returns A text chunk
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const chunk = createTextChunk('Hello world!')
|
|
111
|
+
* // { type: 'text', text: 'Hello world!' }
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export function createTextChunk(text: string, agentId?: string): TextChunk {
|
|
115
|
+
const chunk: TextChunk = { type: 'text', text }
|
|
116
|
+
if (agentId) {
|
|
117
|
+
chunk.agentId = agentId
|
|
118
|
+
}
|
|
119
|
+
return chunk
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Creates a reasoning chunk for testing.
|
|
124
|
+
*
|
|
125
|
+
* @param text - The reasoning text
|
|
126
|
+
* @returns A reasoning chunk
|
|
127
|
+
*/
|
|
128
|
+
export function createReasoningChunk(text: string): ReasoningChunk {
|
|
129
|
+
return { type: 'reasoning', text }
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Creates a mock async generator that yields the provided chunks.
|
|
134
|
+
*
|
|
135
|
+
* @param chunks - The chunks to yield
|
|
136
|
+
* @param returnValue - The value to return when the generator completes
|
|
137
|
+
* @returns An async generator that yields the chunks
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* const stream = createMockStream([
|
|
142
|
+
* createTextChunk('Processing...'),
|
|
143
|
+
* createToolCallChunk('read_files', { paths: ['test.ts'] }),
|
|
144
|
+
* createTextChunk('Done!'),
|
|
145
|
+
* createToolCallChunk('end_turn', {}),
|
|
146
|
+
* ])
|
|
147
|
+
*
|
|
148
|
+
* // Consume the stream
|
|
149
|
+
* const chunks = []
|
|
150
|
+
* for await (const chunk of stream) {
|
|
151
|
+
* chunks.push(chunk)
|
|
152
|
+
* }
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export function createMockStream(
|
|
156
|
+
chunks: StreamChunk[],
|
|
157
|
+
returnValue: string | null = 'mock-message-id',
|
|
158
|
+
): AsyncGenerator<StreamChunk, string | null, undefined> {
|
|
159
|
+
async function* generator(): AsyncGenerator<
|
|
160
|
+
StreamChunk,
|
|
161
|
+
string | null,
|
|
162
|
+
undefined
|
|
163
|
+
> {
|
|
164
|
+
for (const chunk of chunks) {
|
|
165
|
+
yield chunk
|
|
166
|
+
}
|
|
167
|
+
return returnValue
|
|
168
|
+
}
|
|
169
|
+
return generator()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Creates a mock stream that yields text in multiple chunks.
|
|
174
|
+
* Useful for testing streaming text display.
|
|
175
|
+
*
|
|
176
|
+
* @param text - The complete text to stream
|
|
177
|
+
* @param chunkSize - Size of each chunk
|
|
178
|
+
* @param endWithTool - Whether to end with an end_turn tool call
|
|
179
|
+
* @returns A mock stream
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const stream = createMockTextStream('Hello world!', 3)
|
|
184
|
+
* // Yields: 'Hel', 'lo ', 'wor', 'ld!'
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
export function createMockTextStream(
|
|
188
|
+
text: string,
|
|
189
|
+
chunkSize: number = 10,
|
|
190
|
+
endWithTool: boolean = true,
|
|
191
|
+
): AsyncGenerator<StreamChunk, string | null, undefined> {
|
|
192
|
+
const chunks: StreamChunk[] = []
|
|
193
|
+
|
|
194
|
+
for (let i = 0; i < text.length; i += chunkSize) {
|
|
195
|
+
chunks.push(createTextChunk(text.slice(i, i + chunkSize)))
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (endWithTool) {
|
|
199
|
+
chunks.push(createToolCallChunk('end_turn', {}))
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return createMockStream(chunks)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Options for creating a mock prompt function.
|
|
207
|
+
*/
|
|
208
|
+
export interface MockPromptOptions {
|
|
209
|
+
/**
|
|
210
|
+
* Default response text.
|
|
211
|
+
*/
|
|
212
|
+
defaultResponse?: string
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Whether to include an end_turn tool call.
|
|
216
|
+
*/
|
|
217
|
+
includeEndTurn?: boolean
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Custom chunks to yield.
|
|
221
|
+
*/
|
|
222
|
+
chunks?: StreamChunk[]
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Mock prompt function result type.
|
|
227
|
+
*/
|
|
228
|
+
export type MockPromptFn = Mock<
|
|
229
|
+
(
|
|
230
|
+
params: Record<string, unknown>,
|
|
231
|
+
) => AsyncGenerator<StreamChunk, string | null>
|
|
232
|
+
>
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Creates a mock promptAiSdkStream function for testing.
|
|
236
|
+
*
|
|
237
|
+
* @param options - Configuration options
|
|
238
|
+
* @returns A mock function that returns streams
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* const mockPrompt = createMockPromptAiSdkStream({
|
|
243
|
+
* defaultResponse: 'I understand your request.',
|
|
244
|
+
* })
|
|
245
|
+
*
|
|
246
|
+
* loopAgentStepsBaseParams.promptAiSdkStream = mockPrompt
|
|
247
|
+
*
|
|
248
|
+
* await loopAgentSteps({ ...params })
|
|
249
|
+
*
|
|
250
|
+
* expect(mockPrompt).toHaveBeenCalledTimes(1)
|
|
251
|
+
* ```
|
|
252
|
+
*/
|
|
253
|
+
export function createMockPromptAiSdkStream(
|
|
254
|
+
options: MockPromptOptions = {},
|
|
255
|
+
): MockPromptFn {
|
|
256
|
+
const {
|
|
257
|
+
defaultResponse = 'Mock response\n\n',
|
|
258
|
+
includeEndTurn = true,
|
|
259
|
+
chunks,
|
|
260
|
+
} = options
|
|
261
|
+
|
|
262
|
+
return mock(async function* () {
|
|
263
|
+
if (chunks) {
|
|
264
|
+
for (const chunk of chunks) {
|
|
265
|
+
yield chunk
|
|
266
|
+
}
|
|
267
|
+
} else {
|
|
268
|
+
yield createTextChunk(defaultResponse)
|
|
269
|
+
if (includeEndTurn) {
|
|
270
|
+
yield createToolCallChunk('end_turn', {})
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return 'mock-message-id'
|
|
274
|
+
})
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Collects all chunks from a stream into an array.
|
|
279
|
+
* Useful for testing stream content.
|
|
280
|
+
*
|
|
281
|
+
* @param stream - The stream to collect from
|
|
282
|
+
* @returns An array of all chunks and the return value
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* const stream = createMockStream([...])
|
|
287
|
+
* const { chunks, returnValue } = await collectStreamChunks(stream)
|
|
288
|
+
*
|
|
289
|
+
* expect(chunks).toHaveLength(3)
|
|
290
|
+
* expect(returnValue).toBe('mock-message-id')
|
|
291
|
+
* ```
|
|
292
|
+
*/
|
|
293
|
+
export async function collectStreamChunks<T, R>(
|
|
294
|
+
stream: AsyncGenerator<T, R, undefined>,
|
|
295
|
+
): Promise<{ chunks: T[]; returnValue: R }> {
|
|
296
|
+
const chunks: T[] = []
|
|
297
|
+
|
|
298
|
+
let result = await stream.next()
|
|
299
|
+
while (!result.done) {
|
|
300
|
+
chunks.push(result.value)
|
|
301
|
+
result = await stream.next()
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return { chunks, returnValue: result.value }
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Resets the tool call ID counter.
|
|
309
|
+
* Call this in beforeEach to ensure deterministic IDs.
|
|
310
|
+
*/
|
|
311
|
+
export function resetToolCallIdCounter(): void {
|
|
312
|
+
toolCallIdCounter = 0
|
|
313
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Use Bun's built-in mock.setSystemTime() instead.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface PendingTimer {
|
|
6
|
+
id: number
|
|
7
|
+
ms: number
|
|
8
|
+
fn: () => void
|
|
9
|
+
active: boolean
|
|
10
|
+
createdAt: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface MockTimers {
|
|
14
|
+
setTimeout: typeof globalThis.setTimeout
|
|
15
|
+
clearTimeout: typeof globalThis.clearTimeout
|
|
16
|
+
install: () => void
|
|
17
|
+
restore: () => void
|
|
18
|
+
runAll: () => void
|
|
19
|
+
advanceBy: (ms: number) => void
|
|
20
|
+
getPending: () => PendingTimer[]
|
|
21
|
+
getPendingCount: () => number
|
|
22
|
+
clearAll: () => void
|
|
23
|
+
isPending: (id: number) => boolean
|
|
24
|
+
getNext: () => PendingTimer | undefined
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** @deprecated Use Bun's built-in mock.setSystemTime() instead. */
|
|
28
|
+
export function createMockTimers(): MockTimers {
|
|
29
|
+
const pendingTimers: PendingTimer[] = []
|
|
30
|
+
let nextId = 1
|
|
31
|
+
let currentTime = 0
|
|
32
|
+
|
|
33
|
+
const originalSetTimeout = globalThis.setTimeout
|
|
34
|
+
const originalClearTimeout = globalThis.clearTimeout
|
|
35
|
+
|
|
36
|
+
const mockSetTimeout = ((fn: () => void, ms?: number): number => {
|
|
37
|
+
const id = nextId++
|
|
38
|
+
pendingTimers.push({
|
|
39
|
+
id,
|
|
40
|
+
ms: Number(ms ?? 0),
|
|
41
|
+
fn,
|
|
42
|
+
active: true,
|
|
43
|
+
createdAt: currentTime,
|
|
44
|
+
})
|
|
45
|
+
return id
|
|
46
|
+
}) as typeof globalThis.setTimeout
|
|
47
|
+
|
|
48
|
+
const mockClearTimeout = ((id?: number): void => {
|
|
49
|
+
if (id === undefined) return
|
|
50
|
+
const timer = pendingTimers.find((t) => t.id === id)
|
|
51
|
+
if (timer) {
|
|
52
|
+
timer.active = false
|
|
53
|
+
}
|
|
54
|
+
}) as typeof globalThis.clearTimeout
|
|
55
|
+
|
|
56
|
+
const getActivePending = (): PendingTimer[] => {
|
|
57
|
+
return pendingTimers.filter((t) => t.active)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
setTimeout: mockSetTimeout,
|
|
62
|
+
clearTimeout: mockClearTimeout,
|
|
63
|
+
|
|
64
|
+
install(): void {
|
|
65
|
+
globalThis.setTimeout = mockSetTimeout
|
|
66
|
+
globalThis.clearTimeout = mockClearTimeout
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
restore(): void {
|
|
70
|
+
globalThis.setTimeout = originalSetTimeout
|
|
71
|
+
globalThis.clearTimeout = originalClearTimeout
|
|
72
|
+
pendingTimers.length = 0
|
|
73
|
+
nextId = 1
|
|
74
|
+
currentTime = 0
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
runAll(): void {
|
|
78
|
+
const active = getActivePending()
|
|
79
|
+
for (const timer of active) {
|
|
80
|
+
if (timer.active) {
|
|
81
|
+
timer.active = false
|
|
82
|
+
timer.fn()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
advanceBy(ms: number): void {
|
|
88
|
+
currentTime += ms
|
|
89
|
+
const active = getActivePending()
|
|
90
|
+
.filter((t) => t.createdAt + t.ms <= currentTime)
|
|
91
|
+
.sort((a, b) => a.createdAt + a.ms - (b.createdAt + b.ms))
|
|
92
|
+
|
|
93
|
+
for (const timer of active) {
|
|
94
|
+
if (timer.active) {
|
|
95
|
+
timer.active = false
|
|
96
|
+
timer.fn()
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
getPending(): PendingTimer[] {
|
|
102
|
+
return getActivePending()
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
getPendingCount(): number {
|
|
106
|
+
return getActivePending().length
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
clearAll(): void {
|
|
110
|
+
for (const timer of pendingTimers) {
|
|
111
|
+
timer.active = false
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
isPending(id: number): boolean {
|
|
116
|
+
return pendingTimers.some((t) => t.id === id && t.active)
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
getNext(): PendingTimer | undefined {
|
|
120
|
+
return getActivePending().sort(
|
|
121
|
+
(a, b) => a.createdAt + a.ms - (b.createdAt + b.ms),
|
|
122
|
+
)[0]
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** @deprecated Use Bun's built-in mock.setSystemTime() instead. */
|
|
128
|
+
export function installMockTimers(): MockTimers {
|
|
129
|
+
const timers = createMockTimers()
|
|
130
|
+
timers.install()
|
|
131
|
+
return timers
|
|
132
|
+
}
|