@desplega.ai/agent-swarm 1.106.0 → 1.107.1

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 (137) hide show
  1. package/README.md +3 -3
  2. package/dist/{actions-pk6xqa2y.js → actions-0a8stf21.js} +7 -7
  3. package/dist/{app-pmfvefkh.js → app-bzfks2d1.js} +5 -4
  4. package/dist/{artifact-12d91qnq.js → artifact-0874w6js.js} +2 -1
  5. package/dist/{assistant-wcjpqxk6.js → assistant-609ad3tq.js} +12 -11
  6. package/dist/{boot-reembed-atv4kcrh.js → boot-reembed-b0e34fya.js} +3 -3
  7. package/dist/{boot-reembed-zanbm36c.js → boot-reembed-zkxqahga.js} +4 -4
  8. package/dist/{boot-scrub-logs-asq051ff.js → boot-scrub-logs-b8rr0zdz.js} +2 -2
  9. package/dist/{claude-adapter-w96mzan4.js → claude-adapter-hw0wsvpj.js} +2 -1
  10. package/dist/{claude-managed-setup-t0wkvzgz.js → claude-managed-setup-yhbcx0bz.js} +1 -1
  11. package/dist/{cli-6xn2xv4r.js → cli-07ztw3qw.js} +199 -16
  12. package/dist/{cli-p7hff99g.js → cli-0fvvg222.js} +3 -3
  13. package/dist/{cli-dqhz8451.js → cli-4r9m8f3t.js} +10 -1
  14. package/dist/{cli-rp5kaak8.js → cli-6k4tfbz1.js} +21 -13
  15. package/dist/{cli-39jaysbv.js → cli-6x9842b5.js} +20 -3
  16. package/dist/cli-7wmybrt5.js +115 -0
  17. package/dist/{cli-84gyjn6h.js → cli-85dpqvhe.js} +337 -335
  18. package/dist/{cli-842gfjn1.js → cli-a5y6jw3y.js} +2 -2
  19. package/dist/{cli-4wmnp8q3.js → cli-amncg1dq.js} +108 -21
  20. package/dist/{cli-j1172z85.js → cli-bbywzv1h.js} +50 -24
  21. package/dist/{cli-q44nxhwq.js → cli-bk526b46.js} +29 -3
  22. package/dist/{cli-6hqvenfv.js → cli-byh4fpv6.js} +1 -1
  23. package/dist/{cli-wfhe4tgs.js → cli-cddy6663.js} +1 -1
  24. package/dist/{cli-n38fcvhe.js → cli-ft53b49j.js} +1105 -18
  25. package/dist/{cli-qtr61agf.js → cli-g9jtrzqn.js} +5 -4
  26. package/dist/{cli-6kqcg4zv.js → cli-hv2fndhm.js} +4 -1
  27. package/dist/{cli-8da61htc.js → cli-kc3h8mnm.js} +1 -1
  28. package/dist/{cli-tfcrm7ds.js → cli-khcv8aqa.js} +1 -1
  29. package/dist/{cli-8fhhmzbh.js → cli-kjfs7t6m.js} +1 -1
  30. package/dist/{cli-50nss8e8.js → cli-m3enfr8q.js} +3 -3
  31. package/dist/{cli-v90vvqt8.js → cli-nbbsaxgb.js} +248 -50
  32. package/dist/{cli-xgssgdqn.js → cli-njbznqnh.js} +1 -1
  33. package/dist/{cli-sp3c9fwf.js → cli-pe7daxs4.js} +2 -2
  34. package/dist/{cli-h9k3grhx.js → cli-pwfsqc2x.js} +1 -1
  35. package/dist/{cli-anrn8brw.js → cli-qd6pvqyx.js} +33 -14
  36. package/dist/{cli-f7ypwjgh.js → cli-qr5dg0hn.js} +1 -1
  37. package/dist/{cli-hmqkes02.js → cli-r28xcyhw.js} +1 -1
  38. package/dist/{cli-fete3y1e.js → cli-rkndnn90.js} +4 -1
  39. package/dist/{cli-08fnz4jm.js → cli-sh7cxxef.js} +101 -43
  40. package/dist/{cli-4fwzc50f.js → cli-ssrekyyz.js} +2 -2
  41. package/dist/cli-tkmm5nf9.js +4178 -0
  42. package/dist/{cli-ygcrdkqt.js → cli-vbraamxr.js} +5 -2
  43. package/dist/{cli-pxddwmyc.js → cli-vg4rpzka.js} +1 -1
  44. package/dist/{cli-xvs40j7w.js → cli-vpy2ykv9.js} +4 -4
  45. package/dist/{cli-6n1nnzm7.js → cli-wx82tw1k.js} +1 -1
  46. package/dist/{cli-k7gt5r0p.js → cli-ykd4a9nc.js} +1 -1
  47. package/dist/cli.js +36 -18
  48. package/dist/{codex-adapter-h9rj59tj.js → codex-adapter-sdqdznk1.js} +6 -3
  49. package/dist/{codex-login-27ea9qfw.js → codex-login-4sywkz6v.js} +1 -1
  50. package/dist/{codex-session-runner-2ybavr0w.js → codex-session-runner-t8jgxf6c.js} +4 -3
  51. package/dist/{commands-075ak6vf.js → commands-d0taq40d.js} +2 -2
  52. package/dist/{db-60fj8j7t.js → db-vtvke5z0.js} +17 -3
  53. package/dist/{e2b-jy6t336w.js → e2b-xb3rhzb1.js} +2 -2
  54. package/dist/{google-generative-ai-rf42vj2h.js → google-generative-ai-vfq6ymz9.js} +1 -1
  55. package/dist/{google-vertex-m92pj5fb.js → google-vertex-mj5y5rfj.js} +1 -1
  56. package/dist/{handlers-96j9z4gk.js → handlers-mezjqnv9.js} +12 -11
  57. package/dist/{hook-f58wyvmy.js → hook-93j171n5.js} +3 -3
  58. package/dist/{http-naqhj1n0.js → http-p6cd3qsn.js} +434 -137
  59. package/dist/index-516gja9z.js +30 -0
  60. package/dist/{index-py84s5en.js → index-5n2c8yay.js} +2 -1
  61. package/dist/{index-f5e873a5.js → index-jzcmg0v3.js} +9 -10
  62. package/dist/{index-v3r40ak0.js → index-qd5zq03s.js} +12 -14
  63. package/dist/{index-jscerv2x.js → index-sehyj6pr.js} +6 -6
  64. package/dist/{keepalive-8gbgeg21.js → keepalive-e6f2s1gm.js} +4 -4
  65. package/dist/{lead-hj6stakm.js → lead-7d5kjkha.js} +26 -25
  66. package/dist/{maintenance-1nvd0jva.js → maintenance-yzwmptty.js} +4 -4
  67. package/dist/{onboard-8myqe0jh.js → onboard-bgfn21x5.js} +4 -4
  68. package/dist/{opencode-adapter-p2w6efwc.js → opencode-adapter-5jxw9cv8.js} +2 -1
  69. package/dist/{otel-impl-tddx9x81.js → otel-impl-z0s291n2.js} +5 -2
  70. package/dist/{pi-mono-adapter-y037wnp4.js → pi-mono-adapter-e1dn8qh3.js} +67 -55
  71. package/dist/{pricing-refresh-f6cgj5br.js → pricing-refresh-9gsbd6k9.js} +4 -4
  72. package/dist/{seed-pricing-3tqmbe0p.js → seed-pricing-037064at.js} +3 -3
  73. package/dist/{setup-tq3ept9k.js → setup-y9110edr.js} +4 -4
  74. package/dist/{worker-526psbtb.js → worker-v2wr6ffm.js} +26 -25
  75. package/openapi.json +302 -7
  76. package/package.json +20 -3
  77. package/src/be/db.ts +297 -10
  78. package/src/be/migrations/103_schedule_target_type.sql +79 -0
  79. package/src/be/migrations/104_task_reasoning_effort.sql +1 -0
  80. package/src/be/migrations/105_user_favorites.sql +18 -0
  81. package/src/commands/provider-credentials.ts +10 -1
  82. package/src/commands/runner.ts +57 -2
  83. package/src/heartbeat/heartbeat.ts +8 -1
  84. package/src/http/agents.ts +76 -16
  85. package/src/http/favorites.ts +98 -0
  86. package/src/http/index.ts +5 -1
  87. package/src/http/oauth-locks.ts +90 -0
  88. package/src/http/pages-public.ts +1 -0
  89. package/src/http/pages.ts +49 -5
  90. package/src/http/schedules.ts +109 -63
  91. package/src/http/stats.ts +13 -1
  92. package/src/http/tasks.ts +3 -0
  93. package/src/http/workflows.ts +16 -4
  94. package/src/linear/sync.ts +75 -3
  95. package/src/providers/claude-adapter.ts +13 -0
  96. package/src/providers/codex-adapter.ts +75 -11
  97. package/src/providers/codex-oauth/auth-json-fs.ts +9 -1
  98. package/src/providers/codex-oauth/auth-json.ts +24 -2
  99. package/src/providers/codex-oauth/storage.ts +184 -23
  100. package/src/providers/modelsdev-reasoning.json +4034 -0
  101. package/src/providers/opencode-adapter.ts +38 -1
  102. package/src/providers/pi-mono-adapter.ts +21 -3
  103. package/src/providers/reasoning-effort.ts +299 -0
  104. package/src/providers/types.ts +18 -0
  105. package/src/scheduler/index.ts +8 -1
  106. package/src/scheduler/scheduler.test.ts +1 -0
  107. package/src/scheduler/scheduler.ts +144 -53
  108. package/src/tests/agents-harness-provider.test.ts +294 -0
  109. package/src/tests/agents-list-model-display.test.ts +7 -0
  110. package/src/tests/claude-adapter.test.ts +65 -1
  111. package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +406 -0
  112. package/src/tests/codex-adapter.test.ts +40 -0
  113. package/src/tests/codex-oauth-refresh-lock.test.ts +321 -0
  114. package/src/tests/codex-oauth-storage.test.ts +20 -1
  115. package/src/tests/context-key-db.test.ts +55 -1
  116. package/src/tests/credential-status-routing.test.ts +57 -0
  117. package/src/tests/favorites.test.ts +162 -0
  118. package/src/tests/heartbeat.test.ts +17 -0
  119. package/src/tests/linear-webhook.test.ts +34 -1
  120. package/src/tests/model-control.test.ts +136 -0
  121. package/src/tests/opencode-adapter.test.ts +55 -0
  122. package/src/tests/pages-public-html.test.ts +6 -0
  123. package/src/tests/pages-versioning.test.ts +2 -2
  124. package/src/tests/pi-mono-adapter.test.ts +68 -2
  125. package/src/tests/reasoning-effort.test.ts +203 -0
  126. package/src/tests/schedule-target-type.test.ts +472 -0
  127. package/src/tests/scheduled-tasks-api.test.ts +20 -14
  128. package/src/tests/send-task-requested-by.test.ts +26 -0
  129. package/src/tests/workflow-agent-task.test.ts +2 -0
  130. package/src/tools/schedules/create-schedule.ts +85 -4
  131. package/src/tools/schedules/update-schedule.ts +81 -2
  132. package/src/tools/send-task.ts +27 -3
  133. package/src/tools/task-action.ts +5 -0
  134. package/src/types.ts +62 -1
  135. package/src/workflows/executors/agent-task.ts +8 -1
  136. package/dist/cli-v9853xza.js +0 -1112
  137. package/dist/index-45bqm6xc.js +0 -21
