@runtypelabs/sdk 10.8.1 → 10.11.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.
package/dist/index.d.ts CHANGED
@@ -1480,6 +1480,8 @@ interface paths {
1480
1480
  requestBody?: {
1481
1481
  content: {
1482
1482
  "application/json": {
1483
+ /** @description The complete set of capabilities (flow, sub-agent and saved-tool attachments) on this agent, in display order. Each entry names its source by name, so the declaration is portable across accounts. Capabilities on the agent but absent here are removed; omit the field to leave them untouched. When present, the capabilities are part of the content hash and of the version this converge snapshots. They are written to the agent itself, so they cannot accompany a non-live deploy. */
1484
+ capabilities?: components["schemas"]["AgentEnsureCapability"][];
1483
1485
  contentHash?: string;
1484
1486
  definition?: {
1485
1487
  config?: {
@@ -1790,6 +1792,8 @@ interface paths {
1790
1792
  * @enum {string}
1791
1793
  */
1792
1794
  release?: "none" | "publish";
1795
+ /** @description The complete set of skills bound to this agent, in load order. Each entry names a skill by slug; `version` pins that skill versionNumber, and omitting it follows the skill's published version. Skills bound to the agent but absent here are unbound; omit the field to leave bindings untouched. Bindings are agent state, not alias state, so they take effect immediately and cannot accompany a non-live deploy. */
1796
+ skills?: components["schemas"]["AgentEnsureSkillBinding"][];
1793
1797
  version?: components["schemas"]["EnsureVersionMetadata"];
1794
1798
  };
1795
1799
  };
@@ -1849,15 +1853,6 @@ interface paths {
1849
1853
  "application/json": components["schemas"]["AgentEnsureHashMismatch"];
1850
1854
  };
1851
1855
  };
1852
- /** @description Active preview alias quota exceeded for the organization or the agent (code PREVIEW_ALIAS_LIMIT). Archive a preview alias and retry. */
1853
- 429: {
1854
- headers: {
1855
- [name: string]: unknown;
1856
- };
1857
- content: {
1858
- "application/json": components["schemas"]["AgentEnsurePreviewAliasLimit"];
1859
- };
1860
- };
1861
1856
  /** @description Internal server error, or code alias_activation_failed when a non-live activation could not be applied (nothing was written) */
1862
1857
  500: {
1863
1858
  headers: {
@@ -3059,7 +3054,7 @@ interface paths {
3059
3054
  };
3060
3055
  /**
3061
3056
  * Activate a version at a release alias
3062
- * @description Aim one alias at one immutable version of the same agent, appending a deployment receipt in the same transaction. Moving an existing `live` pointer requires the AGENTS:DEPLOY:LIVE scope and an `If-Match` revision; preview aliases require AGENTS:DEPLOY:PREVIEW. Dependency references the version names are fingerprinted first, and an unresolvable reference refuses the activation. Activating a preview alias renews its 14-day expiry; `live` never expires. Creating a new preview alias past the active-preview quota answers 429 with code PREVIEW_ALIAS_LIMIT.
3057
+ * @description Aim one alias at one immutable version of the same agent, appending a deployment receipt in the same transaction. Moving an existing `live` pointer requires the AGENTS:DEPLOY:LIVE scope and an `If-Match` revision; preview aliases require AGENTS:DEPLOY:PREVIEW. Dependency references the version names are fingerprinted first, and an unresolvable reference refuses the activation. Activating a preview alias renews its 14-day expiry; `live` never expires.
3063
3058
  */
3064
3059
  put: {
3065
3060
  parameters: {
@@ -3094,14 +3089,10 @@ interface paths {
3094
3089
  };
3095
3090
  content: {
3096
3091
  "application/json": {
3097
- /** @description How many preview aliases this agent has active after the write. Null for `live`, which is never counted. Read it beside `previewLimit` to see a per-pull-request pipeline filling up before an activation is refused with PREVIEW_ALIAS_LIMIT. */
3098
- activePreviewCount: number | null;
3099
3092
  alias: string;
3100
3093
  /** @description Per-alias secret binding names in force after this activation. Names only, never values. */
3101
3094
  bindingNames: string[];
3102
3095
  changed: boolean;
3103
- /** @description The active-preview ceiling this agent is counted against. Null for `live`. */
3104
- previewLimit: number | null;
3105
3096
  receiptId: string;
3106
3097
  revision: number;
3107
3098
  versionId: string;
@@ -3193,15 +3184,6 @@ interface paths {
3193
3184
  "application/json": components["schemas"]["Error"];
3194
3185
  };
3195
3186
  };
3196
- /** @description Active preview alias quota exceeded for the organization or the agent */
3197
- 429: {
3198
- headers: {
3199
- [name: string]: unknown;
3200
- };
3201
- content: {
3202
- "application/json": components["schemas"]["PreviewAliasLimitError"];
3203
- };
3204
- };
3205
3187
  /** @description Internal server error */
3206
3188
  500: {
3207
3189
  headers: {
@@ -3716,14 +3698,10 @@ interface paths {
3716
3698
  };
3717
3699
  content: {
3718
3700
  "application/json": {
3719
- /** @description How many preview aliases this agent has active after the write. Null for `live`, which is never counted. Read it beside `previewLimit` to see a per-pull-request pipeline filling up before an activation is refused with PREVIEW_ALIAS_LIMIT. */
3720
- activePreviewCount: number | null;
3721
3701
  alias: string;
3722
3702
  /** @description Per-alias secret binding names in force after this activation. Names only, never values. */
3723
3703
  bindingNames: string[];
3724
3704
  changed: boolean;
3725
- /** @description The active-preview ceiling this agent is counted against. Null for `live`. */
3726
- previewLimit: number | null;
3727
3705
  receiptId: string;
3728
3706
  revision: number;
3729
3707
  versionId: string;
@@ -10544,6 +10522,8 @@ interface paths {
10544
10522
  icon: string | null;
10545
10523
  id: string;
10546
10524
  indexedFields: string[];
10525
+ /** @description Who last wrote the definition (e.g. dashboard, api, sdk); sdk/terraform mean managed in code. */
10526
+ lastModifiedSource: string | null;
10547
10527
  recordCount?: number;
10548
10528
  /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10549
10529
  schema: {
@@ -10642,6 +10622,8 @@ interface paths {
10642
10622
  icon: string | null;
10643
10623
  id: string;
10644
10624
  indexedFields: string[];
10625
+ /** @description Who last wrote the definition (e.g. dashboard, api, sdk); sdk/terraform mean managed in code. */
10626
+ lastModifiedSource: string | null;
10645
10627
  recordCount?: number;
10646
10628
  /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10647
10629
  schema: {
@@ -10712,55 +10694,74 @@ interface paths {
10712
10694
  patch?: never;
10713
10695
  trace?: never;
10714
10696
  };
10715
- "/v1/collections/types.d.ts": {
10697
+ "/v1/collections/ensure": {
10716
10698
  parameters: {
10717
10699
  query?: never;
10718
10700
  header?: never;
10719
10701
  path?: never;
10720
10702
  cookie?: never;
10721
10703
  };
10704
+ get?: never;
10705
+ put?: never;
10722
10706
  /**
10723
- * Generate TypeScript types for schematized collections
10724
- * @description Emit a TypeScript `.d.ts` module (one interface per schematized collection plus a `declare module '@runtypelabs/sdk'` augmentation of `RecordCollections`) so `client.records.from('<slug>')` types record metadata. Fetch it with `runtype records typegen`; commit and diff-check the output in CI to catch collection-schema drift.
10707
+ * Ensure collection (config-as-code converge)
10708
+ * @description Idempotently converge a repo-defined record collection (display fields, schema and validationMode) onto the platform. Identity is slug + account scope. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response); full requests create the collection or update it when the canonical content hash differs. Schema changes follow the same rules as PATCH: they bump schemaVersion and append history, and a breaking change is rejected while the resulting mode is `enforce`. Set dryRun to plan without writing (CI drift gate), and onConflict: "overwrite" to converge over dashboard/API edits. Ensure never deletes a collection and never touches records.
10725
10709
  */
10726
- get: {
10710
+ post: {
10727
10711
  parameters: {
10728
10712
  query?: never;
10729
10713
  header?: never;
10730
10714
  path?: never;
10731
10715
  cookie?: never;
10732
10716
  };
10733
- requestBody?: never;
10734
- responses: {
10735
- /** @description A TypeScript declaration module */
10736
- 200: {
10737
- headers: {
10738
- [name: string]: unknown;
10739
- };
10740
- content: {
10741
- "text/plain": string;
10717
+ requestBody?: {
10718
+ content: {
10719
+ "application/json": {
10720
+ contentHash?: string;
10721
+ definition?: {
10722
+ description?: string | null;
10723
+ displayName: string;
10724
+ icon?: string | null;
10725
+ /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10726
+ schema?: {
10727
+ [key: string]: unknown;
10728
+ } | null;
10729
+ slug: string;
10730
+ /** @enum {string} */
10731
+ validationMode?: "off" | "warn" | "enforce";
10732
+ };
10733
+ dryRun?: boolean;
10734
+ expectedRemoteHash?: string;
10735
+ /** @enum {string} */
10736
+ onConflict?: "error" | "overwrite";
10737
+ slug: string;
10742
10738
  };
10743
10739
  };
10744
- /** @description Unauthorized */
10745
- 401: {
10740
+ };
10741
+ responses: {
10742
+ /** @description Converge result: unchanged | created | updated | definitionRequired (hash miss — retry with the full definition) | plan (dryRun) */
10743
+ 200: {
10746
10744
  headers: {
10747
10745
  [name: string]: unknown;
10748
10746
  };
10749
10747
  content: {
10750
- "application/json": components["schemas"]["Error"];
10748
+ "application/json": components["schemas"]["CollectionEnsureResponse"];
10751
10749
  };
10752
10750
  };
10753
- /** @description Insufficient permissions */
10754
- 403: {
10751
+ /** @description Invalid slug or schema, or a breaking schema change while enforcing (BREAKING_SCHEMA_CHANGE_REQUIRES_WARN_MODE) */
10752
+ 400: {
10755
10753
  headers: {
10756
10754
  [name: string]: unknown;
10757
10755
  };
10758
10756
  content: {
10759
- "application/json": components["schemas"]["Error"];
10757
+ "application/json": components["schemas"]["Error"] & {
10758
+ code?: string;
10759
+ details?: unknown;
10760
+ };
10760
10761
  };
10761
10762
  };
10762
- /** @description Internal server error */
10763
- 500: {
10763
+ /** @description Unauthorized */
10764
+ 401: {
10764
10765
  headers: {
10765
10766
  [name: string]: unknown;
10766
10767
  };
@@ -10768,79 +10769,8 @@ interface paths {
10768
10769
  "application/json": components["schemas"]["Error"];
10769
10770
  };
10770
10771
  };
10771
- };
10772
- };
10773
- put?: never;
10774
- post?: never;
10775
- delete?: never;
10776
- options?: never;
10777
- head?: never;
10778
- patch?: never;
10779
- trace?: never;
10780
- };
10781
- "/v1/collections/{slug}": {
10782
- parameters: {
10783
- query?: never;
10784
- header?: never;
10785
- path?: never;
10786
- cookie?: never;
10787
- };
10788
- /**
10789
- * Get a collection
10790
- * @description Get a collection by slug. `includeHistory=true` embeds the append-only schema version history.
10791
- */
10792
- get: {
10793
- parameters: {
10794
- query?: {
10795
- includeHistory?: string;
10796
- };
10797
- header?: never;
10798
- path: {
10799
- slug: string;
10800
- };
10801
- cookie?: never;
10802
- };
10803
- requestBody?: never;
10804
- responses: {
10805
- /** @description Collection */
10806
- 200: {
10807
- headers: {
10808
- [name: string]: unknown;
10809
- };
10810
- content: {
10811
- "application/json": {
10812
- createdAt: string;
10813
- description: string | null;
10814
- displayName: string;
10815
- history?: {
10816
- /** @enum {string} */
10817
- changeKind: "additive" | "breaking";
10818
- changedBy: string | null;
10819
- createdAt: string;
10820
- /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10821
- schema: {
10822
- [key: string]: unknown;
10823
- } | null;
10824
- version: number;
10825
- }[];
10826
- icon: string | null;
10827
- id: string;
10828
- indexedFields: string[];
10829
- recordCount?: number;
10830
- /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10831
- schema: {
10832
- [key: string]: unknown;
10833
- } | null;
10834
- schemaVersion: number;
10835
- slug: string;
10836
- updatedAt: string;
10837
- /** @enum {string} */
10838
- validationMode: "off" | "warn" | "enforce";
10839
- };
10840
- };
10841
- };
10842
- /** @description Unauthorized */
10843
- 401: {
10772
+ /** @description Insufficient permissions */
10773
+ 403: {
10844
10774
  headers: {
10845
10775
  [name: string]: unknown;
10846
10776
  };
@@ -10848,22 +10778,22 @@ interface paths {
10848
10778
  "application/json": components["schemas"]["Error"];
10849
10779
  };
10850
10780
  };
10851
- /** @description Insufficient permissions */
10852
- 403: {
10781
+ /** @description Conflict: external_modification (last write was not ensure; pass onConflict: "overwrite") or remote_changed (expectedRemoteHash guard) */
10782
+ 409: {
10853
10783
  headers: {
10854
10784
  [name: string]: unknown;
10855
10785
  };
10856
10786
  content: {
10857
- "application/json": components["schemas"]["Error"];
10787
+ "application/json": components["schemas"]["CollectionEnsureConflict"];
10858
10788
  };
10859
10789
  };
10860
- /** @description Not found */
10861
- 404: {
10790
+ /** @description Submitted contentHash does not match the server-recomputed canonical hash */
10791
+ 422: {
10862
10792
  headers: {
10863
10793
  [name: string]: unknown;
10864
10794
  };
10865
10795
  content: {
10866
- "application/json": components["schemas"]["Error"];
10796
+ "application/json": components["schemas"]["CollectionEnsureHashMismatch"];
10867
10797
  };
10868
10798
  };
10869
10799
  /** @description Internal server error */
@@ -10877,32 +10807,39 @@ interface paths {
10877
10807
  };
10878
10808
  };
10879
10809
  };
10880
- put?: never;
10881
- post?: never;
10810
+ delete?: never;
10811
+ options?: never;
10812
+ head?: never;
10813
+ patch?: never;
10814
+ trace?: never;
10815
+ };
10816
+ "/v1/collections/types.d.ts": {
10817
+ parameters: {
10818
+ query?: never;
10819
+ header?: never;
10820
+ path?: never;
10821
+ cookie?: never;
10822
+ };
10882
10823
  /**
10883
- * Delete a collection
10884
- * @description Delete the collection REGISTRATION only. Records of this type are not touched — they revert to schemaless behavior. Deleting records is a separate, explicit operation.
10824
+ * Generate TypeScript types for schematized collections
10825
+ * @description Emit a TypeScript `.d.ts` module (one interface per schematized collection plus a `declare module '@runtypelabs/sdk'` augmentation of `RecordCollections`) so `client.records.from('<slug>')` types record metadata. Fetch it with `runtype records typegen`; commit and diff-check the output in CI to catch collection-schema drift.
10885
10826
  */
10886
- delete: {
10827
+ get: {
10887
10828
  parameters: {
10888
10829
  query?: never;
10889
10830
  header?: never;
10890
- path: {
10891
- slug: string;
10892
- };
10831
+ path?: never;
10893
10832
  cookie?: never;
10894
10833
  };
10895
10834
  requestBody?: never;
10896
10835
  responses: {
10897
- /** @description Deleted */
10836
+ /** @description A TypeScript declaration module */
10898
10837
  200: {
10899
10838
  headers: {
10900
10839
  [name: string]: unknown;
10901
10840
  };
10902
10841
  content: {
10903
- "application/json": {
10904
- success: boolean;
10905
- };
10842
+ "text/plain": string;
10906
10843
  };
10907
10844
  };
10908
10845
  /** @description Unauthorized */
@@ -10923,15 +10860,6 @@ interface paths {
10923
10860
  "application/json": components["schemas"]["Error"];
10924
10861
  };
10925
10862
  };
10926
- /** @description Not found */
10927
- 404: {
10928
- headers: {
10929
- [name: string]: unknown;
10930
- };
10931
- content: {
10932
- "application/json": components["schemas"]["Error"];
10933
- };
10934
- };
10935
10863
  /** @description Internal server error */
10936
10864
  500: {
10937
10865
  headers: {
@@ -10943,84 +10871,261 @@ interface paths {
10943
10871
  };
10944
10872
  };
10945
10873
  };
10874
+ put?: never;
10875
+ post?: never;
10876
+ delete?: never;
10946
10877
  options?: never;
10947
10878
  head?: never;
10879
+ patch?: never;
10880
+ trace?: never;
10881
+ };
10882
+ "/v1/collections/{slug}": {
10883
+ parameters: {
10884
+ query?: never;
10885
+ header?: never;
10886
+ path?: never;
10887
+ cookie?: never;
10888
+ };
10948
10889
  /**
10949
- * Update a collection
10950
- * @description Update display fields, validation mode, or the schema. Schema changes are classified additive vs breaking; breaking changes are rejected while the resulting mode is `enforce` (drop to `warn`, migrate, re-enforce). Every schema change bumps `schemaVersion` and appends a history row. When the mode transitions to `enforce`, the response includes `enforceCheck` — a bounded dry-run of existing records against the schema.
10890
+ * Get a collection
10891
+ * @description Get a collection by slug. `includeHistory=true` embeds the append-only schema version history.
10951
10892
  */
10952
- patch: {
10893
+ get: {
10953
10894
  parameters: {
10954
- query?: never;
10895
+ query?: {
10896
+ includeHistory?: string;
10897
+ };
10955
10898
  header?: never;
10956
10899
  path: {
10957
10900
  slug: string;
10958
10901
  };
10959
10902
  cookie?: never;
10960
10903
  };
10961
- requestBody?: {
10962
- content: {
10963
- "application/json": {
10964
- description?: string | null;
10965
- displayName?: string;
10966
- icon?: string | null;
10967
- /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10968
- schema?: {
10969
- [key: string]: unknown;
10970
- } | null;
10971
- slug?: string;
10972
- /** @enum {string} */
10973
- validationMode?: "off" | "warn" | "enforce";
10974
- };
10975
- };
10976
- };
10904
+ requestBody?: never;
10977
10905
  responses: {
10978
- /** @description Updated collection */
10906
+ /** @description Collection */
10979
10907
  200: {
10980
10908
  headers: {
10981
10909
  [name: string]: unknown;
10982
10910
  };
10983
10911
  content: {
10984
10912
  "application/json": {
10985
- collection: {
10913
+ createdAt: string;
10914
+ description: string | null;
10915
+ displayName: string;
10916
+ history?: {
10917
+ /** @enum {string} */
10918
+ changeKind: "additive" | "breaking";
10919
+ changedBy: string | null;
10986
10920
  createdAt: string;
10987
- description: string | null;
10988
- displayName: string;
10989
- icon: string | null;
10990
- id: string;
10991
- indexedFields: string[];
10992
- recordCount?: number;
10993
10921
  /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10994
10922
  schema: {
10995
10923
  [key: string]: unknown;
10996
10924
  } | null;
10997
- schemaVersion: number;
10998
- slug: string;
10999
- updatedAt: string;
11000
- /** @enum {string} */
11001
- validationMode: "off" | "warn" | "enforce";
11002
- };
11003
- enforceCheck?: {
11004
- checked: number;
11005
- failed: number;
11006
- truncated: boolean;
11007
- };
11008
- schemaChange?: {
11009
- breakingChanges: string[];
11010
- /** @enum {string} */
11011
- kind: "additive" | "breaking";
11012
- };
11013
- };
11014
- };
11015
- };
11016
- /** @description Invalid input, immutable slug (SLUG_IMMUTABLE), or breaking change while enforcing (BREAKING_SCHEMA_CHANGE_REQUIRES_WARN_MODE) */
11017
- 400: {
11018
- headers: {
11019
- [name: string]: unknown;
11020
- };
11021
- content: {
11022
- "application/json": components["schemas"]["Error"] & {
11023
- code?: string;
10925
+ version: number;
10926
+ }[];
10927
+ icon: string | null;
10928
+ id: string;
10929
+ indexedFields: string[];
10930
+ /** @description Who last wrote the definition (e.g. dashboard, api, sdk); sdk/terraform mean managed in code. */
10931
+ lastModifiedSource: string | null;
10932
+ recordCount?: number;
10933
+ /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
10934
+ schema: {
10935
+ [key: string]: unknown;
10936
+ } | null;
10937
+ schemaVersion: number;
10938
+ slug: string;
10939
+ updatedAt: string;
10940
+ /** @enum {string} */
10941
+ validationMode: "off" | "warn" | "enforce";
10942
+ };
10943
+ };
10944
+ };
10945
+ /** @description Unauthorized */
10946
+ 401: {
10947
+ headers: {
10948
+ [name: string]: unknown;
10949
+ };
10950
+ content: {
10951
+ "application/json": components["schemas"]["Error"];
10952
+ };
10953
+ };
10954
+ /** @description Insufficient permissions */
10955
+ 403: {
10956
+ headers: {
10957
+ [name: string]: unknown;
10958
+ };
10959
+ content: {
10960
+ "application/json": components["schemas"]["Error"];
10961
+ };
10962
+ };
10963
+ /** @description Not found */
10964
+ 404: {
10965
+ headers: {
10966
+ [name: string]: unknown;
10967
+ };
10968
+ content: {
10969
+ "application/json": components["schemas"]["Error"];
10970
+ };
10971
+ };
10972
+ /** @description Internal server error */
10973
+ 500: {
10974
+ headers: {
10975
+ [name: string]: unknown;
10976
+ };
10977
+ content: {
10978
+ "application/json": components["schemas"]["Error"];
10979
+ };
10980
+ };
10981
+ };
10982
+ };
10983
+ put?: never;
10984
+ post?: never;
10985
+ /**
10986
+ * Delete a collection
10987
+ * @description Delete the collection REGISTRATION only. Records of this type are not touched — they revert to schemaless behavior. Deleting records is a separate, explicit operation.
10988
+ */
10989
+ delete: {
10990
+ parameters: {
10991
+ query?: never;
10992
+ header?: never;
10993
+ path: {
10994
+ slug: string;
10995
+ };
10996
+ cookie?: never;
10997
+ };
10998
+ requestBody?: never;
10999
+ responses: {
11000
+ /** @description Deleted */
11001
+ 200: {
11002
+ headers: {
11003
+ [name: string]: unknown;
11004
+ };
11005
+ content: {
11006
+ "application/json": {
11007
+ success: boolean;
11008
+ };
11009
+ };
11010
+ };
11011
+ /** @description Unauthorized */
11012
+ 401: {
11013
+ headers: {
11014
+ [name: string]: unknown;
11015
+ };
11016
+ content: {
11017
+ "application/json": components["schemas"]["Error"];
11018
+ };
11019
+ };
11020
+ /** @description Insufficient permissions */
11021
+ 403: {
11022
+ headers: {
11023
+ [name: string]: unknown;
11024
+ };
11025
+ content: {
11026
+ "application/json": components["schemas"]["Error"];
11027
+ };
11028
+ };
11029
+ /** @description Not found */
11030
+ 404: {
11031
+ headers: {
11032
+ [name: string]: unknown;
11033
+ };
11034
+ content: {
11035
+ "application/json": components["schemas"]["Error"];
11036
+ };
11037
+ };
11038
+ /** @description Internal server error */
11039
+ 500: {
11040
+ headers: {
11041
+ [name: string]: unknown;
11042
+ };
11043
+ content: {
11044
+ "application/json": components["schemas"]["Error"];
11045
+ };
11046
+ };
11047
+ };
11048
+ };
11049
+ options?: never;
11050
+ head?: never;
11051
+ /**
11052
+ * Update a collection
11053
+ * @description Update display fields, validation mode, or the schema. Schema changes are classified additive vs breaking; breaking changes are rejected while the resulting mode is `enforce` (drop to `warn`, migrate, re-enforce). Every schema change bumps `schemaVersion` and appends a history row. When the mode transitions to `enforce`, the response includes `enforceCheck` — a bounded dry-run of existing records against the schema.
11054
+ */
11055
+ patch: {
11056
+ parameters: {
11057
+ query?: never;
11058
+ header?: never;
11059
+ path: {
11060
+ slug: string;
11061
+ };
11062
+ cookie?: never;
11063
+ };
11064
+ requestBody?: {
11065
+ content: {
11066
+ "application/json": {
11067
+ description?: string | null;
11068
+ displayName?: string;
11069
+ icon?: string | null;
11070
+ /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
11071
+ schema?: {
11072
+ [key: string]: unknown;
11073
+ } | null;
11074
+ slug?: string;
11075
+ /** @enum {string} */
11076
+ validationMode?: "off" | "warn" | "enforce";
11077
+ };
11078
+ };
11079
+ };
11080
+ responses: {
11081
+ /** @description Updated collection */
11082
+ 200: {
11083
+ headers: {
11084
+ [name: string]: unknown;
11085
+ };
11086
+ content: {
11087
+ "application/json": {
11088
+ collection: {
11089
+ createdAt: string;
11090
+ description: string | null;
11091
+ displayName: string;
11092
+ icon: string | null;
11093
+ id: string;
11094
+ indexedFields: string[];
11095
+ /** @description Who last wrote the definition (e.g. dashboard, api, sdk); sdk/terraform mean managed in code. */
11096
+ lastModifiedSource: string | null;
11097
+ recordCount?: number;
11098
+ /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
11099
+ schema: {
11100
+ [key: string]: unknown;
11101
+ } | null;
11102
+ schemaVersion: number;
11103
+ slug: string;
11104
+ updatedAt: string;
11105
+ /** @enum {string} */
11106
+ validationMode: "off" | "warn" | "enforce";
11107
+ };
11108
+ enforceCheck?: {
11109
+ checked: number;
11110
+ failed: number;
11111
+ truncated: boolean;
11112
+ };
11113
+ schemaChange?: {
11114
+ breakingChanges: string[];
11115
+ /** @enum {string} */
11116
+ kind: "additive" | "breaking";
11117
+ };
11118
+ };
11119
+ };
11120
+ };
11121
+ /** @description Invalid input, immutable slug (SLUG_IMMUTABLE), or breaking change while enforcing (BREAKING_SCHEMA_CHANGE_REQUIRES_WARN_MODE) */
11122
+ 400: {
11123
+ headers: {
11124
+ [name: string]: unknown;
11125
+ };
11126
+ content: {
11127
+ "application/json": components["schemas"]["Error"] & {
11128
+ code?: string;
11024
11129
  };
11025
11130
  };
11026
11131
  };
@@ -11158,6 +11263,83 @@ interface paths {
11158
11263
  patch?: never;
11159
11264
  trace?: never;
11160
11265
  };
11266
+ "/v1/collections/{slug}/pull": {
11267
+ parameters: {
11268
+ query?: never;
11269
+ header?: never;
11270
+ path?: never;
11271
+ cookie?: never;
11272
+ };
11273
+ /**
11274
+ * Pull collection definition (config-as-code)
11275
+ * @description Return the canonical config-as-code definition and provenance for a collection — the absorb-drift direction of the ensure protocol. The contentHash is recomputed from the live collection, so it is accurate even immediately after a dashboard edit.
11276
+ */
11277
+ get: {
11278
+ parameters: {
11279
+ query?: never;
11280
+ header?: never;
11281
+ path: {
11282
+ slug: string;
11283
+ };
11284
+ cookie?: never;
11285
+ };
11286
+ requestBody?: never;
11287
+ responses: {
11288
+ /** @description Canonical definition + provenance */
11289
+ 200: {
11290
+ headers: {
11291
+ [name: string]: unknown;
11292
+ };
11293
+ content: {
11294
+ "application/json": components["schemas"]["CollectionPullResponse"];
11295
+ };
11296
+ };
11297
+ /** @description Unauthorized */
11298
+ 401: {
11299
+ headers: {
11300
+ [name: string]: unknown;
11301
+ };
11302
+ content: {
11303
+ "application/json": components["schemas"]["Error"];
11304
+ };
11305
+ };
11306
+ /** @description Insufficient permissions */
11307
+ 403: {
11308
+ headers: {
11309
+ [name: string]: unknown;
11310
+ };
11311
+ content: {
11312
+ "application/json": components["schemas"]["Error"];
11313
+ };
11314
+ };
11315
+ /** @description No collection with that slug in the account scope */
11316
+ 404: {
11317
+ headers: {
11318
+ [name: string]: unknown;
11319
+ };
11320
+ content: {
11321
+ "application/json": components["schemas"]["Error"];
11322
+ };
11323
+ };
11324
+ /** @description Internal server error */
11325
+ 500: {
11326
+ headers: {
11327
+ [name: string]: unknown;
11328
+ };
11329
+ content: {
11330
+ "application/json": components["schemas"]["Error"];
11331
+ };
11332
+ };
11333
+ };
11334
+ };
11335
+ put?: never;
11336
+ post?: never;
11337
+ delete?: never;
11338
+ options?: never;
11339
+ head?: never;
11340
+ patch?: never;
11341
+ trace?: never;
11342
+ };
11161
11343
  "/v1/collections/{slug}/validate-existing": {
11162
11344
  parameters: {
11163
11345
  query?: never;
@@ -15806,7 +15988,7 @@ interface paths {
15806
15988
  put?: never;
15807
15989
  /**
15808
15990
  * Ensure eval suite (config-as-code converge)
15809
- * @description Idempotently converge a repo-defined eval suite (target + cases + graders) onto the platform. Identity is the suite name + account scope; the target flow/agent is resolved by name. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response, not an error); full requests create the suite or replace its cases when the canonical content hash differs. Non-executing: never runs the eval. The response always carries the server-computed canonical hash.
15991
+ * @description Idempotently converge a repo-defined eval suite (target + cases + graders) onto the platform. Identity is the suite name + account scope; the target flow/agent is resolved by name. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response, not an error); full requests create the suite or replace the cases ensure owns when the canonical content hash differs. Cases saved from runs, added in the dashboard, or owned by a product are never replaced. Set dryRun to plan without writing (CI drift gate), and onConflict: "overwrite" to converge over dashboard/API edits. Non-executing: never runs the eval. The response always carries the server-computed canonical hash.
15810
15992
  */
15811
15993
  post: {
15812
15994
  parameters: {
@@ -15870,12 +16052,16 @@ interface paths {
15870
16052
  };
15871
16053
  virtual?: boolean;
15872
16054
  };
16055
+ dryRun?: boolean;
16056
+ expectedRemoteHash?: string;
15873
16057
  name: string;
16058
+ /** @enum {string} */
16059
+ onConflict?: "error" | "overwrite";
15874
16060
  };
15875
16061
  };
15876
16062
  };
15877
16063
  responses: {
15878
- /** @description Converge result: unchanged | created | updated | definitionRequired (hash miss — retry with the full definition) */
16064
+ /** @description Converge result: unchanged | created | updated | definitionRequired (hash miss — retry with the full definition) | plan (dryRun) */
15879
16065
  200: {
15880
16066
  headers: {
15881
16067
  [name: string]: unknown;
@@ -15911,6 +16097,15 @@ interface paths {
15911
16097
  "application/json": components["schemas"]["Error"];
15912
16098
  };
15913
16099
  };
16100
+ /** @description Conflict: external_modification (last write was not ensure; pass onConflict: "overwrite") or remote_changed (expectedRemoteHash guard) */
16101
+ 409: {
16102
+ headers: {
16103
+ [name: string]: unknown;
16104
+ };
16105
+ content: {
16106
+ "application/json": components["schemas"]["EvalEnsureConflict"];
16107
+ };
16108
+ };
15914
16109
  /** @description Submitted contentHash does not match the server-recomputed canonical hash */
15915
16110
  422: {
15916
16111
  headers: {
@@ -16195,7 +16390,7 @@ interface paths {
16195
16390
  };
16196
16391
  /**
16197
16392
  * Pull eval suite definition (config-as-code)
16198
- * @description Return the canonical config-as-code definition and provenance for an eval suite by name — the absorb-drift direction of the ensure protocol. The contentHash is recomputed from the live suite state.
16393
+ * @description Return the canonical config-as-code definition and provenance for an eval suite by name — the absorb-drift direction of the ensure protocol. The definition carries the cases ensure owns (or, for a suite ensure never wrote, its unowned cases), and the contentHash is recomputed from that live state.
16199
16394
  */
16200
16395
  get: {
16201
16396
  parameters: {
@@ -16935,7 +17130,7 @@ interface paths {
16935
17130
  name: string;
16936
17131
  notes?: string;
16937
17132
  /**
16938
- * @description Case provenance. Defaults to "manual" when omitted.
17133
+ * @description Case provenance. Defaults to "manual" when omitted. "ensure" is reserved for config-as-code converges.
16939
17134
  * @enum {string}
16940
17135
  */
16941
17136
  origin?: "manual" | "saved_from_run" | "generated" | "imported" | "fpo";
@@ -17341,7 +17536,7 @@ interface paths {
17341
17536
  name: string;
17342
17537
  notes?: string;
17343
17538
  /**
17344
- * @description Case provenance. Defaults to "manual" when omitted.
17539
+ * @description Case provenance. Defaults to "manual" when omitted. "ensure" is reserved for config-as-code converges.
17345
17540
  * @enum {string}
17346
17541
  */
17347
17542
  origin?: "manual" | "saved_from_run" | "generated" | "imported" | "fpo";
@@ -18848,6 +19043,10 @@ interface paths {
18848
19043
  executionLane?: "durable" | "in_process";
18849
19044
  httpStatus?: number;
18850
19045
  result?: unknown;
19046
+ /** @description Present and `true` when the execution settled but its result was too large to store or could not be retrieved; `result` then holds only a summary and `resultUnavailableReason` explains why. `error` keeps describing an execution failure; on an otherwise completed execution it repeats the reason. */
19047
+ resultUnavailable?: boolean;
19048
+ /** @description Why the result is unavailable. Present exactly when `resultUnavailable` is `true`. */
19049
+ resultUnavailableReason?: string;
18851
19050
  /** @enum {string} */
18852
19051
  status: "queued" | "running" | "paused" | "completed" | "failed" | "cancelled";
18853
19052
  targetId?: string;
@@ -30707,6 +30906,7 @@ interface paths {
30707
30906
  productGoal?: string;
30708
30907
  /** @enum {string} */
30709
30908
  productStage?: "idea" | "prototype" | "beta" | "production" | "scaling";
30909
+ stack?: components["schemas"]["ProductStack"];
30710
30910
  targetAudience?: string;
30711
30911
  techStack?: {
30712
30912
  backend?: string[];
@@ -30808,7 +31008,7 @@ interface paths {
30808
31008
  put?: never;
30809
31009
  /**
30810
31010
  * Ensure full product (config-as-code converge of the whole FPO)
30811
- * @description Idempotently converge an entire Full Product Object (the nested product graph) in one shot. Fans out to the per-entity ensure services in dependency order (product → capability backing flows/agents → capability-as-tool composition → capability links → surfaces + surface items → records → schedules → secret bindings), returning a per-entity report. Identity is the product name + account scope. NON-atomic by design: a per-entity failure is reported in `entities[].result = "failed"` (and `hasFailures`) and a re-run self-heals; only a top-level product reject aborts. Set dryRun to plan without writing. Set prune to remove product-scoped capabilities/surfaces (and their items) absent from the FPO (account-scoped flows/agents/tools/records are never removed). Whole-FPO fast-probe is not yet supported (PR3). API keys converge each nested flow, agent, schedule, record, eval suite and skill only with that entity kind's own write scope (FLOWS:WRITE, AGENTS:WRITE or AGENTS:CREATE/UPDATE, SCHEDULES:WRITE, RECORDS:WRITE, EVALS:WRITE, SKILLS:WRITE) on top of the product scope; otherwise that entity reports `failed`. Binding a skill to an agent also needs agent update scope. Schedules also honor the plan's active-schedule limit and minimum frequency.
31011
+ * @description Idempotently converge an entire Full Product Object (the nested product graph) in one shot. Fans out to the per-entity ensure services in dependency order (product → capability backing flows/agents → capability-as-tool composition → capability links → surfaces + surface items → records → schedules → secret bindings), returning a per-entity report. Identity is the product name + account scope. NON-atomic by design: a per-entity failure is reported in `entities[].result = "failed"` (and `hasFailures`) and a re-run self-heals; only a top-level product reject aborts. Converged capability agents and flows are published to `live` by default; set release to "none" to save changes as drafts. Set dryRun to plan without writing. Set prune to remove product-scoped capabilities/surfaces (and their items) absent from the FPO (account-scoped flows/agents/tools/records are never removed). A hash-only probe (`name` + `contentHash`, no fpo) with release "none" answers `unchanged` when the live graph reconstructs (as GET /products/pull-fpo does) to that hash, else `definitionRequired` (retry with the full fpo); a probe that publishes (the default release) always answers `definitionRequired`, because only a full converge can publish drafts that are not yet live. The probe, the dryRun `remoteHash` and expectedRemoteHash read the live graph, so API keys need PRODUCTS:READ for them. A dryRun reports the live graph's `remoteHash`; pass it as expectedRemoteHash on the apply to refuse the write (409 remote_changed) if the product changed in between. The guard compares what GET /products/pull-fpo reconstructs, so edits to seed records, schedules or secrets (which pull-fpo omits) do not trip it. When pull-fpo has to omit part of the product (a capability, surface, schedule, eval suite or skill it cannot represent), a probe answers `definitionRequired`, a dryRun reports no `remoteHash`, and expectedRemoteHash is refused with 409. The guard is re-checked immediately before the first write but does not lock the graph, so an edit that lands while the apply is running can still be overwritten. API keys need PRODUCTS:CREATE to create the product and PRODUCTS:UPDATE to change an existing one (PRODUCTS:WRITE covers both). API keys converge each nested flow, agent, tool, surface, schedule, record, eval suite and skill only with that entity kind's own write scope (FLOWS:WRITE, AGENTS:WRITE or AGENTS:CREATE/UPDATE, TOOLS:WRITE, PRODUCTS:SURFACES:WRITE, SCHEDULES:WRITE, RECORDS:WRITE, EVALS:WRITE, SKILLS:WRITE) on top of the product scope; otherwise that entity reports `failed`. Adding or changing a capability on an existing product needs PRODUCTS:CAPABILITIES:WRITE, and adding a route to an existing surface needs PRODUCTS:SURFACES:WRITE. Prune needs PRODUCTS:CAPABILITIES:WRITE to remove capabilities and PRODUCTS:SURFACES:WRITE to remove surfaces or their items, and a pruned surface's client tokens are revoked. Binding a skill to an agent also needs agent update scope. Schedules also honor the plan's active-schedule limit and minimum frequency.
30812
31012
  */
30813
31013
  post: {
30814
31014
  parameters: {
@@ -30820,12 +31020,18 @@ interface paths {
30820
31020
  requestBody?: {
30821
31021
  content: {
30822
31022
  "application/json": {
31023
+ /** @description Hash-only probe: the canonical FPO hash the caller holds. Answers `unchanged` when the live graph reconstructs (as pull-fpo does) to this hash, else `definitionRequired`. Only valid without `fpo`. */
31024
+ contentHash?: string;
30823
31025
  /** @description Plan without writing — returns a per-entity plan (CI drift gate). */
30824
31026
  dryRun?: boolean;
30825
- /** @description A complete Full Product Object (FPO): the nested product graph (product, capabilities, tools, surfaces, ...). Validated server-side via the shared FPO validator. */
30826
- fpo: {
31027
+ /** @description TOCTOU guard binding a dry run to its apply: the write proceeds only while the live graph still hashes to this value (the dry run's `remoteHash`); otherwise 409 remote_changed. */
31028
+ expectedRemoteHash?: string;
31029
+ /** @description A complete Full Product Object (FPO): the nested product graph (product, capabilities, tools, surfaces, ...). Validated server-side via the shared FPO validator. Omit it only for a hash-only probe (`name` + `contentHash`). */
31030
+ fpo?: {
30827
31031
  [key: string]: unknown;
30828
31032
  };
31033
+ /** @description The product name a hash-only probe resolves. Only valid without `fpo`. */
31034
+ name?: string;
30829
31035
  /**
30830
31036
  * @description Per nested entity: "overwrite" converges over dashboard/API edits.
30831
31037
  * @enum {string}
@@ -30833,11 +31039,16 @@ interface paths {
30833
31039
  onConflict?: "error" | "overwrite";
30834
31040
  /** @description Opt-in removal of product-scoped capabilities/surfaces (and their items) absent from the FPO, after the converge passes. NEVER touches account-scoped flows/agents/tools/records. Honors createPolicy:"skip". With dryRun, reports would-be removals as `pruned` plan rows. */
30835
31041
  prune?: boolean;
31042
+ /**
31043
+ * @description Whether converged capability agents and flows go live. Defaults to "publish": an agent or flow whose converged content is not yet live is versioned and published (the agent's `live` alias moves to that version), matching product creation. "none" saves changes as drafts and leaves `live` where it was. Publishing needs update authority over that entity kind, and for an agent the live deploy scope (AGENTS:DEPLOY:LIVE; AGENTS:WRITE or AGENTS:UPDATE also accepted); an API key without it converges that kind as "none".
31044
+ * @enum {string}
31045
+ */
31046
+ release?: "none" | "publish";
30836
31047
  };
30837
31048
  };
30838
31049
  };
30839
31050
  responses: {
30840
- /** @description Converge result: unchanged | converged | plan (dryRun), with a per-entity report. */
31051
+ /** @description Converge result: unchanged | converged | plan (dryRun), with a per-entity report; or definitionRequired (hash-only probe miss — retry with the full fpo). */
30841
31052
  200: {
30842
31053
  headers: {
30843
31054
  [name: string]: unknown;
@@ -30873,7 +31084,7 @@ interface paths {
30873
31084
  "application/json": components["schemas"]["Error"];
30874
31085
  };
30875
31086
  };
30876
- /** @description Conflict converging the top-level product: external_modification or remote_changed. */
31087
+ /** @description Conflict: external_modification converging the top-level product, or remote_changed (expectedRemoteHash guard). */
30877
31088
  409: {
30878
31089
  headers: {
30879
31090
  [name: string]: unknown;
@@ -31601,6 +31812,18 @@ interface paths {
31601
31812
  totalCost: string | null;
31602
31813
  /** @description Trace id in the span store; null on a row the control-plane arm served. */
31603
31814
  traceId: string | null;
31815
+ /** @description How the run started, for a Via column. Forward-only for schedule, api key, cli, mcp and eval detail: a header written before those stamps reads null, or falls back to the coarse origin/surface facts when they alone answer it. A label is a snapshot or a lookup and never authority; mcp, cli and sdk are self-declared by the client. */
31816
+ via?: {
31817
+ /** @description The thing that started it: the schedule id (schedule), product surface id (surface), API key id (api), the acting user id (cli) or eval suite id (eval). Null for mcp and test, and for an api run whose header predates key stamping. */
31818
+ id: string | null;
31819
+ /**
31820
+ * @description One word for the way the run started.
31821
+ * @enum {string}
31822
+ */
31823
+ kind: "schedule" | "surface" | "api" | "mcp" | "cli" | "test" | "eval";
31824
+ /** @description Its display name when the API could resolve one: schedule name, surface name, API key name as it was at dispatch, MCP client name, the acting user's first name, or eval suite name. Null when unresolved, for example a deleted schedule. */
31825
+ label: string | null;
31826
+ } | null;
31604
31827
  }[];
31605
31828
  error?: {
31606
31829
  message: string;
@@ -33125,7 +33348,7 @@ interface paths {
33125
33348
  put?: never;
33126
33349
  /**
33127
33350
  * Ensure surface (config-as-code converge)
33128
- * @description Idempotently converge a repo-defined surface definition onto a product. Identity is name + product. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response, not an error); full requests create the surface or update it when the canonical content hash differs. The response always carries the server-computed canonical hash. Set dryRun to plan without writing (CI drift gate), and onConflict: "overwrite" to converge over dashboard/API edits. Surfaces have no version snapshots, so there is no publish option.
33351
+ * @description Idempotently converge a repo-defined surface definition onto a product. Identity is name + product. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response, not an error); full requests create the surface or update it when the canonical content hash differs. The response always carries the server-computed canonical hash. Set dryRun to plan without writing (CI drift gate), and onConflict: "overwrite" to converge over dashboard/API edits. Surfaces have no version snapshots, so there is no publish option. inbound/outbound are excluded from the content hash, so a request carrying them must send the full definition; changes to them are reported in changedKeys (as inbound.<key> / outbound.<key>) and converge as "updated".
33129
33352
  */
33130
33353
  post: {
33131
33354
  parameters: {
@@ -33146,13 +33369,15 @@ interface paths {
33146
33369
  };
33147
33370
  /** @enum {string} */
33148
33371
  environment?: "production" | "development";
33372
+ /** @description Inbound channel config. Omit to keep the stored value; null clears it. A credential value of "<redacted>" (as returned by pull) keeps the stored credential. */
33149
33373
  inbound?: {
33150
33374
  [key: string]: unknown;
33151
- };
33375
+ } | null;
33152
33376
  name: string;
33377
+ /** @description Outbound channel config. Omit to keep the stored value; null clears it. A credential value of "<redacted>" (as returned by pull) keeps the stored credential. */
33153
33378
  outbound?: {
33154
33379
  [key: string]: unknown;
33155
- };
33380
+ } | null;
33156
33381
  /** @enum {string} */
33157
33382
  status?: "draft" | "active" | "paused";
33158
33383
  /** @enum {string} */
@@ -33256,7 +33481,7 @@ interface paths {
33256
33481
  };
33257
33482
  /**
33258
33483
  * Pull surface definition (config-as-code)
33259
- * @description Return the canonical config-as-code definition and provenance for a surface by name within a product — the absorb-drift direction of the ensure protocol. The contentHash is recomputed from the live surface state, so it is accurate even immediately after a dashboard edit.
33484
+ * @description Return the canonical config-as-code definition and provenance for a surface by name within a product — the absorb-drift direction of the ensure protocol. The contentHash is recomputed from the live surface state, so it is accurate even immediately after a dashboard edit. Configured inbound/outbound credentials are returned as the "<redacted>" placeholder, which ensure accepts to keep the stored value; inbound/outbound are null when the surface has none.
33260
33485
  */
33261
33486
  get: {
33262
33487
  parameters: {
@@ -39609,47 +39834,72 @@ interface paths {
39609
39834
  patch?: never;
39610
39835
  trace?: never;
39611
39836
  };
39612
- "/v1/question-sets/{id}": {
39837
+ "/v1/question-sets/ensure": {
39613
39838
  parameters: {
39614
39839
  query?: never;
39615
39840
  header?: never;
39616
39841
  path?: never;
39617
39842
  cookie?: never;
39618
39843
  };
39844
+ get?: never;
39845
+ put?: never;
39619
39846
  /**
39620
- * Get a question set
39621
- * @description A question set with its versions, newest first.
39847
+ * Ensure question set (config-as-code converge)
39848
+ * @description Idempotently converge a repo-defined question set. Identity is the slug within the organization. A hash-only probe skips the payload in the steady state (a miss is a normal 200 `definitionRequired`, not an error); a full request creates the set, or appends a draft version when the questions, input mapping or model differ. Set dryRun to plan without writing, onConflict: "overwrite" to converge over dashboard or API edits, expectedRemoteHash to bind an apply to its dry run, and release: "publish" to publish the latest version. Ensure never deletes a set or a version.
39622
39849
  */
39623
- get: {
39850
+ post: {
39624
39851
  parameters: {
39625
39852
  query?: never;
39626
39853
  header?: never;
39627
- path: {
39628
- id: string;
39629
- };
39854
+ path?: never;
39630
39855
  cookie?: never;
39631
39856
  };
39632
- requestBody?: never;
39857
+ requestBody?: {
39858
+ content: {
39859
+ "application/json": {
39860
+ contentHash?: string;
39861
+ definition?: {
39862
+ description?: string | null;
39863
+ inputMapping?: {
39864
+ [key: string]: string;
39865
+ } | null;
39866
+ model?: string | null;
39867
+ name: string;
39868
+ /** @description Judgment questions keyed by question id, validated like `POST /v1/question-sets`. */
39869
+ questions: {
39870
+ [key: string]: unknown;
39871
+ };
39872
+ };
39873
+ dryRun?: boolean;
39874
+ expectedRemoteHash?: string;
39875
+ /** @enum {string} */
39876
+ onConflict?: "error" | "overwrite";
39877
+ /** @enum {string} */
39878
+ release?: "none" | "publish";
39879
+ /** @description Identity, unique in the organization: lowercase letters, digits, `-` and `_`, up to 64. */
39880
+ slug: string;
39881
+ };
39882
+ };
39883
+ };
39633
39884
  responses: {
39634
- /** @description Question set */
39885
+ /** @description Converge result: unchanged | created | updated | definitionRequired (hash miss; retry with the full definition) | plan (dryRun) */
39635
39886
  200: {
39636
39887
  headers: {
39637
39888
  [name: string]: unknown;
39638
39889
  };
39639
39890
  content: {
39640
- "application/json": {
39641
- questionSet: components["schemas"]["QuestionSet"];
39642
- versions: components["schemas"]["QuestionSetVersion"][];
39643
- };
39891
+ "application/json": components["schemas"]["QuestionSetEnsureResponse"];
39644
39892
  };
39645
39893
  };
39646
- /** @description Invalid request */
39894
+ /** @description Invalid request or invalid questions */
39647
39895
  400: {
39648
39896
  headers: {
39649
39897
  [name: string]: unknown;
39650
39898
  };
39651
39899
  content: {
39652
- "application/json": components["schemas"]["QuestionSetError"];
39900
+ "application/json": components["schemas"]["Error"] & {
39901
+ code?: string;
39902
+ };
39653
39903
  };
39654
39904
  };
39655
39905
  /** @description Unauthorized */
@@ -39670,79 +39920,37 @@ interface paths {
39670
39920
  "application/json": components["schemas"]["Error"];
39671
39921
  };
39672
39922
  };
39673
- /** @description Not found */
39923
+ /** @description The question set was removed while the converge ran */
39674
39924
  404: {
39675
39925
  headers: {
39676
39926
  [name: string]: unknown;
39677
39927
  };
39678
39928
  content: {
39679
- "application/json": components["schemas"]["QuestionSetError"];
39680
- };
39681
- };
39682
- };
39683
- };
39684
- /**
39685
- * Update a question set
39686
- * @description Update the name or description, and append a new draft version when `questions`, `inputMapping` or `model` is present. Fields left out of a new version carry over from the latest version. No existing version is changed, and the slug is fixed.
39687
- */
39688
- put: {
39689
- parameters: {
39690
- query?: never;
39691
- header?: never;
39692
- path: {
39693
- id: string;
39694
- };
39695
- cookie?: never;
39696
- };
39697
- requestBody?: {
39698
- content: {
39699
- "application/json": {
39700
- description?: string | null;
39701
- inputMapping?: {
39702
- [key: string]: string;
39703
- } | null;
39704
- model?: string | null;
39705
- name?: string;
39706
- /** @description Judgment questions keyed by question id. Each is `{ type: "boolean" | "choice" | "score", instructions, criteria }`. The id is never sent to the model, so instructions and criteria carry the meaning. */
39707
- questions?: {
39708
- [key: string]: unknown;
39709
- };
39710
- };
39711
- };
39712
- };
39713
- responses: {
39714
- /** @description Updated */
39715
- 200: {
39716
- headers: {
39717
- [name: string]: unknown;
39718
- };
39719
- content: {
39720
- "application/json": {
39721
- questionSet: components["schemas"]["QuestionSet"];
39722
- version: components["schemas"]["QuestionSetVersion"] & (Record<string, never> | null);
39929
+ "application/json": components["schemas"]["Error"] & {
39930
+ code?: string;
39723
39931
  };
39724
39932
  };
39725
39933
  };
39726
- /** @description Invalid request */
39727
- 400: {
39934
+ /** @description Conflict: external_modification (the last write was not ensure; pass onConflict: "overwrite"), remote_changed (expectedRemoteHash guard), or a concurrent write */
39935
+ 409: {
39728
39936
  headers: {
39729
39937
  [name: string]: unknown;
39730
39938
  };
39731
39939
  content: {
39732
- "application/json": components["schemas"]["QuestionSetError"];
39940
+ "application/json": components["schemas"]["QuestionSetEnsureConflict"];
39733
39941
  };
39734
39942
  };
39735
- /** @description Unauthorized */
39736
- 401: {
39943
+ /** @description The submitted contentHash does not match the server-recomputed canonical hash */
39944
+ 422: {
39737
39945
  headers: {
39738
39946
  [name: string]: unknown;
39739
39947
  };
39740
39948
  content: {
39741
- "application/json": components["schemas"]["Error"];
39949
+ "application/json": components["schemas"]["QuestionSetEnsureHashMismatch"];
39742
39950
  };
39743
39951
  };
39744
- /** @description Insufficient permissions, or no organization context */
39745
- 403: {
39952
+ /** @description Internal server error */
39953
+ 500: {
39746
39954
  headers: {
39747
39955
  [name: string]: unknown;
39748
39956
  };
@@ -39750,34 +39958,15 @@ interface paths {
39750
39958
  "application/json": components["schemas"]["Error"];
39751
39959
  };
39752
39960
  };
39753
- /** @description Not found */
39754
- 404: {
39755
- headers: {
39756
- [name: string]: unknown;
39757
- };
39758
- content: {
39759
- "application/json": components["schemas"]["QuestionSetError"];
39760
- };
39761
- };
39762
- /** @description Conflict */
39763
- 409: {
39764
- headers: {
39765
- [name: string]: unknown;
39766
- };
39767
- content: {
39768
- "application/json": components["schemas"]["QuestionSetError"];
39769
- };
39770
- };
39771
39961
  };
39772
39962
  };
39773
- post?: never;
39774
39963
  delete?: never;
39775
39964
  options?: never;
39776
39965
  head?: never;
39777
39966
  patch?: never;
39778
39967
  trace?: never;
39779
39968
  };
39780
- "/v1/question-sets/{id}/resolved": {
39969
+ "/v1/question-sets/pull": {
39781
39970
  parameters: {
39782
39971
  query?: never;
39783
39972
  header?: never;
@@ -39785,38 +39974,28 @@ interface paths {
39785
39974
  cookie?: never;
39786
39975
  };
39787
39976
  /**
39788
- * Resolve a question set
39789
- * @description The question set exactly as an execution receives it: the current published version (or the published `version` named), with its current calibration. A draft-only set answers 404 QUESTION_SET_UNRESOLVED.
39977
+ * Pull question set definition (config-as-code)
39978
+ * @description Return the canonical config-as-code definition and provenance for a question set by slug. The definition is the latest version, and the contentHash is recomputed from the live row, so it is accurate right after a dashboard edit.
39790
39979
  */
39791
39980
  get: {
39792
39981
  parameters: {
39793
- query?: {
39794
- version?: number;
39982
+ query: {
39983
+ /** @description Identity, unique in the organization: lowercase letters, digits, `-` and `_`, up to 64. */
39984
+ slug: string;
39795
39985
  };
39796
39986
  header?: never;
39797
- path: {
39798
- id: string;
39799
- };
39987
+ path?: never;
39800
39988
  cookie?: never;
39801
39989
  };
39802
39990
  requestBody?: never;
39803
39991
  responses: {
39804
- /** @description Resolved */
39992
+ /** @description Canonical definition and provenance */
39805
39993
  200: {
39806
39994
  headers: {
39807
39995
  [name: string]: unknown;
39808
39996
  };
39809
39997
  content: {
39810
- "application/json": components["schemas"]["ResolvedQuestionSet"];
39811
- };
39812
- };
39813
- /** @description Invalid request */
39814
- 400: {
39815
- headers: {
39816
- [name: string]: unknown;
39817
- };
39818
- content: {
39819
- "application/json": components["schemas"]["QuestionSetError"];
39998
+ "application/json": components["schemas"]["QuestionSetPullResponse"];
39820
39999
  };
39821
40000
  };
39822
40001
  /** @description Unauthorized */
@@ -39837,69 +40016,8 @@ interface paths {
39837
40016
  "application/json": components["schemas"]["Error"];
39838
40017
  };
39839
40018
  };
39840
- /** @description Not found */
40019
+ /** @description No question set with that slug in the organization */
39841
40020
  404: {
39842
- headers: {
39843
- [name: string]: unknown;
39844
- };
39845
- content: {
39846
- "application/json": components["schemas"]["QuestionSetError"];
39847
- };
39848
- };
39849
- };
39850
- };
39851
- put?: never;
39852
- post?: never;
39853
- delete?: never;
39854
- options?: never;
39855
- head?: never;
39856
- patch?: never;
39857
- trace?: never;
39858
- };
39859
- "/v1/question-sets/{id}/versions": {
39860
- parameters: {
39861
- query?: never;
39862
- header?: never;
39863
- path?: never;
39864
- cookie?: never;
39865
- };
39866
- /**
39867
- * List a question set's versions
39868
- * @description Every version, newest first.
39869
- */
39870
- get: {
39871
- parameters: {
39872
- query?: never;
39873
- header?: never;
39874
- path: {
39875
- id: string;
39876
- };
39877
- cookie?: never;
39878
- };
39879
- requestBody?: never;
39880
- responses: {
39881
- /** @description Versions */
39882
- 200: {
39883
- headers: {
39884
- [name: string]: unknown;
39885
- };
39886
- content: {
39887
- "application/json": {
39888
- data: components["schemas"]["QuestionSetVersion"][];
39889
- };
39890
- };
39891
- };
39892
- /** @description Invalid request */
39893
- 400: {
39894
- headers: {
39895
- [name: string]: unknown;
39896
- };
39897
- content: {
39898
- "application/json": components["schemas"]["QuestionSetError"];
39899
- };
39900
- };
39901
- /** @description Unauthorized */
39902
- 401: {
39903
40021
  headers: {
39904
40022
  [name: string]: unknown;
39905
40023
  };
@@ -39907,8 +40025,8 @@ interface paths {
39907
40025
  "application/json": components["schemas"]["Error"];
39908
40026
  };
39909
40027
  };
39910
- /** @description Insufficient permissions, or no organization context */
39911
- 403: {
40028
+ /** @description Internal server error */
40029
+ 500: {
39912
40030
  headers: {
39913
40031
  [name: string]: unknown;
39914
40032
  };
@@ -39916,15 +40034,6 @@ interface paths {
39916
40034
  "application/json": components["schemas"]["Error"];
39917
40035
  };
39918
40036
  };
39919
- /** @description Not found */
39920
- 404: {
39921
- headers: {
39922
- [name: string]: unknown;
39923
- };
39924
- content: {
39925
- "application/json": components["schemas"]["QuestionSetError"];
39926
- };
39927
- };
39928
40037
  };
39929
40038
  };
39930
40039
  put?: never;
@@ -39935,7 +40044,7 @@ interface paths {
39935
40044
  patch?: never;
39936
40045
  trace?: never;
39937
40046
  };
39938
- "/v1/question-sets/{id}/versions/{versionNumber}/calibrations": {
40047
+ "/v1/question-sets/{id}": {
39939
40048
  parameters: {
39940
40049
  query?: never;
39941
40050
  header?: never;
@@ -39943,35 +40052,361 @@ interface paths {
39943
40052
  cookie?: never;
39944
40053
  };
39945
40054
  /**
39946
- * List a question set version's calibrations
39947
- * @description The calibration history of one version, newest first, with cursor pagination.
40055
+ * Get a question set
40056
+ * @description A question set with its versions, newest first.
39948
40057
  */
39949
40058
  get: {
39950
40059
  parameters: {
39951
- query?: {
39952
- /** @description 1-200, default 50. */
39953
- limit?: string;
39954
- /** @description `pagination.nextCursor` from a previous page. */
39955
- cursor?: string;
39956
- };
40060
+ query?: never;
39957
40061
  header?: never;
39958
40062
  path: {
39959
40063
  id: string;
39960
- versionNumber: number;
39961
40064
  };
39962
40065
  cookie?: never;
39963
40066
  };
39964
40067
  requestBody?: never;
39965
40068
  responses: {
39966
- /** @description Calibrations */
40069
+ /** @description Question set */
39967
40070
  200: {
39968
40071
  headers: {
39969
40072
  [name: string]: unknown;
39970
40073
  };
39971
40074
  content: {
39972
40075
  "application/json": {
39973
- data: components["schemas"]["JudgmentCalibrationRecord"][];
39974
- pagination: components["schemas"]["Pagination"];
40076
+ questionSet: components["schemas"]["QuestionSet"];
40077
+ versions: components["schemas"]["QuestionSetVersion"][];
40078
+ };
40079
+ };
40080
+ };
40081
+ /** @description Invalid request */
40082
+ 400: {
40083
+ headers: {
40084
+ [name: string]: unknown;
40085
+ };
40086
+ content: {
40087
+ "application/json": components["schemas"]["QuestionSetError"];
40088
+ };
40089
+ };
40090
+ /** @description Unauthorized */
40091
+ 401: {
40092
+ headers: {
40093
+ [name: string]: unknown;
40094
+ };
40095
+ content: {
40096
+ "application/json": components["schemas"]["Error"];
40097
+ };
40098
+ };
40099
+ /** @description Insufficient permissions, or no organization context */
40100
+ 403: {
40101
+ headers: {
40102
+ [name: string]: unknown;
40103
+ };
40104
+ content: {
40105
+ "application/json": components["schemas"]["Error"];
40106
+ };
40107
+ };
40108
+ /** @description Not found */
40109
+ 404: {
40110
+ headers: {
40111
+ [name: string]: unknown;
40112
+ };
40113
+ content: {
40114
+ "application/json": components["schemas"]["QuestionSetError"];
40115
+ };
40116
+ };
40117
+ };
40118
+ };
40119
+ /**
40120
+ * Update a question set
40121
+ * @description Update the name or description, and append a new draft version when `questions`, `inputMapping` or `model` is present. Fields left out of a new version carry over from the latest version. No existing version is changed, and the slug is fixed.
40122
+ */
40123
+ put: {
40124
+ parameters: {
40125
+ query?: never;
40126
+ header?: never;
40127
+ path: {
40128
+ id: string;
40129
+ };
40130
+ cookie?: never;
40131
+ };
40132
+ requestBody?: {
40133
+ content: {
40134
+ "application/json": {
40135
+ description?: string | null;
40136
+ inputMapping?: {
40137
+ [key: string]: string;
40138
+ } | null;
40139
+ model?: string | null;
40140
+ name?: string;
40141
+ /** @description Judgment questions keyed by question id. Each is `{ type: "boolean" | "choice" | "score", instructions, criteria }`. The id is never sent to the model, so instructions and criteria carry the meaning. */
40142
+ questions?: {
40143
+ [key: string]: unknown;
40144
+ };
40145
+ };
40146
+ };
40147
+ };
40148
+ responses: {
40149
+ /** @description Updated */
40150
+ 200: {
40151
+ headers: {
40152
+ [name: string]: unknown;
40153
+ };
40154
+ content: {
40155
+ "application/json": {
40156
+ questionSet: components["schemas"]["QuestionSet"];
40157
+ version: components["schemas"]["QuestionSetVersion"] & (Record<string, never> | null);
40158
+ };
40159
+ };
40160
+ };
40161
+ /** @description Invalid request */
40162
+ 400: {
40163
+ headers: {
40164
+ [name: string]: unknown;
40165
+ };
40166
+ content: {
40167
+ "application/json": components["schemas"]["QuestionSetError"];
40168
+ };
40169
+ };
40170
+ /** @description Unauthorized */
40171
+ 401: {
40172
+ headers: {
40173
+ [name: string]: unknown;
40174
+ };
40175
+ content: {
40176
+ "application/json": components["schemas"]["Error"];
40177
+ };
40178
+ };
40179
+ /** @description Insufficient permissions, or no organization context */
40180
+ 403: {
40181
+ headers: {
40182
+ [name: string]: unknown;
40183
+ };
40184
+ content: {
40185
+ "application/json": components["schemas"]["Error"];
40186
+ };
40187
+ };
40188
+ /** @description Not found */
40189
+ 404: {
40190
+ headers: {
40191
+ [name: string]: unknown;
40192
+ };
40193
+ content: {
40194
+ "application/json": components["schemas"]["QuestionSetError"];
40195
+ };
40196
+ };
40197
+ /** @description Conflict */
40198
+ 409: {
40199
+ headers: {
40200
+ [name: string]: unknown;
40201
+ };
40202
+ content: {
40203
+ "application/json": components["schemas"]["QuestionSetError"];
40204
+ };
40205
+ };
40206
+ };
40207
+ };
40208
+ post?: never;
40209
+ delete?: never;
40210
+ options?: never;
40211
+ head?: never;
40212
+ patch?: never;
40213
+ trace?: never;
40214
+ };
40215
+ "/v1/question-sets/{id}/resolved": {
40216
+ parameters: {
40217
+ query?: never;
40218
+ header?: never;
40219
+ path?: never;
40220
+ cookie?: never;
40221
+ };
40222
+ /**
40223
+ * Resolve a question set
40224
+ * @description The question set exactly as an execution receives it: the current published version (or the published `version` named), with its current calibration. A draft-only set answers 404 QUESTION_SET_UNRESOLVED.
40225
+ */
40226
+ get: {
40227
+ parameters: {
40228
+ query?: {
40229
+ version?: number;
40230
+ };
40231
+ header?: never;
40232
+ path: {
40233
+ id: string;
40234
+ };
40235
+ cookie?: never;
40236
+ };
40237
+ requestBody?: never;
40238
+ responses: {
40239
+ /** @description Resolved */
40240
+ 200: {
40241
+ headers: {
40242
+ [name: string]: unknown;
40243
+ };
40244
+ content: {
40245
+ "application/json": components["schemas"]["ResolvedQuestionSet"];
40246
+ };
40247
+ };
40248
+ /** @description Invalid request */
40249
+ 400: {
40250
+ headers: {
40251
+ [name: string]: unknown;
40252
+ };
40253
+ content: {
40254
+ "application/json": components["schemas"]["QuestionSetError"];
40255
+ };
40256
+ };
40257
+ /** @description Unauthorized */
40258
+ 401: {
40259
+ headers: {
40260
+ [name: string]: unknown;
40261
+ };
40262
+ content: {
40263
+ "application/json": components["schemas"]["Error"];
40264
+ };
40265
+ };
40266
+ /** @description Insufficient permissions, or no organization context */
40267
+ 403: {
40268
+ headers: {
40269
+ [name: string]: unknown;
40270
+ };
40271
+ content: {
40272
+ "application/json": components["schemas"]["Error"];
40273
+ };
40274
+ };
40275
+ /** @description Not found */
40276
+ 404: {
40277
+ headers: {
40278
+ [name: string]: unknown;
40279
+ };
40280
+ content: {
40281
+ "application/json": components["schemas"]["QuestionSetError"];
40282
+ };
40283
+ };
40284
+ };
40285
+ };
40286
+ put?: never;
40287
+ post?: never;
40288
+ delete?: never;
40289
+ options?: never;
40290
+ head?: never;
40291
+ patch?: never;
40292
+ trace?: never;
40293
+ };
40294
+ "/v1/question-sets/{id}/versions": {
40295
+ parameters: {
40296
+ query?: never;
40297
+ header?: never;
40298
+ path?: never;
40299
+ cookie?: never;
40300
+ };
40301
+ /**
40302
+ * List a question set's versions
40303
+ * @description Every version, newest first.
40304
+ */
40305
+ get: {
40306
+ parameters: {
40307
+ query?: never;
40308
+ header?: never;
40309
+ path: {
40310
+ id: string;
40311
+ };
40312
+ cookie?: never;
40313
+ };
40314
+ requestBody?: never;
40315
+ responses: {
40316
+ /** @description Versions */
40317
+ 200: {
40318
+ headers: {
40319
+ [name: string]: unknown;
40320
+ };
40321
+ content: {
40322
+ "application/json": {
40323
+ data: components["schemas"]["QuestionSetVersion"][];
40324
+ };
40325
+ };
40326
+ };
40327
+ /** @description Invalid request */
40328
+ 400: {
40329
+ headers: {
40330
+ [name: string]: unknown;
40331
+ };
40332
+ content: {
40333
+ "application/json": components["schemas"]["QuestionSetError"];
40334
+ };
40335
+ };
40336
+ /** @description Unauthorized */
40337
+ 401: {
40338
+ headers: {
40339
+ [name: string]: unknown;
40340
+ };
40341
+ content: {
40342
+ "application/json": components["schemas"]["Error"];
40343
+ };
40344
+ };
40345
+ /** @description Insufficient permissions, or no organization context */
40346
+ 403: {
40347
+ headers: {
40348
+ [name: string]: unknown;
40349
+ };
40350
+ content: {
40351
+ "application/json": components["schemas"]["Error"];
40352
+ };
40353
+ };
40354
+ /** @description Not found */
40355
+ 404: {
40356
+ headers: {
40357
+ [name: string]: unknown;
40358
+ };
40359
+ content: {
40360
+ "application/json": components["schemas"]["QuestionSetError"];
40361
+ };
40362
+ };
40363
+ };
40364
+ };
40365
+ put?: never;
40366
+ post?: never;
40367
+ delete?: never;
40368
+ options?: never;
40369
+ head?: never;
40370
+ patch?: never;
40371
+ trace?: never;
40372
+ };
40373
+ "/v1/question-sets/{id}/versions/{versionNumber}/calibrations": {
40374
+ parameters: {
40375
+ query?: never;
40376
+ header?: never;
40377
+ path?: never;
40378
+ cookie?: never;
40379
+ };
40380
+ /**
40381
+ * List a question set version's calibrations
40382
+ * @description The calibration history of one version, newest first, with cursor pagination.
40383
+ */
40384
+ get: {
40385
+ parameters: {
40386
+ query?: {
40387
+ /** @description 1-200, default 50. */
40388
+ limit?: string;
40389
+ /** @description `pagination.nextCursor` from a previous page. */
40390
+ cursor?: string;
40391
+ };
40392
+ header?: never;
40393
+ path: {
40394
+ id: string;
40395
+ versionNumber: number;
40396
+ };
40397
+ cookie?: never;
40398
+ };
40399
+ requestBody?: never;
40400
+ responses: {
40401
+ /** @description Calibrations */
40402
+ 200: {
40403
+ headers: {
40404
+ [name: string]: unknown;
40405
+ };
40406
+ content: {
40407
+ "application/json": {
40408
+ data: components["schemas"]["JudgmentCalibrationRecord"][];
40409
+ pagination: components["schemas"]["Pagination"];
39975
40410
  };
39976
40411
  };
39977
40412
  };
@@ -40130,7 +40565,10 @@ interface paths {
40130
40565
  */
40131
40566
  post: {
40132
40567
  parameters: {
40133
- query?: never;
40568
+ query?: {
40569
+ /** @description A set managed by code (`lastModifiedSource` is `sdk` or `terraform`) answers 409 `managed_by_code_conflict` unless this is `overwrite`. */
40570
+ onConflict?: "error" | "overwrite";
40571
+ };
40134
40572
  header?: never;
40135
40573
  path: {
40136
40574
  id: string;
@@ -40188,6 +40626,15 @@ interface paths {
40188
40626
  "application/json": components["schemas"]["QuestionSetError"];
40189
40627
  };
40190
40628
  };
40629
+ /** @description Conflict */
40630
+ 409: {
40631
+ headers: {
40632
+ [name: string]: unknown;
40633
+ };
40634
+ content: {
40635
+ "application/json": components["schemas"]["QuestionSetError"];
40636
+ };
40637
+ };
40191
40638
  };
40192
40639
  };
40193
40640
  delete?: never;
@@ -42094,7 +42541,7 @@ interface paths {
42094
42541
  };
42095
42542
  /**
42096
42543
  * List runs
42097
- * @description Every agent and flow run in the span store, newest start first, including runs that write no control-plane row. The UNSCOPED feed is ROOT runs only: a subagent or nested-flow run folds under its parent, `childCount` says how many are folded there, and `parentExecutionId=<id>` reads them. Pass `includeChildren=true` for the flat enumeration. Any resource-scoped filter (`agentId`, `flowId`, `conversationId`, `surfaceId`, `recordId`, `batchExecutionId`, `parentExecutionId`, `rootExecutionId`, `executionId`) is already an explicit selection and never folds, so an agent that only ever runs as a subagent still lists under `agentId`. Each row carries `origin` (dashboard | api | internal | null), read from the caller's authenticated principal, and `test` as its derived alias for `origin === "dashboard"`; any entrance that resolves a principal stamps origin, including the Runtype MCP server tools and Code Mode (`api`) and the hosted `/v1/mcp` proxy (`internal`). A lane with no principal answers null for both by design: schedule, webhook, messaging, A2A, an agent exposed as an MCP surface, subagent, nested flow, a client-token product surface, an ingested run, and any row whose header predates the field. `overlay=live` adds live control-plane fields; the overlay never adds, drops or reorders a row. A cursor minted by the retired control-plane list lane (`cp.` prefix) restarts at page one and answers `pagination.cursorReset: true`.
42544
+ * @description Every agent and flow run in the span store, newest start first, including runs that write no control-plane row. The UNSCOPED feed is ROOT runs only: a subagent or nested-flow run folds under its parent, `childCount` says how many are folded there, and `parentExecutionId=<id>` reads them. Pass `includeChildren=true` for the flat enumeration. Any resource-scoped filter (`agentId`, `flowId`, `conversationId`, `surfaceId`, `recordId`, `batchExecutionId`, `parentExecutionId`, `rootExecutionId`, `executionId`) is already an explicit selection and never folds, so an agent that only ever runs as a subagent still lists under `agentId`. Each row carries `origin` (dashboard | api | internal | null), read from the caller's authenticated principal, and `test` as its derived alias for `origin === "dashboard"`; any entrance that resolves a principal stamps origin, including the Runtype MCP server tools and Code Mode (`api`) and the hosted `/v1/mcp` proxy (`internal`). A lane with no principal answers null for both by design: schedule, webhook, messaging, A2A, an agent exposed as an MCP surface, subagent, nested flow, a client-token product surface, an ingested run, and any row whose header predates the field. `overlay=live` adds live control-plane fields; the overlay never adds, drops or reorders a row. A cursor minted by the retired control-plane list lane (`cp.` prefix) restarts at page one and answers `pagination.cursorReset: true`. `includeCount=true` adds `pagination.totalCount`, counted up to 1000, and `pagination.totalCountCapped`. Each row carries `via` (schedule | surface | api | mcp | cli | test | eval, with the id and name of the thing that started it) where the entrance stated it; null otherwise.
42098
42545
  */
42099
42546
  get: {
42100
42547
  parameters: {
@@ -42137,6 +42584,8 @@ interface paths {
42137
42584
  limit?: string;
42138
42585
  /** @description Keyset cursor from a previous page. */
42139
42586
  cursor?: string;
42587
+ /** @description "true" adds pagination.totalCount and pagination.totalCountCapped: the number of runs matching this request's filters within its window, ignoring the cursor and limit, counted up to 1000. Past that the count stops at 1000 and totalCountCapped is true, so read it as "more than 1000". Omitted, or any other value, the response carries neither field. */
42588
+ includeCount?: string;
42140
42589
  };
42141
42590
  header?: never;
42142
42591
  path?: never;
@@ -42159,6 +42608,10 @@ interface paths {
42159
42608
  hasPrev: boolean;
42160
42609
  limit: number;
42161
42610
  nextCursor: string | null;
42611
+ /** @description The runs the request's filters match within its window, ignoring the cursor and limit, counted up to 1000. Present only when `includeCount=true`. */
42612
+ totalCount?: number;
42613
+ /** @description True when more than 1000 runs matched, so `totalCount` is the cap rather than the total. Present only when `includeCount=true`. */
42614
+ totalCountCapped?: boolean;
42162
42615
  };
42163
42616
  /** @description The started_at window the query resolved to, after defaults. */
42164
42617
  window: {
@@ -43848,6 +44301,8 @@ interface paths {
43848
44301
  search?: string;
43849
44302
  /** @description Filter by status */
43850
44303
  status?: "active" | "paused";
44304
+ /** @description Only schedules that run this agent */
44305
+ agentId?: string;
43851
44306
  /** @description Response representation. `full` (default) preserves complete values; `compact` shortens every string value longer than 100 characters to a 100-character preview followed by `…`. */
43852
44307
  view?: "full" | "compact";
43853
44308
  };
@@ -43896,7 +44351,7 @@ interface paths {
43896
44351
  };
43897
44352
  };
43898
44353
  };
43899
- /** @description Canonical first page (no cursor/search/status, includeCount=true) is unchanged since the ETag echoed in If-None-Match. No body. */
44354
+ /** @description Canonical first page (no cursor/search/status/agentId, includeCount=true) is unchanged since the ETag echoed in If-None-Match. No body. */
43900
44355
  304: {
43901
44356
  headers: {
43902
44357
  [name: string]: unknown;
@@ -44027,7 +44482,239 @@ interface paths {
44027
44482
  patch?: never;
44028
44483
  trace?: never;
44029
44484
  };
44030
- "/v1/schedules/batch/{batchId}/results": {
44485
+ "/v1/schedules/batch/{batchId}/results": {
44486
+ parameters: {
44487
+ query?: never;
44488
+ header?: never;
44489
+ path?: never;
44490
+ cookie?: never;
44491
+ };
44492
+ /**
44493
+ * Get results for a batch execution
44494
+ * @description Returns the per-record results for a batch execution.
44495
+ */
44496
+ get: {
44497
+ parameters: {
44498
+ query?: {
44499
+ limit?: string;
44500
+ offset?: string;
44501
+ status?: string;
44502
+ };
44503
+ header?: never;
44504
+ path: {
44505
+ batchId: string;
44506
+ };
44507
+ cookie?: never;
44508
+ };
44509
+ requestBody?: never;
44510
+ responses: {
44511
+ /** @description Batch results */
44512
+ 200: {
44513
+ headers: {
44514
+ [name: string]: unknown;
44515
+ };
44516
+ content: {
44517
+ "application/json": {
44518
+ data: {
44519
+ agentExecutionId: string | null;
44520
+ createdAt: string;
44521
+ durationMs: number | null;
44522
+ error: string | null;
44523
+ executedAt: string | null;
44524
+ /**
44525
+ * @description Engine that actually executed this record execution ('runtime' | 'legacy' | 'external'). Recorded at write time from the committed lane decision; never inferred later. 'external' marks a run a customer executed outside Runtype and reported through ingest. Null for rows written before attribution shipped and for units that never started executing.
44526
+ * @enum {string|null}
44527
+ */
44528
+ executionEngine?: "runtime" | "legacy" | "external" | null;
44529
+ failedAt: string | null;
44530
+ failedStepCount: number | null;
44531
+ flowId: string | null;
44532
+ flowName: string | null;
44533
+ record: {
44534
+ id: string;
44535
+ name: string;
44536
+ type: string;
44537
+ } | null;
44538
+ recordId: string;
44539
+ recordResultId: string | null;
44540
+ result?: unknown;
44541
+ status: string;
44542
+ stepCount: number | null;
44543
+ }[];
44544
+ pagination: {
44545
+ hasMore: boolean;
44546
+ limit: number;
44547
+ offset: number;
44548
+ total: number;
44549
+ };
44550
+ summary?: {
44551
+ recordsWithFailedSteps: number;
44552
+ };
44553
+ };
44554
+ };
44555
+ };
44556
+ /** @description Unauthorized */
44557
+ 401: {
44558
+ headers: {
44559
+ [name: string]: unknown;
44560
+ };
44561
+ content: {
44562
+ "application/json": components["schemas"]["Error"];
44563
+ };
44564
+ };
44565
+ /** @description Insufficient permissions */
44566
+ 403: {
44567
+ headers: {
44568
+ [name: string]: unknown;
44569
+ };
44570
+ content: {
44571
+ "application/json": components["schemas"]["Error"];
44572
+ };
44573
+ };
44574
+ /** @description Batch not found */
44575
+ 404: {
44576
+ headers: {
44577
+ [name: string]: unknown;
44578
+ };
44579
+ content: {
44580
+ "application/json": components["schemas"]["Error"];
44581
+ };
44582
+ };
44583
+ };
44584
+ };
44585
+ put?: never;
44586
+ post?: never;
44587
+ delete?: never;
44588
+ options?: never;
44589
+ head?: never;
44590
+ patch?: never;
44591
+ trace?: never;
44592
+ };
44593
+ "/v1/schedules/ensure": {
44594
+ parameters: {
44595
+ query?: never;
44596
+ header?: never;
44597
+ path?: never;
44598
+ cookie?: never;
44599
+ };
44600
+ get?: never;
44601
+ put?: never;
44602
+ /**
44603
+ * Ensure schedule (config-as-code converge)
44604
+ * @description Idempotently converge a repo-defined schedule on a standalone flow or agent. Identity is name + target + account scope; the target may name the flow or agent instead of carrying its id, so one definition works in every environment. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response); full requests create the schedule or update it when the canonical content hash differs. Set dryRun to plan without writing (CI drift gate) and onConflict: "overwrite" to converge over dashboard/API edits. Omit `enabled` to leave a paused schedule paused. Ensure never deletes; schedules owned by a product surface are never matched.
44605
+ */
44606
+ post: {
44607
+ parameters: {
44608
+ query?: never;
44609
+ header?: never;
44610
+ path?: never;
44611
+ cookie?: never;
44612
+ };
44613
+ requestBody?: {
44614
+ content: {
44615
+ "application/json": {
44616
+ contentHash?: string;
44617
+ definition?: components["schemas"]["ScheduleEnsureDefinition"];
44618
+ dryRun?: boolean;
44619
+ expectedRemoteHash?: string;
44620
+ name: string;
44621
+ /** @enum {string} */
44622
+ onConflict?: "error" | "overwrite";
44623
+ target: components["schemas"]["ScheduleEnsureTarget"];
44624
+ };
44625
+ };
44626
+ };
44627
+ responses: {
44628
+ /** @description Converge result: unchanged | created | updated | definitionRequired (hash miss — retry with the full definition) | plan (dryRun) */
44629
+ 200: {
44630
+ headers: {
44631
+ [name: string]: unknown;
44632
+ };
44633
+ content: {
44634
+ "application/json": components["schemas"]["ScheduleEnsureResponse"];
44635
+ };
44636
+ };
44637
+ /** @description Validation error */
44638
+ 400: {
44639
+ headers: {
44640
+ [name: string]: unknown;
44641
+ };
44642
+ content: {
44643
+ "application/json": components["schemas"]["Error"];
44644
+ };
44645
+ };
44646
+ /** @description Unauthorized */
44647
+ 401: {
44648
+ headers: {
44649
+ [name: string]: unknown;
44650
+ };
44651
+ content: {
44652
+ "application/json": components["schemas"]["Error"];
44653
+ };
44654
+ };
44655
+ /** @description Plan limit exceeded (cron frequency or active schedule count) */
44656
+ 402: {
44657
+ headers: {
44658
+ [name: string]: unknown;
44659
+ };
44660
+ content: {
44661
+ "application/json": components["schemas"]["ScheduleEntitlementError"];
44662
+ };
44663
+ };
44664
+ /** @description Insufficient permissions */
44665
+ 403: {
44666
+ headers: {
44667
+ [name: string]: unknown;
44668
+ };
44669
+ content: {
44670
+ "application/json": components["schemas"]["Error"];
44671
+ };
44672
+ };
44673
+ /** @description Target not found */
44674
+ 404: {
44675
+ headers: {
44676
+ [name: string]: unknown;
44677
+ };
44678
+ content: {
44679
+ "application/json": components["schemas"]["Error"];
44680
+ };
44681
+ };
44682
+ /** @description Conflict: external_modification (last write was not ensure; pass onConflict: "overwrite") or remote_changed (expectedRemoteHash guard) */
44683
+ 409: {
44684
+ headers: {
44685
+ [name: string]: unknown;
44686
+ };
44687
+ content: {
44688
+ "application/json": components["schemas"]["ScheduleEnsureConflict"];
44689
+ };
44690
+ };
44691
+ /** @description Submitted contentHash does not match the server-recomputed canonical hash */
44692
+ 422: {
44693
+ headers: {
44694
+ [name: string]: unknown;
44695
+ };
44696
+ content: {
44697
+ "application/json": components["schemas"]["ScheduleEnsureHashMismatch"];
44698
+ };
44699
+ };
44700
+ /** @description Internal server error */
44701
+ 500: {
44702
+ headers: {
44703
+ [name: string]: unknown;
44704
+ };
44705
+ content: {
44706
+ "application/json": components["schemas"]["Error"];
44707
+ };
44708
+ };
44709
+ };
44710
+ };
44711
+ delete?: never;
44712
+ options?: never;
44713
+ head?: never;
44714
+ patch?: never;
44715
+ trace?: never;
44716
+ };
44717
+ "/v1/schedules/pull": {
44031
44718
  parameters: {
44032
44719
  query?: never;
44033
44720
  header?: never;
@@ -44035,67 +44722,40 @@ interface paths {
44035
44722
  cookie?: never;
44036
44723
  };
44037
44724
  /**
44038
- * Get results for a batch execution
44039
- * @description Returns the per-record results for a batch execution.
44725
+ * Pull schedule definition (config-as-code)
44726
+ * @description Return the canonical config-as-code definition and provenance for a standalone schedule by name and target — the absorb-drift direction of the ensure protocol. The target is echoed in the form the query used, and the definition always declares `enabled`.
44040
44727
  */
44041
44728
  get: {
44042
44729
  parameters: {
44043
- query?: {
44044
- limit?: string;
44045
- offset?: string;
44046
- status?: string;
44730
+ query: {
44731
+ name: string;
44732
+ flowId?: string;
44733
+ agentId?: string;
44734
+ flowName?: string;
44735
+ agentName?: string;
44047
44736
  };
44048
44737
  header?: never;
44049
- path: {
44050
- batchId: string;
44051
- };
44738
+ path?: never;
44052
44739
  cookie?: never;
44053
44740
  };
44054
44741
  requestBody?: never;
44055
44742
  responses: {
44056
- /** @description Batch results */
44743
+ /** @description Canonical definition + provenance */
44057
44744
  200: {
44058
44745
  headers: {
44059
44746
  [name: string]: unknown;
44060
44747
  };
44061
44748
  content: {
44062
- "application/json": {
44063
- data: {
44064
- agentExecutionId: string | null;
44065
- createdAt: string;
44066
- durationMs: number | null;
44067
- error: string | null;
44068
- executedAt: string | null;
44069
- /**
44070
- * @description Engine that actually executed this record execution ('runtime' | 'legacy' | 'external'). Recorded at write time from the committed lane decision; never inferred later. 'external' marks a run a customer executed outside Runtype and reported through ingest. Null for rows written before attribution shipped and for units that never started executing.
44071
- * @enum {string|null}
44072
- */
44073
- executionEngine?: "runtime" | "legacy" | "external" | null;
44074
- failedAt: string | null;
44075
- failedStepCount: number | null;
44076
- flowId: string | null;
44077
- flowName: string | null;
44078
- record: {
44079
- id: string;
44080
- name: string;
44081
- type: string;
44082
- } | null;
44083
- recordId: string;
44084
- recordResultId: string | null;
44085
- result?: unknown;
44086
- status: string;
44087
- stepCount: number | null;
44088
- }[];
44089
- pagination: {
44090
- hasMore: boolean;
44091
- limit: number;
44092
- offset: number;
44093
- total: number;
44094
- };
44095
- summary?: {
44096
- recordsWithFailedSteps: number;
44097
- };
44098
- };
44749
+ "application/json": components["schemas"]["SchedulePullResponse"];
44750
+ };
44751
+ };
44752
+ /** @description Validation error */
44753
+ 400: {
44754
+ headers: {
44755
+ [name: string]: unknown;
44756
+ };
44757
+ content: {
44758
+ "application/json": components["schemas"]["Error"];
44099
44759
  };
44100
44760
  };
44101
44761
  /** @description Unauthorized */
@@ -44116,7 +44776,7 @@ interface paths {
44116
44776
  "application/json": components["schemas"]["Error"];
44117
44777
  };
44118
44778
  };
44119
- /** @description Batch not found */
44779
+ /** @description No schedule with that name on that target in the account scope */
44120
44780
  404: {
44121
44781
  headers: {
44122
44782
  [name: string]: unknown;
@@ -44125,6 +44785,15 @@ interface paths {
44125
44785
  "application/json": components["schemas"]["Error"];
44126
44786
  };
44127
44787
  };
44788
+ /** @description Internal server error */
44789
+ 500: {
44790
+ headers: {
44791
+ [name: string]: unknown;
44792
+ };
44793
+ content: {
44794
+ "application/json": components["schemas"]["Error"];
44795
+ };
44796
+ };
44128
44797
  };
44129
44798
  };
44130
44799
  put?: never;
@@ -46523,7 +47192,7 @@ interface paths {
46523
47192
  put?: never;
46524
47193
  /**
46525
47194
  * Ensure skill (config-as-code converge)
46526
- * @description Idempotently converge a repo-defined skill (SKILL.md manifest) onto the platform. Identity is name + account scope. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response, not an error); full requests create the skill or append a new version when the canonical content hash differs. The response always carries the server-computed canonical hash + the version id. Set dryRun to plan without writing (CI drift gate), onConflict: "overwrite" to converge over dashboard/API edits, and release: "publish" to publish the converged version. Admin/control plane only — no review queue.
47195
+ * @description Idempotently converge a repo-defined skill (SKILL.md manifest) onto the platform. Identity is name + account scope. Hash-only probes skip the payload in the steady state (a miss is a normal 200 `definitionRequired` response, not an error); full requests create the skill or append a new version when the canonical content hash differs. The response always carries the server-computed canonical hash + the version id. Set dryRun to plan without writing (CI drift gate), onConflict: "overwrite" to converge over dashboard/API edits, and release: "publish" to publish the converged version. Optional version.label / version.notes stamp provenance (a git SHA, a release tag) on the appended version row. Admin/control plane only — no review queue.
46527
47196
  */
46528
47197
  post: {
46529
47198
  parameters: {
@@ -46550,6 +47219,7 @@ interface paths {
46550
47219
  onConflict?: "error" | "overwrite";
46551
47220
  /** @enum {string} */
46552
47221
  release?: "none" | "publish";
47222
+ version?: components["schemas"]["EnsureVersionMetadata"];
46553
47223
  };
46554
47224
  };
46555
47225
  };
@@ -50684,6 +51354,36 @@ interface components {
50684
51354
  code?: "alias_requires_organization";
50685
51355
  error: string;
50686
51356
  };
51357
+ AgentEnsureCapability: {
51358
+ /** @description The name of another agent in this account scope, called as a sub-agent. */
51359
+ agent?: string;
51360
+ description?: string;
51361
+ /** @description Defaults to true. */
51362
+ enabled?: boolean;
51363
+ /** @description The name of a flow in this account scope. */
51364
+ flow?: string;
51365
+ /** @description JSON Schema for the capability's input. Omit to derive it from the flow's inputs or the tool's own schema. */
51366
+ parametersSchema?: {
51367
+ [key: string]: unknown;
51368
+ };
51369
+ /** @description The name of a saved tool in this account scope. */
51370
+ tool?: string;
51371
+ /** @description The name the agent calls this capability by. */
51372
+ toolName: string;
51373
+ };
51374
+ AgentEnsureCapabilityChange: {
51375
+ /**
51376
+ * @description What this converge did (on a dry run, would do) to the capability.
51377
+ * @enum {string}
51378
+ */
51379
+ action: "add" | "update" | "remove" | "unchanged";
51380
+ enabled: boolean;
51381
+ /** @enum {string|null} */
51382
+ kind: "flow" | "agent" | "tool" | null;
51383
+ /** @description The flow, agent or tool name the capability calls. */
51384
+ source: string | null;
51385
+ toolName: string;
51386
+ };
50687
51387
  AgentEnsureConflict: {
50688
51388
  /** @enum {string} */
50689
51389
  code: "external_modification" | "remote_changed";
@@ -50704,6 +51404,10 @@ interface components {
50704
51404
  AgentEnsureDeployment: {
50705
51405
  /** @description The release alias this converge aimed. */
50706
51406
  alias: string;
51407
+ /** @description Per-alias secret binding names in force after this converge (on a dry run carrying deploy.bindings, the names it would leave in force). Never values. */
51408
+ bindingNames?: string[];
51409
+ /** @description Present on a dry run carrying deploy.bindings: whether the binding names differ from the ones the alias carries now. */
51410
+ bindingsChanged?: boolean;
50707
51411
  /** @description Whether this converge moved the pointer (on a dry run, whether it would move it). */
50708
51412
  changed: boolean;
50709
51413
  /** @description The deployment receipt this converge appended. Absent when the pointer did not move. */
@@ -50722,22 +51426,10 @@ interface components {
50722
51426
  contentHash: string;
50723
51427
  error: string;
50724
51428
  };
50725
- AgentEnsurePreviewAliasLimit: {
50726
- active: number;
50727
- /** @enum {string} */
50728
- code: "PREVIEW_ALIAS_LIMIT";
50729
- error: string;
50730
- limit: number;
50731
- /** @description The same remediation sentence as `error`. */
50732
- message: string;
50733
- /**
50734
- * @description Which population was already at its active-preview limit.
50735
- * @enum {string}
50736
- */
50737
- scope: "organization" | "agent";
50738
- };
50739
51429
  AgentEnsureResponse: {
50740
51430
  agentId: string;
51431
+ /** @description Present when the request carried capabilities: one row per declared capability, then removals. */
51432
+ capabilityChanges?: components["schemas"]["AgentEnsureCapabilityChange"][];
50741
51433
  /** @description Server-computed canonical content hash. Clients should echo this hash in probes. */
50742
51434
  contentHash: string;
50743
51435
  deployment?: components["schemas"]["AgentEnsureDeployment"];
@@ -50745,6 +51437,8 @@ interface components {
50745
51437
  remoteHash?: string;
50746
51438
  /** @enum {string} */
50747
51439
  result: "unchanged" | "created" | "updated";
51440
+ /** @description Present when the request carried skills: one row per declared binding, then unbinds. */
51441
+ skillBindings?: components["schemas"]["AgentEnsureSkillBindingChange"][];
50748
51442
  /** @description The version snapshot backing this state (null if snapshotting failed). */
50749
51443
  versionId: string | null;
50750
51444
  } | {
@@ -50752,6 +51446,8 @@ interface components {
50752
51446
  result: "definitionRequired";
50753
51447
  } | {
50754
51448
  agentId?: string;
51449
+ /** @description Present when the request carried capabilities: one row per declared capability, then removals. */
51450
+ capabilityChanges?: components["schemas"]["AgentEnsureCapabilityChange"][];
50755
51451
  changedKeys: string[];
50756
51452
  /** @enum {string} */
50757
51453
  changes: "none" | "create" | "update";
@@ -50760,6 +51456,8 @@ interface components {
50760
51456
  remoteHash?: string;
50761
51457
  /** @enum {string} */
50762
51458
  result: "plan";
51459
+ /** @description Present when the request carried skills: one row per declared binding, then unbinds. */
51460
+ skillBindings?: components["schemas"]["AgentEnsureSkillBindingChange"][];
50763
51461
  };
50764
51462
  AgentEnsureServerError: {
50765
51463
  /** @description The release alias whose activation failed. No pointer was moved. */
@@ -50768,8 +51466,31 @@ interface components {
50768
51466
  code?: "alias_activation_failed";
50769
51467
  error: string;
50770
51468
  };
51469
+ AgentEnsureSkillBinding: {
51470
+ /** @description Defaults to true. */
51471
+ enabled?: boolean;
51472
+ /** @description The skill slug. */
51473
+ name: string;
51474
+ /** @description Pin this skill versionNumber. Omit to follow the skill's published version. */
51475
+ version?: number;
51476
+ };
51477
+ AgentEnsureSkillBindingChange: {
51478
+ /**
51479
+ * @description What this converge did (on a dry run, would do) to the binding.
51480
+ * @enum {string}
51481
+ */
51482
+ action: "bind" | "update" | "unbind" | "unchanged";
51483
+ enabled: boolean;
51484
+ /** @description The skill slug. */
51485
+ name: string;
51486
+ skillId: string;
51487
+ /** @description The pinned versionNumber; null follows the published version. */
51488
+ version: number | null;
51489
+ };
50771
51490
  AgentPullResponse: {
50772
51491
  agentId: string;
51492
+ /** @description The agent's capabilities in display order, in the shape ensure's capabilities accepts. parametersSchema appears only when it differs from the one ensure would derive. */
51493
+ capabilities: components["schemas"]["AgentEnsureCapability"][];
50773
51494
  contentHash: string;
50774
51495
  definition: {
50775
51496
  config?: {
@@ -51070,6 +51791,8 @@ interface components {
51070
51791
  name: string;
51071
51792
  };
51072
51793
  lastModifiedSource: string | null;
51794
+ /** @description The agent's skill bindings in load order, in the shape ensure's skills accepts. */
51795
+ skills: components["schemas"]["AgentEnsureSkillBinding"][];
51073
51796
  updatedAt: string | null;
51074
51797
  versionId: string | null;
51075
51798
  /** @description Present only when a raw tool_… reference could not be emitted as a portable tool:<name> (the tool was deleted, or its name is shadowed by an older same-named tool). Those references are left as raw ids, which the ensure surface rejects; each warning explains how to fix it. */
@@ -51256,6 +51979,57 @@ interface components {
51256
51979
  /** @enum {string} */
51257
51980
  status: "pending" | "applied" | "settled" | "not_applied";
51258
51981
  };
51982
+ CollectionEnsureConflict: {
51983
+ /** @enum {string} */
51984
+ code: "external_modification" | "remote_changed";
51985
+ currentHash?: string | null;
51986
+ error: string;
51987
+ lastModifiedSource?: string;
51988
+ modifiedAt?: string | null;
51989
+ };
51990
+ CollectionEnsureHashMismatch: {
51991
+ /** @enum {string} */
51992
+ code: "content_hash_mismatch";
51993
+ /** @description The server-computed canonical hash of the submitted definition. */
51994
+ contentHash: string;
51995
+ error: string;
51996
+ };
51997
+ CollectionEnsureResponse: {
51998
+ collectionId: string;
51999
+ /** @description Server-computed canonical content hash. Clients should echo this hash in probes. */
52000
+ contentHash: string;
52001
+ /** @description Present when this ensure moved validationMode to enforce: a bounded dry-run of existing records against the schema, as PATCH reports. */
52002
+ enforceCheck?: {
52003
+ checked: number;
52004
+ failed: number;
52005
+ truncated: boolean;
52006
+ };
52007
+ /** @enum {string} */
52008
+ result: "unchanged" | "created" | "updated";
52009
+ schemaChange?: {
52010
+ breakingChanges: string[];
52011
+ /** @enum {string} */
52012
+ kind: "additive" | "breaking";
52013
+ };
52014
+ } | {
52015
+ /** @enum {string} */
52016
+ result: "definitionRequired";
52017
+ } | {
52018
+ changedKeys: string[];
52019
+ /** @enum {string} */
52020
+ changes: "none" | "create" | "update";
52021
+ collectionId?: string;
52022
+ contentHash: string;
52023
+ remoteHash?: string;
52024
+ /** @enum {string} */
52025
+ result: "plan";
52026
+ /** @description How the schema would change. A breaking change is rejected when the resulting validationMode is enforce. */
52027
+ schemaChange?: {
52028
+ breakingChanges: string[];
52029
+ /** @enum {string} */
52030
+ kind: "additive" | "breaking";
52031
+ };
52032
+ };
51259
52033
  CollectionLookupFailedError: {
51260
52034
  /** @enum {string} */
51261
52035
  code: "COLLECTION_LOOKUP_FAILED";
@@ -51266,6 +52040,24 @@ interface components {
51266
52040
  recordId?: string;
51267
52041
  recordName?: string;
51268
52042
  };
52043
+ CollectionPullResponse: {
52044
+ collectionId: string;
52045
+ contentHash: string;
52046
+ definition: {
52047
+ description: string | null;
52048
+ displayName: string;
52049
+ icon: string | null;
52050
+ /** @description Constrained JSON Schema dialect: root object with string/number/boolean/array/object properties, one nesting level, no $ref/oneOf/pattern */
52051
+ schema: {
52052
+ [key: string]: unknown;
52053
+ } | null;
52054
+ slug: string;
52055
+ /** @enum {string} */
52056
+ validationMode: "off" | "warn" | "enforce";
52057
+ };
52058
+ lastModifiedSource: string | null;
52059
+ updatedAt: string | null;
52060
+ };
51269
52061
  ContextBlocks: {
51270
52062
  blocks: {
51271
52063
  /** @description The block text, scrubbed of secrets. */
@@ -52196,6 +52988,14 @@ interface components {
52196
52988
  name: string;
52197
52989
  }[];
52198
52990
  };
52991
+ EvalEnsureConflict: {
52992
+ /** @enum {string} */
52993
+ code: "external_modification" | "remote_changed";
52994
+ currentHash?: string | null;
52995
+ error: string;
52996
+ lastModifiedSource?: string;
52997
+ modifiedAt?: string | null;
52998
+ };
52199
52999
  EvalEnsureResponse: {
52200
53000
  /** @description Server-computed canonical content hash. Clients should echo this hash in probes. */
52201
53001
  contentHash: string;
@@ -52205,6 +53005,15 @@ interface components {
52205
53005
  } | {
52206
53006
  /** @enum {string} */
52207
53007
  result: "definitionRequired";
53008
+ } | {
53009
+ changedKeys: string[];
53010
+ /** @enum {string} */
53011
+ changes: "none" | "create" | "update";
53012
+ contentHash: string;
53013
+ remoteHash?: string;
53014
+ /** @enum {string} */
53015
+ result: "plan";
53016
+ suiteId?: string;
52208
53017
  };
52209
53018
  /** @description Canonical eval override field. Replaces `stepOverrides` (and its `"*"` key), `claudeManagedOverride` and `advisorOverride`; setting both spellings of one channel is a 400. */
52210
53019
  EvalOverrides: {
@@ -53230,6 +54039,8 @@ interface components {
53230
54039
  changes: "none" | "create" | "update";
53231
54040
  contentHash: string;
53232
54041
  flowId?: string;
54042
+ /** @description Present when the dry run carried release: "publish": whether the converge would re-aim the published version. */
54043
+ publishPending?: boolean;
53233
54044
  remoteHash?: string;
53234
54045
  /** @enum {string} */
53235
54046
  result: "plan";
@@ -53388,15 +54199,6 @@ interface components {
53388
54199
  totalCount?: number;
53389
54200
  totalPages?: number;
53390
54201
  };
53391
- PreviewAliasLimitError: components["schemas"]["Error"] & {
53392
- active: number;
53393
- /** @enum {string} */
53394
- code: "PREVIEW_ALIAS_LIMIT";
53395
- limit: number;
53396
- message: string;
53397
- /** @enum {string} */
53398
- scope: "organization" | "agent";
53399
- };
53400
54202
  ProductCanvasBlock: {
53401
54203
  /** @description When the block was added; set by the server */
53402
54204
  readonly addedAt?: string;
@@ -53505,11 +54307,16 @@ interface components {
53505
54307
  /** @description True when one or more entities failed to converge (re-run to self-heal). */
53506
54308
  hasFailures: boolean;
53507
54309
  productId?: string;
54310
+ /** @description dryRun only: the live graph's pull-fpo hash, absent when the product does not exist or the caller cannot read every section. Pass it back as expectedRemoteHash to guard the apply. */
54311
+ remoteHash?: string;
53508
54312
  /**
53509
- * @description `unchanged` when every entity was unchanged, `converged` when at least one was created/updated, `plan` for dryRun.
54313
+ * @description `unchanged` when every entity was unchanged (a matching hash-only probe reports no entities), `converged` when at least one was created/updated, `plan` for dryRun.
53510
54314
  * @enum {string}
53511
54315
  */
53512
54316
  result: "unchanged" | "converged" | "plan";
54317
+ } | {
54318
+ /** @enum {string} */
54319
+ result: "definitionRequired";
53513
54320
  };
53514
54321
  ProductFpoPullResponse: {
53515
54322
  /** @description Server-computed canonical whole-FPO content hash. */
@@ -53560,6 +54367,7 @@ interface components {
53560
54367
  productGoal?: string;
53561
54368
  /** @enum {string} */
53562
54369
  productStage?: "idea" | "prototype" | "beta" | "production" | "scaling";
54370
+ stack?: components["schemas"]["ProductStack"];
53563
54371
  targetAudience?: string;
53564
54372
  techStack?: {
53565
54373
  backend?: string[];
@@ -53615,11 +54423,52 @@ interface components {
53615
54423
  currentVersionId: string | null;
53616
54424
  description: string | null;
53617
54425
  id: string;
54426
+ /** @description The surface that last wrote the set; `sdk` or `terraform` means it is managed by code through ensure. */
54427
+ lastModifiedSource?: string | null;
53618
54428
  name: string;
53619
54429
  organizationId: string;
53620
54430
  slug: string;
53621
54431
  updatedAt: string;
53622
54432
  };
54433
+ QuestionSetEnsureConflict: {
54434
+ /** @description external_modification, remote_changed, or a question set code such as QUESTION_SET_SLUG_TAKEN. */
54435
+ code: string;
54436
+ currentHash?: string | null;
54437
+ error: string;
54438
+ lastModifiedSource?: string;
54439
+ modifiedAt?: string | null;
54440
+ };
54441
+ QuestionSetEnsureHashMismatch: {
54442
+ /** @enum {string} */
54443
+ code: "content_hash_mismatch";
54444
+ /** @description The server-computed canonical hash of the submitted definition. */
54445
+ contentHash: string;
54446
+ error: string;
54447
+ };
54448
+ QuestionSetEnsureResponse: {
54449
+ /** @description Server-computed canonical content hash. Clients should echo this hash in probes. */
54450
+ contentHash: string;
54451
+ /** @description The version executions resolve when they name none; null until a publish. */
54452
+ publishedVersionNumber: number | null;
54453
+ questionSetId: string;
54454
+ /** @enum {string} */
54455
+ result: "unchanged" | "created" | "updated";
54456
+ /** @description The latest version, which the converged definition matches. */
54457
+ versionId: string | null;
54458
+ versionNumber: number | null;
54459
+ } | {
54460
+ /** @enum {string} */
54461
+ result: "definitionRequired";
54462
+ } | {
54463
+ changedKeys: string[];
54464
+ /** @enum {string} */
54465
+ changes: "none" | "create" | "update";
54466
+ contentHash: string;
54467
+ questionSetId?: string;
54468
+ remoteHash?: string;
54469
+ /** @enum {string} */
54470
+ result: "plan";
54471
+ };
53623
54472
  QuestionSetError: components["schemas"]["Error"] & {
53624
54473
  /** @description Stable code, e.g. QUESTION_SET_INVALID or QUESTION_SET_UNRESOLVED. */
53625
54474
  code?: string;
@@ -53628,6 +54477,26 @@ interface components {
53628
54477
  currentVersionNumber: number | null;
53629
54478
  latestVersionNumber: number;
53630
54479
  };
54480
+ QuestionSetPullResponse: {
54481
+ contentHash: string;
54482
+ definition: {
54483
+ description?: string | null;
54484
+ inputMapping?: {
54485
+ [key: string]: string;
54486
+ } | null;
54487
+ model?: string | null;
54488
+ name: string;
54489
+ questions: {
54490
+ [key: string]: unknown;
54491
+ };
54492
+ slug: string;
54493
+ };
54494
+ lastModifiedSource: string | null;
54495
+ publishedVersionNumber: number | null;
54496
+ questionSetId: string;
54497
+ updatedAt: string | null;
54498
+ versionNumber: number | null;
54499
+ };
53631
54500
  QuestionSetVersion: {
53632
54501
  createdAt: string;
53633
54502
  createdByUserId: string | null;
@@ -53880,6 +54749,18 @@ interface components {
53880
54749
  totalCost: string | null;
53881
54750
  /** @description Trace id in the span store; null on a row the control-plane arm served. */
53882
54751
  traceId: string | null;
54752
+ /** @description How the run started, for a Via column. Forward-only for schedule, api key, cli, mcp and eval detail: a header written before those stamps reads null, or falls back to the coarse origin/surface facts when they alone answer it. A label is a snapshot or a lookup and never authority; mcp, cli and sdk are self-declared by the client. */
54753
+ via?: {
54754
+ /** @description The thing that started it: the schedule id (schedule), product surface id (surface), API key id (api), the acting user id (cli) or eval suite id (eval). Null for mcp and test, and for an api run whose header predates key stamping. */
54755
+ id: string | null;
54756
+ /**
54757
+ * @description One word for the way the run started.
54758
+ * @enum {string}
54759
+ */
54760
+ kind: "schedule" | "surface" | "api" | "mcp" | "cli" | "test" | "eval";
54761
+ /** @description Its display name when the API could resolve one: schedule name, surface name, API key name as it was at dispatch, MCP client name, the acting user's first name, or eval suite name. Null when unresolved, for example a deleted schedule. */
54762
+ label: string | null;
54763
+ } | null;
53883
54764
  };
53884
54765
  RuntimeEmailAdmissionError: {
53885
54766
  code?: string;
@@ -53929,6 +54810,84 @@ interface components {
53929
54810
  kind: string;
53930
54811
  reason: string;
53931
54812
  };
54813
+ ScheduleEnsureConflict: {
54814
+ /** @enum {string} */
54815
+ code: "external_modification" | "remote_changed";
54816
+ currentHash?: string | null;
54817
+ error: string;
54818
+ lastModifiedSource?: string;
54819
+ modifiedAt?: string | null;
54820
+ };
54821
+ ScheduleEnsureDefinition: {
54822
+ /** @description Omit to leave the current paused/active state untouched; new schedules start enabled. */
54823
+ enabled?: boolean;
54824
+ executionOptions?: {
54825
+ chunkSize?: number;
54826
+ flowTimeoutMs?: number;
54827
+ /** @enum {string} */
54828
+ loggingPolicy?: "default" | "on" | "off";
54829
+ maxRetries?: number;
54830
+ modelOverride?: string;
54831
+ progressFlushSize?: number;
54832
+ recordConcurrency?: number;
54833
+ skipCacheWarm?: boolean;
54834
+ stepTimeoutMs?: number;
54835
+ timeoutMs?: number;
54836
+ };
54837
+ inputs?: {
54838
+ [key: string]: unknown;
54839
+ };
54840
+ messages?: {
54841
+ [key: string]: unknown;
54842
+ }[];
54843
+ name: string;
54844
+ recordFilter?: {
54845
+ [key: string]: unknown;
54846
+ };
54847
+ recordIds?: string[];
54848
+ recordType?: string;
54849
+ target: components["schemas"]["ScheduleEnsureTarget"];
54850
+ trigger: {
54851
+ cron?: string;
54852
+ /** Format: date-time */
54853
+ runAt?: string;
54854
+ timezone?: string;
54855
+ /** @enum {string} */
54856
+ type: "recurring" | "one_time";
54857
+ };
54858
+ };
54859
+ ScheduleEnsureHashMismatch: {
54860
+ /** @enum {string} */
54861
+ code: "content_hash_mismatch";
54862
+ /** @description The server-computed canonical hash of the submitted definition. */
54863
+ contentHash: string;
54864
+ error: string;
54865
+ };
54866
+ ScheduleEnsureResponse: {
54867
+ /** @description Server-computed canonical content hash. Clients should echo this hash in probes. */
54868
+ contentHash: string;
54869
+ /** @enum {string} */
54870
+ result: "unchanged" | "created" | "updated";
54871
+ scheduleId: string;
54872
+ } | {
54873
+ /** @enum {string} */
54874
+ result: "definitionRequired";
54875
+ } | {
54876
+ changedKeys: string[];
54877
+ /** @enum {string} */
54878
+ changes: "none" | "create" | "update";
54879
+ contentHash: string;
54880
+ remoteHash?: string;
54881
+ /** @enum {string} */
54882
+ result: "plan";
54883
+ scheduleId?: string;
54884
+ };
54885
+ ScheduleEnsureTarget: {
54886
+ agentId?: string;
54887
+ agentName?: string;
54888
+ flowId?: string;
54889
+ flowName?: string;
54890
+ };
53932
54891
  ScheduleEntitlementError: components["schemas"]["Error"] & {
53933
54892
  /** @description Stable error code (e.g. ACTIVE_SCHEDULE_LIMIT, SCHEDULE_FREQUENCY_LIMIT). */
53934
54893
  code?: string;
@@ -53937,6 +54896,13 @@ interface components {
53937
54896
  /** @description Dashboard-relative URL to the billing/upgrade page. */
53938
54897
  upgradeUrl?: string;
53939
54898
  };
54899
+ SchedulePullResponse: {
54900
+ contentHash: string;
54901
+ definition: components["schemas"]["ScheduleEnsureDefinition"];
54902
+ lastModifiedSource: string | null;
54903
+ scheduleId: string;
54904
+ updatedAt: string | null;
54905
+ };
53940
54906
  ScheduleRunLink: {
53941
54907
  /** @description The agent_executions ROW id the scheduled run stored. Provenance only: a different id space from executionId, and never a /v1/runs key. */
53942
54908
  agentExecutionRowId: string | null;
@@ -54058,13 +55024,15 @@ interface components {
54058
55024
  };
54059
55025
  /** @enum {string} */
54060
55026
  environment?: "production" | "development";
55027
+ /** @description Inbound channel config. Omit to keep the stored value; null clears it. A credential value of "<redacted>" (as returned by pull) keeps the stored credential. */
54061
55028
  inbound?: {
54062
55029
  [key: string]: unknown;
54063
- };
55030
+ } | null;
54064
55031
  name: string;
55032
+ /** @description Outbound channel config. Omit to keep the stored value; null clears it. A credential value of "<redacted>" (as returned by pull) keeps the stored credential. */
54065
55033
  outbound?: {
54066
55034
  [key: string]: unknown;
54067
- };
55035
+ } | null;
54068
55036
  /** @enum {string} */
54069
55037
  status?: "draft" | "active" | "paused";
54070
55038
  /** @enum {string} */
@@ -57003,14 +57971,14 @@ export interface ScheduleMessageSet {
57003
57971
  messages: ScheduleMessage[];
57004
57972
  }
57005
57973
  export type ScheduleMessages = ScheduleMessage[] | ScheduleMessageSet[];
57006
- export interface ScheduleTarget {
57974
+ interface ScheduleTarget$1 {
57007
57975
  flowId?: string;
57008
57976
  agentId?: string;
57009
57977
  recordIds?: string[];
57010
57978
  recordType?: string;
57011
57979
  recordFilter?: JsonValue | null;
57012
57980
  }
57013
- export interface ScheduleTrigger {
57981
+ interface ScheduleTrigger$1 {
57014
57982
  type: 'one_time' | 'recurring';
57015
57983
  /** ISO 8601 datetime — required for `one_time` triggers. */
57016
57984
  runAt?: string;
@@ -57026,8 +57994,8 @@ export interface ScheduleTrigger {
57026
57994
  */
57027
57995
  export type Schedule = paths['/v1/schedules/{id}']['get']['responses'][200]['content']['application/json'];
57028
57996
  export interface CreateScheduleRequest {
57029
- target: ScheduleTarget;
57030
- trigger: ScheduleTrigger;
57997
+ target: ScheduleTarget$1;
57998
+ trigger: ScheduleTrigger$1;
57031
57999
  messages?: ScheduleMessages | null;
57032
58000
  executionOptions?: ScheduleExecutionOptions;
57033
58001
  /** Top-level input variables; keys must not start with `_`. */
@@ -57968,6 +58936,54 @@ interface EnsureEvalResult {
57968
58936
  /** The server-computed canonical hash (echo this — never your own). */
57969
58937
  contentHash: string;
57970
58938
  }
58939
+ /** The dry-run outcome of `client.evals.ensure(definition, { dryRun: true })`. */
58940
+ interface EnsureEvalPlan {
58941
+ result: 'plan';
58942
+ changes: 'none' | 'create' | 'update';
58943
+ /** Coarse keys that differ: `target`, `cases`, `recordedToolMode`, `recordedToolUnmatchedPolicy`. */
58944
+ changedKeys: string[];
58945
+ contentHash: string;
58946
+ /** The live suite's hash, computed over the cases ensure owns; bind an apply to it with `expectedRemoteHash`. */
58947
+ remoteHash?: string;
58948
+ suiteId?: string;
58949
+ }
58950
+ interface EnsureEvalOptions {
58951
+ /** Plan without writing (the CI drift gate). Sends the full definition. */
58952
+ dryRun?: boolean;
58953
+ /**
58954
+ * What to do when the suite's last write came from the dashboard/API rather
58955
+ * than ensure. Default 'error' (HTTP 409 → EvalEnsureConflictError).
58956
+ */
58957
+ onConflict?: 'error' | 'overwrite';
58958
+ /** TOCTOU guard binding a dry run to its apply (409 remote_changed otherwise). */
58959
+ expectedRemoteHash?: string;
58960
+ /** Implies dryRun; throws EvalDriftError unless the plan is 'none'. */
58961
+ expectNoChanges?: boolean;
58962
+ }
58963
+ /** Options for a converging (non-plan) ensure. */
58964
+ type EnsureEvalApplyOptions = Omit<EnsureEvalOptions, 'dryRun' | 'expectNoChanges'> & {
58965
+ dryRun?: false;
58966
+ expectNoChanges?: false;
58967
+ };
58968
+ /** A 409 from the eval ensure protocol (external_modification or remote_changed). */
58969
+ export declare class EvalEnsureConflictError extends Error {
58970
+ readonly code: 'external_modification' | 'remote_changed';
58971
+ readonly lastModifiedSource?: string;
58972
+ readonly modifiedAt?: string | null;
58973
+ readonly currentHash?: string | null;
58974
+ constructor(body: {
58975
+ error?: string;
58976
+ code: 'external_modification' | 'remote_changed';
58977
+ lastModifiedSource?: string;
58978
+ modifiedAt?: string | null;
58979
+ currentHash?: string | null;
58980
+ });
58981
+ }
58982
+ /** Thrown by `ensure(def, { expectNoChanges: true })` when drift is detected. */
58983
+ export declare class EvalDriftError extends Error {
58984
+ readonly plan: EnsureEvalPlan;
58985
+ constructor(plan: EnsureEvalPlan);
58986
+ }
57971
58987
  /** The canonical definition + provenance returned by `client.evals.pull(name)`. */
57972
58988
  interface EvalPullResult {
57973
58989
  suiteId: string;
@@ -58172,15 +59188,17 @@ type RunEvalInput = {
58172
59188
  };
58173
59189
  /**
58174
59190
  * Idempotently converge an eval suite definition onto the platform. Hash-first:
58175
- * probes with a content hash, and only ships the full definition when the
58176
- * server reports a miss (`definitionRequired`). Upserts the suite + replaces
58177
- * its cases; never executes the eval (use the `runtype eval` CLI / `/eval`
58178
- * submit surface to run it).
58179
- *
58180
- * `virtual: true` definitions are ephemeral and have nothing durable to
58181
- * converge — ensure rejects them. Run a virtual eval directly instead.
59191
+ * probes with a content hash, and only ships the full definition on a miss.
59192
+ * Replaces only the cases ensure owns: cases saved from runs or added in the
59193
+ * dashboard survive. Never executes the eval. Virtual evals cannot be ensured.
58182
59194
  */
58183
- export declare function ensureEval(client: RuntypeClient$1, definition: EvalDefinition): Promise<EnsureEvalResult>;
59195
+ export declare function ensureEval(client: RuntypeClient$1, definition: EvalDefinition, options: EnsureEvalOptions & ({
59196
+ dryRun: true;
59197
+ } | {
59198
+ expectNoChanges: true;
59199
+ })): Promise<EnsureEvalPlan>;
59200
+ export declare function ensureEval(client: RuntypeClient$1, definition: EvalDefinition, options?: EnsureEvalApplyOptions): Promise<EnsureEvalResult>;
59201
+ export declare function ensureEval(client: RuntypeClient$1, definition: EvalDefinition, options?: EnsureEvalOptions): Promise<EnsureEvalResult | EnsureEvalPlan>;
58184
59202
  /**
58185
59203
  * Pull the canonical definition + provenance for an eval suite by name — the
58186
59204
  * absorb-drift direction of the ensure protocol. The contentHash reflects the
@@ -58280,6 +59298,7 @@ interface EnsureFlowOptions {
58280
59298
  /**
58281
59299
  * What to do when the flow's last write came from the dashboard/API
58282
59300
  * rather than ensure. Default 'error' (HTTP 409 → FlowEnsureConflictError).
59301
+ * Also applies to the flow's inline evals (409 → EvalEnsureConflictError).
58283
59302
  */
58284
59303
  onConflict?: 'error' | 'overwrite';
58285
59304
  /** 'publish' also re-aims the published-version pointer. Default 'none'. */
@@ -58295,7 +59314,10 @@ interface EnsureFlowOptions {
58295
59314
  * server-generated notes.
58296
59315
  */
58297
59316
  version?: components['schemas']['EnsureVersionMetadata'];
58298
- /** Implies dryRun; throws FlowDriftError unless the plan is 'none'. */
59317
+ /**
59318
+ * Implies dryRun; throws FlowDriftError unless the plan is 'none' and, with
59319
+ * `release: 'publish'`, no publish is pending.
59320
+ */
58299
59321
  expectNoChanges?: boolean;
58300
59322
  }
58301
59323
  interface EnsureFlowConverged {
@@ -58320,6 +59342,8 @@ interface EnsureFlowPlan {
58320
59342
  contentHash: string;
58321
59343
  remoteHash?: string;
58322
59344
  flowId?: string;
59345
+ /** Present when the dry run carried `release: 'publish'`: whether it would re-aim the published version. */
59346
+ publishPending?: boolean;
58323
59347
  }
58324
59348
  type EnsureFlowResult = EnsureFlowConverged | EnsureFlowPlan;
58325
59349
  interface FlowPullResult {
@@ -58944,7 +59968,7 @@ interface EvalSuiteDetail extends EvalSuiteSummary {
58944
59968
  } | null;
58945
59969
  }
58946
59970
  /** Case provenance (mirror of `EvalCaseOrigin` in `@runtypelabs/shared`). */
58947
- type EvalCaseOrigin = 'manual' | 'saved_from_run' | 'generated' | 'imported' | 'fpo';
59971
+ type EvalCaseOrigin = 'manual' | 'saved_from_run' | 'generated' | 'imported' | 'fpo' | 'ensure';
58948
59972
  /** One case to create. */
58949
59973
  interface EvalSuiteCaseInput {
58950
59974
  name: string;
@@ -59475,7 +60499,9 @@ export declare class EvalsNamespace {
59475
60499
  * Idempotently converge a `defineEval` suite definition onto the platform —
59476
60500
  * the deploy-time, non-executing converge for code-colocated evals. Hash-first:
59477
60501
  * the steady state is one tiny probe request. Upserts the eval suite + replaces
59478
- * its cases; never runs the eval.
60502
+ * the cases ensure owns (captured and dashboard cases survive); never runs the
60503
+ * eval. `dryRun` / `expectNoChanges` plan without writing; a dashboard edit
60504
+ * answers 409 unless `onConflict: 'overwrite'`.
59479
60505
  *
59480
60506
  * @example
59481
60507
  * ```typescript
@@ -59487,7 +60513,13 @@ export declare class EvalsNamespace {
59487
60513
  * const result = await Runtype.evals.ensure(suite)
59488
60514
  * ```
59489
60515
  */
59490
- ensure(definition: EvalDefinition): Promise<EnsureEvalResult>;
60516
+ ensure(definition: EvalDefinition, options: EnsureEvalOptions & ({
60517
+ dryRun: true;
60518
+ } | {
60519
+ expectNoChanges: true;
60520
+ })): Promise<EnsureEvalPlan>;
60521
+ ensure(definition: EvalDefinition, options?: EnsureEvalApplyOptions): Promise<EnsureEvalResult>;
60522
+ ensure(definition: EvalDefinition, options?: EnsureEvalOptions): Promise<EnsureEvalResult | EnsureEvalPlan>;
59491
60523
  /**
59492
60524
  * Pull the canonical definition + provenance for an eval suite by name — the
59493
60525
  * absorb-drift direction of the ensure protocol.
@@ -59810,6 +60842,12 @@ interface EnsureSkillOptions {
59810
60842
  * remote still hashes to this value (409 remote_changed otherwise).
59811
60843
  */
59812
60844
  expectedRemoteHash?: string;
60845
+ /**
60846
+ * Provenance stamped on the version row this converge appends (a git SHA, a
60847
+ * release tag). Omit to keep the default 'sdk-ensure' label and the
60848
+ * server-generated notes.
60849
+ */
60850
+ version?: components['schemas']['EnsureVersionMetadata'];
59813
60851
  /** Implies dryRun; throws SkillDriftError unless the plan is 'none'. */
59814
60852
  expectNoChanges?: boolean;
59815
60853
  }
@@ -59953,7 +60991,7 @@ interface SkillVersion {
59953
60991
  createdAt: string;
59954
60992
  }
59955
60993
  /** An agent ↔ skill binding row. */
59956
- interface AgentSkillBinding {
60994
+ interface AgentSkillBinding$1 {
59957
60995
  id: string;
59958
60996
  agentId: string;
59959
60997
  skillId: string;
@@ -59968,7 +61006,7 @@ interface AgentSkillBinding {
59968
61006
  * {@link SkillsNamespace.listBindingsForSkill}, the by-skill twin of
59969
61007
  * {@link SkillsNamespace.listBindings}.
59970
61008
  */
59971
- interface SkillBindingWithAgent extends AgentSkillBinding {
61009
+ interface SkillBindingWithAgent extends AgentSkillBinding$1 {
59972
61010
  agent: {
59973
61011
  id: string;
59974
61012
  name: string;
@@ -60236,7 +61274,7 @@ export declare class SkillsNamespace {
60236
61274
  * Bind a skill to an agent. Both the agent and the skill must be owned by the
60237
61275
  * caller.
60238
61276
  */
60239
- bind(input: BindSkillInput): Promise<AgentSkillBinding>;
61277
+ bind(input: BindSkillInput): Promise<AgentSkillBinding$1>;
60240
61278
  /**
60241
61279
  * Remove a skill binding by its binding id.
60242
61280
  */
@@ -60249,7 +61287,7 @@ export declare class SkillsNamespace {
60249
61287
  * const bindings = await Runtype.skills.listBindings('agent_123')
60250
61288
  * ```
60251
61289
  */
60252
- listBindings(agentId: string): Promise<AgentSkillBinding[]>;
61290
+ listBindings(agentId: string): Promise<AgentSkillBinding$1[]>;
60253
61291
  /**
60254
61292
  * List every agent a skill is bound to, each row joined with the agent's name
60255
61293
  * and type. The by-agent twin is {@link listBindings}.
@@ -60338,23 +61376,6 @@ export declare class AgentAliasNotFoundError extends Error {
60338
61376
  agentId: string;
60339
61377
  });
60340
61378
  }
60341
- /**
60342
- * A new preview pointer refused by the active-preview quota (HTTP 429). Archive
60343
- * a preview you no longer need — archiving frees the quota immediately — or wait
60344
- * for one to expire. `live` is never counted.
60345
- */
60346
- export declare class AgentAliasPreviewLimitError extends Error {
60347
- readonly code = "PREVIEW_ALIAS_LIMIT";
60348
- readonly scope: 'organization' | 'agent';
60349
- readonly limit: number;
60350
- readonly active: number;
60351
- constructor(body: {
60352
- error?: string;
60353
- scope: 'organization' | 'agent';
60354
- limit: number;
60355
- active: number;
60356
- });
60357
- }
60358
61379
  /** A version whose named references no longer resolve in this account (HTTP 422). */
60359
61380
  export declare class AgentAliasDependencyError extends Error {
60360
61381
  readonly code = "alias_dependency_unresolved";
@@ -60365,7 +61386,7 @@ export declare class AgentAliasDependencyError extends Error {
60365
61386
  });
60366
61387
  }
60367
61388
  /** Every coded refusal the alias plane maps onto a typed error. */
60368
- type TypedAliasError = AgentAliasRevisionMismatchError | AgentAliasRevisionRequiredError | AgentAliasNotFoundError | AgentAliasDependencyError | AgentAliasPreviewLimitError;
61389
+ type TypedAliasError = AgentAliasRevisionMismatchError | AgentAliasRevisionRequiredError | AgentAliasNotFoundError | AgentAliasDependencyError;
60369
61390
  /** The refusal code, when this is one of the typed alias errors. */
60370
61391
  export declare function agentAliasErrorCode(err: unknown): TypedAliasError['code'] | undefined;
60371
61392
  interface ListAgentAliasesOptions {
@@ -60714,8 +61735,61 @@ interface EnsureAgentOptions {
60714
61735
  * server-generated notes.
60715
61736
  */
60716
61737
  version?: components['schemas']['EnsureVersionMetadata'];
60717
- /** Implies dryRun; throws AgentDriftError unless the plan is 'none'. */
61738
+ /**
61739
+ * Implies dryRun; throws AgentDriftError unless the plan is 'none', no skill
61740
+ * binding would change and, with `release` or `deploy`, the alias would not move.
61741
+ */
60718
61742
  expectNoChanges?: boolean;
61743
+ /**
61744
+ * The complete set of skills bound to the agent, in load order. `version`
61745
+ * pins a skill versionNumber; omit it to follow the published version.
61746
+ * Bound skills absent here are unbound; omit the option to leave bindings alone.
61747
+ */
61748
+ skills?: AgentSkillBinding[];
61749
+ /**
61750
+ * The complete set of capabilities (flow, sub-agent and saved-tool
61751
+ * attachments) in display order. Capabilities absent here are removed; omit
61752
+ * the option to leave them alone. When present they are part of the content hash.
61753
+ */
61754
+ capabilities?: AgentCapabilityDeclaration[];
61755
+ }
61756
+ /** @example `{ toolName: 'lookup_order', flow: 'Order Lookup' }` attaches the flow named "Order Lookup". */
61757
+ interface AgentCapabilityDeclaration {
61758
+ /** The name the agent calls this capability by. */
61759
+ toolName: string;
61760
+ /** Exactly one of `flow`, `agent` or `tool`: the source's name in this account. */
61761
+ flow?: string;
61762
+ agent?: string;
61763
+ tool?: string;
61764
+ description?: string;
61765
+ /** Omit to derive it from the flow's inputs or the tool's own schema. */
61766
+ parametersSchema?: Record<string, unknown>;
61767
+ enabled?: boolean;
61768
+ }
61769
+ /** What one ensure did (or, on a dry run, would do) to a declared or removed capability. */
61770
+ interface AgentCapabilityChange {
61771
+ toolName: string;
61772
+ action: 'add' | 'update' | 'remove' | 'unchanged';
61773
+ kind: 'flow' | 'agent' | 'tool' | null;
61774
+ /** The flow, agent or tool name the capability calls. */
61775
+ source: string | null;
61776
+ enabled: boolean;
61777
+ }
61778
+ /** @example `{ name: 'refund-policy', version: 3 }` pins version 3; `{ name: 'tone-guide' }` follows published. */
61779
+ interface AgentSkillBinding {
61780
+ /** The skill slug. */
61781
+ name: string;
61782
+ version?: number;
61783
+ enabled?: boolean;
61784
+ }
61785
+ /** What one ensure did (or, on a dry run, would do) to a declared or removed binding. */
61786
+ interface AgentSkillBindingChange {
61787
+ name: string;
61788
+ skillId: string;
61789
+ action: 'bind' | 'update' | 'unbind' | 'unchanged';
61790
+ /** The pinned versionNumber; null follows the published version. */
61791
+ version: number | null;
61792
+ enabled: boolean;
60719
61793
  }
60720
61794
  interface EnsureAgentConverged {
60721
61795
  result: 'unchanged' | 'created' | 'updated';
@@ -60727,6 +61801,10 @@ interface EnsureAgentConverged {
60727
61801
  remoteHash?: string;
60728
61802
  /** The pointer this converge aimed, present only when it carried release or deploy. */
60729
61803
  deployment?: AgentEnsureDeployment;
61804
+ /** Present when the request carried `skills`. */
61805
+ skillBindings?: AgentSkillBindingChange[];
61806
+ /** Present when the request carried `capabilities`. */
61807
+ capabilityChanges?: AgentCapabilityChange[];
60730
61808
  }
60731
61809
  interface EnsureAgentPlan {
60732
61810
  result: 'plan';
@@ -60737,6 +61815,10 @@ interface EnsureAgentPlan {
60737
61815
  agentId?: string;
60738
61816
  /** The pointer this dry run would aim, and whether it would move. */
60739
61817
  deployment?: AgentEnsureDeployment;
61818
+ /** Present when the request carried `skills`. */
61819
+ skillBindings?: AgentSkillBindingChange[];
61820
+ /** Present when the request carried `capabilities`. */
61821
+ capabilityChanges?: AgentCapabilityChange[];
60740
61822
  }
60741
61823
  type EnsureAgentResult = EnsureAgentConverged | EnsureAgentPlan;
60742
61824
  interface AgentPullResult {
@@ -60753,6 +61835,10 @@ interface AgentPullResult {
60753
61835
  * `defineAgent`/`ensure` reject — so each warning explains how to fix it.
60754
61836
  */
60755
61837
  warnings?: string[];
61838
+ /** The agent's skill bindings, ready to pass back as the `skills` ensure option. */
61839
+ skills: AgentSkillBinding[];
61840
+ /** The agent's capabilities, ready to pass back as the `capabilities` ensure option. */
61841
+ capabilities: AgentCapabilityDeclaration[];
60756
61842
  }
60757
61843
  /** A 409 from the ensure protocol (external_modification or remote_changed). */
60758
61844
  export declare class AgentEnsureConflictError extends Error {
@@ -60906,6 +61992,18 @@ interface RunListRow {
60906
61992
  * predates the field.
60907
61993
  */
60908
61994
  test: boolean | null;
61995
+ /**
61996
+ * How the run started, for a Via column. Forward-only for schedule, API key,
61997
+ * CLI, MCP and eval detail: a header written before those stamps reads null or
61998
+ * the coarse origin. `mcp`, `cli` and `sdk` are self-declared by the client.
61999
+ */
62000
+ via?: {
62001
+ kind: 'schedule' | 'surface' | 'api' | 'mcp' | 'cli' | 'test' | 'eval';
62002
+ /** Schedule, surface, API key, acting user or eval suite id; null for mcp and test. */
62003
+ id: string | null;
62004
+ /** Its display name when the API could resolve one; null otherwise. */
62005
+ label: string | null;
62006
+ } | null;
60909
62007
  stopReason?: string | null;
60910
62008
  iterations?: number | null;
60911
62009
  /**
@@ -60959,6 +62057,8 @@ interface RunListParams {
60959
62057
  overlay?: 'live' | 'none';
60960
62058
  limit?: number;
60961
62059
  cursor?: string;
62060
+ /** `'true'` adds `pagination.totalCount`, counted up to 1000, and `totalCountCapped`. */
62061
+ includeCount?: 'true' | 'false';
60962
62062
  }
60963
62063
  interface RunListResponse {
60964
62064
  data: RunListRow[];
@@ -60969,6 +62069,10 @@ interface RunListResponse {
60969
62069
  limit: number;
60970
62070
  /** True when the supplied cursor was rejected and the read restarted at page one; stop paging. */
60971
62071
  cursorReset?: boolean;
62072
+ /** Runs the filters match in the window, up to 1000; present only when `includeCount` was `'true'`. */
62073
+ totalCount?: number;
62074
+ /** True when more runs matched than `totalCount` counts, so read it as "more than". */
62075
+ totalCountCapped?: boolean;
60972
62076
  };
60973
62077
  window: {
60974
62078
  from: string;
@@ -61135,6 +62239,115 @@ export declare class ToolsNamespace {
61135
62239
  pull(name: string): Promise<ToolPullResult>;
61136
62240
  }
61137
62241
  //#endregion
62242
+ //#region src/question-sets-ensure.d.ts
62243
+ /** A question set declared in code. `slug` is its identity within the organization. */
62244
+ interface QuestionSetDefinition {
62245
+ slug: string;
62246
+ name: string;
62247
+ description?: string | null;
62248
+ /** Judgment questions keyed by question id, e.g. `{ urgent: { type: 'boolean', instructions: '...' } }`. */
62249
+ questions: Record<string, unknown>;
62250
+ inputMapping?: Record<string, string> | null;
62251
+ model?: string | null;
62252
+ }
62253
+ /** Canonical form of a question set definition, without its slug. */
62254
+ export declare function normalizeQuestionSetDefinition(definition: QuestionSetDefinition): Record<string, unknown>;
62255
+ /** SHA-256 (hex) over the canonical question set definition. */
62256
+ export declare function computeQuestionSetContentHash(definition: QuestionSetDefinition): Promise<string>;
62257
+ /**
62258
+ * Pure local constructor for a question set definition. Checks the structure
62259
+ * and rejects unknown fields; the server validates the questions at ensure time.
62260
+ *
62261
+ * @example
62262
+ * ```typescript
62263
+ * const triage = defineQuestionSet({
62264
+ * slug: 'ticket-triage',
62265
+ * name: 'Ticket triage',
62266
+ * questions: { urgent: { type: 'boolean', instructions: 'Is the ticket urgent?' } },
62267
+ * })
62268
+ * ```
62269
+ */
62270
+ export declare function defineQuestionSet(input: QuestionSetDefinition): QuestionSetDefinition;
62271
+ interface EnsureQuestionSetOptions {
62272
+ /** Plan without writing (the CI drift gate). Sends the full definition. */
62273
+ dryRun?: boolean;
62274
+ /** What to do when the last write came from the dashboard or API. Default 'error' (409). */
62275
+ onConflict?: 'error' | 'overwrite';
62276
+ /** 'publish' makes the latest version the one executions resolve. Default 'none'. */
62277
+ release?: 'none' | 'publish';
62278
+ /** Apply only if the remote still hashes to this value (409 remote_changed otherwise). */
62279
+ expectedRemoteHash?: string;
62280
+ /** Implies dryRun; throws QuestionSetDriftError unless the plan is 'none'. */
62281
+ expectNoChanges?: boolean;
62282
+ }
62283
+ interface EnsureQuestionSetConverged {
62284
+ result: 'unchanged' | 'created' | 'updated';
62285
+ questionSetId: string;
62286
+ versionId: string | null;
62287
+ versionNumber: number | null;
62288
+ publishedVersionNumber: number | null;
62289
+ /** The server-computed canonical hash; echo this one, never your own. */
62290
+ contentHash: string;
62291
+ }
62292
+ interface EnsureQuestionSetPlan {
62293
+ result: 'plan';
62294
+ changes: 'none' | 'create' | 'update';
62295
+ changedKeys: string[];
62296
+ contentHash: string;
62297
+ remoteHash?: string;
62298
+ questionSetId?: string;
62299
+ }
62300
+ type EnsureQuestionSetResult = EnsureQuestionSetConverged | EnsureQuestionSetPlan;
62301
+ interface QuestionSetPullResult {
62302
+ questionSetId: string;
62303
+ definition: QuestionSetDefinition;
62304
+ contentHash: string;
62305
+ lastModifiedSource: string | null;
62306
+ updatedAt: string | null;
62307
+ versionNumber: number | null;
62308
+ publishedVersionNumber: number | null;
62309
+ }
62310
+ /** A 409 from the ensure protocol (external_modification or remote_changed). */
62311
+ export declare class QuestionSetEnsureConflictError extends Error {
62312
+ readonly code: 'external_modification' | 'remote_changed';
62313
+ readonly lastModifiedSource?: string;
62314
+ readonly modifiedAt?: string | null;
62315
+ readonly currentHash?: string | null;
62316
+ constructor(body: {
62317
+ error?: string;
62318
+ code: 'external_modification' | 'remote_changed';
62319
+ lastModifiedSource?: string;
62320
+ modifiedAt?: string | null;
62321
+ currentHash?: string | null;
62322
+ });
62323
+ }
62324
+ /** Thrown by `ensure(def, { expectNoChanges: true })` when the remote differs. */
62325
+ export declare class QuestionSetDriftError extends Error {
62326
+ readonly plan: EnsureQuestionSetPlan;
62327
+ constructor(slug: string, plan: EnsureQuestionSetPlan);
62328
+ }
62329
+ //#endregion
62330
+ //#region src/question-sets-namespace.d.ts
62331
+ /** Question set config-as-code: `ensure` and `pull`. */
62332
+ export declare class QuestionSetsNamespace {
62333
+ private getClient;
62334
+ constructor(getClient: () => RuntypeClient$1);
62335
+ /**
62336
+ * Converge a `defineQuestionSet` definition. The steady state is one hash
62337
+ * probe. Pass `release: 'publish'` so flows and agents can resolve the
62338
+ * latest version.
62339
+ *
62340
+ * @example
62341
+ * ```typescript
62342
+ * await Runtype.questionSets.ensure(triage, { release: 'publish' })
62343
+ * await Runtype.questionSets.ensure(triage, { expectNoChanges: true })
62344
+ * ```
62345
+ */
62346
+ ensure(definition: QuestionSetDefinition, options?: EnsureQuestionSetOptions): Promise<EnsureQuestionSetResult>;
62347
+ /** Pull the live definition and provenance for a slug, to absorb a dashboard edit. */
62348
+ pull(slug: string): Promise<QuestionSetPullResult>;
62349
+ }
62350
+ //#endregion
61138
62351
  //#region src/products-ensure.d.ts
61139
62352
  /** Canonical normalized form of a product definition (name + canvas excluded). */
61140
62353
  export declare function normalizeProductDefinition(definition: ProductContentInput): {
@@ -61267,6 +62480,28 @@ interface EnsureFpoOptions {
61267
62480
  * plan rows.
61268
62481
  */
61269
62482
  prune?: boolean;
62483
+ /** Implies dryRun; throws FpoDriftError when any entity would be created, updated, pruned or fails. */
62484
+ expectNoChanges?: boolean;
62485
+ /**
62486
+ * TOCTOU guard: pass the dry run's `remoteHash`; the write proceeds only while
62487
+ * the live graph still hashes to it (ProductEnsureConflictError `remote_changed`
62488
+ * otherwise). The hash covers what `pullFpo` reconstructs, so seed records,
62489
+ * schedules and secrets are outside it.
62490
+ */
62491
+ expectedRemoteHash?: string;
62492
+ /**
62493
+ * With `release: 'none'`, send a hash-only probe first and skip the full FPO
62494
+ * when the live graph reconstructs to the same hash. A publishing converge
62495
+ * (the default release) always ships the full FPO, since only it can publish
62496
+ * drafts that are not yet live.
62497
+ */
62498
+ hashProbe?: boolean;
62499
+ /**
62500
+ * Whether converged capability agents and flows go live. The server defaults
62501
+ * to `'publish'` (version, publish and move the agent's `live` alias, as
62502
+ * product creation does); `'none'` saves changes as drafts.
62503
+ */
62504
+ release?: 'none' | 'publish';
61270
62505
  }
61271
62506
  /** One nested entity's converge result. */
61272
62507
  interface FpoEntityOutcome {
@@ -61281,9 +62516,17 @@ interface EnsureFpoResult {
61281
62516
  result: 'unchanged' | 'converged' | 'plan';
61282
62517
  productId?: string;
61283
62518
  contentHash: string;
62519
+ /** dryRun only: the live graph's hash, to pass back as `expectedRemoteHash`. */
62520
+ remoteHash?: string;
61284
62521
  entities: FpoEntityOutcome[];
61285
62522
  hasFailures: boolean;
61286
62523
  }
62524
+ /** Thrown by `ensureFpo(fpo, { expectNoChanges: true })` when the plan is not clean. */
62525
+ export declare class FpoDriftError extends Error {
62526
+ readonly plan: EnsureFpoResult;
62527
+ constructor(plan: EnsureFpoResult);
62528
+ }
62529
+ export declare function fpoPlanHasDrift(plan: EnsureFpoResult): boolean;
61287
62530
  interface PullFpoResult {
61288
62531
  productId: string;
61289
62532
  /**
@@ -61297,10 +62540,10 @@ interface PullFpoResult {
61297
62540
  warnings?: string[];
61298
62541
  }
61299
62542
  /**
61300
- * Converge an entire FPO onto the platform. Ships the full FPO (no hash-only
61301
- * probe in this release); the server fans out to the per-entity ensure services
61302
- * and returns the whole-FPO hash + per-entity report. Non-atomic: inspect
61303
- * `result.hasFailures` / `entities[].result` and re-run to self-heal.
62543
+ * Converge an entire FPO onto the platform. Ships the full FPO unless a
62544
+ * drafts-only `hashProbe` finds the live graph already matches; the server fans out to the
62545
+ * per-entity ensure services and returns the whole-FPO hash + per-entity report.
62546
+ * Non-atomic: inspect `result.hasFailures` / `entities[].result` and re-run to self-heal.
61304
62547
  */
61305
62548
  export declare function ensureFpo(client: RuntypeClient$1, fpo: FpoInput, options?: EnsureFpoOptions): Promise<EnsureFpoResult>;
61306
62549
  /**
@@ -61429,8 +62672,10 @@ interface DefineSurfaceInput {
61429
62672
  name: string;
61430
62673
  type: SurfaceDefinitionType;
61431
62674
  behavior?: Record<string, unknown>;
61432
- inbound?: Record<string, unknown>;
61433
- outbound?: Record<string, unknown>;
62675
+ /** Omit to keep the stored value; null clears it; a `'<redacted>'` credential keeps the stored secret. */
62676
+ inbound?: Record<string, unknown> | null;
62677
+ /** Omit to keep the stored value; null clears it; a `'<redacted>'` credential keeps the stored secret. */
62678
+ outbound?: Record<string, unknown> | null;
61434
62679
  status?: SurfaceDefinitionStatus;
61435
62680
  }
61436
62681
  /** The canonical (wire) definition produced by `defineSurface`. */
@@ -61438,8 +62683,10 @@ interface SurfaceDefinition {
61438
62683
  name: string;
61439
62684
  type: SurfaceDefinitionType;
61440
62685
  behavior?: Record<string, unknown>;
61441
- inbound?: Record<string, unknown>;
61442
- outbound?: Record<string, unknown>;
62686
+ /** Omit to keep the stored value; null clears it; a `'<redacted>'` credential keeps the stored secret. */
62687
+ inbound?: Record<string, unknown> | null;
62688
+ /** Omit to keep the stored value; null clears it; a `'<redacted>'` credential keeps the stored secret. */
62689
+ outbound?: Record<string, unknown> | null;
61443
62690
  status?: SurfaceDefinitionStatus;
61444
62691
  }
61445
62692
  /**
@@ -62267,6 +63514,23 @@ export declare class Runtype {
62267
63514
  * ```
62268
63515
  */
62269
63516
  static get tools(): ToolsNamespace;
63517
+ /**
63518
+ * Question sets namespace - Question set config-as-code (define / ensure / pull)
63519
+ *
63520
+ * @example
63521
+ * ```typescript
63522
+ * import { defineQuestionSet, Runtype } from '@runtypelabs/sdk'
63523
+ *
63524
+ * const triage = defineQuestionSet({
63525
+ * slug: 'ticket-triage',
63526
+ * name: 'Ticket triage',
63527
+ * questions: { urgent: { type: 'boolean', instructions: 'Is the ticket urgent?' } },
63528
+ * })
63529
+ *
63530
+ * await Runtype.questionSets.ensure(triage, { release: 'publish' })
63531
+ * ```
63532
+ */
63533
+ static get questionSets(): QuestionSetsNamespace;
62270
63534
  /**
62271
63535
  * Products namespace - Product config-as-code (define / ensure / pull)
62272
63536
  *
@@ -62464,6 +63728,238 @@ interface PromoteAgentResult {
62464
63728
  */
62465
63729
  export declare function promoteAgent(input: PromoteAgentInput): Promise<PromoteAgentResult>;
62466
63730
  //#endregion
63731
+ //#region src/schedules-ensure.d.ts
63732
+ /** Exactly one key: a flow or agent by id, or by name (portable across environments). */
63733
+ export type ScheduleTarget = {
63734
+ flowId: string;
63735
+ } | {
63736
+ agentId: string;
63737
+ } | {
63738
+ flowName: string;
63739
+ } | {
63740
+ agentName: string;
63741
+ };
63742
+ export type ScheduleTrigger = {
63743
+ type: 'recurring';
63744
+ cron: string;
63745
+ timezone: string;
63746
+ runAt?: string;
63747
+ } | {
63748
+ type: 'one_time';
63749
+ runAt: string;
63750
+ cron?: string;
63751
+ timezone?: string;
63752
+ };
63753
+ type ScheduleDefinitionMessage = {
63754
+ role: 'system' | 'user' | 'assistant';
63755
+ content: unknown;
63756
+ } | {
63757
+ name?: string;
63758
+ messages: Array<{
63759
+ role: 'system' | 'user' | 'assistant';
63760
+ content: unknown;
63761
+ }>;
63762
+ };
63763
+ /** The canonical (wire) definition produced by `defineSchedule`. */
63764
+ interface ScheduleDefinition {
63765
+ name: string;
63766
+ target: ScheduleTarget;
63767
+ trigger: ScheduleTrigger;
63768
+ recordIds?: string[];
63769
+ recordType?: string;
63770
+ recordFilter?: Record<string, unknown>;
63771
+ messages?: ScheduleDefinitionMessage[];
63772
+ inputs?: Record<string, unknown>;
63773
+ executionOptions?: Record<string, unknown>;
63774
+ /** Omit to leave the schedule's paused/active state alone; new schedules start enabled. */
63775
+ enabled?: boolean;
63776
+ }
63777
+ type DefineScheduleInput = ScheduleDefinition;
63778
+ interface ScheduleContentInput {
63779
+ triggerType: string;
63780
+ cron?: string | null;
63781
+ timezone?: string | null;
63782
+ runAt?: string | Date | null;
63783
+ recordIds?: string[] | null;
63784
+ recordType?: string | null;
63785
+ recordFilter?: Record<string, unknown> | null;
63786
+ messages?: unknown[] | null;
63787
+ inputs?: Record<string, unknown> | null;
63788
+ executionOptions?: Record<string, unknown> | null;
63789
+ enabled?: boolean | null;
63790
+ }
63791
+ /** Canonical normalized schedule content (name and target excluded — identity). */
63792
+ export declare function normalizeScheduleContent(definition: ScheduleContentInput): Record<string, unknown>;
63793
+ /** SHA-256 (hex) over canonical schedule content, in the flat content shape. */
63794
+ export declare function computeScheduleContentHash(definition: ScheduleContentInput): Promise<string>;
63795
+ /** The content hash of a `defineSchedule` definition. */
63796
+ export declare function computeScheduleDefinitionHash(definition: ScheduleDefinition): Promise<string>;
63797
+ /**
63798
+ * Pure-local declarative constructor for a standalone schedule. No I/O.
63799
+ * Validates structure; cron, timezone, record filter and plan limits are
63800
+ * checked server-side at ensure time.
63801
+ *
63802
+ * @example
63803
+ * ```typescript
63804
+ * const nightly = defineSchedule({
63805
+ * name: 'Nightly digest',
63806
+ * target: { flowName: 'Digest' },
63807
+ * trigger: { type: 'recurring', cron: '0 2 * * *', timezone: 'UTC' },
63808
+ * })
63809
+ * ```
63810
+ */
63811
+ export declare function defineSchedule(input: DefineScheduleInput): ScheduleDefinition;
63812
+ interface EnsureScheduleOptions {
63813
+ /** Plan without writing (the CI drift gate). Sends the full definition. */
63814
+ dryRun?: boolean;
63815
+ /** What to do when the last write was not ensure. Default 'error' (409). */
63816
+ onConflict?: 'error' | 'overwrite';
63817
+ /** TOCTOU guard from a dry run; the full definition is always sent with it. */
63818
+ expectedRemoteHash?: string;
63819
+ /** Implies dryRun; throws ScheduleDriftError unless the plan is 'none'. */
63820
+ expectNoChanges?: boolean;
63821
+ }
63822
+ interface EnsureScheduleConverged {
63823
+ result: 'unchanged' | 'created' | 'updated';
63824
+ scheduleId: string;
63825
+ /** The server-computed canonical hash (echo this — never your own). */
63826
+ contentHash: string;
63827
+ }
63828
+ interface EnsureSchedulePlan {
63829
+ result: 'plan';
63830
+ changes: 'none' | 'create' | 'update';
63831
+ changedKeys: string[];
63832
+ contentHash: string;
63833
+ remoteHash?: string;
63834
+ scheduleId?: string;
63835
+ }
63836
+ type EnsureScheduleResult = EnsureScheduleConverged | EnsureSchedulePlan;
63837
+ interface SchedulePullResult {
63838
+ scheduleId: string;
63839
+ definition: ScheduleDefinition;
63840
+ contentHash: string;
63841
+ lastModifiedSource: string | null;
63842
+ updatedAt: string | null;
63843
+ }
63844
+ /** A 409 from the ensure protocol (external_modification or remote_changed). */
63845
+ export declare class ScheduleEnsureConflictError extends Error {
63846
+ readonly code: 'external_modification' | 'remote_changed';
63847
+ readonly lastModifiedSource?: string;
63848
+ readonly modifiedAt?: string | null;
63849
+ readonly currentHash?: string | null;
63850
+ constructor(body: {
63851
+ error?: string;
63852
+ code: 'external_modification' | 'remote_changed';
63853
+ lastModifiedSource?: string;
63854
+ modifiedAt?: string | null;
63855
+ currentHash?: string | null;
63856
+ });
63857
+ }
63858
+ /** Thrown by `ensure(def, { expectNoChanges: true })` when drift is detected. */
63859
+ export declare class ScheduleDriftError extends Error {
63860
+ readonly plan: EnsureSchedulePlan;
63861
+ constructor(plan: EnsureSchedulePlan);
63862
+ }
63863
+ /** The request surface ensure needs; both SDK clients satisfy it. */
63864
+ interface ScheduleEnsureTransport {
63865
+ get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
63866
+ post<T>(path: string, data?: unknown): Promise<T>;
63867
+ }
63868
+ /**
63869
+ * Idempotently converge a standalone schedule. Hash-first: probes with a
63870
+ * content hash and ships the full definition only on a miss. Never deletes.
63871
+ */
63872
+ export declare function ensureSchedule(client: ScheduleEnsureTransport, definition: ScheduleDefinition, options?: EnsureScheduleOptions): Promise<EnsureScheduleResult>;
63873
+ /** Pull the canonical definition + provenance for a schedule by name and target. */
63874
+ export declare function pullSchedule(client: ScheduleEnsureTransport, name: string, target: ScheduleTarget): Promise<SchedulePullResult>;
63875
+ //#endregion
63876
+ //#region src/collections-ensure.d.ts
63877
+ type RecordCollectionValidationMode = 'off' | 'warn' | 'enforce';
63878
+ /** A repo-declared record collection. `slug` is identity; omitted fields converge to create defaults. */
63879
+ interface RecordCollectionDefinition {
63880
+ slug: string;
63881
+ displayName: string;
63882
+ description?: string | null;
63883
+ icon?: string | null;
63884
+ schema?: Record<string, unknown> | null;
63885
+ validationMode?: RecordCollectionValidationMode;
63886
+ }
63887
+ /** Canonical normalized form of a collection definition (slug excluded — identity). */
63888
+ export declare function normalizeRecordCollectionDefinition(definition: RecordCollectionDefinition): {
63889
+ displayName: string;
63890
+ description?: string;
63891
+ icon?: string;
63892
+ schema?: Record<string, unknown>;
63893
+ validationMode: string;
63894
+ };
63895
+ /** SHA-256 (hex) over the canonical normalized collection definition. */
63896
+ export declare function computeRecordCollectionContentHash(definition: RecordCollectionDefinition): Promise<string>;
63897
+ interface EnsureCollectionOptions {
63898
+ /** Plan without writing (the CI drift gate). Sends the full definition. */
63899
+ dryRun?: boolean;
63900
+ /** What to do when the last write came from the dashboard/API. Default 'error' (409). */
63901
+ onConflict?: 'error' | 'overwrite';
63902
+ /** TOCTOU guard binding a dry run to its apply (409 remote_changed otherwise). */
63903
+ expectedRemoteHash?: string;
63904
+ /** Implies dryRun; throws CollectionDriftError unless the plan is 'none'. */
63905
+ expectNoChanges?: boolean;
63906
+ }
63907
+ interface CollectionSchemaChange {
63908
+ kind: 'additive' | 'breaking';
63909
+ breakingChanges: string[];
63910
+ }
63911
+ interface EnsureCollectionConverged {
63912
+ result: 'unchanged' | 'created' | 'updated';
63913
+ collectionId: string;
63914
+ /** The server-computed canonical hash (echo this — never your own). */
63915
+ contentHash: string;
63916
+ schemaChange?: CollectionSchemaChange;
63917
+ /** Present when this ensure moved validationMode to `enforce`: existing records checked against the schema. */
63918
+ enforceCheck?: {
63919
+ checked: number;
63920
+ failed: number;
63921
+ truncated: boolean;
63922
+ };
63923
+ }
63924
+ interface EnsureCollectionPlan {
63925
+ result: 'plan';
63926
+ changes: 'none' | 'create' | 'update';
63927
+ changedKeys: string[];
63928
+ contentHash: string;
63929
+ remoteHash?: string;
63930
+ collectionId?: string;
63931
+ schemaChange?: CollectionSchemaChange;
63932
+ }
63933
+ type EnsureCollectionResult = EnsureCollectionConverged | EnsureCollectionPlan;
63934
+ interface CollectionPullResult {
63935
+ collectionId: string;
63936
+ definition: Required<Omit<RecordCollectionDefinition, 'validationMode'>> & {
63937
+ validationMode: RecordCollectionValidationMode;
63938
+ };
63939
+ contentHash: string;
63940
+ lastModifiedSource: string | null;
63941
+ updatedAt: string | null;
63942
+ }
63943
+ /** A 409 from the ensure protocol (external_modification or remote_changed). */
63944
+ export declare class CollectionEnsureConflictError extends Error {
63945
+ readonly code: 'external_modification' | 'remote_changed';
63946
+ readonly lastModifiedSource?: string;
63947
+ readonly modifiedAt?: string | null;
63948
+ readonly currentHash?: string | null;
63949
+ constructor(body: {
63950
+ error?: string;
63951
+ code: 'external_modification' | 'remote_changed';
63952
+ lastModifiedSource?: string;
63953
+ modifiedAt?: string | null;
63954
+ currentHash?: string | null;
63955
+ });
63956
+ }
63957
+ /** Thrown by `ensure(def, { expectNoChanges: true })` when drift is detected. */
63958
+ export declare class CollectionDriftError extends Error {
63959
+ readonly plan: EnsureCollectionPlan;
63960
+ constructor(slug: string, plan: EnsureCollectionPlan);
63961
+ }
63962
+ //#endregion
62467
63963
  //#region src/api-key-request-types.d.ts
62468
63964
  /**
62469
63965
  * Agent API key request types.
@@ -63201,6 +64697,24 @@ export declare class CollectionsEndpoint {
63201
64697
  * `RecordCollections` map so `client.records.from(slug)` types metadata.
63202
64698
  */
63203
64699
  typegen(): Promise<string>;
64700
+ /**
64701
+ * Idempotently converge a repo-declared collection (display fields, schema,
64702
+ * validationMode) by slug. Hash-first; `dryRun` / `expectNoChanges` plan
64703
+ * without writing. Never deletes a collection or touches records.
64704
+ *
64705
+ * @example
64706
+ * ```typescript
64707
+ * await client.collections.ensure({
64708
+ * slug: 'customers',
64709
+ * displayName: 'Customers',
64710
+ * schema: { type: 'object', properties: { status: { type: 'string' } } },
64711
+ * validationMode: 'warn',
64712
+ * })
64713
+ * ```
64714
+ */
64715
+ ensure(definition: RecordCollectionDefinition, options?: EnsureCollectionOptions): Promise<EnsureCollectionResult>;
64716
+ /** Pull the canonical definition and provenance for a collection — the absorb-drift direction. */
64717
+ pull(slug: string): Promise<CollectionPullResult>;
63204
64718
  }
63205
64719
  /**
63206
64720
  * Agent API key REQUESTS — a device-authorization-style grant.
@@ -65542,6 +67056,17 @@ export declare class SchedulesEndpoint {
65542
67056
  * Create a schedule. Provide exactly one of `target.flowId` or `target.agentId`.
65543
67057
  */
65544
67058
  create(data: CreateScheduleRequest): Promise<ScheduleMutationResponse>;
67059
+ /**
67060
+ * Idempotently converge a `defineSchedule` definition on a standalone flow or
67061
+ * agent. Identity is name + target; the steady state is one hash probe. Never
67062
+ * deletes, and an omitted `enabled` leaves a paused schedule paused.
67063
+ */
67064
+ ensure(definition: ScheduleDefinition, options?: EnsureScheduleOptions): Promise<EnsureScheduleResult>;
67065
+ /**
67066
+ * Pull the canonical definition + provenance for a schedule by name and
67067
+ * target — the absorb-drift direction of `ensure`.
67068
+ */
67069
+ pull(name: string, target: ScheduleTarget): Promise<SchedulePullResult>;
65545
67070
  /**
65546
67071
  * Update a schedule (partial update supported).
65547
67072
  */
@@ -67443,5 +68968,5 @@ export declare function getLikelySupportingCandidatePaths(bestCandidatePath: str
67443
68968
  export declare function getDefaultPlanPath(taskName: string): string;
67444
68969
  export declare function sanitizeTaskSlug(taskName: string): string;
67445
68970
  //#endregion
67446
- export type { AIGrader, ActivateAgentAliasInput, ActivateAgentPromotionInput, AgentAlias, AgentAliasActivation, AgentAliasArchiveFailure, AgentAliasArchived, AgentAliasList, AgentAliasTransport, AgentDefinition, AgentDefinitionConfig, AgentDeploymentList, AgentDeploymentPromotion, AgentDeploymentReceipt, AgentPromotionManifest, AgentPromotionTransport, AgentPromotionValidation, AgentPullResult, AgentStreamEvent, ApiKeyRequest, ApiKeyRequestDelivery, ApiKeyRequestEnvironment, ApiKeyRequestHandoff, ApiKeyRequestListParams, ApiKeyRequestRequester, ApiKeyRequestStatus, ApplyGeneratedProposalOptions, ApplyGeneratedProposalResult, ArchiveAgentAliasEverywhereResult, ArchiveAgentAliasInput, AttachRuntimeToolsOptions, BatchClient, BatchListParams, BatchOptions, BatchRequest, BatchResult, BatchScheduleConfig, BatchStatus, BindSkillInput, BuiltInGraderId, CaseExpected, CheckGrader, ClaimApiKeyRequestInput, ClaimApiKeyRequestResponse, ClientConversation, ClientToken, ClientTokenConfig, ClientTokenDefinition, ClientTokenEnvironment, ClientTokenVersionPin, ClientWidgetTheme, ConditionalGetResult, ConditionalStepConfig, ContextErrorHandling, ContextFallback, CreateApiKeyRequestInput, CreateApiKeyRequestResponse, CreateClientTokenRequest, CreateClientTokenResponse, CreateEvalSuiteInput, CreatePromptData, DecomposeCriteriaResult, DefineAgentInput, DefineEvalCaseInput, DefineEvalInput, DefineFlowInput, DefineProductInput, DefineSkillInput, DefineSurfaceInput, DefineToolInput, DetachedReattach, DetachedReconnectOptions, DispatchClient, DispatchEvent, DispatchOptions, EnsureAgentConverged, EnsureAgentOptions, EnsureAgentPlan, EnsureAgentResult, EnsureClientTokenConverged, EnsureClientTokenOptions, EnsureClientTokenPlan, EnsureClientTokenResult, EnsureEvalResult, EnsureFlowConverged, EnsureFlowOptions, EnsureFlowPlan, EnsureFlowResult, EnsureFpoOptions, EnsureFpoResult, EnsureProductConverged, EnsureProductOptions, EnsureProductPlan, EnsureProductResult, EnsureSkillConverged, EnsureSkillOptions, EnsureSkillPlan, EnsureSkillResult, EnsureSurfaceConverged, EnsureSurfaceOptions, EnsureSurfacePlan, EnsureSurfaceResult, EnsureToolConverged, EnsureToolOptions, EnsureToolPlan, EnsureToolResult, ErrorHandlingMode, EvalAgentSelector, EvalAgentTargetResolution, EvalCaseDefinition, EvalCaseInput, EvalCaseProposal, EvalCaseProposalAccepted, EvalCaseProposalListResult, EvalCasesGenerated, EvalClient, EvalDefinition, EvalListParams, EvalMessage, EvalOptions, EvalProposalSource, EvalProposalStatus, EvalProposedCase, EvalPullResult, EvalRecord, EvalRequest, EvalResult, EvalRunCaseScores, EvalRunConfig, EvalRunEvidence, EvalRunScores, EvalStatus, EvalSuiteCase, EvalSuiteCaseInput, EvalSuiteCoverage, EvalSuiteDetail, EvalSuiteLatestRun, EvalSuiteListResult, EvalSuiteRunQueued, EvalSuiteRunResult, EvalSuiteSummary, EvalTarget, ExecutionStreamEvent, FallbackFailEvent, FallbackStartEvent, FallbackSuccessEvent, FallbackTrigger, FallbackTriggerType, FallbacksExhaustedEvent, FallbacksInitiatedEvent, FetchUrlStepConfig, FieldFormat, FlowCompleteEvent, FlowConfig, FlowDefinition, FlowDefinitionStep, FlowErrorEvent, FlowFallback, FlowInlineEvalInput, FlowPausedEvent, FlowPullResult, FlowStartEvent, FlowStreamEvent, FlowSummary, FlowValidationClient, FlowValidationIssue, FlowValidationResult, FpoEntityOutcome, FpoInput, GenerateEmbeddingStepConfig, GenerateEvalCasesInput, GeneratedRuntimeToolGateDecision, GeneratedRuntimeToolGateOptions, GetApiKeyRequestResponse, GetRecordStepConfig, Gradeable, GraderConfig, GraderOutcome, GraderSeverity, HumanVerdict, ListAgentAliasesOptions, ListAgentDeploymentsOptions, ListConversationsResponse, ListRecordsStepConfig, LoopStepConfig, Message, MessageFallback, ModelFallback, ModelOverride, OrganizationAgentAlias, OrganizationAgentAliasList, PersistedGraderOutcome, PrepareAgentPromotionInput, ProductDefinition, ProductPullResult, PromoteAgentInput, PromoteAgentResult, PromptErrorHandling, PromptFallback, PromptListParams, PromptStepConfig, PullFpoResult, RecordConfig, RecordFilter, RecordFilterCondition, RecordFilterGroup, RecordFilterOperator, RetrieveRecordStepConfig, RetryFallback, RollbackAgentAliasInput, RunEvalCaseResult, RunEvalInput, RunEvalResult, RunListParams, RunListResponse, RunListRow, AgentSkillBinding as RuntypeAgentSkillBinding, ConditionalStepConfig$1 as RuntypeConditionalStepConfig, RuntypeConfig, FetchUrlStepConfig$1 as RuntypeFetchUrlStepConfig, FlowConfig$1 as RuntypeFlowConfig, GenerateEmbeddingStepConfig$1 as RuntypeGenerateEmbeddingStepConfig, GetRecordStepConfig$1 as RuntypeGetRecordStepConfig, ListRecordsStepConfig$1 as RuntypeListRecordsStepConfig, LoopStepConfig$1 as RuntypeLoopStepConfig, Message$1 as RuntypeMessage, ModelOverride$1 as RuntypeModelOverride, Prompt$1 as RuntypePrompt, PromptStepConfig$1 as RuntypePromptStepConfig, RecordConfig$1 as RuntypeRecordConfig, RetrieveRecordStepConfig$1 as RuntypeRetrieveRecordStepConfig, SearchStepConfig as RuntypeSearchStepConfig, SendEmailStepConfig as RuntypeSendEmailStepConfig, SendEventStepConfig as RuntypeSendEventStepConfig, SendStreamStepConfig as RuntypeSendStreamStepConfig, SetVariableStepConfig as RuntypeSetVariableStepConfig, Skill as RuntypeSkill, SkillBindingWithAgent as RuntypeSkillBindingWithAgent, SkillCapabilities as RuntypeSkillCapabilities, SkillFrontmatter as RuntypeSkillFrontmatter, SkillManifest as RuntypeSkillManifest, SkillProposal as RuntypeSkillProposal, SkillRuntypeExtensions as RuntypeSkillRuntypeExtensions, SkillVersion as RuntypeSkillVersion, TransformDataStepConfig as RuntypeTransformDataStepConfig, UpsertFlowConfig as RuntypeUpsertFlowConfig, UpsertRecordStepConfig as RuntypeUpsertRecordStepConfig, VectorSearchStepConfig as RuntypeVectorSearchStepConfig, WaitUntilStepConfig as RuntypeWaitUntilStepConfig, SearchStepConfig$1 as SearchStepConfig, SendEmailStepConfig$1 as SendEmailStepConfig, SendEventStepConfig$1 as SendEventStepConfig, SendStreamStepConfig$1 as SendStreamStepConfig, SetVariableStepConfig$1 as SetVariableStepConfig, SkillDefinition, SkillListPage, SkillListPagination, SkillListParams, SkillManifestInput, SkillMarkdownInput, SkillOrigin, SkillProposalStatus, SkillPullResult, SkillStatus, SkillTrustLevel, SkillVersionStatus, SkillWithVersion, SkillWriteInput, StepCompleteEvent, StepDeltaEvent, StepFallback, StepFieldMeta, StepStartEvent, StepWaitingLocalEvent, StreamCallbacks, StreamConsumeOptions, StreamEvent, StreamEventOf, SurfaceDefinition, SurfaceDefinitionStatus, SurfaceDefinitionType, SurfacePullResult, ToolDefinition, ToolDefinitionType, ToolPullResult, TransformDataStepConfig$1 as TransformDataStepConfig, UpdateClientTokenRequest, UpdateEvalCaseInput, UpdateEvalSuiteInput, UpdatePromptData, UpsertFlowConfig$1 as UpsertFlowConfig, UpsertRecordStepConfig$1 as UpsertRecordStepConfig, ValidateAgentPromotionInput, VectorSearchStepConfig$1 as VectorSearchStepConfig, WaitUntilStepConfig$1 as WaitUntilStepConfig, WorkflowCompileDeps, WorkflowCompletionCriteriaConfig, WorkflowConfig, WorkflowConfigFactory, WorkflowHookEntry, WorkflowHookKind, WorkflowHookRef, WorkflowHookSignatures, WorkflowMilestoneConfig, WorkflowPolicyConfig, WorkflowRecoveryConfig, WorkflowSlot };
68971
+ export type { AIGrader, ActivateAgentAliasInput, ActivateAgentPromotionInput, AgentAlias, AgentAliasActivation, AgentAliasArchiveFailure, AgentAliasArchived, AgentAliasList, AgentAliasTransport, AgentCapabilityChange, AgentCapabilityDeclaration, AgentDefinition, AgentDefinitionConfig, AgentDeploymentList, AgentDeploymentPromotion, AgentDeploymentReceipt, AgentPromotionManifest, AgentPromotionTransport, AgentPromotionValidation, AgentPullResult, AgentSkillBinding, AgentSkillBindingChange, AgentStreamEvent, ApiKeyRequest, ApiKeyRequestDelivery, ApiKeyRequestEnvironment, ApiKeyRequestHandoff, ApiKeyRequestListParams, ApiKeyRequestRequester, ApiKeyRequestStatus, ApplyGeneratedProposalOptions, ApplyGeneratedProposalResult, ArchiveAgentAliasEverywhereResult, ArchiveAgentAliasInput, AttachRuntimeToolsOptions, BatchClient, BatchListParams, BatchOptions, BatchRequest, BatchResult, BatchScheduleConfig, BatchStatus, BindSkillInput, BuiltInGraderId, CaseExpected, CheckGrader, ClaimApiKeyRequestInput, ClaimApiKeyRequestResponse, ClientConversation, ClientToken, ClientTokenConfig, ClientTokenDefinition, ClientTokenEnvironment, ClientTokenVersionPin, ClientWidgetTheme, CollectionPullResult, CollectionSchemaChange, ConditionalGetResult, ConditionalStepConfig, ContextErrorHandling, ContextFallback, CreateApiKeyRequestInput, CreateApiKeyRequestResponse, CreateClientTokenRequest, CreateClientTokenResponse, CreateEvalSuiteInput, CreatePromptData, DecomposeCriteriaResult, DefineAgentInput, DefineEvalCaseInput, DefineEvalInput, DefineFlowInput, DefineProductInput, DefineScheduleInput, DefineSkillInput, DefineSurfaceInput, DefineToolInput, DetachedReattach, DetachedReconnectOptions, DispatchClient, DispatchEvent, DispatchOptions, EnsureAgentConverged, EnsureAgentOptions, EnsureAgentPlan, EnsureAgentResult, EnsureClientTokenConverged, EnsureClientTokenOptions, EnsureClientTokenPlan, EnsureClientTokenResult, EnsureCollectionConverged, EnsureCollectionOptions, EnsureCollectionPlan, EnsureCollectionResult, EnsureEvalApplyOptions, EnsureEvalOptions, EnsureEvalPlan, EnsureEvalResult, EnsureFlowConverged, EnsureFlowOptions, EnsureFlowPlan, EnsureFlowResult, EnsureFpoOptions, EnsureFpoResult, EnsureProductConverged, EnsureProductOptions, EnsureProductPlan, EnsureProductResult, EnsureQuestionSetConverged, EnsureQuestionSetOptions, EnsureQuestionSetPlan, EnsureQuestionSetResult, EnsureScheduleConverged, EnsureScheduleOptions, EnsureSchedulePlan, EnsureScheduleResult, EnsureSkillConverged, EnsureSkillOptions, EnsureSkillPlan, EnsureSkillResult, EnsureSurfaceConverged, EnsureSurfaceOptions, EnsureSurfacePlan, EnsureSurfaceResult, EnsureToolConverged, EnsureToolOptions, EnsureToolPlan, EnsureToolResult, ErrorHandlingMode, EvalAgentSelector, EvalAgentTargetResolution, EvalCaseDefinition, EvalCaseInput, EvalCaseProposal, EvalCaseProposalAccepted, EvalCaseProposalListResult, EvalCasesGenerated, EvalClient, EvalDefinition, EvalListParams, EvalMessage, EvalOptions, EvalProposalSource, EvalProposalStatus, EvalProposedCase, EvalPullResult, EvalRecord, EvalRequest, EvalResult, EvalRunCaseScores, EvalRunConfig, EvalRunEvidence, EvalRunScores, EvalStatus, EvalSuiteCase, EvalSuiteCaseInput, EvalSuiteCoverage, EvalSuiteDetail, EvalSuiteLatestRun, EvalSuiteListResult, EvalSuiteRunQueued, EvalSuiteRunResult, EvalSuiteSummary, EvalTarget, ExecutionStreamEvent, FallbackFailEvent, FallbackStartEvent, FallbackSuccessEvent, FallbackTrigger, FallbackTriggerType, FallbacksExhaustedEvent, FallbacksInitiatedEvent, FetchUrlStepConfig, FieldFormat, FlowCompleteEvent, FlowConfig, FlowDefinition, FlowDefinitionStep, FlowErrorEvent, FlowFallback, FlowInlineEvalInput, FlowPausedEvent, FlowPullResult, FlowStartEvent, FlowStreamEvent, FlowSummary, FlowValidationClient, FlowValidationIssue, FlowValidationResult, FpoEntityOutcome, FpoInput, GenerateEmbeddingStepConfig, GenerateEvalCasesInput, GeneratedRuntimeToolGateDecision, GeneratedRuntimeToolGateOptions, GetApiKeyRequestResponse, GetRecordStepConfig, Gradeable, GraderConfig, GraderOutcome, GraderSeverity, HumanVerdict, ListAgentAliasesOptions, ListAgentDeploymentsOptions, ListConversationsResponse, ListRecordsStepConfig, LoopStepConfig, Message, MessageFallback, ModelFallback, ModelOverride, OrganizationAgentAlias, OrganizationAgentAliasList, PersistedGraderOutcome, PrepareAgentPromotionInput, ProductDefinition, ProductPullResult, PromoteAgentInput, PromoteAgentResult, PromptErrorHandling, PromptFallback, PromptListParams, PromptStepConfig, PullFpoResult, QuestionSetDefinition, QuestionSetPullResult, RecordCollectionDefinition, RecordCollectionValidationMode, RecordConfig, RecordFilter, RecordFilterCondition, RecordFilterGroup, RecordFilterOperator, RetrieveRecordStepConfig, RetryFallback, RollbackAgentAliasInput, RunEvalCaseResult, RunEvalInput, RunEvalResult, RunListParams, RunListResponse, RunListRow, AgentSkillBinding$1 as RuntypeAgentSkillBinding, ConditionalStepConfig$1 as RuntypeConditionalStepConfig, RuntypeConfig, FetchUrlStepConfig$1 as RuntypeFetchUrlStepConfig, FlowConfig$1 as RuntypeFlowConfig, GenerateEmbeddingStepConfig$1 as RuntypeGenerateEmbeddingStepConfig, GetRecordStepConfig$1 as RuntypeGetRecordStepConfig, ListRecordsStepConfig$1 as RuntypeListRecordsStepConfig, LoopStepConfig$1 as RuntypeLoopStepConfig, Message$1 as RuntypeMessage, ModelOverride$1 as RuntypeModelOverride, Prompt$1 as RuntypePrompt, PromptStepConfig$1 as RuntypePromptStepConfig, RecordConfig$1 as RuntypeRecordConfig, RetrieveRecordStepConfig$1 as RuntypeRetrieveRecordStepConfig, SearchStepConfig as RuntypeSearchStepConfig, SendEmailStepConfig as RuntypeSendEmailStepConfig, SendEventStepConfig as RuntypeSendEventStepConfig, SendStreamStepConfig as RuntypeSendStreamStepConfig, SetVariableStepConfig as RuntypeSetVariableStepConfig, Skill as RuntypeSkill, SkillBindingWithAgent as RuntypeSkillBindingWithAgent, SkillCapabilities as RuntypeSkillCapabilities, SkillFrontmatter as RuntypeSkillFrontmatter, SkillManifest as RuntypeSkillManifest, SkillProposal as RuntypeSkillProposal, SkillRuntypeExtensions as RuntypeSkillRuntypeExtensions, SkillVersion as RuntypeSkillVersion, TransformDataStepConfig as RuntypeTransformDataStepConfig, UpsertFlowConfig as RuntypeUpsertFlowConfig, UpsertRecordStepConfig as RuntypeUpsertRecordStepConfig, VectorSearchStepConfig as RuntypeVectorSearchStepConfig, WaitUntilStepConfig as RuntypeWaitUntilStepConfig, ScheduleDefinition, ScheduleDefinitionMessage, ScheduleEnsureTransport, SchedulePullResult, SearchStepConfig$1 as SearchStepConfig, SendEmailStepConfig$1 as SendEmailStepConfig, SendEventStepConfig$1 as SendEventStepConfig, SendStreamStepConfig$1 as SendStreamStepConfig, SetVariableStepConfig$1 as SetVariableStepConfig, SkillDefinition, SkillListPage, SkillListPagination, SkillListParams, SkillManifestInput, SkillMarkdownInput, SkillOrigin, SkillProposalStatus, SkillPullResult, SkillStatus, SkillTrustLevel, SkillVersionStatus, SkillWithVersion, SkillWriteInput, StepCompleteEvent, StepDeltaEvent, StepFallback, StepFieldMeta, StepStartEvent, StepWaitingLocalEvent, StreamCallbacks, StreamConsumeOptions, StreamEvent, StreamEventOf, SurfaceDefinition, SurfaceDefinitionStatus, SurfaceDefinitionType, SurfacePullResult, ToolDefinition, ToolDefinitionType, ToolPullResult, TransformDataStepConfig$1 as TransformDataStepConfig, UpdateClientTokenRequest, UpdateEvalCaseInput, UpdateEvalSuiteInput, UpdatePromptData, UpsertFlowConfig$1 as UpsertFlowConfig, UpsertRecordStepConfig$1 as UpsertRecordStepConfig, ValidateAgentPromotionInput, VectorSearchStepConfig$1 as VectorSearchStepConfig, WaitUntilStepConfig$1 as WaitUntilStepConfig, WorkflowCompileDeps, WorkflowCompletionCriteriaConfig, WorkflowConfig, WorkflowConfigFactory, WorkflowHookEntry, WorkflowHookKind, WorkflowHookRef, WorkflowHookSignatures, WorkflowMilestoneConfig, WorkflowPolicyConfig, WorkflowRecoveryConfig, WorkflowSlot };
67447
68972
  export {}