windmill-client 1.849.0 → 1.851.0

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.
@@ -1045,7 +1045,7 @@ export type AiAgent = {
1045
1045
  */
1046
1046
  id: string;
1047
1047
  /**
1048
- * The name the AI agent calls this tool by, not a human label. On a flowmodule tool it must match ^[a-zA-Z0-9_]+$ - letters, numbers and underscores only (e.g. 'search_documentation', not 'Search documentation') - and always be set; on an mcp or websearch tool it is a plain label. Put the human-readable explanation in 'description'.
1048
+ * The name the AI agent calls this tool by, not a human label. On a flowmodule tool it must match ^[a-zA-Z0-9_]+$ - letters, numbers and underscores only (e.g. 'search_documentation', not 'Search documentation') - and always be set; on an mcp, websearch or question tool it is a plain label. Put the human-readable explanation in 'description'.
1049
1049
  */
1050
1050
  summary?: string;
1051
1051
  /**
@@ -1056,6 +1056,10 @@ export type AiAgent = {
1056
1056
  * Scopes the token of this tool's jobs is restricted to, on top of the agent step's own restriction: a tool can only narrow it.
1057
1057
  */
1058
1058
  job_token_scopes?: Array<(string)> | null;
1059
+ /**
1060
+ * Flowmodule and mcp tools only. Each call waits for a person to approve or reject it from the flow's run page or chat, without the agent holding a worker. Calls in the same turn that do not require approval run right away. A rejected call, or one nobody answers within 30 minutes, is reported to the AI as not run.
1061
+ */
1062
+ requires_approval?: boolean;
1059
1063
  /**
1060
1064
  * The implementation of a tool. Can be a flow module (script/flow) or an MCP tool reference
1061
1065
  */
@@ -1077,6 +1081,12 @@ export type AiAgent = {
1077
1081
  exclude_tools?: Array<(string)>;
1078
1082
  } | {
1079
1083
  tool_type: 'websearch';
1084
+ } | {
1085
+ tool_type: 'question';
1086
+ /**
1087
+ * Seconds to wait for an answer before the question is reported to the AI as timed out. Defaults to 1800.
1088
+ */
1089
+ timeout?: number;
1080
1090
  };
1081
1091
  }>;
1082
1092
  type: 'aiagent';
@@ -1230,6 +1240,27 @@ export type FlowStatusModule = {
1230
1240
  };
1231
1241
  } | {
1232
1242
  type: 'web_search';
1243
+ } | {
1244
+ type: 'approval';
1245
+ call_id: string;
1246
+ calls: Array<{
1247
+ function_name: string;
1248
+ arguments: unknown;
1249
+ }>;
1250
+ expires_at: string;
1251
+ } | {
1252
+ type: 'question';
1253
+ call_id: string;
1254
+ question: string;
1255
+ /**
1256
+ * answers the model proposes; a free-text answer is always possible
1257
+ */
1258
+ choices?: Array<(string)>;
1259
+ /**
1260
+ * whether several choices can be picked together
1261
+ */
1262
+ multi_select?: boolean;
1263
+ expires_at: string;
1233
1264
  } | {
1234
1265
  type: 'message';
1235
1266
  })>;
