@alumbwe/anvil 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/package.json +6 -2
  2. package/src/agents/bundled-agents.generated.ts +4 -4
  3. package/src/chat.tsx +1703 -1698
  4. package/src/cli-args.ts +134 -134
  5. package/src/components/status-bar.tsx +331 -313
  6. package/src/hooks/helpers/send-message.ts +663 -654
  7. package/src/hooks/use-send-message.ts +806 -773
  8. package/src/index.tsx +473 -473
  9. package/src/state/chat-store.ts +553 -544
  10. package/src/utils/create-run-config.ts +121 -121
  11. package/src/utils/format-compact-number.ts +37 -0
  12. package/vendor/@anvil/common/package.json +27 -0
  13. package/vendor/@anvil/common/src/__tests__/agent-validation.test.ts +846 -0
  14. package/vendor/@anvil/common/src/__tests__/anvil-model-availability.test.ts +101 -0
  15. package/vendor/@anvil/common/src/__tests__/anvil-models.test.ts +1408 -0
  16. package/vendor/@anvil/common/src/__tests__/anvil-public-data-use-copy.test.ts +258 -0
  17. package/vendor/@anvil/common/src/__tests__/anvil-referral-tiers.test.ts +48 -0
  18. package/vendor/@anvil/common/src/__tests__/anvil-spend-ceilings.test.ts +282 -0
  19. package/vendor/@anvil/common/src/__tests__/anvil-trust.test.ts +526 -0
  20. package/vendor/@anvil/common/src/__tests__/deepseek-direct.test.ts +68 -0
  21. package/vendor/@anvil/common/src/__tests__/disposable-email.test.ts +132 -0
  22. package/vendor/@anvil/common/src/__tests__/dynamic-agent-template-schema.test.ts +422 -0
  23. package/vendor/@anvil/common/src/__tests__/env-ci.test.ts +167 -0
  24. package/vendor/@anvil/common/src/__tests__/env-process.test.ts +145 -0
  25. package/vendor/@anvil/common/src/__tests__/foreign-client-shipped-agents.test.ts +234 -0
  26. package/vendor/@anvil/common/src/__tests__/foreign-client-signals.test.ts +379 -0
  27. package/vendor/@anvil/common/src/__tests__/free-agents.test.ts +807 -0
  28. package/vendor/@anvil/common/src/__tests__/gravity-capi.test.ts +154 -0
  29. package/vendor/@anvil/common/src/__tests__/handlesteps-parsing.test.ts +246 -0
  30. package/vendor/@anvil/common/src/__tests__/kimi-k3-god-only.test.ts +77 -0
  31. package/vendor/@anvil/common/src/__tests__/model-config.test.ts +89 -0
  32. package/vendor/@anvil/common/src/__tests__/project-file-tree.test.ts +298 -0
  33. package/vendor/@anvil/common/src/__tests__/provisioned-model-tiers.test.ts +116 -0
  34. package/vendor/@anvil/common/src/__tests__/reasoning-effort.test.ts +167 -0
  35. package/vendor/@anvil/common/src/__tests__/reddit-capi.test.ts +132 -0
  36. package/vendor/@anvil/common/src/__tests__/response-ad-positions.test.ts +72 -0
  37. package/vendor/@anvil/common/src/__tests__/user-state.test.ts +30 -0
  38. package/vendor/@anvil/common/src/actions.ts +215 -0
  39. package/vendor/@anvil/common/src/analytics-core.ts +69 -0
  40. package/vendor/@anvil/common/src/analytics.ts +93 -0
  41. package/vendor/@anvil/common/src/api-keys/constants.ts +26 -0
  42. package/vendor/@anvil/common/src/browser-actions.ts +413 -0
  43. package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding-gate.test.ts +63 -0
  44. package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding.test.ts +246 -0
  45. package/vendor/@anvil/common/src/constants/__tests__/cf-worker-signals.test.ts +106 -0
  46. package/vendor/@anvil/common/src/constants/agents.ts +99 -0
  47. package/vendor/@anvil/common/src/constants/analytics-events.ts +435 -0
  48. package/vendor/@anvil/common/src/constants/anthropic.ts +73 -0
  49. package/vendor/@anvil/common/src/constants/anvil-data-use.ts +81 -0
  50. package/vendor/@anvil/common/src/constants/anvil-errors.ts +7 -0
  51. package/vendor/@anvil/common/src/constants/anvil-gemini-thinker.ts +21 -0
  52. package/vendor/@anvil/common/src/constants/anvil-model-ids.ts +11 -0
  53. package/vendor/@anvil/common/src/constants/anvil-models.ts +2130 -0
  54. package/vendor/@anvil/common/src/constants/anvil-onboarding-gate.ts +55 -0
  55. package/vendor/@anvil/common/src/constants/anvil-onboarding.ts +307 -0
  56. package/vendor/@anvil/common/src/constants/anvil-referral-tiers.ts +87 -0
  57. package/vendor/@anvil/common/src/constants/anvil-signup-block.ts +68 -0
  58. package/vendor/@anvil/common/src/constants/anvil-spend-ceilings.ts +450 -0
  59. package/vendor/@anvil/common/src/constants/anvil-trust.ts +976 -0
  60. package/vendor/@anvil/common/src/constants/auth.ts +18 -0
  61. package/vendor/@anvil/common/src/constants/byok.ts +2 -0
  62. package/vendor/@anvil/common/src/constants/cf-worker-signals.ts +132 -0
  63. package/vendor/@anvil/common/src/constants/composio.ts +34 -0
  64. package/vendor/@anvil/common/src/constants/deepseek-direct.ts +55 -0
  65. package/vendor/@anvil/common/src/constants/feedback.ts +13 -0
  66. package/vendor/@anvil/common/src/constants/foreign-client-signals.ts +272 -0
  67. package/vendor/@anvil/common/src/constants/free-agents.ts +777 -0
  68. package/vendor/@anvil/common/src/constants/gemini.ts +15 -0
  69. package/vendor/@anvil/common/src/constants/grant-priorities.ts +13 -0
  70. package/vendor/@anvil/common/src/constants/hosts.ts +6 -0
  71. package/vendor/@anvil/common/src/constants/images.ts +51 -0
  72. package/vendor/@anvil/common/src/constants/index.ts +7 -0
  73. package/vendor/@anvil/common/src/constants/knowledge.ts +35 -0
  74. package/vendor/@anvil/common/src/constants/limits.ts +23 -0
  75. package/vendor/@anvil/common/src/constants/model-config.ts +277 -0
  76. package/vendor/@anvil/common/src/constants/openrouter-attribution.ts +8 -0
  77. package/vendor/@anvil/common/src/constants/paths.ts +69 -0
  78. package/vendor/@anvil/common/src/constants/provider-routes.ts +317 -0
  79. package/vendor/@anvil/common/src/constants/reasoning-effort.ts +79 -0
  80. package/vendor/@anvil/common/src/constants/skills.ts +60 -0
  81. package/vendor/@anvil/common/src/constants/subscription-plans.ts +49 -0
  82. package/vendor/@anvil/common/src/constants/ui.ts +25 -0
  83. package/vendor/@anvil/common/src/env-ci.ts +36 -0
  84. package/vendor/@anvil/common/src/env-process.ts +95 -0
  85. package/vendor/@anvil/common/src/env-schema.ts +95 -0
  86. package/vendor/@anvil/common/src/env.ts +24 -0
  87. package/vendor/@anvil/common/src/gravity-capi.ts +207 -0
  88. package/vendor/@anvil/common/src/mcp/client.ts +233 -0
  89. package/vendor/@anvil/common/src/old-constants.ts +10 -0
  90. package/vendor/@anvil/common/src/project-file-tree.ts +355 -0
  91. package/vendor/@anvil/common/src/reddit-capi.ts +254 -0
  92. package/vendor/@anvil/common/src/schemas/feedback.ts +52 -0
  93. package/vendor/@anvil/common/src/schemas/logs.ts +66 -0
  94. package/vendor/@anvil/common/src/templates/agent-validation.ts +392 -0
  95. package/vendor/@anvil/common/src/templates/initial-agents-dir/LICENSE +202 -0
  96. package/vendor/@anvil/common/src/templates/initial-agents-dir/README.md +294 -0
  97. package/vendor/@anvil/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +17 -0
  98. package/vendor/@anvil/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +78 -0
  99. package/vendor/@anvil/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +73 -0
  100. package/vendor/@anvil/common/src/templates/initial-agents-dir/my-custom-agent.ts +40 -0
  101. package/vendor/@anvil/common/src/templates/initial-agents-dir/package.json +6 -0
  102. package/vendor/@anvil/common/src/templates/initial-agents-dir/skills/README.md +65 -0
  103. package/vendor/@anvil/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +29 -0
  104. package/vendor/@anvil/common/src/templates/initial-agents-dir/types/agent-definition.ts +497 -0
  105. package/vendor/@anvil/common/src/templates/initial-agents-dir/types/tools.ts +444 -0
  106. package/vendor/@anvil/common/src/templates/initial-agents-dir/types/util-types.ts +178 -0
  107. package/vendor/@anvil/common/src/testing/TESTING_PATTERNS.md +351 -0
  108. package/vendor/@anvil/common/src/testing/anvil-offer-invariants.ts +169 -0
  109. package/vendor/@anvil/common/src/testing/errors.ts +33 -0
  110. package/vendor/@anvil/common/src/testing/fixtures/agent-runtime.ts +334 -0
  111. package/vendor/@anvil/common/src/testing/impl/agent-runtime.ts +6 -0
  112. package/vendor/@anvil/common/src/testing/index.ts +84 -0
  113. package/vendor/@anvil/common/src/testing/mock-modules.ts +53 -0
  114. package/vendor/@anvil/common/src/testing/mock-types.ts +123 -0
  115. package/vendor/@anvil/common/src/testing/mocks/analytics.ts +261 -0
  116. package/vendor/@anvil/common/src/testing/mocks/child-process.ts +93 -0
  117. package/vendor/@anvil/common/src/testing/mocks/crypto.ts +218 -0
  118. package/vendor/@anvil/common/src/testing/mocks/database.ts +337 -0
  119. package/vendor/@anvil/common/src/testing/mocks/fetch.ts +219 -0
  120. package/vendor/@anvil/common/src/testing/mocks/filesystem.ts +166 -0
  121. package/vendor/@anvil/common/src/testing/mocks/index.ts +101 -0
  122. package/vendor/@anvil/common/src/testing/mocks/logger.ts +135 -0
  123. package/vendor/@anvil/common/src/testing/mocks/stream.ts +313 -0
  124. package/vendor/@anvil/common/src/testing/mocks/timers.ts +132 -0
  125. package/vendor/@anvil/common/src/testing/mocks/tree-sitter.ts +127 -0
  126. package/vendor/@anvil/common/src/testing/setup.ts +282 -0
  127. package/vendor/@anvil/common/src/testing-env-ci.ts +15 -0
  128. package/vendor/@anvil/common/src/testing-env-process.ts +78 -0
  129. package/vendor/@anvil/common/src/tools/__tests__/compile-tool-definitions.test.ts +34 -0
  130. package/vendor/@anvil/common/src/tools/compile-tool-definitions.ts +157 -0
  131. package/vendor/@anvil/common/src/tools/constants.ts +117 -0
  132. package/vendor/@anvil/common/src/tools/list.ts +190 -0
  133. package/vendor/@anvil/common/src/tools/params/__tests__/coerce-to-array.test.ts +213 -0
  134. package/vendor/@anvil/common/src/tools/params/__tests__/read-docs.test.ts +47 -0
  135. package/vendor/@anvil/common/src/tools/params/__tests__/render-ui.test.ts +65 -0
  136. package/vendor/@anvil/common/src/tools/params/tool/__tests__/run-terminal-command-timeout.test.ts +49 -0
  137. package/vendor/@anvil/common/src/tools/params/tool/add-message.ts +39 -0
  138. package/vendor/@anvil/common/src/tools/params/tool/add-subgoal.ts +57 -0
  139. package/vendor/@anvil/common/src/tools/params/tool/apply-patch.ts +110 -0
  140. package/vendor/@anvil/common/src/tools/params/tool/ask-user.ts +181 -0
  141. package/vendor/@anvil/common/src/tools/params/tool/browser-logs.ts +85 -0
  142. package/vendor/@anvil/common/src/tools/params/tool/cloud-plan-ready.ts +94 -0
  143. package/vendor/@anvil/common/src/tools/params/tool/code-search.ts +159 -0
  144. package/vendor/@anvil/common/src/tools/params/tool/composio.ts +131 -0
  145. package/vendor/@anvil/common/src/tools/params/tool/create-plan.ts +80 -0
  146. package/vendor/@anvil/common/src/tools/params/tool/end-turn.ts +57 -0
  147. package/vendor/@anvil/common/src/tools/params/tool/find-files.ts +60 -0
  148. package/vendor/@anvil/common/src/tools/params/tool/glob.ts +80 -0
  149. package/vendor/@anvil/common/src/tools/params/tool/gravity-index.ts +93 -0
  150. package/vendor/@anvil/common/src/tools/params/tool/list-directory.ts +58 -0
  151. package/vendor/@anvil/common/src/tools/params/tool/lookup-agent-info.ts +37 -0
  152. package/vendor/@anvil/common/src/tools/params/tool/propose-str-replace.ts +103 -0
  153. package/vendor/@anvil/common/src/tools/params/tool/propose-write-file.ts +71 -0
  154. package/vendor/@anvil/common/src/tools/params/tool/read-docs.ts +90 -0
  155. package/vendor/@anvil/common/src/tools/params/tool/read-files.ts +109 -0
  156. package/vendor/@anvil/common/src/tools/params/tool/read-subtree.ts +79 -0
  157. package/vendor/@anvil/common/src/tools/params/tool/read-url.ts +81 -0
  158. package/vendor/@anvil/common/src/tools/params/tool/render-ui.ts +168 -0
  159. package/vendor/@anvil/common/src/tools/params/tool/run-file-change-hooks.ts +57 -0
  160. package/vendor/@anvil/common/src/tools/params/tool/run-terminal-command.ts +211 -0
  161. package/vendor/@anvil/common/src/tools/params/tool/screenshot.ts +97 -0
  162. package/vendor/@anvil/common/src/tools/params/tool/set-messages.ts +44 -0
  163. package/vendor/@anvil/common/src/tools/params/tool/set-output.ts +61 -0
  164. package/vendor/@anvil/common/src/tools/params/tool/skill.ts +59 -0
  165. package/vendor/@anvil/common/src/tools/params/tool/spawn-agent-inline.ts +56 -0
  166. package/vendor/@anvil/common/src/tools/params/tool/spawn-agents.ts +154 -0
  167. package/vendor/@anvil/common/src/tools/params/tool/str-replace.ts +107 -0
  168. package/vendor/@anvil/common/src/tools/params/tool/suggest-followups.ts +97 -0
  169. package/vendor/@anvil/common/src/tools/params/tool/task-completed.ts +61 -0
  170. package/vendor/@anvil/common/src/tools/params/tool/think-deeply.ts +56 -0
  171. package/vendor/@anvil/common/src/tools/params/tool/update-subgoal.ts +89 -0
  172. package/vendor/@anvil/common/src/tools/params/tool/vision-analyze.ts +82 -0
  173. package/vendor/@anvil/common/src/tools/params/tool/web-search.ts +73 -0
  174. package/vendor/@anvil/common/src/tools/params/tool/write-file.ts +71 -0
  175. package/vendor/@anvil/common/src/tools/params/tool/write-todos.ts +67 -0
  176. package/vendor/@anvil/common/src/tools/params/utils.ts +150 -0
  177. package/vendor/@anvil/common/src/tools/utils.ts +24 -0
  178. package/vendor/@anvil/common/src/types/__tests__/dynamic-agent-template.test.ts +20 -0
  179. package/vendor/@anvil/common/src/types/agent-template.ts +215 -0
  180. package/vendor/@anvil/common/src/types/anvil-session.ts +535 -0
  181. package/vendor/@anvil/common/src/types/anvil-streak.ts +6 -0
  182. package/vendor/@anvil/common/src/types/anvil-usage.ts +64 -0
  183. package/vendor/@anvil/common/src/types/api/agents/publish.ts +61 -0
  184. package/vendor/@anvil/common/src/types/bun-test.d.ts +5 -0
  185. package/vendor/@anvil/common/src/types/contracts/agent-runtime.ts +75 -0
  186. package/vendor/@anvil/common/src/types/contracts/analytics.ts +9 -0
  187. package/vendor/@anvil/common/src/types/contracts/bigquery.ts +55 -0
  188. package/vendor/@anvil/common/src/types/contracts/billing.ts +46 -0
  189. package/vendor/@anvil/common/src/types/contracts/client.ts +53 -0
  190. package/vendor/@anvil/common/src/types/contracts/database.ts +112 -0
  191. package/vendor/@anvil/common/src/types/contracts/env.ts +203 -0
  192. package/vendor/@anvil/common/src/types/contracts/llm.ts +191 -0
  193. package/vendor/@anvil/common/src/types/contracts/logger.ts +14 -0
  194. package/vendor/@anvil/common/src/types/contracts/logs.ts +34 -0
  195. package/vendor/@anvil/common/src/types/contracts/trace.ts +21 -0
  196. package/vendor/@anvil/common/src/types/dynamic-agent-template.ts +328 -0
  197. package/vendor/@anvil/common/src/types/filesystem.ts +10 -0
  198. package/vendor/@anvil/common/src/types/function-params.ts +33 -0
  199. package/vendor/@anvil/common/src/types/grant.ts +20 -0
  200. package/vendor/@anvil/common/src/types/gravity-index.ts +170 -0
  201. package/vendor/@anvil/common/src/types/json.ts +29 -0
  202. package/vendor/@anvil/common/src/types/mcp.ts +24 -0
  203. package/vendor/@anvil/common/src/types/messages/anvil-message.ts +58 -0
  204. package/vendor/@anvil/common/src/types/messages/content-part.ts +59 -0
  205. package/vendor/@anvil/common/src/types/messages/data-content.ts +14 -0
  206. package/vendor/@anvil/common/src/types/messages/provider-metadata.ts +13 -0
  207. package/vendor/@anvil/common/src/types/organization.ts +118 -0
  208. package/vendor/@anvil/common/src/types/print-mode.ts +121 -0
  209. package/vendor/@anvil/common/src/types/publisher.ts +67 -0
  210. package/vendor/@anvil/common/src/types/session-state.ts +149 -0
  211. package/vendor/@anvil/common/src/types/skill.ts +86 -0
  212. package/vendor/@anvil/common/src/types/source.ts +11 -0
  213. package/vendor/@anvil/common/src/types/spawn.ts +13 -0
  214. package/vendor/@anvil/common/src/types/subscription.ts +67 -0
  215. package/vendor/@anvil/common/src/types/usage.ts +16 -0
  216. package/vendor/@anvil/common/src/types/util.ts +3 -0
  217. package/vendor/@anvil/common/src/util/__tests__/ad-user-agent.test.ts +26 -0
  218. package/vendor/@anvil/common/src/util/__tests__/analytics-dispatcher.test.ts +122 -0
  219. package/vendor/@anvil/common/src/util/__tests__/analytics-log.test.ts +102 -0
  220. package/vendor/@anvil/common/src/util/__tests__/analytics-sampling.test.ts +143 -0
  221. package/vendor/@anvil/common/src/util/__tests__/anvil-streak.test.ts +202 -0
  222. package/vendor/@anvil/common/src/util/__tests__/anvil-usage-summary.test.ts +193 -0
  223. package/vendor/@anvil/common/src/util/__tests__/axiom-only-log.test.ts +140 -0
  224. package/vendor/@anvil/common/src/util/__tests__/client-user-agent.test.ts +148 -0
  225. package/vendor/@anvil/common/src/util/__tests__/engagement-tracker.test.ts +115 -0
  226. package/vendor/@anvil/common/src/util/__tests__/env-file-path.test.ts +57 -0
  227. package/vendor/@anvil/common/src/util/__tests__/error-abort.test.ts +774 -0
  228. package/vendor/@anvil/common/src/util/__tests__/error-api-details.test.ts +206 -0
  229. package/vendor/@anvil/common/src/util/__tests__/file-read-limits.test.ts +173 -0
  230. package/vendor/@anvil/common/src/util/__tests__/format-code-search.test.ts +60 -0
  231. package/vendor/@anvil/common/src/util/__tests__/log-mirror.test.ts +31 -0
  232. package/vendor/@anvil/common/src/util/__tests__/messages.test.ts +1252 -0
  233. package/vendor/@anvil/common/src/util/__tests__/partial-json-delta.test.ts +505 -0
  234. package/vendor/@anvil/common/src/util/__tests__/path.test.ts +22 -0
  235. package/vendor/@anvil/common/src/util/__tests__/project-ignore.test.ts +90 -0
  236. package/vendor/@anvil/common/src/util/__tests__/promise.test.ts +325 -0
  237. package/vendor/@anvil/common/src/util/__tests__/rate-limit.test.ts +28 -0
  238. package/vendor/@anvil/common/src/util/__tests__/reddit-anvil-retention.test.ts +130 -0
  239. package/vendor/@anvil/common/src/util/__tests__/saxy.test.ts +1008 -0
  240. package/vendor/@anvil/common/src/util/__tests__/split-data.test.ts +289 -0
  241. package/vendor/@anvil/common/src/util/__tests__/string.test.ts +239 -0
  242. package/vendor/@anvil/common/src/util/__tests__/thread-title.test.ts +70 -0
  243. package/vendor/@anvil/common/src/util/__tests__/tool-result-media-order.test.ts +108 -0
  244. package/vendor/@anvil/common/src/util/__tests__/ttft-histogram.test.ts +180 -0
  245. package/vendor/@anvil/common/src/util/__tests__/with-timeout.test.ts +24 -0
  246. package/vendor/@anvil/common/src/util/__tests__/zoned-time.test.ts +88 -0
  247. package/vendor/@anvil/common/src/util/ad-user-agent.ts +25 -0
  248. package/vendor/@anvil/common/src/util/agent-file-utils.ts +110 -0
  249. package/vendor/@anvil/common/src/util/agent-id-parsing.ts +136 -0
  250. package/vendor/@anvil/common/src/util/agent-name-normalization.ts +38 -0
  251. package/vendor/@anvil/common/src/util/agent-name-resolver.ts +86 -0
  252. package/vendor/@anvil/common/src/util/analytics-dispatcher.ts +82 -0
  253. package/vendor/@anvil/common/src/util/analytics-log.ts +78 -0
  254. package/vendor/@anvil/common/src/util/analytics-sampling.ts +255 -0
  255. package/vendor/@anvil/common/src/util/anvil-model-availability.ts +102 -0
  256. package/vendor/@anvil/common/src/util/anvil-privacy.ts +82 -0
  257. package/vendor/@anvil/common/src/util/anvil-streak-line.ts +103 -0
  258. package/vendor/@anvil/common/src/util/anvil-streak.ts +156 -0
  259. package/vendor/@anvil/common/src/util/anvil-usage-summary.ts +125 -0
  260. package/vendor/@anvil/common/src/util/array.ts +31 -0
  261. package/vendor/@anvil/common/src/util/axiom-only-log.ts +124 -0
  262. package/vendor/@anvil/common/src/util/cache-debug.ts +171 -0
  263. package/vendor/@anvil/common/src/util/client-user-agent.ts +114 -0
  264. package/vendor/@anvil/common/src/util/credentials.ts +26 -0
  265. package/vendor/@anvil/common/src/util/currency.ts +25 -0
  266. package/vendor/@anvil/common/src/util/dates.ts +81 -0
  267. package/vendor/@anvil/common/src/util/disposable-email.ts +277 -0
  268. package/vendor/@anvil/common/src/util/engagement-tracker.ts +129 -0
  269. package/vendor/@anvil/common/src/util/env-file-path.ts +40 -0
  270. package/vendor/@anvil/common/src/util/error.ts +562 -0
  271. package/vendor/@anvil/common/src/util/file-read-limits.ts +236 -0
  272. package/vendor/@anvil/common/src/util/file.ts +339 -0
  273. package/vendor/@anvil/common/src/util/format-code-search.ts +115 -0
  274. package/vendor/@anvil/common/src/util/lazy-response-ads.ts +92 -0
  275. package/vendor/@anvil/common/src/util/log-data.ts +57 -0
  276. package/vendor/@anvil/common/src/util/log-ingest.ts +58 -0
  277. package/vendor/@anvil/common/src/util/log-mirror.ts +34 -0
  278. package/vendor/@anvil/common/src/util/lru-cache.ts +67 -0
  279. package/vendor/@anvil/common/src/util/messages.ts +685 -0
  280. package/vendor/@anvil/common/src/util/min-heap.ts +87 -0
  281. package/vendor/@anvil/common/src/util/model-utils.ts +4 -0
  282. package/vendor/@anvil/common/src/util/object.ts +128 -0
  283. package/vendor/@anvil/common/src/util/partial-json-delta.ts +89 -0
  284. package/vendor/@anvil/common/src/util/path.ts +15 -0
  285. package/vendor/@anvil/common/src/util/project-ignore.ts +119 -0
  286. package/vendor/@anvil/common/src/util/promise.ts +73 -0
  287. package/vendor/@anvil/common/src/util/random.ts +15 -0
  288. package/vendor/@anvil/common/src/util/rate-limit.ts +56 -0
  289. package/vendor/@anvil/common/src/util/reddit-anvil-retention.ts +60 -0
  290. package/vendor/@anvil/common/src/util/reddit-capi-events.ts +36 -0
  291. package/vendor/@anvil/common/src/util/response-ad-positions.ts +54 -0
  292. package/vendor/@anvil/common/src/util/saxy.ts +741 -0
  293. package/vendor/@anvil/common/src/util/skills.test.ts +44 -0
  294. package/vendor/@anvil/common/src/util/skills.ts +36 -0
  295. package/vendor/@anvil/common/src/util/split-data.ts +259 -0
  296. package/vendor/@anvil/common/src/util/stop-sequence.ts +61 -0
  297. package/vendor/@anvil/common/src/util/string.ts +426 -0
  298. package/vendor/@anvil/common/src/util/system-info.ts +53 -0
  299. package/vendor/@anvil/common/src/util/thread-title.ts +46 -0
  300. package/vendor/@anvil/common/src/util/ttft-histogram.ts +73 -0
  301. package/vendor/@anvil/common/src/util/xml-parser.ts +27 -0
  302. package/vendor/@anvil/common/src/util/xml.ts +17 -0
  303. package/vendor/@anvil/common/src/util/zod-schema.ts +25 -0
  304. package/vendor/@anvil/common/src/util/zoned-time.ts +136 -0
  305. package/vendor/@anvil/common/src/utils/ask-user-bridge.ts +44 -0
  306. package/vendor/@anvil/sdk/dist/index.cjs +52297 -0
  307. package/vendor/@anvil/sdk/dist/index.cjs.map +440 -0
  308. package/vendor/@anvil/sdk/dist/index.d.ts +4277 -0
  309. package/vendor/@anvil/sdk/dist/index.mjs +52290 -0
  310. package/vendor/@anvil/sdk/dist/index.mjs.map +440 -0
  311. package/vendor/@anvil/sdk/dist/vendor/ai.cjs +30886 -0
  312. package/vendor/@anvil/sdk/dist/vendor/ripgrep/arm64-darwin/rg +0 -0
  313. package/vendor/@anvil/sdk/dist/vendor/ripgrep/arm64-linux/rg +0 -0
  314. package/vendor/@anvil/sdk/dist/vendor/ripgrep/x64-darwin/rg +0 -0
  315. package/vendor/@anvil/sdk/dist/vendor/ripgrep/x64-linux/rg +0 -0
  316. package/vendor/@anvil/sdk/dist/vendor/ripgrep/x64-win32/rg.exe +0 -0
  317. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-c-sharp.wasm +0 -0
  318. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-cpp.wasm +0 -0
  319. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-go.wasm +0 -0
  320. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-java.wasm +0 -0
  321. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-javascript.wasm +0 -0
  322. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-python.wasm +0 -0
  323. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-ruby.wasm +0 -0
  324. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-rust.wasm +0 -0
  325. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-tsx.wasm +0 -0
  326. package/vendor/@anvil/sdk/dist/wasm/tree-sitter-typescript.wasm +0 -0
  327. package/vendor/@anvil/sdk/dist/wasm/tree-sitter.wasm +0 -0
  328. package/vendor/@anvil/sdk/package.json +21 -0