package/README.md CHANGED
@@ -126,12 +126,12 @@ Check [our templates](https://templates.agent-swarm.dev) for a quick start.
126
126
  - **Hybrid memory recall + in-place edits** — memory retrieval can blend vector and full-text ranking, and agents can correct an existing memory without losing its ID or history. [Memory →](https://docs.agent-swarm.dev/docs/architecture/memory) · [MCP tools →](https://docs.agent-swarm.dev/docs/reference/mcp-tools#memory-tools)
127
127
  - **Multi-channel inputs** — Slack, GitHub, GitLab, email, WhatsApp, Linear, Jira, and the HTTP API all create tasks. [Integrations](#integrations)
128
128
  - **Workflow engine with Human-in-the-Loop** — DAG-based automation with approval gates, retries, and structured I/O. [Workflows →](https://docs.agent-swarm.dev/docs/concepts/workflows)
129
- - **Scheduled & recurring tasks** — cron-based automation for standing work. [Scheduling →](https://docs.agent-swarm.dev/docs/concepts/scheduling)
129
+ - **Scheduled & recurring tasks** — cron-based automation for standing work, with schedules that can target agent tasks, workflows, or catalog scripts. [Scheduling →](https://docs.agent-swarm.dev/docs/concepts/scheduling)
130
130
  - **Durable script workflows** — launch background script runs, inspect their journals, and track them from the dashboard when a one-shot `script-run` is too small. [Guide →](https://docs.agent-swarm.dev/docs/guides/script-workflow-runs)
131
131
  - **Scripts as external APIs** — expose a saved script as a public `POST /api/x/script/<id>` endpoint with optional bearer auth, typed input validation, and per-endpoint usage tracking. [Guide →](https://docs.agent-swarm.dev/docs/guides/scripts-external-apis)
132
132
  - **Typed script API connections** — lead-managed OpenAPI connections let scripts call approved external APIs through generated `ctx.api.*` clients while credential bindings keep raw secrets out of source and args. [Guide →](https://docs.agent-swarm.dev/docs/guides/scripts-credential-broker)
133
133
  - **E2B-backed eval harness** — run a scenario × harness-config matrix against real swarm stacks, capture transcripts/artifacts, and grade outcomes with deterministic checks plus LLM or agentic judges. [Guide →](https://docs.agent-swarm.dev/docs/guides/evals-harness)
134
- - **Harness & LLM agnostic** — run with Claude Code, Claude Bridge, OpenAI Codex, pi-mono (Anthropic, OpenRouter, or Amazon Bedrock), Devin, Claude Managed Agents, raw LLMs, or opencode. Tasks, schedules, and workflow agent-task nodes can use portable `modelTier` intent (`smol`, `regular`, `smart`, `ultra`) and resolve it per worker/provider at run time. [Harness config →](https://docs.agent-swarm.dev/docs/guides/harness-configuration) · [Add a new provider →](https://docs.agent-swarm.dev/docs/guides/harness-providers)
134
+ - **Harness & LLM agnostic** — run with Claude Code, Claude Bridge, OpenAI Codex, pi-mono (Anthropic, OpenRouter, or Amazon Bedrock), Devin, Claude Managed Agents, raw LLMs, or opencode. Tasks, schedules, and workflow agent-task nodes can use portable `modelTier` intent (`smol`, `regular`, `smart`, `ultra`), and operators can set per-agent reasoning effort (`off` → `xhigh`) without changing task payloads. [Harness config →](https://docs.agent-swarm.dev/docs/guides/harness-configuration) · [Add a new provider →](https://docs.agent-swarm.dev/docs/guides/harness-providers)
135
135
  - **OpenTelemetry traces plus OTLP cost/token metrics** — export API + worker traces and finalized session cost/token counters through the same OTLP pipeline for dashboarding in SigNoz, Datadog, Tempo, or another compatible backend. [Observability →](https://docs.agent-swarm.dev/docs/guides/observability-opentelemetry)
136
136
  - **Follow-up continuity across all harnesses** — child tasks inherit a bounded prior-task context preamble built from the task chain, so continuity survives restarts and works the same across every provider. [Task lifecycle →](https://docs.agent-swarm.dev/docs/concepts/task-lifecycle)
137
137
  - **Skills & MCP servers** — reusable procedural knowledge, bundled skill reference files, and per-agent MCP servers with scope cascade. [MCP tools →](https://docs.agent-swarm.dev/docs/reference/mcp-tools)
@@ -217,7 +217,7 @@ Missing one? Ask the swarm to build it.
217
217
  Real-time monitoring of agents, tasks, and inter-agent chat. Use the hosted version at [app.agent-swarm.dev](https://app.agent-swarm.dev), or run locally:
218
218
 
219
219
  ```bash
220
- cd ui && pnpm install && pnpm run dev
220
+ cd ui && bun install && bun run dev
221
221
  ```
222
222
 
223
223
  Opens at `http://localhost:5274`.
@@ -1,28 +1,28 @@
1
1
  import {
2
2
  resolveSlackUserId
3
- } from "./cli-p7hff99g.js";
4
- import"./cli-tfcrm7ds.js";
5
- import"./cli-pxddwmyc.js";
3
+ } from "./cli-0fvvg222.js";
4
+ import"./cli-khcv8aqa.js";
5
+ import"./cli-vg4rpzka.js";
6
6
  import {
7
7
  buildCancelledBlocks,
8
8
  getTaskLink
9
9
  } from "./cli-z92pkwzn.js";
10
- import"./cli-dh55d5fg.js";
11
10
  import {
12
11
  createTaskWithSiblingAwareness,
13
12
  slackContextKey
14
- } from "./cli-6hqvenfv.js";
13
+ } from "./cli-byh4fpv6.js";
14
+ import"./cli-dh55d5fg.js";
15
15
  import {
16
16
  cancelTask,
17
17
  getAgentById,
18
18
  getLeadAgent,
19
19
  getTaskById,
20
20
  init_db
21
- } from "./cli-6xn2xv4r.js";
21
+ } from "./cli-07ztw3qw.js";
22
22
  import"./cli-z2zcxes1.js";
23
23
  import"./cli-q21d49ac.js";
24
24
  import"./cli-anrj584m.js";
25
- import"./cli-39jaysbv.js";
25
+ import"./cli-6x9842b5.js";
26
26
  import"./cli-3pp1362w.js";
27
27
  import"./cli-p9swy5t3.js";
28
28
 
@@ -3,18 +3,19 @@ import {
3
3
  initSlackApp,
4
4
  startSlackApp,
5
5
  stopSlackApp
6
- } from "./cli-rp5kaak8.js";
7
- import"./cli-fete3y1e.js";
6
+ } from "./cli-6k4tfbz1.js";
7
+ import"./cli-rkndnn90.js";
8
8
  import"./cli-b0p7rfnd.js";
9
9
  import"./cli-z92pkwzn.js";
10
10
  import"./cli-dh55d5fg.js";
11
- import"./cli-6xn2xv4r.js";
11
+ import"./cli-07ztw3qw.js";
12
12
  import"./cli-z2zcxes1.js";
13
13
  import"./cli-q21d49ac.js";
14
14
  import"./cli-anrj584m.js";
15
- import"./cli-39jaysbv.js";
15
+ import"./cli-6x9842b5.js";
16
16
  import"./cli-3pp1362w.js";
17
17
  import"./cli-e15jhafb.js";
18
+ import"./cli-7wmybrt5.js";
18
19
  import"./cli-p9swy5t3.js";
19
20
  export {
20
21
  stopSlackApp,
@@ -7,10 +7,11 @@ import {
7
7
  import {
8
8
  require_follow_redirects,
9
9
  require_src
10
- } from "./cli-fete3y1e.js";
10
+ } from "./cli-rkndnn90.js";
11
11
  import {
12
12
  getMcpBaseUrl
13
13
  } from "./cli-dh55d5fg.js";
14
+ import"./cli-7wmybrt5.js";
14
15
  import {
15
16
  __commonJS,
16
17
  __require,
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  bufferThreadMessage,
3
3
  wasEventSeen
4
- } from "./cli-xvs40j7w.js";
4
+ } from "./cli-vpy2ykv9.js";
5
5
  import {
6
6
  hasOtherUserMention
7
- } from "./cli-8fhhmzbh.js";
7
+ } from "./cli-kjfs7t6m.js";
8
8
  import {
9
9
  require_dist
10
- } from "./cli-rp5kaak8.js";
11
- import"./cli-fete3y1e.js";
10
+ } from "./cli-6k4tfbz1.js";
11
+ import"./cli-rkndnn90.js";
12
12
  import"./cli-b0p7rfnd.js";
13
13
  import {
14
14
  resolveSlackUserId
15
- } from "./cli-p7hff99g.js";
16
- import"./cli-tfcrm7ds.js";
17
- import"./cli-pxddwmyc.js";
15
+ } from "./cli-0fvvg222.js";
16
+ import"./cli-khcv8aqa.js";
17
+ import"./cli-vg4rpzka.js";
18
18
  import"./cli-z92pkwzn.js";
19
- import"./cli-dh55d5fg.js";
20
19
  import {
21
20
  createTaskWithSiblingAwareness,
22
21
  slackContextKey
23
- } from "./cli-6hqvenfv.js";
22
+ } from "./cli-byh4fpv6.js";
23
+ import"./cli-dh55d5fg.js";
24
24
  import {
25
25
  getAgentWorkingOnThread,
26
26
  getLeadAgent,
@@ -28,13 +28,14 @@ import {
28
28
  init_db,
29
29
  init_resolver,
30
30
  resolveTemplate
31
- } from "./cli-6xn2xv4r.js";
31
+ } from "./cli-07ztw3qw.js";
32
32
  import"./cli-z2zcxes1.js";
33
33
  import"./cli-q21d49ac.js";
34
34
  import"./cli-anrj584m.js";
35
- import"./cli-39jaysbv.js";
35
+ import"./cli-6x9842b5.js";
36
36
  import"./cli-3pp1362w.js";
37
37
  import"./cli-e15jhafb.js";
38
+ import"./cli-7wmybrt5.js";
38
39
  import {
39
40
  __toESM
40
41
  } from "./cli-p9swy5t3.js";
@@ -3,16 +3,16 @@ import {
3
3
  getEmbeddingProvider,
4
4
  getMemoryStore,
5
5
  init_constants
6
- } from "./cli-hmqkes02.js";
6
+ } from "./cli-r28xcyhw.js";
7
7
  import"./cli-3j01d33e.js";
8
8
  import {
9
9
  getDb,
10
10
  init_db
11
- } from "./cli-6xn2xv4r.js";
11
+ } from "./cli-07ztw3qw.js";
12
12
  import"./cli-z2zcxes1.js";
13
13
  import"./cli-q21d49ac.js";
14
14
  import"./cli-anrj584m.js";
15
- import"./cli-39jaysbv.js";
15
+ import"./cli-6x9842b5.js";
16
16
  import"./cli-3pp1362w.js";
17
17
  import"./cli-p9swy5t3.js";
18
18
 
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  embedScript,
3
3
  embeddingProvider
4
- } from "./cli-4fwzc50f.js";
5
- import"./cli-hmqkes02.js";
4
+ } from "./cli-ssrekyyz.js";
5
+ import"./cli-r28xcyhw.js";
6
6
  import"./cli-3j01d33e.js";
7
7
  import {
8
8
  getDb,
9
9
  init_db
10
- } from "./cli-6xn2xv4r.js";
10
+ } from "./cli-07ztw3qw.js";
11
11
  import"./cli-z2zcxes1.js";
12
12
  import"./cli-q21d49ac.js";
13
13
  import"./cli-anrj584m.js";
14
- import"./cli-39jaysbv.js";
14
+ import"./cli-6x9842b5.js";
15
15
  import"./cli-3pp1362w.js";
16
16
  import"./cli-p9swy5t3.js";
17
17
 
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getDb,
3
3
  init_db
4
- } from "./cli-6xn2xv4r.js";
4
+ } from "./cli-07ztw3qw.js";
5
5
  import"./cli-z2zcxes1.js";
6
6
  import"./cli-q21d49ac.js";
7
7
  import"./cli-anrj584m.js";
8
- import"./cli-39jaysbv.js";
8
+ import"./cli-6x9842b5.js";
9
9
  import {
10
10
  init_secret_scrubber,
11
11
  scrubSecrets
@@ -12,11 +12,12 @@ import {
12
12
  resolveClaudeBinary,
13
13
  resolveClaudeBinaryArgv,
14
14
  resolveClaudeBridgeEnabled
15
- } from "./cli-dqhz8451.js";
15
+ } from "./cli-4r9m8f3t.js";
16
16
  import"./cli-psrqtw2m.js";
17
17
  import"./cli-tng3131n.js";
18
18
  import"./cli-zm7njwzd.js";
19
19
  import"./cli-tghre7g6.js";
20
+ import"./cli-tkmm5nf9.js";
20
21
  import"./cli-z2zcxes1.js";
21
22
  import"./cli-3pp1362w.js";
22
23
  import"./cli-7zd05xb4.js";
@@ -1,4 +1,4 @@
1
- import"./cli-4wmnp8q3.js";
1
+ import"./cli-amncg1dq.js";
2
2
  import {
3
3
  Anthropic,
4
4
  BadRequestError,