@@ -6888,6 +6919,10 @@ export type GitRepositorySettings = {
6888
6919
  auto_pull?: AutoPullSettings;
6889
6920
  promotion_open_prs?: boolean;
6890
6921
  fork_open_prs?: boolean;
6922
+ /**
6923
+ * review every pull request against the tracked branch with the workspace's AI
6924
+ */
6925
+ ai_review_prs?: boolean;
6891
6926
  /**
6892
6927
  * server-owned, last failure opening a PR for a deploy branch of this repo
6893
6928
  */
@@ -7190,6 +7225,10 @@ export type RoleCapabilities = {
7190
7225
  apps: AuthorLevel;
7191
7226
  manage_schedules: boolean;
7192
7227
  manage_triggers: boolean;
7228
+ /**
7229
+ * Fork the workspace.
7230
+ */
7231
+ fork: boolean;
7193
7232
  visibility: RoleVisibility;
7194
7233
  };
7195
7234
  /**
@@ -7201,6 +7240,7 @@ export type RoleCapabilitiesPatch = {
7201
7240
  apps?: AuthorLevel;
7202
7241
  manage_schedules?: boolean;
7203
7242
  manage_triggers?: boolean;
7243
+ fork?: boolean;
7204
7244
  visibility?: {
7205
7245
  [key: string]: (boolean);
7206
7246
  };
@@ -7608,6 +7648,13 @@ export type ProtectionRuleset = {
7608
7648
  rules: ProtectionRules;
7609
7649
  bypass_groups: RuleBypasserGroups;
7610
7650
  bypass_users: RuleBypasserUsers;
7651
+ fork_role_mapping?: ForkRoleMapping;
7652
+ };
7653
+ /**
7654
+ * Role a member of this workspace gets in a fork of it, keyed by the role it holds here. Unmapped roles carry over unchanged; where two rulesets map the same role, the first by name wins. On update, omitting it leaves the stored mapping unchanged.
7655
+ */
7656
+ export type ForkRoleMapping = {
7657
+ [key: string]: (string);
7611
7658
  };
7612
7659
  /**
7613
7660
  * Configuration of protection restrictions
@@ -10351,6 +10398,7 @@ export type CreateProtectionRuleData = {
10351
10398
  rules: ProtectionRules;
10352
10399
  bypass_groups: RuleBypasserGroups;
10353
10400
  bypass_users: RuleBypasserUsers;
10401
+ fork_role_mapping?: ForkRoleMapping;
10354
10402
  };
10355
10403
  workspace: string;
10356
10404
  };
@@ -10367,6 +10415,7 @@ export type UpdateProtectionRuleData = {
10367
10415
  rules: ProtectionRules;
10368
10416
  bypass_groups: RuleBypasserGroups;
10369
10417
  bypass_users: RuleBypasserUsers;
10418
+ fork_role_mapping?: ForkRoleMapping;
10370
10419
  };
10371
10420
  /**
10372
10421
  * Name of the protection rule to update
@@ -10605,6 +10654,7 @@ export type GetInstanceUiResponse = {
10605
10654
  instance_banner?: unknown;
10606
10655
  accent_color?: unknown;
10607
10656
  api_base_url?: unknown;
10657
+ api_base_url_applies_to?: unknown;
10608
10658
  };
10609
10659
  export type GetRuffConfigResponse = string;
10610
10660
  export type GetLocalResponse = unknown;
@@ -16288,250 +16338,22 @@ export type UnshareAgentFromSlackChannelData = {
16288
16338
  workspace: string;
16289
16339
  };
16290
16340
  export type UnshareAgentFromSlackChannelResponse = string;
16291
- export type ListEvalDatasetsData = {
16292
- workspace: string;
16293
- };
16294
- export type ListEvalDatasetsResponse = Array<EvalDataset>;
16295
- export type CreateEvalDatasetData = {
16296
- /**
16297
- * new eval dataset
16298
- */
16341
+ export type CompleteAiData = {
16299
16342
  requestBody: {
16300
- path: string;
16301
- summary?: string;
16302
- scorers?: Array<Scorer>;
16303
- /**
16304
- * The cases to create the dataset holding, so one can be assembled in a single act rather than created empty and filled in afterwards.
16305
- */
16306
- cases?: Array<NewEvalCase>;
16307
- };
16308
- workspace: string;
16309
- };
16310
- export type CreateEvalDatasetResponse = string;
16311
- export type GetEvalDatasetData = {
16312
- path: string;
16313
- workspace: string;
16314
- };
16315
- export type GetEvalDatasetResponse = EvalDataset;
16316
- export type UpdateEvalDatasetData = {
16317
- path: string;
16318
- /**
16319
- * updated eval dataset
16320
- */
16321
- requestBody: {
16322
- /**
16323
- * Renames the dataset. Its cases and experiments follow through the foreign keys, so a rename keeps the history it already has.
16324
- *
16325
- */
16326
- path?: string;
16327
- /**
16328
- * Left out to keep the stored summary; sent as "" to clear it.
16329
- */
16330
- summary?: string;
16331
- /**
16332
- * Left out to keep the dataset's columns as they are; sent to replace them wholesale.
16333
- *
16334
- */
16335
- scorers?: Array<Scorer>;
16343
+ system: string;
16344
+ user: string;
16336
16345
  /**
16337
- * The cases as they should stand afterwards: all of them, each carrying its id if the dataset already has it. Sent with the rest of an edit so that a rename the dataset refuses refuses the case edits with it.
16338
- *
16346
+ * defaults to the AI config's default model
16339
16347
  */
16340
- cases?: Array<SaveEvalCase>;
16348
+ model?: AIProviderModel;
16349
+ max_tokens?: number;
16341
16350
  };
16342
16351
  workspace: string;
16343
16352
  };
16344
- export type UpdateEvalDatasetResponse = string;
16345
- export type DeleteEvalDatasetData = {
16346
- path: string;
16347
- workspace: string;
16348
- };
16349
- export type DeleteEvalDatasetResponse = string;
16350
- export type ListEvalCasesData = {
16351
- /**
16352
- * which page to return (start at 1, default 1)
16353
- */
16354
- page?: number;
16355
- path: string;
16356
- /**
16357
- * number of items to return for a given page (default 30, max 100)
16358
- */
16359
- perPage?: number;
16360
- workspace: string;
16361
- };
16362
- export type ListEvalCasesResponse = {
16363
- cases: Array<EvalCase>;
16364
- };
16365
- export type EvalSubjectStateData = {
16366
- path: string;
16367
- workspace: string;
16368
- };
16369
- export type EvalSubjectStateResponse = {
16370
- version?: number;
16371
- };
16372
- export type EvalRunPayloadData = {
16373
- /**
16374
- * The flow job that answered the case.
16375
- */
16376
- jobId: string;
16377
- workspace: string;
16378
- };
16379
- export type EvalRunPayloadResponse = {
16380
- /**
16381
- * The case, the answer, and every tool call the agent made.
16382
- */
16383
- run: {
16384
- [key: string]: unknown;
16385
- };
16386
- /**
16387
- * The same run as a judge agent is shown it.
16388
- */
16389
- rendered: string;
16390
- };
16391
- export type ScorerDefaultsData = {
16392
- workspace: string;
16393
- };
16394
- export type ScorerDefaultsResponse = {
16395
- /**
16396
- * The system prompt a judge agent is created with.
16397
- */
16398
- judge_prompt: string;
16399
- script_template: string;
16400
- };
16401
- export type RecentScorersData = {
16402
- /**
16403
- * only scorers of this kind
16404
- */
16405
- kind?: 'script' | 'agent';
16406
- workspace: string;
16407
- };
16408
- export type RecentScorersResponse = Array<(Scorer & {
16409
- /**
16410
- * The dataset it is a column of.
16411
- */
16412
- dataset: string;
16413
- })>;
16414
- export type RunExperimentData = {
16415
- /**
16416
- * what to run
16417
- */
16418
- requestBody: {
16419
- dataset: string;
16420
- subject: EvalSubject;
16421
- };
16422
- workspace: string;
16423
- };
16424
- export type RunExperimentResponse = string;
16425
- export type CollectExperimentData = {
16426
- id: string;
16427
- workspace: string;
16428
- };
16429
- export type CollectExperimentResponse = number;
16430
- export type ListAllExperimentsData = {
16431
- /**
16432
- * Restrict to one agent's runs, which is what makes the list a history rather than a log. Runs of what is deployed, of a past version, and of the edits waiting on top are all that agent's, so this does not discriminate by kind.
16433
- *
16434
- */
16435
- subjectPath?: string;
16436
- workspace: string;
16437
- };
16438
- export type ListAllExperimentsResponse = Array<EvalExperiment>;
16439
- export type ExperimentResultsData = {
16440
- /**
16441
- * The experiment every column is compared against. A delta is only computed between two scores of the same scorer id, and a column the baseline was never scored with reports it rather than showing a difference.
16442
- *
16443
- */
16444
- baseline?: string;
16445
- /**
16446
- * the experiment to read
16447
- */
16448
- id: string;
16449
- path: string;
16450
- workspace: string;
16451
- };
16452
- export type ExperimentResultsResponse = {
16453
- experiment: EvalExperiment;
16454
- baseline?: EvalExperiment;
16455
- /**
16456
- * The columns, which belong to the dataset rather than the experiment.
16457
- */
16458
- scorers: Array<Scorer>;
16459
- rows: Array<ExperimentRow>;
16460
- means: Array<ScorerMean>;
16461
- /**
16462
- * Cells scoring lower than the baseline, across every column.
16463
- */
16464
- regressed: number;
16465
- /**
16466
- * The version the subject is on now. A row that ran against an earlier one describes an agent that no longer exists.
16467
- *
16468
- */
16469
- subject_current_version?: number;
16470
- /**
16471
- * What the agent hashes to as deployed. A run of unsaved edits carrying this hash ran exactly what is deployed now — the edits were saved — so it is a run of that version rather than of edits.
16472
- *
16473
- */
16474
- subject_deployed_hash?: string;
16475
- };
16476
- export type ListPathAutocompletePathsData = {
16477
- /**
16478
- * bypass the server-side cache and re-query the DB, refreshing the
16479
- * cache. Used right after a deploy so the new path appears immediately.
16480
- *
16481
- */
16482
- force?: boolean;
16483
- workspace: string;
16484
- };
16485
- export type ListPathAutocompletePathsResponse = {
16486
- paths: Array<(string)>;
16487
- };
16488
- export type ListRawAppsData = {
16489
- /**
16490
- * filter by exact matching user creator. Supports comma-separated list (e.g. 'alice,bob') and negation by prefixing all values with '!' (e.g. '!alice,!bob')
16491
- */
16492
- createdBy?: string;
16493
- /**
16494
- * When true, append per-user draft rows whose path has no
16495
- * deployed counterpart. Synthesized rows carry `draft_only: true`
16496
- * so the home page can render a "Draft" badge. Gated to
16497
- * non-operators + page 0 + no narrowing filters on the backend so
16498
- * picker callers stay deployed-only and pagination stays clean.
16499
- *
16500
- */
16501
- includeDraftOnly?: boolean;
16502
- /**
16503
- * Filter by label
16504
- */
16505
- label?: string;
16506
- /**
16507
- * order by desc order (default true)
16508
- */
16509
- orderDesc?: boolean;
16510
- /**
16511
- * which page to return (start at 1, default 1)
16512
- */
16513
- page?: number;
16514
- /**
16515
- * mask to filter exact matching path
16516
- */
16517
- pathExact?: string;
16518
- /**
16519
- * mask to filter matching starting path
16520
- */
16521
- pathStart?: string;
16522
- /**
16523
- * number of items to return for a given page (default 30, max 100)
16524
- */
16525
- perPage?: number;
16526
- /**
16527
- * (default false)
16528
- * show only the starred items
16529
- *
16530
- */
16531
- starredOnly?: boolean;
16532
- workspace: string;
16353
+ export type CompleteAiResponse = {
16354
+ text: string;
16355
+ model: AIProviderModel;
16533
16356
  };
16534
- export type ListRawAppsResponse = Array<ListableRawApp>;
16535
16357
  export type RecordAiUsageData = {
16536
16358
  requestBody: {
16537
16359
  events: Array<AITokenUsageEvent>;
@@ -16711,6 +16533,250 @@ export type UnshareAiSessionData = {
16711
16533
  workspace: string;
16712
16534
  };
16713
16535
  export type UnshareAiSessionResponse = string;
16536
+ export type ListEvalDatasetsData = {
16537
+ workspace: string;
16538
+ };
16539
+ export type ListEvalDatasetsResponse = Array<EvalDataset>;
16540
+ export type CreateEvalDatasetData = {
16541
+ /**
16542
+ * new eval dataset
16543
+ */
16544
+ requestBody: {
16545
+ path: string;
16546
+ summary?: string;
16547
+ scorers?: Array<Scorer>;
16548
+ /**
16549
+ * The cases to create the dataset holding, so one can be assembled in a single act rather than created empty and filled in afterwards.
16550
+ */
16551
+ cases?: Array<NewEvalCase>;
16552
+ };
16553
+ workspace: string;
16554
+ };
16555
+ export type CreateEvalDatasetResponse = string;
16556
+ export type GetEvalDatasetData = {
16557
+ path: string;
16558
+ workspace: string;
16559
+ };
16560
+ export type GetEvalDatasetResponse = EvalDataset;
16561
+ export type UpdateEvalDatasetData = {
16562
+ path: string;
16563
+ /**
16564
+ * updated eval dataset
16565
+ */
16566
+ requestBody: {
16567
+ /**
16568
+ * Renames the dataset. Its cases and experiments follow through the foreign keys, so a rename keeps the history it already has.
16569
+ *
16570
+ */
16571
+ path?: string;
16572
+ /**
16573
+ * Left out to keep the stored summary; sent as "" to clear it.
16574
+ */
16575
+ summary?: string;
16576
+ /**
16577
+ * Left out to keep the dataset's columns as they are; sent to replace them wholesale.
16578
+ *
16579
+ */
16580
+ scorers?: Array<Scorer>;
16581
+ /**
16582
+ * The cases as they should stand afterwards: all of them, each carrying its id if the dataset already has it. Sent with the rest of an edit so that a rename the dataset refuses refuses the case edits with it.
16583
+ *
16584
+ */
16585
+ cases?: Array<SaveEvalCase>;
16586
+ };
16587
+ workspace: string;
16588
+ };
16589
+ export type UpdateEvalDatasetResponse = string;
16590
+ export type DeleteEvalDatasetData = {
16591
+ path: string;
16592
+ workspace: string;
16593
+ };
16594
+ export type DeleteEvalDatasetResponse = string;
16595
+ export type ListEvalCasesData = {
16596
+ /**
16597
+ * which page to return (start at 1, default 1)
16598
+ */
16599
+ page?: number;
16600
+ path: string;
16601
+ /**
16602
+ * number of items to return for a given page (default 30, max 100)
16603
+ */
16604
+ perPage?: number;
16605
+ workspace: string;
16606
+ };
16607
+ export type ListEvalCasesResponse = {
16608
+ cases: Array<EvalCase>;
16609
+ };
16610
+ export type EvalSubjectStateData = {
16611
+ path: string;
16612
+ workspace: string;
16613
+ };
16614
+ export type EvalSubjectStateResponse = {
16615
+ version?: number;
16616
+ };
16617
+ export type EvalRunPayloadData = {
16618
+ /**
16619
+ * The flow job that answered the case.
16620
+ */
16621
+ jobId: string;
16622
+ workspace: string;
16623
+ };
16624
+ export type EvalRunPayloadResponse = {
16625
+ /**
16626
+ * The case, the answer, and every tool call the agent made.
16627
+ */
16628
+ run: {
16629
+ [key: string]: unknown;
16630
+ };
16631
+ /**
16632
+ * The same run as a judge agent is shown it.
16633
+ */
16634
+ rendered: string;
16635
+ };
16636
+ export type ScorerDefaultsData = {
16637
+ workspace: string;
16638
+ };
16639
+ export type ScorerDefaultsResponse = {
16640
+ /**
16641
+ * The system prompt a judge agent is created with.
16642
+ */
16643
+ judge_prompt: string;
16644
+ script_template: string;
16645
+ };
16646
+ export type RecentScorersData = {
16647
+ /**
16648
+ * only scorers of this kind
16649
+ */
16650
+ kind?: 'script' | 'agent';
16651
+ workspace: string;
16652
+ };
16653
+ export type RecentScorersResponse = Array<(Scorer & {
16654
+ /**
16655
+ * The dataset it is a column of.
16656
+ */
16657
+ dataset: string;
16658
+ })>;
16659
+ export type RunExperimentData = {
16660
+ /**
16661
+ * what to run
16662
+ */
16663
+ requestBody: {
16664
+ dataset: string;
16665
+ subject: EvalSubject;
16666
+ };
16667
+ workspace: string;
16668
+ };
16669
+ export type RunExperimentResponse = string;
16670
+ export type CollectExperimentData = {
16671
+ id: string;
16672
+ workspace: string;
16673
+ };
16674
+ export type CollectExperimentResponse = number;
16675
+ export type ListAllExperimentsData = {
16676
+ /**
16677
+ * Restrict to one agent's runs, which is what makes the list a history rather than a log. Runs of what is deployed, of a past version, and of the edits waiting on top are all that agent's, so this does not discriminate by kind.
16678
+ *
16679
+ */
16680
+ subjectPath?: string;
16681
+ workspace: string;
16682
+ };
16683
+ export type ListAllExperimentsResponse = Array<EvalExperiment>;
16684
+ export type ExperimentResultsData = {
16685
+ /**
16686
+ * The experiment every column is compared against. A delta is only computed between two scores of the same scorer id, and a column the baseline was never scored with reports it rather than showing a difference.
16687
+ *
16688
+ */
16689
+ baseline?: string;
16690
+ /**
16691
+ * the experiment to read
16692
+ */
16693
+ id: string;
16694
+ path: string;
16695
+ workspace: string;
16696
+ };
16697
+ export type ExperimentResultsResponse = {
16698
+ experiment: EvalExperiment;
16699
+ baseline?: EvalExperiment;
16700
+ /**
16701
+ * The columns, which belong to the dataset rather than the experiment.
16702
+ */
16703
+ scorers: Array<Scorer>;
16704
+ rows: Array<ExperimentRow>;
16705
+ means: Array<ScorerMean>;
16706
+ /**
16707
+ * Cells scoring lower than the baseline, across every column.
16708
+ */
16709
+ regressed: number;
16710
+ /**
16711
+ * The version the subject is on now. A row that ran against an earlier one describes an agent that no longer exists.
16712
+ *
16713
+ */
16714
+ subject_current_version?: number;
16715
+ /**
16716
+ * What the agent hashes to as deployed. A run of unsaved edits carrying this hash ran exactly what is deployed now — the edits were saved — so it is a run of that version rather than of edits.
16717
+ *
16718
+ */
16719
+ subject_deployed_hash?: string;
16720
+ };
16721
+ export type ListPathAutocompletePathsData = {
16722
+ /**
16723
+ * bypass the server-side cache and re-query the DB, refreshing the
16724
+ * cache. Used right after a deploy so the new path appears immediately.
16725
+ *
16726
+ */
16727
+ force?: boolean;
16728
+ workspace: string;
16729
+ };
16730
+ export type ListPathAutocompletePathsResponse = {
16731
+ paths: Array<(string)>;
16732
+ };
16733
+ export type ListRawAppsData = {
16734
+ /**
16735
+ * filter by exact matching user creator. Supports comma-separated list (e.g. 'alice,bob') and negation by prefixing all values with '!' (e.g. '!alice,!bob')
16736
+ */
16737
+ createdBy?: string;
16738
+ /**
16739
+ * When true, append per-user draft rows whose path has no
16740
+ * deployed counterpart. Synthesized rows carry `draft_only: true`
16741
+ * so the home page can render a "Draft" badge. Gated to
16742
+ * non-operators + page 0 + no narrowing filters on the backend so
16743
+ * picker callers stay deployed-only and pagination stays clean.
16744
+ *
16745
+ */
16746
+ includeDraftOnly?: boolean;
16747
+ /**
16748
+ * Filter by label
16749
+ */
16750
+ label?: string;
16751
+ /**
16752
+ * order by desc order (default true)
16753
+ */
16754
+ orderDesc?: boolean;
16755
+ /**
16756
+ * which page to return (start at 1, default 1)
16757
+ */
16758
+ page?: number;
16759
+ /**
16760
+ * mask to filter exact matching path
16761
+ */
16762
+ pathExact?: string;
16763
+ /**
16764
+ * mask to filter matching starting path
16765
+ */
16766
+ pathStart?: string;
16767
+ /**
16768
+ * number of items to return for a given page (default 30, max 100)
16769
+ */
16770
+ perPage?: number;
16771
+ /**
16772
+ * (default false)
16773
+ * show only the starred items
16774
+ *
16775
+ */
16776
+ starredOnly?: boolean;
16777
+ workspace: string;
16778
+ };
16779
+ export type ListRawAppsResponse = Array<ListableRawApp>;
16714
16780
  export type ResumeSuspendedTriggerJobsData = {
16715
16781
  /**
16716
16782
  * Optional list of job IDs to reassign
@@ -20011,6 +20077,10 @@ export type GetHubProjectExportData = {
20011
20077
  * hub project slug (3-50 chars, lowercase alphanumeric and hyphens, no leading/trailing hyphen)
20012
20078
  */
20013
20079
  slug: string;
20080
+ /**
20081
+ * id of a reviewed project version to export instead of the current one (see the hub's `/projects/{slug}/versions`)
20082
+ */
20083
+ version?: number;
20014
20084
  workspace: string;
20015
20085
  };
20016
20086
  export type GetHubProjectExportResponse = string;
@@ -24172,6 +24242,7 @@ export type $OpenApiTs = {
24172
24242
  rules: ProtectionRules;
24173
24243
  bypass_groups: RuleBypasserGroups;
24174
24244
  bypass_users: RuleBypasserUsers;
24245
+ fork_role_mapping?: ForkRoleMapping;
24175
24246
  };
24176
24247
  workspace: string;
24177
24248
  };
@@ -24201,6 +24272,7 @@ export type $OpenApiTs = {
24201
24272
  rules: ProtectionRules;
24202
24273
  bypass_groups: RuleBypasserGroups;
24203
24274
  bypass_users: RuleBypasserUsers;
24275
+ fork_role_mapping?: ForkRoleMapping;
24204
24276
  };
24205
24277
  /**
24206
24278
  * Name of the protection rule to update
@@ -24748,12 +24820,13 @@ export type $OpenApiTs = {
24748
24820
  get: {
24749
24821
  res: {
24750
24822
  /**
24751
- * the instance_banner, accent_color and api_base_url settings
24823
+ * the instance_banner, accent_color, api_base_url and api_base_url_applies_to settings
24752
24824
  */
24753
24825
  200: {
24754
24826
  instance_banner?: unknown;
24755
24827
  accent_color?: unknown;
24756
24828
  api_base_url?: unknown;
24829
+ api_base_url_applies_to?: unknown;
24757
24830
  };
24758
24831
  };
24759
24832
  };
@@ -33701,6 +33774,334 @@ export type $OpenApiTs = {
33701
33774
  };
33702
33775
  };