@@ -0,0 +1,246 @@
1
+ import { describe, expect, it } from 'bun:test'
2
+
3
+ import {
4
+ classifyOnboardingOtherText,
5
+ ANVIL_ONBOARDING_QUESTIONS,
6
+ isOnboardingComplete,
7
+ ONBOARDING_LEGACY_OPTION_IDS,
8
+ ONBOARDING_OTHER_TEXT_MAX,
9
+ OTHER_OPTION_ID,
10
+ validateOnboardingSubmission,
11
+ type OnboardingAnswer,
12
+ } from '../anvil-onboarding'
13
+
14
+ /** A complete, valid submission. */
15
+ function fullAnswers(overrides: OnboardingAnswer[] = []): OnboardingAnswer[] {
16
+ const base: OnboardingAnswer[] = [
17
+ { questionId: 'referral_source', optionIds: ['youtube'] },
18
+ { questionId: 'role', optionIds: ['professional_dev'] },
19
+ { questionId: 'proficiency', optionIds: ['advanced'] },
20
+ { questionId: 'intended_use', optionIds: ['work', 'side_projects'] },
21
+ { questionId: 'subscriptions', optionIds: ['cursor'] },
22
+ ]
23
+ return base.map((a) => overrides.find((o) => o.questionId === a.questionId) ?? a)
24
+ }
25
+
26
+ describe('the question set itself', () => {
27
+ it('gives every option a unique id within its question', () => {
28
+ // A duplicate id would silently merge two distinct answers in the analytics.
29
+ for (const q of ANVIL_ONBOARDING_QUESTIONS) {
30
+ const ids = q.options.map((o) => o.id)
31
+ expect(new Set(ids).size).toBe(ids.length)
32
+ }
33
+ })
34
+
35
+ it('offers Other everywhere except the ordinal scale', () => {
36
+ // Free text on an ordered scale is unusable for the segmentation the
37
+ // question exists to support.
38
+ for (const q of ANVIL_ONBOARDING_QUESTIONS) {
39
+ const hasOther = q.options.some((o) => o.id === OTHER_OPTION_ID)
40
+ expect(hasOther).toBe(q.id !== 'proficiency')
41
+ }
42
+ })
43
+
44
+ it('maps every legacy option onto an option that still exists', () => {
45
+ // A successor that no longer exists silently drops the answers it was
46
+ // supposed to rescue — the exact failure the map exists to prevent.
47
+ for (const [questionId, map] of Object.entries(ONBOARDING_LEGACY_OPTION_IDS)) {
48
+ const question = ANVIL_ONBOARDING_QUESTIONS.find((q) => q.id === questionId)
49
+ expect(question).toBeDefined()
50
+ const live = new Set(question!.options.map((o) => o.id))
51
+ for (const [retired, successor] of Object.entries(map ?? {})) {
52
+ expect(live.has(retired)).toBe(false)
53
+ expect(live.has(successor)).toBe(true)
54
+ }
55
+ }
56
+ })
57
+
58
+ it('only marks options exclusive on multi-select questions', () => {
59
+ // On a single-choice question "exclusive" is meaningless, and reading as
60
+ // though it does something is worse than not having it.
61
+ for (const q of ANVIL_ONBOARDING_QUESTIONS) {
62
+ if (q.multi) continue
63
+ expect(q.options.some((o) => o.exclusive)).toBe(false)
64
+ }
65
+ })
66
+ })
67
+
68
+ describe('classifyOnboardingOtherText — write-ins folded into real options', () => {
69
+ it('counts every Instagram spelling as the Instagram / TikTok option', () => {
70
+ for (const text of ['insta', 'Instagram', 'instagram ads', 'IG', 'tik tok']) {
71
+ expect(classifyOnboardingOtherText('referral_source', text)).toBe('tiktok')
72
+ }
73
+ })
74
+
75
+ it('counts AI assistants as the Google / AI search option', () => {
76
+ for (const text of ['ChatGPT', 'chat gpt', 'AI', 'gemini', 'perplexity']) {
77
+ expect(classifyOnboardingOtherText('referral_source', text)).toBe('search')
78
+ }
79
+ })
80
+
81
+ it('prefers the more specific rule when a write-in matches both', () => {
82
+ expect(classifyOnboardingOtherText('referral_source', 'instagram AI page')).toBe(
83
+ 'tiktok',
84
+ )
85
+ })
86
+
87
+ it('leaves genuinely other answers alone', () => {
88
+ // The AI rule is the dangerous one: a substring match would swallow
89
+ // "email", "said", "chair" and quietly inflate a channel that never
90
+ // referred anyone.
91
+ for (const text of ['forums', 'my brother', 'email newsletter', 'a fair']) {
92
+ expect(classifyOnboardingOtherText('referral_source', text)).toBeNull()
93
+ }
94
+ })
95
+
96
+ it('does nothing on questions with no rules', () => {
97
+ expect(classifyOnboardingOtherText('role', 'instagram')).toBeNull()
98
+ })
99
+ })
100
+
101
+ describe('validateOnboardingSubmission', () => {
102
+ it('accepts a complete submission', () => {
103
+ const result = validateOnboardingSubmission({ answers: fullAnswers() })
104
+ expect(result.ok).toBe(true)
105
+ })
106
+
107
+ it('requires every question', () => {
108
+ // The form has no skip, so a partial submission is a stale or hand-rolled
109
+ // client rather than a user choice — and half a response would sit in the
110
+ // analytics looking like a real one.
111
+ const result = validateOnboardingSubmission({
112
+ answers: fullAnswers().slice(0, 2),
113
+ })
114
+ expect(result.ok).toBe(false)
115
+ if (result.ok) throw new Error('unreachable')
116
+ expect(result.errors.length).toBeGreaterThan(0)
117
+ expect(result.errors.every((e) => e.questionId !== null)).toBe(true)
118
+ })
119
+
120
+ it('rejects an unknown option id', () => {
121
+ // Out-of-date client or a forged post. Accepting it would put a value in
122
+ // the analytics that no question can explain.
123
+ const result = validateOnboardingSubmission({
124
+ answers: fullAnswers([{ questionId: 'role', optionIds: ['ceo_of_mars'] }]),
125
+ })
126
+ expect(result.ok).toBe(false)
127
+ })
128
+
129
+ it('rejects multiple answers to a single-choice question', () => {
130
+ const result = validateOnboardingSubmission({
131
+ answers: fullAnswers([
132
+ { questionId: 'role', optionIds: ['student', 'founder'] },
133
+ ]),
134
+ })
135
+ expect(result.ok).toBe(false)
136
+ })
137
+
138
+ it('rejects an exclusive option combined with others', () => {
139
+ // "No subscriptions" and "Cursor" cannot both be true; a stored
140
+ // contradiction has no honest reading in the tally.
141
+ const result = validateOnboardingSubmission({
142
+ answers: fullAnswers([
143
+ { questionId: 'subscriptions', optionIds: ['none', 'cursor'] },
144
+ ]),
145
+ })
146
+ expect(result.ok).toBe(false)
147
+ })
148
+
149
+ it('accepts the exclusive option on its own', () => {
150
+ const result = validateOnboardingSubmission({
151
+ answers: fullAnswers([
152
+ { questionId: 'subscriptions', optionIds: ['none'] },
153
+ ]),
154
+ })
155
+ expect(result.ok).toBe(true)
156
+ })
157
+
158
+ it('accepts multiple answers where the question allows it', () => {
159
+ const result = validateOnboardingSubmission({
160
+ answers: fullAnswers([
161
+ {
162
+ questionId: 'intended_use',
163
+ optionIds: ['work', 'learning', 'automation'],
164
+ },
165
+ ]),
166
+ })
167
+ expect(result.ok).toBe(true)
168
+ })
169
+ })
170
+
171
+ describe('the Other option', () => {
172
+ it('requires accompanying text', () => {
173
+ const result = validateOnboardingSubmission({
174
+ answers: fullAnswers([
175
+ { questionId: 'role', optionIds: [OTHER_OPTION_ID] },
176
+ ]),
177
+ })
178
+ expect(result.ok).toBe(false)
179
+ })
180
+
181
+ it('keeps the text when Other is chosen', () => {
182
+ const result = validateOnboardingSubmission({
183
+ answers: fullAnswers([
184
+ {
185
+ questionId: 'role',
186
+ optionIds: [OTHER_OPTION_ID],
187
+ otherText: ' technical writer ',
188
+ },
189
+ ]),
190
+ })
191
+ expect(result.ok).toBe(true)
192
+ if (!result.ok) throw new Error('unreachable')
193
+ const role = result.answers.find((a) => a.questionId === 'role')
194
+ expect(role?.otherText).toBe('technical writer')
195
+ })
196
+
197
+ it('drops stray text when Other was NOT chosen', () => {
198
+ // Otherwise text rides along on an answer that has nowhere to display it,
199
+ // and the admin view shows a note against the wrong option.
200
+ const result = validateOnboardingSubmission({
201
+ answers: fullAnswers([
202
+ { questionId: 'role', optionIds: ['student'], otherText: 'ignore me' },
203
+ ]),
204
+ })
205
+ expect(result.ok).toBe(true)
206
+ if (!result.ok) throw new Error('unreachable')
207
+ expect(result.answers.find((a) => a.questionId === 'role')?.otherText).toBeUndefined()
208
+ })
209
+
210
+ it('truncates rather than rejecting a long note', () => {
211
+ const result = validateOnboardingSubmission({
212
+ answers: fullAnswers([
213
+ {
214
+ questionId: 'role',
215
+ optionIds: [OTHER_OPTION_ID],
216
+ otherText: 'x'.repeat(ONBOARDING_OTHER_TEXT_MAX + 500),
217
+ },
218
+ ]),
219
+ })
220
+ expect(result.ok).toBe(true)
221
+ if (!result.ok) throw new Error('unreachable')
222
+ expect(result.answers.find((a) => a.questionId === 'role')?.otherText).toHaveLength(
223
+ ONBOARDING_OTHER_TEXT_MAX,
224
+ )
225
+ })
226
+ })
227
+
228
+ describe('isOnboardingComplete — the blocking gate reads this', () => {
229
+ it('is true only when every question has an answer', () => {
230
+ expect(isOnboardingComplete(fullAnswers())).toBe(true)
231
+ expect(isOnboardingComplete(fullAnswers().slice(0, 3))).toBe(false)
232
+ })
233
+
234
+ it('treats null, undefined and empty as incomplete', () => {
235
+ // A user with no record must be gated, not waved through — this is the
236
+ // difference between the gate working and being decorative.
237
+ expect(isOnboardingComplete(null)).toBe(false)
238
+ expect(isOnboardingComplete(undefined)).toBe(false)
239
+ expect(isOnboardingComplete([])).toBe(false)
240
+ })
241
+
242
+ it('does not count an answer with no options chosen', () => {
243
+ const hollow = fullAnswers([{ questionId: 'role', optionIds: [] }])
244
+ expect(isOnboardingComplete(hollow)).toBe(false)
245
+ })
246
+ })
@@ -0,0 +1,106 @@
1
+ import { describe, expect, it } from 'bun:test'
2
+
3
+ import {
4
+ detectCfWorker,
5
+ looksLikeProxyClientId,
6
+ parseAllowedWorkerZones,
7
+ } from '../cf-worker-signals'
8
+
9
+ const NO_ZONES = new Set<string>()
10
+
11
+ describe('detectCfWorker', () => {
12
+ it('detects a Worker subrequest that came through our edge', () => {
13
+ expect(
14
+ detectCfWorker({
15
+ cfWorkerHeader: 'anvil2api.workers.dev',
16
+ cfRayHeader: 'abc123-SJC',
17
+ allowedZones: NO_ZONES,
18
+ }),
19
+ ).toEqual({ detected: true, zone: 'anvil2api.workers.dev' })
20
+ })
21
+
22
+ it('ignores ordinary traffic', () => {
23
+ expect(
24
+ detectCfWorker({
25
+ cfWorkerHeader: null,
26
+ cfRayHeader: 'abc123-SJC',
27
+ allowedZones: NO_ZONES,
28
+ }),
29
+ ).toEqual({ detected: false, reason: 'no_header' })
30
+ })
31
+
32
+ it('refuses to act on cf-worker without edge corroboration', () => {
33
+ // This is the whole difference between this detector and the ones that were
34
+ // defeated: without `cf-ray` the header is caller-authored text on a request
35
+ // that never touched Cloudflare, which is exactly as forgeable as a
36
+ // self-reported fingerprint.
37
+ expect(
38
+ detectCfWorker({
39
+ cfWorkerHeader: 'anything.workers.dev',
40
+ cfRayHeader: null,
41
+ allowedZones: NO_ZONES,
42
+ }),
43
+ ).toEqual({ detected: false, reason: 'not_edge_verified' })
44
+ })
45
+
46
+ it('never flags our own Workers', () => {
47
+ // app-preview-proxy is a Cloudflare Worker that talks to our API. Banning
48
+ // our own infrastructure is the most obvious way this could go wrong.
49
+ const allowed = parseAllowedWorkerZones('app-preview-proxy, vly-sh-router')
50
+ expect(
51
+ detectCfWorker({
52
+ cfWorkerHeader: 'app-preview-proxy',
53
+ cfRayHeader: 'abc-SJC',
54
+ allowedZones: allowed,
55
+ }),
56
+ ).toEqual({ detected: false, reason: 'allowlisted' })
57
+ })
58
+
59
+ it('matches the allowlist case-insensitively and ignores padding', () => {
60
+ const allowed = parseAllowedWorkerZones(' App-Preview-Proxy ,, ')
61
+ expect(
62
+ detectCfWorker({
63
+ cfWorkerHeader: ' APP-PREVIEW-PROXY ',
64
+ cfRayHeader: 'abc-SJC',
65
+ allowedZones: allowed,
66
+ }).detected,
67
+ ).toBe(false)
68
+ })
69
+
70
+ it('treats a whitespace-only header as absent', () => {
71
+ expect(
72
+ detectCfWorker({
73
+ cfWorkerHeader: ' ',
74
+ cfRayHeader: 'abc-SJC',
75
+ allowedZones: NO_ZONES,
76
+ }),
77
+ ).toEqual({ detected: false, reason: 'no_header' })
78
+ })
79
+ })
80
+
81
+ describe('parseAllowedWorkerZones', () => {
82
+ it('is empty for unset config rather than throwing', () => {
83
+ expect(parseAllowedWorkerZones(undefined).size).toBe(0)
84
+ expect(parseAllowedWorkerZones('').size).toBe(0)
85
+ })
86
+ })
87
+
88
+ describe('looksLikeProxyClientId', () => {
89
+ it('matches the published proxy generator', () => {
90
+ expect(looksLikeProxyClientId('wf-a1b2c3d4')).toBe(true)
91
+ })
92
+
93
+ it('does not match our own clients or near-misses', () => {
94
+ for (const id of [
95
+ 'enhanced-abc',
96
+ 'wf-TOOLONGVALUE',
97
+ 'wf-a1b2c3',
98
+ 'wf-A1B2C3D4',
99
+ null,
100
+ undefined,
101
+ '',
102
+ ]) {
103
+ expect(looksLikeProxyClientId(id as string)).toBe(false)
104
+ }
105
+ })
106
+ })
@@ -0,0 +1,99 @@
1
+ import type { AgentTemplateTypes } from '../types/session-state'
2
+
3
+ // Define agent personas with their shared characteristics
4
+ export const AGENT_PERSONAS = {
5
+ // Base agents - all use Buffy persona
6
+ base: {
7
+ displayName: 'Buffy the Base Agent',
8
+ purpose: 'Base agent that orchestrates the full response.',
9
+ } as const,
10
+
11
+ // Ask mode
12
+ ask: {
13
+ displayName: 'Ask Mode Agent',
14
+ purpose: 'Base ask-mode agent that orchestrates the full response.',
15
+ } as const,
16
+
17
+ // Specialized agents
18
+ thinker: {
19
+ displayName: 'Theo the Theorizer',
20
+ purpose:
21
+ 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',
22
+ } as const,
23
+ 'file-explorer': {
24
+ displayName: 'Dora The File Explorer',
25
+ purpose: 'Expert at exploring a codebase and finding relevant files.',
26
+ } as const,
27
+ 'file-picker': {
28
+ displayName: 'Fletcher the File Fetcher',
29
+ purpose: 'Expert at finding relevant files in a codebase.',
30
+ } as const,
31
+ researcher: {
32
+ displayName: 'Reid Searcher the Researcher',
33
+ purpose: 'Expert at researching topics using web search and documentation.',
34
+ } as const,
35
+ planner: {
36
+ displayName: 'Peter Plan',
37
+ purpose: 'Agent that formulates a comprehensive plan to a prompt.',
38
+ hidden: true,
39
+ } as const,
40
+ reviewer: {
41
+ displayName: 'Nit Pick Nick the Reviewer',
42
+ purpose:
43
+ 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase; otherwise, no need to use this agent for minor changes since it takes a second.',
44
+ } as const,
45
+ 'agent-builder': {
46
+ displayName: 'Bob the Agent Builder',
47
+ purpose: 'Creates new agent templates for the anvil multi-agent system',
48
+ hidden: false,
49
+ } as const,
50
+ } as const satisfies Partial<
51
+ Record<
52
+ (typeof AgentTemplateTypes)[keyof typeof AgentTemplateTypes],
53
+ { displayName: string; purpose: string; hidden?: boolean }
54
+ >
55
+ >
56
+
57
+ // Agent IDs list from AGENT_PERSONAS keys
58
+ export const AGENT_IDS = Object.keys(
59
+ AGENT_PERSONAS,
60
+ ) as (keyof typeof AGENT_PERSONAS)[]
61
+
62
+ // Agent ID prefix constant
63
+ export const AGENT_ID_PREFIX = 'AnvilAI/'
64
+
65
+ // Agent names for client-side reference
66
+ export const AGENT_NAMES = Object.fromEntries(
67
+ Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [
68
+ agentType,
69
+ persona.displayName,
70
+ ]),
71
+ ) as Record<keyof typeof AGENT_PERSONAS, string>
72
+
73
+ export type AgentName =
74
+ (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']
75
+
76
+ // Get unique agent names for UI display
77
+ export const UNIQUE_AGENT_NAMES = Array.from(
78
+ new Set(
79
+ Object.values(AGENT_PERSONAS)
80
+ .filter((persona) => !('hidden' in persona) || !persona.hidden)
81
+ .map((persona) => persona.displayName),
82
+ ),
83
+ )
84
+
85
+ // Map from display name back to agent types (for parsing user input)
86
+ export const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(
87
+ (acc, [type, name]) => {
88
+ if (!acc[name]) acc[name] = []
89
+ acc[name].push(type)
90
+ return acc
91
+ },
92
+ {} as Record<string, string[]>,
93
+ )
94
+
95
+ export const MAX_AGENT_STEPS_DEFAULT = 200
96
+
97
+ // Programmatic tool calls can persist additional rows without consuming the
98
+ // LLM-call budget, so keep the transport limit separate and safely bounded.
99
+ export const MAX_AGENT_STEP_ROWS = 1_000