@evolvingmachines/evolve 0.0.55-project-sable.20260916.db0bc0bb

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 (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/dist/chunk-5GVMBEYI.js +11 -0
  4. package/dist/chunk-HQJI3HHU.js +1 -0
  5. package/dist/chunk-JS2UTK2I.js +427 -0
  6. package/dist/cli/index.cjs +73 -0
  7. package/dist/cli/index.d.cts +270 -0
  8. package/dist/cli/index.d.ts +270 -0
  9. package/dist/cli/index.js +54 -0
  10. package/dist/index.cjs +669 -0
  11. package/dist/index.d.cts +5023 -0
  12. package/dist/index.d.ts +5023 -0
  13. package/dist/index.js +230 -0
  14. package/dist/managed-modal-IJW62SSK.js +4 -0
  15. package/dist/resumable-HFSICSH3.js +1 -0
  16. package/dist/tar-GVC4KE52.js +1 -0
  17. package/dist/types-DlpTxdR_.d.cts +4777 -0
  18. package/dist/types-DlpTxdR_.d.ts +4777 -0
  19. package/dist/upload-KPYDMWFJ.js +1 -0
  20. package/docs-agents/SKILL.md +138 -0
  21. package/docs-agents/index.md +81 -0
  22. package/docs-agents/python/01-getting-started.md +511 -0
  23. package/docs-agents/python/02-configuration.md +855 -0
  24. package/docs-agents/python/03-runtime.md +899 -0
  25. package/docs-agents/python/04-streaming.md +451 -0
  26. package/docs-agents/python/05-swarm-pipeline.md +953 -0
  27. package/docs-agents/python/index.md +122 -0
  28. package/docs-agents/typescript/01-getting-started.md +494 -0
  29. package/docs-agents/typescript/02-configuration.md +841 -0
  30. package/docs-agents/typescript/03-runtime.md +864 -0
  31. package/docs-agents/typescript/04-streaming.md +478 -0
  32. package/docs-agents/typescript/05-swarm-pipeline.md +957 -0
  33. package/docs-agents/typescript/index.md +121 -0
  34. package/docs-evals/SKILL.md +112 -0
  35. package/docs-evals/cli-reference/agent.mdx +67 -0
  36. package/docs-evals/cli-reference/analysis.mdx +91 -0
  37. package/docs-evals/cli-reference/analyze.mdx +74 -0
  38. package/docs-evals/cli-reference/auth.mdx +60 -0
  39. package/docs-evals/cli-reference/check.mdx +146 -0
  40. package/docs-evals/cli-reference/dataset.mdx +133 -0
  41. package/docs-evals/cli-reference/index.mdx +108 -0
  42. package/docs-evals/cli-reference/job.mdx +239 -0
  43. package/docs-evals/cli-reference/run.mdx +196 -0
  44. package/docs-evals/cli-reference/secrets.mdx +95 -0
  45. package/docs-evals/cli-reference/skill.mdx +51 -0
  46. package/docs-evals/cli-reference/skills.mdx +81 -0
  47. package/docs-evals/cli-reference/trial.mdx +112 -0
  48. package/docs-evals/cli-reference/upload.mdx +36 -0
  49. package/docs-evals/core-concepts/agents.mdx +106 -0
  50. package/docs-evals/core-concepts/analyze.mdx +86 -0
  51. package/docs-evals/core-concepts/check.mdx +51 -0
  52. package/docs-evals/core-concepts/datasets.mdx +138 -0
  53. package/docs-evals/core-concepts/index.mdx +42 -0
  54. package/docs-evals/core-concepts/jobs.mdx +136 -0
  55. package/docs-evals/core-concepts/models.mdx +68 -0
  56. package/docs-evals/core-concepts/sandboxes.mdx +52 -0
  57. package/docs-evals/core-concepts/secrets.mdx +41 -0
  58. package/docs-evals/core-concepts/skills.mdx +42 -0
  59. package/docs-evals/core-concepts/tasks.mdx +216 -0
  60. package/docs-evals/core-concepts/trial-outputs.mdx +103 -0
  61. package/docs-evals/core-concepts/trials.mdx +103 -0
  62. package/docs-evals/core-concepts/upload.mdx +45 -0
  63. package/docs-evals/dashboard/checks.mdx +15 -0
  64. package/docs-evals/dashboard/datasets.mdx +24 -0
  65. package/docs-evals/dashboard/jobs.mdx +65 -0
  66. package/docs-evals/dashboard/traces.mdx +15 -0
  67. package/docs-evals/dashboard/trial-viewer.mdx +30 -0
  68. package/docs-evals/docs.json +180 -0
  69. package/docs-evals/getting-started/installation.mdx +56 -0
  70. package/docs-evals/getting-started/quick-start.mdx +85 -0
  71. package/docs-evals/index.mdx +36 -0
  72. package/docs-evals/sdk/python.mdx +139 -0
  73. package/docs-evals/sdk/typescript.mdx +141 -0
  74. package/docs-evals/sdk-reference/agents.mdx +105 -0
  75. package/docs-evals/sdk-reference/analyses.mdx +125 -0
  76. package/docs-evals/sdk-reference/auth.mdx +76 -0
  77. package/docs-evals/sdk-reference/checks.mdx +166 -0
  78. package/docs-evals/sdk-reference/datasets.mdx +305 -0
  79. package/docs-evals/sdk-reference/errors.mdx +199 -0
  80. package/docs-evals/sdk-reference/index.mdx +58 -0
  81. package/docs-evals/sdk-reference/jobs.mdx +731 -0
  82. package/docs-evals/sdk-reference/meta.mdx +52 -0
  83. package/docs-evals/sdk-reference/skills.mdx +68 -0
  84. package/docs-evals/sdk-reference/trials.mdx +232 -0
  85. package/docs-evals/sdk-reference/types.mdx +272 -0
  86. package/docs-evals/snippets/global-options.mdx +13 -0
  87. package/docs-evals/snippets/list-flags.mdx +23 -0
  88. package/harness-capabilities.json +430 -0
  89. package/hosted-error-codes.json +120 -0
  90. package/package.json +163 -0
  91. package/skills/create-adapter/SKILL.md +287 -0
  92. package/skills/create-task/SKILL.md +491 -0
  93. package/skills/evolve/SKILL.md +39 -0
  94. package/skills/publish/SKILL.md +142 -0
  95. package/skills/rewardkit/SKILL.md +330 -0
  96. package/spec/atif/README.md +45 -0
  97. package/spec/atif/trajectory.schema.json +865 -0
  98. package/spec/openapi.yaml +13447 -0
@@ -0,0 +1,105 @@
1
+ ---
2
+ title: "agents"
3
+ description: "Register and manage your own agents."
4
+ ---
5
+
6
+ `agents()` returns the registered-agents client. A registered agent's name works in a job's `agents[].name` like a built-in.
7
+
8
+ ## create
9
+
10
+ <Tabs>
11
+ <Tab title="TypeScript">
12
+ ```ts
13
+ create(input: { name: string; run_command: string; env?: Record<string, string> } & ({ install_script: string } | { directory: string })): Promise<Agent>
14
+ ```
15
+
16
+ Register an agent from an install script's text, or from a local directory. `run_command` runs with `sh -c` at the task's working directory; what it can rely on, and the registration limit, are on [agents](/core-concepts/agents#register-your-own-agent).
17
+
18
+ ```ts
19
+ const agent = await agents().create({
20
+ name: "acme-cli",
21
+ install_script: "curl -fsSL https://acme.dev/install.sh | sh",
22
+ run_command: "acme-cli --headless",
23
+ });
24
+ ```
25
+ </Tab>
26
+ <Tab title="Python">
27
+ ```python
28
+ async def create(
29
+ *,
30
+ name: str,
31
+ install_script: Optional[str] = None,
32
+ directory: Optional[str] = None,
33
+ run_command: str,
34
+ env: Optional[Dict[str, str]] = None,
35
+ ) -> Agent
36
+ ```
37
+
38
+ Register an agent from an install script's text, or from a local directory. `run_command` runs with `sh -c` at the task's working directory; what it can rely on, and the registration limit, are on [agents](/core-concepts/agents#register-your-own-agent).
39
+
40
+ ```python
41
+ agent = await agents().create(
42
+ name="acme-cli",
43
+ install_script="curl -fsSL https://acme.dev/install.sh | sh",
44
+ run_command="acme-cli --headless",
45
+ )
46
+ ```
47
+ </Tab>
48
+ </Tabs>
49
+
50
+ ## list, get, upsert, delete
51
+
52
+ <Tabs>
53
+ <Tab title="TypeScript">
54
+ ```ts
55
+ list(options?: { limit?: number; cursor?: string }): AgentList
56
+ get(name: string): Promise<Agent>
57
+ upsert(
58
+ name: string,
59
+ input: { run_command: string; env?: Record<string, string> } & ({ install_script: string } | { directory: string }),
60
+ ): Promise<Agent>
61
+ delete(name: string): Promise<void>
62
+ ```
63
+
64
+ Your agents, one agent, replace one without a gap, or delete one. Past jobs keep the agent they recorded. `upsert` creates when the name is free and replaces when it is not, consuming no new slot; it is a full replacement, so an omitted `env` becomes empty.
65
+
66
+ ```ts
67
+ await agents().upsert(
68
+ "acme-cli",
69
+ {
70
+ install_script: "curl -fsSL https://acme.dev/install.sh | sh",
71
+ run_command: "acme-cli --headless --v2",
72
+ },
73
+ );
74
+ ```
75
+ </Tab>
76
+ <Tab title="Python">
77
+ ```python
78
+ def list(
79
+ *,
80
+ limit: Optional[int] = None,
81
+ cursor: Optional[str] = None,
82
+ )
83
+ async def get(name: str) -> Agent
84
+ async def upsert(
85
+ name: str,
86
+ *,
87
+ run_command: str,
88
+ install_script: Optional[str] = None,
89
+ directory: Optional[str] = None,
90
+ env: Optional[Dict[str, str]] = None,
91
+ ) -> Agent
92
+ async def delete(name: str) -> None
93
+ ```
94
+
95
+ Your agents, one agent, replace one without a gap, or delete one. Past jobs keep the agent they recorded. `upsert` creates when the name is free and replaces when it is not, consuming no new slot; it is a full replacement, so an omitted `env` becomes empty.
96
+
97
+ ```python
98
+ await agents().upsert(
99
+ "acme-cli",
100
+ install_script="curl -fsSL https://acme.dev/install.sh | sh",
101
+ run_command="acme-cli --headless --v2",
102
+ )
103
+ ```
104
+ </Tab>
105
+ </Tabs>
@@ -0,0 +1,125 @@
1
+ ---
2
+ title: "analyses"
3
+ description: "Read trace-analysis runs."
4
+ ---
5
+
6
+ `analyses()` returns the analyses client. Analyses are started from a job, with `jobs().analyze()`; this client reads them back.
7
+
8
+ ## list
9
+
10
+ <Tabs>
11
+ <Tab title="TypeScript">
12
+ ```ts
13
+ list(options?: { scope?: "my" | "shared"; job?: string; status?: AnalysisStatus[]; limit?: number; cursor?: string }): AnalysisList
14
+ ```
15
+
16
+ Analysis runs, newest first, each naming the trial, job and task it judged.
17
+
18
+ ```ts
19
+ for await (const a of analyses().list({
20
+ job: job.id,
21
+ status: ["failed"],
22
+ })) {
23
+ console.log(a.id, a.label);
24
+ }
25
+ ```
26
+ </Tab>
27
+ <Tab title="Python">
28
+ ```python
29
+ def list(
30
+ *,
31
+ scope: Optional[JobListScope] = None,
32
+ job: Optional[str] = None,
33
+ status: Optional[List[AnalysisStatus]] = None,
34
+ limit: Optional[int] = None,
35
+ cursor: Optional[str] = None,
36
+ )
37
+ ```
38
+
39
+ Analysis runs, newest first, each naming the trial, job and task it judged.
40
+
41
+ ```python
42
+ async for a in analyses().list(
43
+ job=job.id,
44
+ status=["failed"],
45
+ ):
46
+ print(a["id"], a["label"])
47
+ ```
48
+ </Tab>
49
+ </Tabs>
50
+
51
+ ## get, transcript, artifact
52
+
53
+ <Tabs>
54
+ <Tab title="TypeScript">
55
+ ```ts
56
+ get(analysisId: string): Promise<TrialAnalysis>
57
+ transcript(
58
+ analysisId: string,
59
+ options?: { since?: number },
60
+ ): Promise<AnalysisTranscript>
61
+ artifact(
62
+ analysisId: string,
63
+ stream: "trace-stdout" | "trace-stderr",
64
+ ): Promise<string | null>
65
+ artifact(
66
+ analysisId: string,
67
+ stream: "agent-home",
68
+ ): Promise<Record<string, string> | null>
69
+ ```
70
+
71
+ The verdict document for every analysis, failed ones included, the analyzer's own transcript (everything after `since` in one read), or one stored artifact; an analysis has no verifier log and no trajectory. A run opens to its job's creator and every member of the organization; any other id answers `analysis_not_found` (`trial_not_found` from `transcript`).
72
+
73
+ ```ts
74
+ const verdict = await analyses().get("a0a1b2c3-…");
75
+ ```
76
+ </Tab>
77
+ <Tab title="Python">
78
+ The Python client has `list` and `download` only. Read a verdict from the analyzed trial: `(await trials().get(trial_id)).analysis`.
79
+ </Tab>
80
+ </Tabs>
81
+
82
+ ## download
83
+
84
+ <Tabs>
85
+ <Tab title="TypeScript">
86
+ ```ts
87
+ download(analysisId: string): Promise<Buffer>
88
+ download(
89
+ analysisId: string,
90
+ options: { to: string },
91
+ ): Promise<string>
92
+ download(
93
+ analysisId: string,
94
+ options: { stream: true },
95
+ ): Promise<ReadableStream<Uint8Array>>
96
+ ```
97
+
98
+ The run as one `.tar.gz`, `analyze-<analyzed trial>__<7 chars>/`: a trial tree of the analyzer's own run, with `artifacts/analysis.json` on a completed run. The bytes, the saved file's path, or a stream. `analysis_not_terminal` while the run is queued or running.
99
+
100
+ ```ts
101
+ const path = await analyses().download(
102
+ "a0a1b2c3-…",
103
+ { to: "./analyses" },
104
+ );
105
+ ```
106
+ </Tab>
107
+ <Tab title="Python">
108
+ ```python
109
+ async def download(
110
+ analysis_id: str,
111
+ *,
112
+ to: Optional[str] = None,
113
+ )
114
+ ```
115
+
116
+ The run as one `.tar.gz`, `analyze-<analyzed trial>__<7 chars>/`: the bytes, or with `to` the saved file's path. `analysis_not_found` for an id you cannot read, `analysis_not_terminal` while the run is queued or running.
117
+
118
+ ```python
119
+ path = await analyses().download(
120
+ "a0a1b2c3-…",
121
+ to="./analyses",
122
+ )
123
+ ```
124
+ </Tab>
125
+ </Tabs>
@@ -0,0 +1,76 @@
1
+ ---
2
+ title: "auth and orgs"
3
+ description: "Who you are, and your organizations."
4
+ ---
5
+
6
+ `auth()` returns the identity client, `orgs()` the organizations client. Every job, dataset and analysis belongs to an organization, today your personal one; the API accepts an `org` on a job or a publish, but the SDK and CLI do not name one yet.
7
+
8
+ ## auth.status
9
+
10
+ <Tabs>
11
+ <Tab title="TypeScript">
12
+ ```ts
13
+ status(): Promise<AuthStatus>
14
+ ```
15
+
16
+ The caller and the API key in use: `user_id`, `email`, and `key` with `id`, `label`, `created_at` and `last_used_at`. The key's secret is never returned, and `last_used_at` is always null today.
17
+
18
+ ```ts
19
+ const me = await auth().status();
20
+ ```
21
+ </Tab>
22
+ <Tab title="Python">
23
+ ```python
24
+ async def status() -> AuthStatus
25
+ ```
26
+
27
+ The caller and the API key in use. The key's secret is never returned.
28
+
29
+ ```python
30
+ me = await auth().status()
31
+ ```
32
+ </Tab>
33
+ </Tabs>
34
+
35
+ ## orgs.list, orgs.get
36
+
37
+ <Tabs>
38
+ <Tab title="TypeScript">
39
+ ```ts
40
+ list(): Promise<Organization[]>
41
+ get(org: string): Promise<OrganizationDetail>
42
+ ```
43
+
44
+ The organizations you belong to, or one organization with your role, its members, its quota and live usage.
45
+
46
+ ```ts
47
+ const org = await orgs().get("acme");
48
+ ```
49
+ </Tab>
50
+ <Tab title="Python">
51
+ ```python
52
+ async def list() -> List[Organization]
53
+ async def get(org: str) -> OrganizationDetail
54
+ ```
55
+
56
+ The organizations you belong to, or one organization with your role, its members, its quota and live usage.
57
+
58
+ ```python
59
+ org = await orgs().get("acme")
60
+ ```
61
+ </Tab>
62
+ </Tabs>
63
+
64
+ ## Quota and usage
65
+
66
+ `quota` is nine ceilings, each the value the platform administrator set or the fleet default; only the administrator's dashboard sets them, never a key or the SDK.
67
+
68
+ - `max_queued_trials`: the one that refuses. A job whose trials would not fit is refused with `quota_exceeded`.
69
+ - `max_concurrent_trials`, `max_concurrent_imports`, `max_concurrent_analyses` (trace analyses and task checks under one count): work beyond them waits.
70
+ - `monthly_budget_usd`: model spend allowed per UTC calendar month; a trial it refuses settles `BUDGET` with `team:` in its message. Null means no monthly budget.
71
+ - `max_concurrent_sandboxes_e2b`, `_daytona`, `_modal`: the organization's sandboxes in flight per provider, trials, analyses, regrade verifiers and managed sessions together; work beyond one waits, and an organization with no value of its own reads the platform's fleet ceiling.
72
+ - `max_concurrent_sessions`: managed-agent sessions open at once; recorded, not yet enforced.
73
+
74
+ A `0` pauses that kind of work: creates are refused at `max_queued_trials` 0, work waits at 0 on the concurrency ceilings, and `monthly_budget_usd` 0 pauses all model spend for the month.
75
+
76
+ `usage` is the live load: `in_flight_trials`, `queued_trials`, `in_flight_imports`, `in_flight_analyses`, `active_sessions` (always 0 on a shared organization), and `month_spend_usd` with `month_spend_as_of`, the month-to-date model spend as of that time (UTC calendar month, reset on the 1st); it may lag by a few minutes. It is null, never 0, when no reading is held; `evolve auth org show` prints `unavailable` then.
@@ -0,0 +1,166 @@
1
+ ---
2
+ title: "checks"
3
+ description: "Start and read task quality checks."
4
+ ---
5
+
6
+ `checks()` returns the checks client.
7
+
8
+ ## create
9
+
10
+ <Tabs>
11
+ <Tab title="TypeScript">
12
+ ```ts
13
+ create(input: { source: { directory: string } | { dataset: string }; model_name?: string; rubric?: Rubric; prompt?: string; reasoning_effort?: string; sandbox_provider?: EvalSandboxProvider; n_concurrent?: number; include_task_names?: string[]; exclude_task_names?: string[]; n_tasks?: number; onUploadProgress?: (sentBytes: number, totalBytes: number) => void }): Promise<Check>
14
+ ```
15
+
16
+ Check a local task directory or a directory of them, uploaded as one archive (`upload_too_large` past the published ceiling), or a published dataset, nothing uploaded. Returns the accepted check with one `queued` result per task; an empty selection is refused with `no_checkable_tasks`, and a dataset version resolves as for a job (`dataset_not_found`, `no_active_version`, `version_not_ready`). A check on a dataset version also appears on every job spanning it, as `check` on `jobs().tasks()` rows.
17
+
18
+ ```ts
19
+ const check = await checks().create({ source: { dataset: "my-swe@1.0" } });
20
+ ```
21
+ </Tab>
22
+ <Tab title="Python">
23
+ ```python
24
+ async def create(
25
+ directory: Optional[str] = None,
26
+ *,
27
+ dataset: Optional[str] = None,
28
+ model_name=None,
29
+ rubric: Optional[Rubric] = None,
30
+ prompt=None,
31
+ reasoning_effort=None,
32
+ sandbox_provider=None,
33
+ n_concurrent=None,
34
+ include_task_names=None,
35
+ exclude_task_names=None,
36
+ n_tasks=None,
37
+ on_upload_progress=None,
38
+ ) -> Check
39
+ ```
40
+
41
+ Check a local task directory or a directory of them, uploaded as one archive (`upload_too_large` past the published ceiling), or a published dataset, nothing uploaded; one source, not both. Returns the accepted check with one `queued` result per task; an empty selection is refused with `no_checkable_tasks`, and a dataset version resolves as for a job. A check on a dataset version also appears on every job spanning it, as `check` on `jobs().tasks()` rows.
42
+
43
+ ```python
44
+ check = await checks().create(dataset="my-swe@1.0")
45
+ ```
46
+ </Tab>
47
+ </Tabs>
48
+
49
+ ## get, list, watch
50
+
51
+ <Tabs>
52
+ <Tab title="TypeScript">
53
+ ```ts
54
+ get(checkId: string): Promise<Check>
55
+ list(options?: { scope?: "my" | "shared"; status?: CheckStatus[]; limit?: number; cursor?: string }): CheckList
56
+ watch(checkId: string, options?: { onProgress?: (check: Check) => void; signal?: AbortSignal; pollIntervalMs?: number }): Promise<Check>
57
+ ```
58
+
59
+ One check with its per-task results, your checks, or a poll until every task settled.
60
+
61
+ ```ts
62
+ const done = await checks().watch(check.id);
63
+ ```
64
+ </Tab>
65
+ <Tab title="Python">
66
+ ```python
67
+ async def get(check_id: str) -> Check
68
+ def list(
69
+ *,
70
+ scope: Optional[JobListScope] = None,
71
+ status: Optional[List[CheckStatus]] = None,
72
+ limit: Optional[int] = None,
73
+ cursor: Optional[str] = None,
74
+ )
75
+ async def watch(
76
+ check_id: str,
77
+ *,
78
+ on_progress: Optional[Callable[[Check], None]] = None,
79
+ poll_interval_s: float = 2.0,
80
+ timeout_s: Optional[float] = None,
81
+ ) -> Check
82
+ ```
83
+
84
+ One check with its per-task results, your checks, or a poll until every task settled.
85
+
86
+ ```python
87
+ done = await checks().watch(check.id)
88
+ ```
89
+ </Tab>
90
+ </Tabs>
91
+
92
+ ## task, transcript, artifact
93
+
94
+ <Tabs>
95
+ <Tab title="TypeScript">
96
+ ```ts
97
+ task(taskCheckId: string): Promise<TaskCheck>
98
+ transcript(
99
+ taskCheckId: string,
100
+ options?: { since?: number },
101
+ ): Promise<TaskCheckTranscript>
102
+ artifact(
103
+ taskCheckId: string,
104
+ stream: "trace-stdout" | "trace-stderr",
105
+ ): Promise<string | null>
106
+ artifact(
107
+ taskCheckId: string,
108
+ stream: "agent-home",
109
+ ): Promise<Record<string, string> | null>
110
+ ```
111
+
112
+ One task's result by its task check id, the checker's own transcript (everything after `since` in one read), or one stored artifact; a task check has no verifier log and no trajectory. An id you may not read answers `trial_not_found`.
113
+
114
+ ```ts
115
+ const result = await checks().task(done.results[0].id);
116
+ ```
117
+ </Tab>
118
+ <Tab title="Python">
119
+ The Python client has no per-task reads. A task's result is in `Check.results`, returned by `get` and `watch`.
120
+ </Tab>
121
+ </Tabs>
122
+
123
+ ## download
124
+
125
+ <Tabs>
126
+ <Tab title="TypeScript">
127
+ ```ts
128
+ download(id: string): Promise<Buffer>
129
+ download(
130
+ id: string,
131
+ options: { to: string },
132
+ ): Promise<string>
133
+ download(
134
+ id: string,
135
+ options: { stream: true },
136
+ ): Promise<ReadableStream<Uint8Array>>
137
+ ```
138
+
139
+ The whole check by its check id (`check-<id>/` with `check_report.json` and one folder per task), or one task's folder by its task check id (`check-<task>__<7 chars>/`), as one `.tar.gz`. Each task folder is a trial tree of the checker's own run, with `artifacts/check-result.json` on a completed run. An id that is neither answers `check_not_found`; an unsettled check or task check answers `check_not_terminal`.
140
+
141
+ ```ts
142
+ const path = await checks().download(
143
+ check.id,
144
+ { to: "./checks" },
145
+ );
146
+ ```
147
+ </Tab>
148
+ <Tab title="Python">
149
+ ```python
150
+ async def download(
151
+ id: str,
152
+ *,
153
+ to: Optional[str] = None,
154
+ )
155
+ ```
156
+
157
+ The whole check by its check id (`check-<id>/` with `check_report.json` and one folder per task), or one task's folder by its task check id (`check-<task>__<7 chars>/`), as one `.tar.gz`. An id that is neither answers `check_not_found`; an unsettled check or task check answers `check_not_terminal`.
158
+
159
+ ```python
160
+ path = await checks().download(
161
+ check.id,
162
+ to="./checks",
163
+ )
164
+ ```
165
+ </Tab>
166
+ </Tabs>