33703
33776
  };
33777
+ '/w/{workspace}/ai/complete': {
33778
+ post: {
33779
+ req: {
33780
+ requestBody: {
33781
+ system: string;
33782
+ user: string;
33783
+ /**
33784
+ * defaults to the AI config's default model
33785
+ */
33786
+ model?: AIProviderModel;
33787
+ max_tokens?: number;
33788
+ };
33789
+ workspace: string;
33790
+ };
33791
+ res: {
33792
+ /**
33793
+ * the answer, and the model that wrote it
33794
+ */
33795
+ 200: {
33796
+ text: string;
33797
+ model: AIProviderModel;
33798
+ };
33799
+ };
33800
+ };
33801
+ };
33802
+ '/w/{workspace}/ai/usage': {
33803
+ post: {
33804
+ req: {
33805
+ requestBody: {
33806
+ events: Array<AITokenUsageEvent>;
33807
+ };
33808
+ workspace: string;
33809
+ };
33810
+ res: {
33811
+ /**
33812
+ * usage recorded
33813
+ */
33814
+ 204: void;
33815
+ };
33816
+ };
33817
+ get: {
33818
+ req: {
33819
+ days?: number;
33820
+ groupBy?: 'day' | 'user' | 'model';
33821
+ /**
33822
+ * workspace-wide usage (admin only) or the calling user's own
33823
+ */
33824
+ scope?: 'workspace' | 'self';
33825
+ workspace: string;
33826
+ };
33827
+ res: {
33828
+ /**
33829
+ * usage buckets
33830
+ */
33831
+ 200: {
33832
+ buckets: Array<AITokenUsageBucket>;
33833
+ /**
33834
+ * more buckets matched than were returned, so summing them under-reports
33835
+ */
33836
+ truncated: boolean;
33837
+ };
33838
+ };
33839
+ };
33840
+ };
33841
+ '/w/{workspace}/ai/sessions/list': {
33842
+ get: {
33843
+ req: {
33844
+ workspace: string;
33845
+ };
33846
+ res: {
33847
+ /**
33848
+ * backups, newest first; `enabled` is false when the workspace has no storage for them
33849
+ */
33850
+ 200: {
33851
+ enabled: boolean;
33852
+ /**
33853
+ * names the storage answered from; sync state recorded against another one is void
33854
+ */
33855
+ storage_id?: string;
33856
+ /**
33857
+ * bumped by every workspace key rotation; sync state recorded under another one is void
33858
+ */
33859
+ backup_generation?: number;
33860
+ /**
33861
+ * the storage answered from is the instance object store, standing in for a workspace without storage of its own; a removal owed to it is retired by any answer from the workspace's own storage
33862
+ */
33863
+ fallback?: boolean;
33864
+ /**
33865
+ * the newest 500 at most
33866
+ */
33867
+ sessions: Array<AISessionBackupListing>;
33868
+ /**
33869
+ * the user has more sessions than the answer names
33870
+ */
33871
+ truncated?: boolean;
33872
+ };
33873
+ };
33874
+ };
33875
+ };
33876
+ '/w/{workspace}/ai/sessions/pull': {
33877
+ post: {
33878
+ req: {
33879
+ requestBody: {
33880
+ ids: Array<(string)>;
33881
+ resume?: AISessionBackupCursor;
33882
+ };
33883
+ workspace: string;
33884
+ };
33885
+ res: {
33886
+ /**
33887
+ * the backups found; `deferred` lists ids that did not fit the response budget
33888
+ */
33889
+ 200: {
33890
+ enabled: boolean;
33891
+ storage_id?: string;
33892
+ backup_generation?: number;
33893
+ fallback?: boolean;
33894
+ sessions: Array<AISessionBackup>;
33895
+ deferred: Array<(string)>;
33896
+ };
33897
+ };
33898
+ };
33899
+ };
33900
+ '/w/{workspace}/ai/sessions/push': {
33901
+ post: {
33902
+ req: {
33903
+ requestBody: {
33904
+ /**
33905
+ * the email the push was prepared for; refused with a 409 when it is not the caller's
33906
+ */
33907
+ owner: string;
33908
+ sessions?: Array<AISessionBackupPush>;
33909
+ removed?: Array<(string)>;
33910
+ };
33911
+ workspace: string;
33912
+ };
33913
+ res: {
33914
+ /**
33915
+ * one result per session written or removed, in request order
33916
+ */
33917
+ 200: {
33918
+ enabled: boolean;
33919
+ storage_id?: string;
33920
+ backup_generation?: number;
33921
+ fallback?: boolean;
33922
+ results: Array<{
33923
+ id: string;
33924
+ error?: string;
33925
+ /**
33926
+ * nothing was written and the session must be pushed whole again; an incremental part found no listed session to ride on (the backup was removed, or a push split over parts is in progress or was abandoned), or a later part of a push split over parts found another push had superseded it
33927
+ */
33928
+ needs_whole?: boolean;
33929
+ }>;
33930
+ };
33931
+ };
33932
+ };
33933
+ };
33934
+ '/w/{workspace}/ai/shared_artifacts/share': {
33935
+ post: {
33936
+ req: {
33937
+ requestBody: {
33938
+ /**
33939
+ * the artifact's id in the author's session
33940
+ */
33941
+ artifact_id: string;
33942
+ name: string;
33943
+ kind: 'md' | 'html';
33944
+ version: number;
33945
+ content: string;
33946
+ };
33947
+ workspace: string;
33948
+ };
33949
+ res: {
33950
+ /**
33951
+ * the shared copy
33952
+ */
33953
+ 200: SharedAiArtifactInfo;
33954
+ };
33955
+ };
33956
+ };
33957
+ '/w/{workspace}/ai/shared_artifacts/status': {
33958
+ get: {
33959
+ req: {
33960
+ artifactId: string;
33961
+ workspace: string;
33962
+ };
33963
+ res: {
33964
+ /**
33965
+ * the live share, if any, and how long shares last
33966
+ */
33967
+ 200: {
33968
+ retention_secs: number;
33969
+ share?: SharedAiArtifactInfo;
33970
+ };
33971
+ };
33972
+ };
33973
+ };
33974
+ '/w/{workspace}/ai/shared_artifacts/get/{id}': {
33975
+ get: {
33976
+ req: {
33977
+ id: string;
33978
+ workspace: string;
33979
+ };
33980
+ res: {
33981
+ /**
33982
+ * the shared artifact
33983
+ */
33984
+ 200: SharedAiArtifactInfo & {
33985
+ content: string;
33986
+ /**
33987
+ * whether the caller authored the share or is a workspace admin
33988
+ */
33989
+ can_unshare: boolean;
33990
+ };
33991
+ };
33992
+ };
33993
+ };
33994
+ '/w/{workspace}/ai/shared_artifacts/delete/{id}': {
33995
+ delete: {
33996
+ req: {
33997
+ id: string;
33998
+ workspace: string;
33999
+ };
34000
+ res: {
34001
+ /**
34002
+ * share deleted
34003
+ */
34004
+ 200: string;
34005
+ };
34006
+ };
34007
+ };
34008
+ '/w/{workspace}/ai/shared_sessions/share': {
34009
+ post: {
34010
+ req: {
34011
+ requestBody: {
34012
+ /**
34013
+ * the session's id in the author's browser
34014
+ */
34015
+ session_id: string;
34016
+ name: string;
34017
+ /**
34018
+ * left as it is on an existing share when absent; a new share starts private
34019
+ */
34020
+ is_public?: boolean;
34021
+ message_count: number;
34022
+ snapshot: {
34023
+ [key: string]: unknown;
34024
+ };
34025
+ };
34026
+ workspace: string;
34027
+ };
34028
+ res: {
34029
+ /**
34030
+ * the shared snapshot
34031
+ */
34032
+ 200: SharedAiSessionInfo;
34033
+ };
34034
+ };
34035
+ };
34036
+ '/w/{workspace}/ai/shared_sessions/status': {
34037
+ get: {
34038
+ req: {
34039
+ sessionId: string;
34040
+ workspace: string;
34041
+ };
34042
+ res: {
34043
+ /**
34044
+ * the share, if any
34045
+ */
34046
+ 200: {
34047
+ share?: SharedAiSessionInfo;
34048
+ };
34049
+ };
34050
+ };
34051
+ };
34052
+ '/w/{workspace}/ai/shared_sessions/set_public/{id}': {
34053
+ post: {
34054
+ req: {
34055
+ id: string;
34056
+ requestBody: {
34057
+ is_public: boolean;
34058
+ };
34059
+ workspace: string;
34060
+ };
34061
+ res: {
34062
+ /**
34063
+ * the updated share
34064
+ */
34065
+ 200: SharedAiSessionInfo;
34066
+ };
34067
+ };
34068
+ };
34069
+ '/w/{workspace}/ai_u/shared_sessions/get/{id}': {
34070
+ get: {
34071
+ req: {
34072
+ id: string;
34073
+ workspace: string;
34074
+ };
34075
+ res: {
34076
+ /**
34077
+ * the shared session
34078
+ */
34079
+ 200: SharedAiSessionInfo & {
34080
+ snapshot: {
34081
+ [key: string]: unknown;
34082
+ };
34083
+ /**
34084
+ * whether the caller authored the share or is a workspace admin
34085
+ */
34086
+ can_unshare: boolean;
34087
+ };
34088
+ };
34089
+ };
34090
+ };
34091
+ '/w/{workspace}/ai/shared_sessions/delete/{id}': {
34092
+ delete: {
34093
+ req: {
34094
+ id: string;
34095
+ workspace: string;
34096
+ };
34097
+ res: {
34098
+ /**
34099
+ * share deleted
34100
+ */
34101
+ 200: string;
34102
+ };
34103
+ };
34104
+ };
33704
34105
  '/w/{workspace}/ai_evals/datasets/list': {
33705
34106
  get: {
33706
34107
  req: {
@@ -34090,309 +34491,6 @@ export type $OpenApiTs = {
34090
34491
  };
34091
34492
  };
34092
34493
  };
34093
- '/w/{workspace}/ai/usage': {
34094
- post: {
34095
- req: {
34096
- requestBody: {
34097
- events: Array<AITokenUsageEvent>;
34098
- };
34099
- workspace: string;
34100
- };
34101
- res: {
34102
- /**
34103
- * usage recorded
34104
- */
34105
- 204: void;
34106
- };
34107
- };
34108
- get: {
34109
- req: {
34110
- days?: number;
34111
- groupBy?: 'day' | 'user' | 'model';
34112
- /**
34113
- * workspace-wide usage (admin only) or the calling user's own
34114
- */
34115
- scope?: 'workspace' | 'self';
34116
- workspace: string;
34117
- };
34118
- res: {
34119
- /**
34120
- * usage buckets
34121
- */
34122
- 200: {
34123
- buckets: Array<AITokenUsageBucket>;
34124
- /**
34125
- * more buckets matched than were returned, so summing them under-reports
34126
- */
34127
- truncated: boolean;
34128
- };
34129
- };
34130
- };
34131
- };
34132
- '/w/{workspace}/ai/sessions/list': {
34133
- get: {
34134
- req: {
34135
- workspace: string;
34136
- };
34137
- res: {
34138
- /**
34139
- * backups, newest first; `enabled` is false when the workspace has no storage for them
34140
- */
34141
- 200: {
34142
- enabled: boolean;
34143
- /**
34144
- * names the storage answered from; sync state recorded against another one is void
34145
- */
34146
- storage_id?: string;
34147
- /**
34148
- * bumped by every workspace key rotation; sync state recorded under another one is void
34149
- */
34150
- backup_generation?: number;
34151
- /**
34152
- * the storage answered from is the instance object store, standing in for a workspace without storage of its own; a removal owed to it is retired by any answer from the workspace's own storage
34153
- */
34154
- fallback?: boolean;
34155
- /**
34156
- * the newest 500 at most
34157
- */
34158
- sessions: Array<AISessionBackupListing>;
34159
- /**
34160
- * the user has more sessions than the answer names
34161
- */
34162
- truncated?: boolean;
34163
- };
34164
- };
34165
- };
34166
- };
34167
- '/w/{workspace}/ai/sessions/pull': {
34168
- post: {
34169
- req: {
34170
- requestBody: {
34171
- ids: Array<(string)>;
34172
- resume?: AISessionBackupCursor;
34173
- };
34174
- workspace: string;
34175
- };
34176
- res: {
34177
- /**
34178
- * the backups found; `deferred` lists ids that did not fit the response budget
34179
- */
34180
- 200: {
34181
- enabled: boolean;
34182
- storage_id?: string;
34183
- backup_generation?: number;
34184
- fallback?: boolean;
34185
- sessions: Array<AISessionBackup>;
34186
- deferred: Array<(string)>;
34187
- };
34188
- };
34189
- };
34190
- };
34191
- '/w/{workspace}/ai/sessions/push': {
34192
- post: {
34193
- req: {
34194
- requestBody: {
34195
- /**
34196
- * the email the push was prepared for; refused with a 409 when it is not the caller's
34197
- */
34198
- owner: string;
34199
- sessions?: Array<AISessionBackupPush>;
34200
- removed?: Array<(string)>;
34201
- };
34202
- workspace: string;
34203
- };
34204
- res: {
34205
- /**
34206
- * one result per session written or removed, in request order
34207
- */
34208
- 200: {
34209
- enabled: boolean;
34210
- storage_id?: string;
34211
- backup_generation?: number;
34212
- fallback?: boolean;
34213
- results: Array<{
34214
- id: string;
34215
- error?: string;
34216
- /**
34217
- * nothing was written and the session must be pushed whole again; an incremental part found no listed session to ride on (the backup was removed, or a push split over parts is in progress or was abandoned), or a later part of a push split over parts found another push had superseded it
34218
- */
34219
- needs_whole?: boolean;
34220
- }>;
34221
- };
34222
- };
34223
- };
34224
- };
34225
- '/w/{workspace}/ai/shared_artifacts/share': {
34226
- post: {
34227
- req: {
34228
- requestBody: {
34229
- /**
34230
- * the artifact's id in the author's session
34231
- */
34232
- artifact_id: string;
34233
- name: string;
34234
- kind: 'md' | 'html';
34235
- version: number;
34236
- content: string;
34237
- };
34238
- workspace: string;
34239
- };
34240
- res: {
34241
- /**
34242
- * the shared copy
34243
- */
34244
- 200: SharedAiArtifactInfo;
34245
- };
34246
- };
34247
- };
34248
- '/w/{workspace}/ai/shared_artifacts/status': {
34249
- get: {
34250
- req: {
34251
- artifactId: string;
34252
- workspace: string;
34253
- };
34254
- res: {
34255
- /**
34256
- * the live share, if any, and how long shares last
34257
- */
34258
- 200: {
34259
- retention_secs: number;
34260
- share?: SharedAiArtifactInfo;
34261
- };
34262
- };
34263
- };
34264
- };
34265
- '/w/{workspace}/ai/shared_artifacts/get/{id}': {
34266
- get: {
34267
- req: {
34268
- id: string;
34269
- workspace: string;
34270
- };
34271
- res: {
34272
- /**
34273
- * the shared artifact
34274
- */
34275
- 200: SharedAiArtifactInfo & {
34276
- content: string;
34277
- /**
34278
- * whether the caller authored the share or is a workspace admin
34279
- */
34280
- can_unshare: boolean;
34281
- };
34282
- };
34283
- };
34284
- };
34285
- '/w/{workspace}/ai/shared_artifacts/delete/{id}': {
34286
- delete: {
34287
- req: {
34288
- id: string;
34289
- workspace: string;
34290
- };
34291
- res: {
34292
- /**
34293
- * share deleted
34294
- */
34295
- 200: string;
34296
- };
34297
- };
34298
- };
34299
- '/w/{workspace}/ai/shared_sessions/share': {
34300
- post: {
34301
- req: {
34302
- requestBody: {
34303
- /**
34304
- * the session's id in the author's browser
34305
- */
34306
- session_id: string;
34307
- name: string;
34308
- /**
34309
- * left as it is on an existing share when absent; a new share starts private
34310
- */
34311
- is_public?: boolean;
34312
- message_count: number;
34313
- snapshot: {
34314
- [key: string]: unknown;
34315
- };
34316
- };
34317
- workspace: string;
34318
- };
34319
- res: {
34320
- /**
34321
- * the shared snapshot
34322
- */
34323
- 200: SharedAiSessionInfo;
34324
- };
34325
- };
34326
- };
34327
- '/w/{workspace}/ai/shared_sessions/status': {
34328
- get: {
34329
- req: {
34330
- sessionId: string;
34331
- workspace: string;
34332
- };
34333
- res: {
34334
- /**
34335
- * the share, if any
34336
- */
34337
- 200: {
34338
- share?: SharedAiSessionInfo;
34339
- };
34340
- };
34341
- };
34342
- };
34343
- '/w/{workspace}/ai/shared_sessions/set_public/{id}': {
34344
- post: {
34345
- req: {
34346
- id: string;
34347
- requestBody: {
34348
- is_public: boolean;
34349
- };
34350
- workspace: string;
34351
- };
34352
- res: {
34353
- /**
34354
- * the updated share
34355
- */
34356
- 200: SharedAiSessionInfo;
34357
- };
34358
- };
34359
- };
34360
- '/w/{workspace}/ai_u/shared_sessions/get/{id}': {
34361
- get: {
34362
- req: {
34363
- id: string;
34364
- workspace: string;
34365
- };
34366
- res: {
34367
- /**
34368
- * the shared session
34369
- */
34370
- 200: SharedAiSessionInfo & {
34371
- snapshot: {
34372
- [key: string]: unknown;
34373
- };
34374
- /**
34375
- * whether the caller authored the share or is a workspace admin
34376
- */
34377
- can_unshare: boolean;
34378
- };
34379
- };
34380
- };
34381
- };
34382
- '/w/{workspace}/ai/shared_sessions/delete/{id}': {
34383
- delete: {
34384
- req: {
34385
- id: string;
34386
- workspace: string;
34387
- };
34388
- res: {
34389
- /**
34390
- * share deleted
34391
- */
34392
- 200: string;
34393
- };
34394
- };
34395
- };
34396
34494
  '/w/{workspace}/trigger/{trigger_kind}/resume_suspended_trigger_jobs/{trigger_path}': {
34397
34495
  post: {
34398
34496
  req: {
@@ -40290,6 +40388,10 @@ export type $OpenApiTs = {
40290
40388
  * hub project slug (3-50 chars, lowercase alphanumeric and hyphens, no leading/trailing hyphen)
40291
40389
  */
40292
40390
  slug: string;
40391
+ /**
40392
+ * id of a reviewed project version to export instead of the current one (see the hub's `/projects/{slug}/versions`)
40393
+ */
40394
+ version?: number;
40293
40395
  workspace: string;
40294
40396
  };
40295
40397
  res: {