@alumbwe/anvil 1.0.41 → 1.0.49

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 (241) hide show
  1. package/bin/anvil.js +18 -0
  2. package/package.json +13 -6
  3. package/src/agents/bundled-agents.generated.ts +1 -1
  4. package/src/entry.ts +5 -0
  5. package/src/index.tsx +27 -4
  6. package/src/login/plain-login.ts +60 -0
  7. package/src/login/supabase-auth.ts +346 -0
  8. package/src/pre-init/client-env.ts +17 -0
  9. package/src/utils/anvil-client.ts +4 -0
  10. package/src/utils/auth.ts +16 -4
  11. package/src/utils/client-env-defaults.ts +28 -0
  12. package/src/utils/config-dir.ts +1 -1
  13. package/vendor/@anvil/common/src/constants/deepseek-direct.ts +30 -1
  14. package/vendor/@anvil/common/src/util/project-ignore.ts +4 -3
  15. package/vendor/@anvil/sdk/dist/index.cjs +46 -10
  16. package/vendor/@anvil/sdk/dist/index.mjs +46 -10
  17. package/src/commands/__tests__/anvil-command-aliases.test.ts +0 -56
  18. package/src/commands/__tests__/bash-command.test.ts +0 -445
  19. package/src/commands/__tests__/command-args.test.ts +0 -349
  20. package/src/commands/__tests__/copy-conversation-clipboard.test.ts +0 -108
  21. package/src/commands/__tests__/copy-conversation.test.ts +0 -226
  22. package/src/commands/__tests__/diagnostics-command.test.ts +0 -35
  23. package/src/commands/__tests__/image.test.ts +0 -99
  24. package/src/commands/__tests__/init.test.ts +0 -456
  25. package/src/commands/__tests__/new-command-rotates-chat.test.ts +0 -91
  26. package/src/commands/__tests__/process-diagnostics.test.ts +0 -54
  27. package/src/commands/__tests__/prompt-builders.test.ts +0 -28
  28. package/src/commands/__tests__/router-input.test.ts +0 -298
  29. package/src/components/__tests__/ad-banner.test.tsx +0 -83
  30. package/src/components/__tests__/anvil-landing-heading-row.test.tsx +0 -91
  31. package/src/components/__tests__/anvil-model-selector.test.tsx +0 -519
  32. package/src/components/__tests__/anvil-offer-invariants.test.ts +0 -54
  33. package/src/components/__tests__/anvil-takeover-prompt.test.tsx +0 -212
  34. package/src/components/__tests__/chat-input-bar.test.tsx +0 -130
  35. package/src/components/__tests__/grid-layout.integration.test.tsx +0 -304
  36. package/src/components/__tests__/grid-layout.test.tsx +0 -1051
  37. package/src/components/__tests__/message-block.completion.test.tsx +0 -104
  38. package/src/components/__tests__/message-block.streaming.test.tsx +0 -78
  39. package/src/components/__tests__/message-with-agents.test.tsx +0 -579
  40. package/src/components/__tests__/multiline-input.test.tsx +0 -1132
  41. package/src/components/__tests__/queue-panel.test.tsx +0 -398
  42. package/src/components/__tests__/selectable-list.test.ts +0 -232
  43. package/src/components/__tests__/status-bar.test.tsx +0 -44
  44. package/src/components/__tests__/status-indicator.test.tsx +0 -204
  45. package/src/components/__tests__/terminal-thinking-orb.test.tsx +0 -111
  46. package/src/components/__tests__/user-error-banner.test.tsx +0 -102
  47. package/src/components/ask-user/__tests__/multiple-choice-form.test.ts +0 -432
  48. package/src/components/ask-user/__tests__/validation.test.ts +0 -213
  49. package/src/components/tools/__tests__/apply-patch.test.tsx +0 -84
  50. package/src/components/tools/__tests__/code-search.test.tsx +0 -45
  51. package/src/components/tools/__tests__/gravity-index.test.ts +0 -76
  52. package/src/components/tools/__tests__/render-ui.test.tsx +0 -92
  53. package/src/components/tools/__tests__/run-terminal-command.test.ts +0 -233
  54. package/src/contexts/__tests__/chat-runtime-context.test.tsx +0 -149
  55. package/src/data/slash-commands.test.ts +0 -24
  56. package/src/hooks/__tests__/holds-live-anvil-slot.test.ts +0 -49
  57. package/src/hooks/__tests__/session-fetch-signal.test.ts +0 -63
  58. package/src/hooks/__tests__/use-activity-query.test.ts +0 -1000
  59. package/src/hooks/__tests__/use-ask-user-bridge.test.ts +0 -176
  60. package/src/hooks/__tests__/use-auth-query.test.ts +0 -21
  61. package/src/hooks/__tests__/use-chat-input-remount.test.tsx +0 -66
  62. package/src/hooks/__tests__/use-clipboard.test.tsx +0 -73
  63. package/src/hooks/__tests__/use-connection-status.test.ts +0 -112
  64. package/src/hooks/__tests__/use-directory-browser.test.ts +0 -203
  65. package/src/hooks/__tests__/use-gravity-ad.test.ts +0 -73
  66. package/src/hooks/__tests__/use-grid-layout.test.ts +0 -349
  67. package/src/hooks/__tests__/use-input-history.test.ts +0 -699
  68. package/src/hooks/__tests__/use-message-queue-editing.test.tsx +0 -209
  69. package/src/hooks/__tests__/use-message-queue.test.tsx +0 -71
  70. package/src/hooks/__tests__/use-path-tab-completion.test.ts +0 -315
  71. package/src/hooks/__tests__/use-queue-controls.test.ts +0 -68
  72. package/src/hooks/__tests__/use-queue-ui.test.tsx +0 -83
  73. package/src/hooks/__tests__/use-searchable-list.test.ts +0 -359
  74. package/src/hooks/__tests__/use-send-message-timer.test.ts +0 -146
  75. package/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +0 -361
  76. package/src/hooks/__tests__/use-suggestion-engine.test.ts +0 -485
  77. package/src/hooks/__tests__/use-terminal-focus.test.ts +0 -66
  78. package/src/hooks/__tests__/use-terminal-layout.test.ts +0 -675
  79. package/src/hooks/__tests__/use-timeout.test.ts +0 -330
  80. package/src/hooks/__tests__/use-usage-query.test.ts +0 -502
  81. package/src/hooks/__tests__/use-user-details-query.test.ts +0 -195
  82. package/src/hooks/helpers/__tests__/send-message.test.ts +0 -1918
  83. package/src/init/__tests__/init-direnv.test.ts +0 -526
  84. package/src/state/__tests__/chat-store-focus.test.ts +0 -22
  85. package/src/state/__tests__/feedback-store.test.ts +0 -257
  86. package/src/utils/__tests__/active-run.test.ts +0 -140
  87. package/src/utils/__tests__/activity-tracker.test.ts +0 -440
  88. package/src/utils/__tests__/agent-display.test.ts +0 -139
  89. package/src/utils/__tests__/analytics-client.test.ts +0 -262
  90. package/src/utils/__tests__/anonymous-id.test.ts +0 -74
  91. package/src/utils/__tests__/anvil-api.test.ts +0 -578
  92. package/src/utils/__tests__/anvil-instance-owner.test.ts +0 -69
  93. package/src/utils/__tests__/anvil-model-navigation.test.ts +0 -102
  94. package/src/utils/__tests__/anvil-premium-reset.test.ts +0 -79
  95. package/src/utils/__tests__/anvil-referral-cache.test.ts +0 -116
  96. package/src/utils/__tests__/anvil-session-api.test.ts +0 -215
  97. package/src/utils/__tests__/anvil-session-display.test.ts +0 -23
  98. package/src/utils/__tests__/anvil-streak-line.test.ts +0 -217
  99. package/src/utils/__tests__/arrays.test.ts +0 -264
  100. package/src/utils/__tests__/bash-context-processor.test.ts +0 -38
  101. package/src/utils/__tests__/block-processor.test.ts +0 -810
  102. package/src/utils/__tests__/chat-history.test.ts +0 -203
  103. package/src/utils/__tests__/chat-input-key-intercept.test.ts +0 -40
  104. package/src/utils/__tests__/chat-meta.test.ts +0 -130
  105. package/src/utils/__tests__/clipboard-linux.test.ts +0 -359
  106. package/src/utils/__tests__/clipboard.test.ts +0 -910
  107. package/src/utils/__tests__/code-search-summary.test.ts +0 -84
  108. package/src/utils/__tests__/collapse-helpers.test.ts +0 -1109
  109. package/src/utils/__tests__/error-handling.test.ts +0 -658
  110. package/src/utils/__tests__/exit-cleanly.test.ts +0 -110
  111. package/src/utils/__tests__/feedback-helpers.test.ts +0 -444
  112. package/src/utils/__tests__/feedback-submission.test.ts +0 -26
  113. package/src/utils/__tests__/fetch-usage.test.ts +0 -355
  114. package/src/utils/__tests__/fingerprint.test.ts +0 -144
  115. package/src/utils/__tests__/fixtures/terminal-command-broker-child.ts +0 -7
  116. package/src/utils/__tests__/fixtures/terminal-command-broker-entry.ts +0 -3
  117. package/src/utils/__tests__/fixtures/terminal-command-broker-owner.ts +0 -33
  118. package/src/utils/__tests__/format-elapsed-time.test.ts +0 -103
  119. package/src/utils/__tests__/format-timeout.test.ts +0 -87
  120. package/src/utils/__tests__/image-dimensions.test.ts +0 -249
  121. package/src/utils/__tests__/image-processor.test.ts +0 -209
  122. package/src/utils/__tests__/implementor-helpers.test.ts +0 -1458
  123. package/src/utils/__tests__/keyboard-actions.test.ts +0 -660
  124. package/src/utils/__tests__/layout-helpers.test.ts +0 -36
  125. package/src/utils/__tests__/lazy-response-ads.test.ts +0 -167
  126. package/src/utils/__tests__/log-shipper.test.ts +0 -53
  127. package/src/utils/__tests__/markdown-renderer.test.tsx +0 -421
  128. package/src/utils/__tests__/message-block-helpers.test.ts +0 -1263
  129. package/src/utils/__tests__/message-updater.test.ts +0 -645
  130. package/src/utils/__tests__/osc-timeout-scenarios.test.ts +0 -172
  131. package/src/utils/__tests__/pending-attachments.test.ts +0 -277
  132. package/src/utils/__tests__/polling-backoff.test.ts +0 -51
  133. package/src/utils/__tests__/queue-panel-actions.test.ts +0 -148
  134. package/src/utils/__tests__/run-state-storage.test.ts +0 -919
  135. package/src/utils/__tests__/safe-json.test.ts +0 -77
  136. package/src/utils/__tests__/sdk-event-handlers.test.ts +0 -685
  137. package/src/utils/__tests__/send-message-helpers.test.ts +0 -1898
  138. package/src/utils/__tests__/send-message-timer.test.ts +0 -64
  139. package/src/utils/__tests__/settings.test.ts +0 -99
  140. package/src/utils/__tests__/strings.test.ts +0 -192
  141. package/src/utils/__tests__/terminal-color-detection.test.ts +0 -425
  142. package/src/utils/__tests__/terminal-command-broker.test.ts +0 -528
  143. package/src/utils/__tests__/terminal-enter-detection.test.ts +0 -77
  144. package/src/utils/__tests__/terminal-io.test.ts +0 -137
  145. package/src/utils/__tests__/terminal-protocol-controller.test.ts +0 -119
  146. package/src/utils/__tests__/text-layout.test.ts +0 -82
  147. package/src/utils/__tests__/theme-platform-detection.test.ts +0 -125
  148. package/src/utils/__tests__/think-tag-parser.test.ts +0 -159
  149. package/src/utils/__tests__/trace-writer.test.ts +0 -223
  150. package/src/utils/__tests__/trim-chat-logs.test.ts +0 -78
  151. package/src/utils/__tests__/usage-banner-state.test.ts +0 -298
  152. package/src/utils/__tests__/validation-error-formatting.test.ts +0 -126
  153. package/src/utils/__tests__/windows-terminal-health.test.ts +0 -101
  154. package/src/utils/__tests__/write-file-atomic.test.ts +0 -127
  155. package/vendor/@anvil/common/src/__tests__/agent-validation.test.ts +0 -846
  156. package/vendor/@anvil/common/src/__tests__/anvil-model-availability.test.ts +0 -101
  157. package/vendor/@anvil/common/src/__tests__/anvil-models.test.ts +0 -1408
  158. package/vendor/@anvil/common/src/__tests__/anvil-public-data-use-copy.test.ts +0 -258
  159. package/vendor/@anvil/common/src/__tests__/anvil-referral-tiers.test.ts +0 -48
  160. package/vendor/@anvil/common/src/__tests__/anvil-spend-ceilings.test.ts +0 -282
  161. package/vendor/@anvil/common/src/__tests__/anvil-trust.test.ts +0 -526
  162. package/vendor/@anvil/common/src/__tests__/deepseek-direct.test.ts +0 -68
  163. package/vendor/@anvil/common/src/__tests__/disposable-email.test.ts +0 -132
  164. package/vendor/@anvil/common/src/__tests__/dynamic-agent-template-schema.test.ts +0 -422
  165. package/vendor/@anvil/common/src/__tests__/env-ci.test.ts +0 -167
  166. package/vendor/@anvil/common/src/__tests__/env-process.test.ts +0 -145
  167. package/vendor/@anvil/common/src/__tests__/foreign-client-shipped-agents.test.ts +0 -234
  168. package/vendor/@anvil/common/src/__tests__/foreign-client-signals.test.ts +0 -379
  169. package/vendor/@anvil/common/src/__tests__/free-agents.test.ts +0 -807
  170. package/vendor/@anvil/common/src/__tests__/gravity-capi.test.ts +0 -154
  171. package/vendor/@anvil/common/src/__tests__/handlesteps-parsing.test.ts +0 -246
  172. package/vendor/@anvil/common/src/__tests__/kimi-k3-god-only.test.ts +0 -77
  173. package/vendor/@anvil/common/src/__tests__/model-config.test.ts +0 -89
  174. package/vendor/@anvil/common/src/__tests__/project-file-tree.test.ts +0 -298
  175. package/vendor/@anvil/common/src/__tests__/provisioned-model-tiers.test.ts +0 -116
  176. package/vendor/@anvil/common/src/__tests__/reasoning-effort.test.ts +0 -167
  177. package/vendor/@anvil/common/src/__tests__/reddit-capi.test.ts +0 -132
  178. package/vendor/@anvil/common/src/__tests__/response-ad-positions.test.ts +0 -72
  179. package/vendor/@anvil/common/src/__tests__/user-state.test.ts +0 -30
  180. package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding-gate.test.ts +0 -63
  181. package/vendor/@anvil/common/src/constants/__tests__/anvil-onboarding.test.ts +0 -246
  182. package/vendor/@anvil/common/src/constants/__tests__/cf-worker-signals.test.ts +0 -106
  183. package/vendor/@anvil/common/src/testing/TESTING_PATTERNS.md +0 -351
  184. package/vendor/@anvil/common/src/testing/anvil-offer-invariants.ts +0 -169
  185. package/vendor/@anvil/common/src/testing/errors.ts +0 -33
  186. package/vendor/@anvil/common/src/testing/fixtures/agent-runtime.ts +0 -334
  187. package/vendor/@anvil/common/src/testing/impl/agent-runtime.ts +0 -6
  188. package/vendor/@anvil/common/src/testing/index.ts +0 -84
  189. package/vendor/@anvil/common/src/testing/mock-modules.ts +0 -53
  190. package/vendor/@anvil/common/src/testing/mock-types.ts +0 -123
  191. package/vendor/@anvil/common/src/testing/mocks/analytics.ts +0 -261
  192. package/vendor/@anvil/common/src/testing/mocks/child-process.ts +0 -93
  193. package/vendor/@anvil/common/src/testing/mocks/crypto.ts +0 -218
  194. package/vendor/@anvil/common/src/testing/mocks/database.ts +0 -337
  195. package/vendor/@anvil/common/src/testing/mocks/fetch.ts +0 -219
  196. package/vendor/@anvil/common/src/testing/mocks/filesystem.ts +0 -166
  197. package/vendor/@anvil/common/src/testing/mocks/index.ts +0 -101
  198. package/vendor/@anvil/common/src/testing/mocks/logger.ts +0 -135
  199. package/vendor/@anvil/common/src/testing/mocks/stream.ts +0 -313
  200. package/vendor/@anvil/common/src/testing/mocks/timers.ts +0 -132
  201. package/vendor/@anvil/common/src/testing/mocks/tree-sitter.ts +0 -127
  202. package/vendor/@anvil/common/src/testing/setup.ts +0 -282
  203. package/vendor/@anvil/common/src/tools/__tests__/compile-tool-definitions.test.ts +0 -34
  204. package/vendor/@anvil/common/src/tools/params/__tests__/coerce-to-array.test.ts +0 -213
  205. package/vendor/@anvil/common/src/tools/params/__tests__/read-docs.test.ts +0 -47
  206. package/vendor/@anvil/common/src/tools/params/__tests__/render-ui.test.ts +0 -65
  207. package/vendor/@anvil/common/src/tools/params/tool/__tests__/run-terminal-command-timeout.test.ts +0 -49
  208. package/vendor/@anvil/common/src/types/__tests__/dynamic-agent-template.test.ts +0 -20
  209. package/vendor/@anvil/common/src/util/__tests__/ad-user-agent.test.ts +0 -26
  210. package/vendor/@anvil/common/src/util/__tests__/analytics-dispatcher.test.ts +0 -122
  211. package/vendor/@anvil/common/src/util/__tests__/analytics-log.test.ts +0 -102
  212. package/vendor/@anvil/common/src/util/__tests__/analytics-sampling.test.ts +0 -143
  213. package/vendor/@anvil/common/src/util/__tests__/anvil-streak.test.ts +0 -202
  214. package/vendor/@anvil/common/src/util/__tests__/anvil-usage-summary.test.ts +0 -193
  215. package/vendor/@anvil/common/src/util/__tests__/axiom-only-log.test.ts +0 -140
  216. package/vendor/@anvil/common/src/util/__tests__/client-user-agent.test.ts +0 -148
  217. package/vendor/@anvil/common/src/util/__tests__/engagement-tracker.test.ts +0 -115
  218. package/vendor/@anvil/common/src/util/__tests__/env-file-path.test.ts +0 -57
  219. package/vendor/@anvil/common/src/util/__tests__/error-abort.test.ts +0 -774
  220. package/vendor/@anvil/common/src/util/__tests__/error-api-details.test.ts +0 -206
  221. package/vendor/@anvil/common/src/util/__tests__/file-read-limits.test.ts +0 -173
  222. package/vendor/@anvil/common/src/util/__tests__/format-code-search.test.ts +0 -60
  223. package/vendor/@anvil/common/src/util/__tests__/log-mirror.test.ts +0 -31
  224. package/vendor/@anvil/common/src/util/__tests__/messages.test.ts +0 -1252
  225. package/vendor/@anvil/common/src/util/__tests__/partial-json-delta.test.ts +0 -505
  226. package/vendor/@anvil/common/src/util/__tests__/path.test.ts +0 -22
  227. package/vendor/@anvil/common/src/util/__tests__/project-ignore.test.ts +0 -90
  228. package/vendor/@anvil/common/src/util/__tests__/promise.test.ts +0 -325
  229. package/vendor/@anvil/common/src/util/__tests__/rate-limit.test.ts +0 -28
  230. package/vendor/@anvil/common/src/util/__tests__/reddit-anvil-retention.test.ts +0 -130
  231. package/vendor/@anvil/common/src/util/__tests__/saxy.test.ts +0 -1008
  232. package/vendor/@anvil/common/src/util/__tests__/split-data.test.ts +0 -289
  233. package/vendor/@anvil/common/src/util/__tests__/string.test.ts +0 -239
  234. package/vendor/@anvil/common/src/util/__tests__/thread-title.test.ts +0 -70
  235. package/vendor/@anvil/common/src/util/__tests__/tool-result-media-order.test.ts +0 -108
  236. package/vendor/@anvil/common/src/util/__tests__/ttft-histogram.test.ts +0 -180
  237. package/vendor/@anvil/common/src/util/__tests__/with-timeout.test.ts +0 -24
  238. package/vendor/@anvil/common/src/util/__tests__/zoned-time.test.ts +0 -88
  239. package/vendor/@anvil/common/src/util/skills.test.ts +0 -44
  240. package/vendor/@anvil/sdk/dist/index.cjs.map +0 -440
  241. package/vendor/@anvil/sdk/dist/index.mjs.map +0 -440
@@ -15,7 +15,7 @@ export const getConfigDir = (): string => {
15
15
  return path.join(
16
16
  os.homedir(),
17
17
  '.config',
18
- 'manicode' +
18
+ 'anvil' +
19
19
  // on a development stack?
20
20
  (env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod'
21
21
  ? `-${env.NEXT_PUBLIC_CB_ENVIRONMENT}`
@@ -18,7 +18,13 @@
18
18
  * served by DeepSeek at all and falls back to the default DeepSeek model.
19
19
  */
20
20
 
21
- export const DEEPSEEK_BASE_URL = 'https://api.deepseek.com'
21
+ export const DEEPSEEK_BASE_URL = 'https://api.deepseek.com'
22
+
23
+ // The managed gateway is deployed with the CLI's Supabase project. Keep this
24
+ // public endpoint in the client so an installed CLI can run without a local
25
+ // .env file; authentication still comes from the user's stored Supabase JWT.
26
+ export const MANAGED_GATEWAY_URL =
27
+ 'https://tqolntrdmbbaptmxihtq.supabase.co/functions/v1/cli-agent'
22
28
 
23
29
  /** Model name sent to DeepSeek for ids that are not a DeepSeek lane model. */
24
30
  export const DEFAULT_DIRECT_DEEPSEEK_MODEL = 'deepseek-v4-pro'
@@ -31,6 +37,29 @@ export const getDirectDeepSeekApiKey = (): string | undefined =>
31
37
  export const isDirectDeepSeekMode = (): boolean =>
32
38
  Boolean(getDirectDeepSeekApiKey())
33
39
 
40
+ /**
41
+ * Managed gateway mode ("no direct mode"): the CLI routes every model call
42
+ * through the Anvil managed gateway (the Supabase `cli-agent` Edge Function)
43
+ * instead of calling a provider directly. The gateway holds the provider key,
44
+ * injects the private system prompt server-side, and meters credits — so the
45
+ * brain and the key never ship in the client.
46
+ *
47
+ * Enabled whenever a gateway URL is configured: `ANVIL_GATEWAY_URL` wins,
48
+ * otherwise it is derived from `SUPABASE_URL` / `NEXT_PUBLIC_SUPABASE_URL`.
49
+ * When on, it takes precedence over direct mode, and the CLI uses a local run
50
+ * identity (no external account backend is required).
51
+ */
52
+ export const getManagedGatewayUrl = (): string | undefined => {
53
+ // ANVIL_GATEWAY_URL remains an escape hatch for development and tests, but
54
+ // production installs must not depend on a locally supplied environment.
55
+ const explicit = process.env.ANVIL_GATEWAY_URL?.trim()
56
+ return (explicit || MANAGED_GATEWAY_URL).replace(/\/+$/, '')
57
+ }
58
+
59
+ /** True when the managed gateway is configured (see {@link getManagedGatewayUrl}). */
60
+ export const isManagedGatewayMode = (): boolean =>
61
+ Boolean(getManagedGatewayUrl())
62
+
34
63
  /** Map a Codebuff model ID to the model name DeepSeek's API accepts. */
35
64
  export function remapModelForDirectDeepSeek(model: string): string {
36
65
  const override = process.env.DEEPSEEK_MODEL
@@ -1,9 +1,10 @@
1
1
  import * as ignore from 'ignore'
2
2
 
3
3
  export const PROJECT_IGNORE_FILES = [
4
- '.gitignore',
5
- '.anvilignore',
6
- '.manicodeignore',
4
+ '.gitignore',
5
+ '.anvilignore',
6
+ // Legacy name retained so existing projects keep their ignore rules.
7
+ '.manicodeignore',
7
8
  // Legacy: respect ignore files created by pre-Anvil installs.
8
9
  '.codebuffignore',
9
10
  ] as const
@@ -34580,9 +34580,15 @@ var handleGlob = async (params) => {
34580
34580
 
34581
34581
  // ../common/src/constants/deepseek-direct.ts
34582
34582
  var DEEPSEEK_BASE_URL = "https://api.deepseek.com";
34583
+ var MANAGED_GATEWAY_URL = "https://tqolntrdmbbaptmxihtq.supabase.co/functions/v1/cli-agent";
34583
34584
  var DEFAULT_DIRECT_DEEPSEEK_MODEL = "deepseek-v4-pro";
34584
34585
  var getDirectDeepSeekApiKey = () => process.env.DEEPSEEK_API_KEY;
34585
34586
  var isDirectDeepSeekMode = () => Boolean(getDirectDeepSeekApiKey());
34587
+ var getManagedGatewayUrl = () => {
34588
+ const explicit = process.env.ANVIL_GATEWAY_URL?.trim();
34589
+ return (explicit || MANAGED_GATEWAY_URL).replace(/\/+$/, "");
34590
+ };
34591
+ var isManagedGatewayMode = () => Boolean(getManagedGatewayUrl());
34586
34592
  function remapModelForDirectDeepSeek(model) {
34587
34593
  const override = process.env.DEEPSEEK_MODEL;
34588
34594
  if (override)
@@ -39820,6 +39826,7 @@ async function loopAgentSteps(params) {
39820
39826
  let totalSteps = 0;
39821
39827
  let llmStepNumber = 0;
39822
39828
  let nResponses = undefined;
39829
+ const isSimpleGreeting = (value) => typeof value === "string" && /^(hi|hey|hello|hiya|good morning|good afternoon|good evening)[!.? ]*$/i.test(value.trim());
39823
39830
  try {
39824
39831
  while (true) {
39825
39832
  totalSteps++;
@@ -39840,7 +39847,7 @@ async function loopAgentSteps(params) {
39840
39847
  const messagesWithStepPrompt = buildArray(...currentAgentState.messageHistory, stepPrompt && userMessage({
39841
39848
  content: stepPrompt
39842
39849
  }));
39843
- const estimateContextTokensLocally = () => countTokensMessages(messagesWithStepPrompt) + countTokens2(system) + countTokensJson(toolsForTokenCount);
39850
+ const estimateContextTokensLocally = () => countTokensMessages(messagesWithStepPrompt) + countTokens2(system) + countTokensJson(isSimpleGreeting([...currentAgentState.messageHistory].reverse().find((message) => message.role === "user")?.content) ? [] : toolsForTokenCount);
39844
39851
  currentAgentState.contextTokenCount = estimateContextTokensLocally();
39845
39852
  if (agentTemplate.compactContext) {
39846
39853
  const compacted = maybeCompactHistory({
@@ -45416,7 +45423,7 @@ async function fetchWithRetry(url2, options, logger2) {
45416
45423
  }
45417
45424
  async function getUserInfoFromApiKey(params) {
45418
45425
  const { apiKey, fields, logger: logger2 } = params;
45419
- if (isDirectDeepSeekMode()) {
45426
+ if (isDirectDeepSeekMode() || isManagedGatewayMode()) {
45420
45427
  const localUser = {
45421
45428
  id: "local-deepseek",
45422
45429
  email: "local@deepseek.local"
@@ -45538,7 +45545,7 @@ async function fetchAgentFromDatabase(params) {
45538
45545
  }
45539
45546
  async function startAgentRun(params) {
45540
45547
  const { apiKey, userId, agentId, ancestorRunIds, logger: logger2 } = params;
45541
- if (isDirectDeepSeekMode()) {
45548
+ if (isDirectDeepSeekMode() || isManagedGatewayMode()) {
45542
45549
  return `local-${crypto.randomUUID()}`;
45543
45550
  }
45544
45551
  const url2 = new URL(`/api/v1/agent-runs`, getWebsiteUrl());
@@ -45598,7 +45605,7 @@ async function finishAgentRun(params) {
45598
45605
  } = params;
45599
45606
  const steps = pendingAgentSteps.get(runId) ?? [];
45600
45607
  pendingAgentSteps.delete(runId);
45601
- if (isDirectDeepSeekMode()) {
45608
+ if (isDirectDeepSeekMode() || isManagedGatewayMode()) {
45602
45609
  return;
45603
45610
  }
45604
45611
  const url2 = new URL(`/api/v1/agent-runs`, getWebsiteUrl());
@@ -47583,8 +47590,13 @@ function fetchWithRetryableNetworkErrors(...args) {
47583
47590
  function getModelForRequest({
47584
47591
  apiKey,
47585
47592
  model,
47586
- userId
47593
+ userId,
47594
+ agentId
47587
47595
  }) {
47596
+ const gatewayUrl = getManagedGatewayUrl();
47597
+ if (gatewayUrl) {
47598
+ return getGatewayModel({ apiKey, model, userId, agentId, gatewayUrl });
47599
+ }
47588
47600
  const directDeepSeekApiKey = getDirectDeepSeekApiKey();
47589
47601
  if (directDeepSeekApiKey) {
47590
47602
  return getDeepSeekDirectModel({
@@ -47643,6 +47655,27 @@ function getModelForRequest({
47643
47655
  supportsStructuredOutputs: true
47644
47656
  });
47645
47657
  }
47658
+ function getGatewayModel({
47659
+ apiKey,
47660
+ model,
47661
+ userId,
47662
+ agentId,
47663
+ gatewayUrl
47664
+ }) {
47665
+ return new OpenAICompatibleChatLanguageModel(model, {
47666
+ provider: "anvil",
47667
+ url: ({ path: endpoint }) => `${gatewayUrl}${endpoint.startsWith("/") ? endpoint : `/${endpoint}`}`,
47668
+ headers: () => ({
47669
+ Authorization: `Bearer ${apiKey}`,
47670
+ "user-agent": `ai-sdk/openai-compatible/${VERSION2}/anvil-cli`,
47671
+ ...agentId ? { "x-anvil-agent": agentId } : {},
47672
+ ...userId ? { [ANVIL_ACTING_USER_HEADER]: userId } : {}
47673
+ }),
47674
+ supportsStructuredOutputs: false,
47675
+ fetch: fetchWithRetryableNetworkErrors,
47676
+ includeUsage: undefined
47677
+ });
47678
+ }
47646
47679
  function getDeepSeekDirectModel({
47647
47680
  apiKey,
47648
47681
  model
@@ -47804,7 +47837,8 @@ async function* promptAiSdkStream(params) {
47804
47837
  const aiSDKModel = getModelForRequest({
47805
47838
  apiKey: params.apiKey,
47806
47839
  model: params.model,
47807
- userId: params.userId
47840
+ userId: params.userId,
47841
+ agentId: params.agentId
47808
47842
  });
47809
47843
  const response = import_ai3.streamText({
47810
47844
  ...streamParams,
@@ -48128,7 +48162,8 @@ async function promptAiSdk(params) {
48128
48162
  const aiSDKModel = getModelForRequest({
48129
48163
  apiKey: params.apiKey,
48130
48164
  model: params.model,
48131
- userId: params.userId
48165
+ userId: params.userId,
48166
+ agentId: params.agentId
48132
48167
  });
48133
48168
  const response = await import_ai3.generateText({
48134
48169
  ...params,
@@ -48181,7 +48216,8 @@ async function promptAiSdkStructured(params) {
48181
48216
  const aiSDKModel = getModelForRequest({
48182
48217
  apiKey: params.apiKey,
48183
48218
  model: params.model,
48184
- userId: params.userId
48219
+ userId: params.userId,
48220
+ agentId: params.agentId
48185
48221
  });
48186
48222
  const response = await import_ai3.generateText({
48187
48223
  ...params,
@@ -52127,7 +52163,7 @@ var userFromJson = (json) => {
52127
52163
  };
52128
52164
  var getConfigDir = (clientEnv = env) => {
52129
52165
  const envSuffix = clientEnv.NEXT_PUBLIC_CB_ENVIRONMENT && clientEnv.NEXT_PUBLIC_CB_ENVIRONMENT !== "prod" ? `-${clientEnv.NEXT_PUBLIC_CB_ENVIRONMENT}` : "";
52130
- return import_node_path2.default.join(import_os5.default.homedir(), ".config", `manicode${envSuffix}`);
52166
+ return import_node_path2.default.join(import_os5.default.homedir(), ".config", `anvil${envSuffix}`);
52131
52167
  };
52132
52168
  var getCredentialsPath = (clientEnv = env) => {
52133
52169
  return import_node_path2.default.join(getConfigDir(clientEnv), "credentials.json");
@@ -52293,5 +52329,5 @@ function setTreeSitterWasmPath2(wasmPath) {
52293
52329
  setTreeSitterWasmPath(wasmPath);
52294
52330
  }
52295
52331
 
52296
- //# debugId=68626CF23310DED964756E2164756E21
52332
+ //# debugId=5C15E7A7E1B3AA1764756E2164756E21
52297
52333
  //# sourceMappingURL=index.cjs.map
@@ -34497,9 +34497,15 @@ var handleGlob = async (params) => {
34497
34497
 
34498
34498
  // ../common/src/constants/deepseek-direct.ts
34499
34499
  var DEEPSEEK_BASE_URL = "https://api.deepseek.com";
34500
+ var MANAGED_GATEWAY_URL = "https://tqolntrdmbbaptmxihtq.supabase.co/functions/v1/cli-agent";
34500
34501
  var DEFAULT_DIRECT_DEEPSEEK_MODEL = "deepseek-v4-pro";
34501
34502
  var getDirectDeepSeekApiKey = () => process.env.DEEPSEEK_API_KEY;
34502
34503
  var isDirectDeepSeekMode = () => Boolean(getDirectDeepSeekApiKey());
34504
+ var getManagedGatewayUrl = () => {
34505
+ const explicit = process.env.ANVIL_GATEWAY_URL?.trim();
34506
+ return (explicit || MANAGED_GATEWAY_URL).replace(/\/+$/, "");
34507
+ };
34508
+ var isManagedGatewayMode = () => Boolean(getManagedGatewayUrl());
34503
34509
  function remapModelForDirectDeepSeek(model) {
34504
34510
  const override = process.env.DEEPSEEK_MODEL;
34505
34511
  if (override)
@@ -39737,6 +39743,7 @@ async function loopAgentSteps(params) {
39737
39743
  let totalSteps = 0;
39738
39744
  let llmStepNumber = 0;
39739
39745
  let nResponses = undefined;
39746
+ const isSimpleGreeting = (value) => typeof value === "string" && /^(hi|hey|hello|hiya|good morning|good afternoon|good evening)[!.? ]*$/i.test(value.trim());
39740
39747
  try {
39741
39748
  while (true) {
39742
39749
  totalSteps++;
@@ -39757,7 +39764,7 @@ async function loopAgentSteps(params) {
39757
39764
  const messagesWithStepPrompt = buildArray(...currentAgentState.messageHistory, stepPrompt && userMessage({
39758
39765
  content: stepPrompt
39759
39766
  }));
39760
- const estimateContextTokensLocally = () => countTokensMessages(messagesWithStepPrompt) + countTokens2(system) + countTokensJson(toolsForTokenCount);
39767
+ const estimateContextTokensLocally = () => countTokensMessages(messagesWithStepPrompt) + countTokens2(system) + countTokensJson(isSimpleGreeting([...currentAgentState.messageHistory].reverse().find((message) => message.role === "user")?.content) ? [] : toolsForTokenCount);
39761
39768
  currentAgentState.contextTokenCount = estimateContextTokensLocally();
39762
39769
  if (agentTemplate.compactContext) {
39763
39770
  const compacted = maybeCompactHistory({
@@ -45333,7 +45340,7 @@ async function fetchWithRetry(url2, options, logger2) {
45333
45340
  }
45334
45341
  async function getUserInfoFromApiKey(params) {
45335
45342
  const { apiKey, fields, logger: logger2 } = params;
45336
- if (isDirectDeepSeekMode()) {
45343
+ if (isDirectDeepSeekMode() || isManagedGatewayMode()) {
45337
45344
  const localUser = {
45338
45345
  id: "local-deepseek",
45339
45346
  email: "local@deepseek.local"
@@ -45455,7 +45462,7 @@ async function fetchAgentFromDatabase(params) {
45455
45462
  }
45456
45463
  async function startAgentRun(params) {
45457
45464
  const { apiKey, userId, agentId, ancestorRunIds, logger: logger2 } = params;
45458
- if (isDirectDeepSeekMode()) {
45465
+ if (isDirectDeepSeekMode() || isManagedGatewayMode()) {
45459
45466
  return `local-${crypto.randomUUID()}`;
45460
45467
  }
45461
45468
  const url2 = new URL(`/api/v1/agent-runs`, getWebsiteUrl());
@@ -45515,7 +45522,7 @@ async function finishAgentRun(params) {
45515
45522
  } = params;
45516
45523
  const steps = pendingAgentSteps.get(runId) ?? [];
45517
45524
  pendingAgentSteps.delete(runId);
45518
- if (isDirectDeepSeekMode()) {
45525
+ if (isDirectDeepSeekMode() || isManagedGatewayMode()) {
45519
45526
  return;
45520
45527
  }
45521
45528
  const url2 = new URL(`/api/v1/agent-runs`, getWebsiteUrl());
@@ -47511,8 +47518,13 @@ function fetchWithRetryableNetworkErrors(...args) {
47511
47518
  function getModelForRequest({
47512
47519
  apiKey,
47513
47520
  model,
47514
- userId
47521
+ userId,
47522
+ agentId
47515
47523
  }) {
47524
+ const gatewayUrl = getManagedGatewayUrl();
47525
+ if (gatewayUrl) {
47526
+ return getGatewayModel({ apiKey, model, userId, agentId, gatewayUrl });
47527
+ }
47516
47528
  const directDeepSeekApiKey = getDirectDeepSeekApiKey();
47517
47529
  if (directDeepSeekApiKey) {
47518
47530
  return getDeepSeekDirectModel({
@@ -47571,6 +47583,27 @@ function getModelForRequest({
47571
47583
  supportsStructuredOutputs: true
47572
47584
  });
47573
47585
  }
47586
+ function getGatewayModel({
47587
+ apiKey,
47588
+ model,
47589
+ userId,
47590
+ agentId,
47591
+ gatewayUrl
47592
+ }) {
47593
+ return new OpenAICompatibleChatLanguageModel(model, {
47594
+ provider: "anvil",
47595
+ url: ({ path: endpoint }) => `${gatewayUrl}${endpoint.startsWith("/") ? endpoint : `/${endpoint}`}`,
47596
+ headers: () => ({
47597
+ Authorization: `Bearer ${apiKey}`,
47598
+ "user-agent": `ai-sdk/openai-compatible/${VERSION2}/anvil-cli`,
47599
+ ...agentId ? { "x-anvil-agent": agentId } : {},
47600
+ ...userId ? { [ANVIL_ACTING_USER_HEADER]: userId } : {}
47601
+ }),
47602
+ supportsStructuredOutputs: false,
47603
+ fetch: fetchWithRetryableNetworkErrors,
47604
+ includeUsage: undefined
47605
+ });
47606
+ }
47574
47607
  function getDeepSeekDirectModel({
47575
47608
  apiKey,
47576
47609
  model
@@ -47732,7 +47765,8 @@ async function* promptAiSdkStream(params) {
47732
47765
  const aiSDKModel = getModelForRequest({
47733
47766
  apiKey: params.apiKey,
47734
47767
  model: params.model,
47735
- userId: params.userId
47768
+ userId: params.userId,
47769
+ agentId: params.agentId
47736
47770
  });
47737
47771
  const response = streamText({
47738
47772
  ...streamParams,
@@ -48056,7 +48090,8 @@ async function promptAiSdk(params) {
48056
48090
  const aiSDKModel = getModelForRequest({
48057
48091
  apiKey: params.apiKey,
48058
48092
  model: params.model,
48059
- userId: params.userId
48093
+ userId: params.userId,
48094
+ agentId: params.agentId
48060
48095
  });
48061
48096
  const response = await generateText({
48062
48097
  ...params,
@@ -48109,7 +48144,8 @@ async function promptAiSdkStructured(params) {
48109
48144
  const aiSDKModel = getModelForRequest({
48110
48145
  apiKey: params.apiKey,
48111
48146
  model: params.model,
48112
- userId: params.userId
48147
+ userId: params.userId,
48148
+ agentId: params.agentId
48113
48149
  });
48114
48150
  const response = await generateText({
48115
48151
  ...params,
@@ -52055,7 +52091,7 @@ var userFromJson = (json) => {
52055
52091
  };
52056
52092
  var getConfigDir = (clientEnv = env) => {
52057
52093
  const envSuffix = clientEnv.NEXT_PUBLIC_CB_ENVIRONMENT && clientEnv.NEXT_PUBLIC_CB_ENVIRONMENT !== "prod" ? `-${clientEnv.NEXT_PUBLIC_CB_ENVIRONMENT}` : "";
52058
- return path22.join(os8.homedir(), ".config", `manicode${envSuffix}`);
52094
+ return path22.join(os8.homedir(), ".config", `anvil${envSuffix}`);
52059
52095
  };
52060
52096
  var getCredentialsPath = (clientEnv = env) => {
52061
52097
  return path22.join(getConfigDir(clientEnv), "credentials.json");
@@ -52286,5 +52322,5 @@ export {
52286
52322
  ANVIL_BINARY
52287
52323
  };
52288
52324
 
52289
- //# debugId=E0C66561A06A653864756E2164756E21
52325
+ //# debugId=B50622D584101C2364756E2164756E21
52290
52326
  //# sourceMappingURL=index.mjs.map
@@ -1,56 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
-
3
- describe('anvil command aliases', () => {
4
- test('/model aliases /end-session in anvil', () => {
5
- const slashCommandsUrl = new URL(
6
- '../../data/slash-commands.ts',
7
- import.meta.url,
8
- ).href
9
- const commandRegistryUrl = new URL(
10
- '../command-registry.ts',
11
- import.meta.url,
12
- ).href
13
-
14
- const result = Bun.spawnSync({
15
- cmd: [
16
- 'bun',
17
- '--eval',
18
- `
19
- import { SLASH_COMMANDS } from ${JSON.stringify(slashCommandsUrl)}
20
- import { findCommand } from ${JSON.stringify(commandRegistryUrl)}
21
-
22
- const endSession = SLASH_COMMANDS.find((cmd) => cmd.id === 'end-session')
23
- if (!endSession) throw new Error('end-session slash command missing')
24
- if (!endSession.aliases?.includes('model')) {
25
- throw new Error('end-session slash command is missing model alias')
26
- }
27
-
28
- const modelCommand = findCommand('model')
29
- if (!modelCommand) throw new Error('model command alias missing')
30
- if (modelCommand.name !== 'end-session') {
31
- throw new Error('model alias did not resolve to end-session')
32
- }
33
- `,
34
- ],
35
- cwd: process.cwd(),
36
- env: {
37
- ...process.env,
38
- ANVIL_MODE: 'true',
39
- NODE_ENV: 'test',
40
- NEXT_PUBLIC_CB_ENVIRONMENT: 'test',
41
- NEXT_PUBLIC_ANVIL_APP_URL: 'https://app.codebuff.test',
42
- NEXT_PUBLIC_SUPPORT_EMAIL: 'support@codebuff.test',
43
- NEXT_PUBLIC_POSTHOG_API_KEY: 'phc_test_key',
44
- NEXT_PUBLIC_POSTHOG_HOST_URL: 'https://posthog.codebuff.test',
45
- NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: 'pk_test_123',
46
- NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL: 'https://stripe.codebuff.test',
47
- NEXT_PUBLIC_WEB_PORT: '3000',
48
- },
49
- stderr: 'pipe',
50
- stdout: 'pipe',
51
- })
52
-
53
- const stderr = new TextDecoder().decode(result.stderr)
54
- expect(result.exitCode, stderr).toBe(0)
55
- }, 15_000)
56
- })