@elevasis/sdk 1.48.0 → 1.49.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.
Files changed (46) hide show
  1. package/dist/cli.cjs +742 -231
  2. package/dist/index.d.ts +685 -47
  3. package/dist/index.js +274 -40
  4. package/dist/node/index.d.ts +108 -24
  5. package/dist/test-utils/index.d.ts +647 -34
  6. package/dist/test-utils/index.js +240 -38
  7. package/dist/worker/index.d.ts +663 -39
  8. package/dist/worker/index.js +115 -6
  9. package/package.json +4 -4
  10. package/reference/_navigation.md +4 -4
  11. package/reference/_reference-manifest.json +1 -1
  12. package/reference/core/index.mdx +6 -4
  13. package/reference/index.mdx +11 -5
  14. package/reference/packages/core/src/README.md +46 -44
  15. package/reference/packages/core/src/content/README.md +13 -12
  16. package/reference/rules/ui.md +1 -1
  17. package/reference/rules/vibe-intents.md +2 -2
  18. package/reference/rules/vibe.md +30 -10
  19. package/reference/scaffold/recipes/extend-content.md +82 -3
  20. package/reference/sdk/cli-management.mdx +184 -41
  21. package/reference/sdk/cli.mdx +103 -64
  22. package/reference/sdk/define-builders.mdx +1 -1
  23. package/reference/sdk/deployment/command-center.mdx +2 -2
  24. package/reference/sdk/deployment/index.mdx +1 -1
  25. package/reference/sdk/exports.mdx +4 -4
  26. package/reference/sdk/framework/agent.mdx +4 -3
  27. package/reference/sdk/framework/index.mdx +1 -1
  28. package/reference/sdk/framework/project-structure.mdx +34 -23
  29. package/reference/sdk/framework/tutorial-system.mdx +1 -1
  30. package/reference/sdk/getting-started.mdx +25 -52
  31. package/reference/sdk/index.mdx +3 -3
  32. package/reference/sdk/platform-tools/adapters-integration.mdx +1 -1
  33. package/reference/sdk/platform-tools/adapters-platform.mdx +1 -1
  34. package/reference/sdk/platform-tools/type-safety.mdx +1 -1
  35. package/reference/sdk/resources/patterns.mdx +10 -11
  36. package/reference/sdk/resources/types.mdx +15 -9
  37. package/reference/sdk/templates/data-enrichment.mdx +1 -1
  38. package/reference/sdk/templates/email-sender.mdx +1 -1
  39. package/reference/sdk/templates/index.mdx +47 -47
  40. package/reference/sdk/templates/lead-scorer.mdx +1 -1
  41. package/reference/sdk/templates/pdf-generator.mdx +42 -24
  42. package/reference/sdk/templates/recurring-job.mdx +20 -15
  43. package/reference/sdk/templates/text-classifier.mdx +1 -1
  44. package/reference/sdk/templates/web-scraper.mdx +9 -5
  45. package/reference/ui/exports.mdx +1 -1
  46. package/reference/ui/index.mdx +2 -2
@@ -812,13 +812,52 @@ interface JsonSchema {
812
812
  * Universal interfaces for LLM interaction across all resource types
813
813
  */
814
814
 
815
+ /**
816
+ * One piece of a multipart `LLMMessage.content`. Modeled close to OpenAI's shape (a single `url`
817
+ * field covers both a hosted URL and a `data:` base64 URL) rather than Anthropic's three-way
818
+ * `source` split, because OpenAI's shape is the one every provider's translation layer can derive
819
+ * the other from -- the Anthropic adapter is the side that branches on the `data:` prefix to
820
+ * recover the split its wire format wants (see `adapters/server/anthropic.ts`).
821
+ */
822
+ type LLMContentPart = {
823
+ type: 'text';
824
+ text: string;
825
+ } | {
826
+ type: 'image';
827
+ /**
828
+ * A `data:<mediaType>;base64,<data>` URL, or an `https://...` URL the provider fetches
829
+ * itself. Base64 is the recommended default: a hosted `url` means the PROVIDER fetches it
830
+ * at call time, so a signed org-storage URL must still be public and unexpired when the
831
+ * provider reaches it, an extra failure mode a caller must manage. Base64 removes that
832
+ * dependency at the cost of payload size -- Anthropic caps a single image at 10 MB.
833
+ */
834
+ url: string;
835
+ /** Overrides the media type parsed off a `data:` URL prefix. Required when `url` is a
836
+ * hosted (non-`data:`) URL and the provider needs it -- Anthropic's `url` source infers
837
+ * the type itself, but callers on a stricter provider should not assume that. */
838
+ mediaType?: string;
839
+ /** OpenAI-only hint for how much detail to preserve when downsampling. Ignored by
840
+ * providers (Anthropic, OpenRouter-as-Anthropic) that do not read it. */
841
+ detail?: 'auto' | 'low' | 'high';
842
+ };
815
843
  /**
816
844
  * Standard chat message format
817
845
  * Compatible with OpenAI, Anthropic, and other providers
818
846
  */
819
847
  interface LLMMessage {
820
848
  role: 'system' | 'user' | 'assistant';
821
- content: string;
849
+ /**
850
+ * A plain string for the common unstructured case, or a parts array to attach an image
851
+ * alongside (or instead of) text -- see `LLMContentPart`. This is a WIDENING, not a
852
+ * replacement: every existing caller passing a bare string keeps compiling and behaving
853
+ * identically.
854
+ *
855
+ * Not every model/adapter can accept an `image` part -- `MockAdapter` throws
856
+ * `LLMUnsupportedContentError` rather than silently ignoring it, and a caller sending an image
857
+ * to a text-only integration should expect the same rather than a plausible-looking
858
+ * text-degraded response. See `llm/errors.ts`.
859
+ */
860
+ content: string | LLMContentPart[];
822
861
  /**
823
862
  * Marks this message as the end of a byte-stable prefix worth an Anthropic cache breakpoint,
824
863
  * beyond the one the system prompt already gets. Anthropic's rule is "everything up to and
@@ -1017,8 +1056,13 @@ interface LLMAdapter {
1017
1056
 
1018
1057
  /**
1019
1058
  * Supported Open AI models (direct SDK access)
1059
+ *
1060
+ * The GPT-5.6 tiers are three separate ids rather than the bare `gpt-5.6` alias. Upstream that
1061
+ * alias routes to Sol, so registering it would put two keys with identical pricing in `MODEL_INFO`
1062
+ * and hide which tier actually ran in `ai_calls`. Leaving it out means a caller who writes
1063
+ * `'gpt-5.6'` is rejected by the dispatcher rather than silently billed at Sol rates.
1020
1064
  */
1021
- type OpenAIModel = 'gpt-5' | 'gpt-5.4-mini' | 'gpt-5.4-nano';
1065
+ type OpenAIModel = 'gpt-5' | 'gpt-5.4-mini' | 'gpt-5.4-nano' | 'gpt-5.6-sol' | 'gpt-5.6-terra' | 'gpt-5.6-luna';
1022
1066
  /**
1023
1067
  * Supported OpenRouter models (explicit union for type safety)
1024
1068
  */
@@ -1034,15 +1078,36 @@ type LLMModel = OpenAIModel | OpenRouterModel | AnthropicModel | 'mock';
1034
1078
  */
1035
1079
  declare const GPT5OptionsSchema: z.ZodObject<{
1036
1080
  reasoning_effort: z.ZodOptional<z.ZodEnum<{
1081
+ low: "low";
1082
+ high: "high";
1037
1083
  minimal: "minimal";
1084
+ medium: "medium";
1085
+ }>>;
1086
+ verbosity: z.ZodOptional<z.ZodEnum<{
1038
1087
  low: "low";
1088
+ high: "high";
1039
1089
  medium: "medium";
1090
+ }>>;
1091
+ }, z.core.$strip>;
1092
+ /**
1093
+ * GPT-5.6 model options schema
1094
+ *
1095
+ * NOT the GPT-5 enum. 5.6 removed `minimal` and added `none`, `xhigh`, and `max`, so reusing
1096
+ * `GPT5OptionsSchema` would accept one value 5.6 rejects and reject three it accepts.
1097
+ */
1098
+ declare const GPT56OptionsSchema: z.ZodObject<{
1099
+ reasoning_effort: z.ZodOptional<z.ZodEnum<{
1100
+ none: "none";
1101
+ low: "low";
1040
1102
  high: "high";
1103
+ medium: "medium";
1104
+ xhigh: "xhigh";
1105
+ max: "max";
1041
1106
  }>>;
1042
1107
  verbosity: z.ZodOptional<z.ZodEnum<{
1043
1108
  low: "low";
1044
- medium: "medium";
1045
1109
  high: "high";
1110
+ medium: "medium";
1046
1111
  }>>;
1047
1112
  }, z.core.$strip>;
1048
1113
  /**
@@ -1064,10 +1129,11 @@ declare const AnthropicOptionsSchema: z.ZodObject<{}, z.core.$strict>;
1064
1129
  * Infer TypeScript types from schemas
1065
1130
  */
1066
1131
  type GPT5Options = z.infer<typeof GPT5OptionsSchema>;
1132
+ type GPT56Options = z.infer<typeof GPT56OptionsSchema>;
1067
1133
  type MockOptions = Record<string, never>;
1068
1134
  type OpenRouterOptions = z.infer<typeof OpenRouterOptionsSchema>;
1069
1135
  type AnthropicOptions = z.infer<typeof AnthropicOptionsSchema>;
1070
- type ModelSpecificOptions = GPT5Options | MockOptions | OpenRouterOptions | AnthropicOptions;
1136
+ type ModelSpecificOptions = GPT5Options | GPT56Options | MockOptions | OpenRouterOptions | AnthropicOptions;
1071
1137
  /**
1072
1138
  * Model configuration for LLM execution
1073
1139
  * Belongs in resource definition (AgentDefinition, WorkflowDefinition, etc.)
@@ -3044,6 +3110,63 @@ type Database = {
3044
3110
  }
3045
3111
  ];
3046
3112
  };
3113
+ content_item_source_assets: {
3114
+ Row: {
3115
+ alt_text: string | null;
3116
+ content_item_id: string;
3117
+ created_at: string;
3118
+ crop: Json | null;
3119
+ derivative_crop: Json | null;
3120
+ derivative_path: string | null;
3121
+ derivative_rendered_at: string | null;
3122
+ id: string;
3123
+ organization_id: string;
3124
+ position: number;
3125
+ source_asset_id: string;
3126
+ };
3127
+ Insert: {
3128
+ alt_text?: string | null;
3129
+ content_item_id: string;
3130
+ created_at?: string;
3131
+ crop?: Json | null;
3132
+ derivative_crop?: Json | null;
3133
+ derivative_path?: string | null;
3134
+ derivative_rendered_at?: string | null;
3135
+ id?: string;
3136
+ organization_id: string;
3137
+ position: number;
3138
+ source_asset_id: string;
3139
+ };
3140
+ Update: {
3141
+ alt_text?: string | null;
3142
+ content_item_id?: string;
3143
+ created_at?: string;
3144
+ crop?: Json | null;
3145
+ derivative_crop?: Json | null;
3146
+ derivative_path?: string | null;
3147
+ derivative_rendered_at?: string | null;
3148
+ id?: string;
3149
+ organization_id?: string;
3150
+ position?: number;
3151
+ source_asset_id?: string;
3152
+ };
3153
+ Relationships: [
3154
+ {
3155
+ foreignKeyName: "content_item_source_assets_asset_fkey";
3156
+ columns: ["source_asset_id", "organization_id"];
3157
+ isOneToOne: false;
3158
+ referencedRelation: "content_source_assets";
3159
+ referencedColumns: ["id", "organization_id"];
3160
+ },
3161
+ {
3162
+ foreignKeyName: "content_item_source_assets_item_fkey";
3163
+ columns: ["content_item_id", "organization_id"];
3164
+ isOneToOne: false;
3165
+ referencedRelation: "content_items";
3166
+ referencedColumns: ["id", "organization_id"];
3167
+ }
3168
+ ];
3169
+ };
3047
3170
  content_items: {
3048
3171
  Row: {
3049
3172
  body: string | null;
@@ -4799,6 +4922,25 @@ type Database = {
4799
4922
  };
4800
4923
  Returns: Json;
4801
4924
  };
4925
+ activate_deployment_atomic: {
4926
+ Args: {
4927
+ p_deployment_id: string;
4928
+ p_organization_id: string;
4929
+ };
4930
+ Returns: {
4931
+ created_at: string;
4932
+ deployment_version: string | null;
4933
+ error_message: string | null;
4934
+ id: string;
4935
+ organization_id: string;
4936
+ pid: number | null;
4937
+ port: number | null;
4938
+ sdk_version: string;
4939
+ status: string;
4940
+ tarball_path: string | null;
4941
+ updated_at: string;
4942
+ };
4943
+ };
4802
4944
  append_deal_activity: {
4803
4945
  Args: {
4804
4946
  p_activity: Json;
@@ -6572,7 +6714,9 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6572
6714
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6573
6715
  properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6574
6716
  storage: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6575
- }, z.core.$loose>>>>;
6717
+ rowSchema: z.ZodOptional<z.ZodString>;
6718
+ stateCatalogId: z.ZodOptional<z.ZodString>;
6719
+ }, z.core.$strict>>>>;
6576
6720
  linkTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6577
6721
  id: z.ZodString;
6578
6722
  label: z.ZodOptional<z.ZodString>;
@@ -6583,7 +6727,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6583
6727
  to: z.ZodString;
6584
6728
  cardinality: z.ZodOptional<z.ZodString>;
6585
6729
  via: z.ZodOptional<z.ZodString>;
6586
- }, z.core.$loose>>>>;
6730
+ }, z.core.$strict>>>>;
6587
6731
  actionTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6588
6732
  id: z.ZodString;
6589
6733
  label: z.ZodOptional<z.ZodString>;
@@ -6593,7 +6737,11 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6593
6737
  actsOn: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
6594
6738
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6595
6739
  effects: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
6596
- }, z.core.$loose>>>>;
6740
+ resourceId: z.ZodOptional<z.ZodString>;
6741
+ invocations: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
6742
+ lifecycle: z.ZodOptional<z.ZodString>;
6743
+ legacyActionId: z.ZodOptional<z.ZodString>;
6744
+ }, z.core.$strict>>>>;
6597
6745
  catalogTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6598
6746
  id: z.ZodString;
6599
6747
  label: z.ZodOptional<z.ZodString>;
@@ -6603,7 +6751,10 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6603
6751
  kind: z.ZodOptional<z.ZodString>;
6604
6752
  appliesTo: z.ZodOptional<z.ZodString>;
6605
6753
  entries: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6606
- }, z.core.$loose>>>>;
6754
+ legacyCatalogKey: z.ZodOptional<z.ZodString>;
6755
+ legacyPipelineKey: z.ZodOptional<z.ZodString>;
6756
+ legacyEntityKey: z.ZodOptional<z.ZodString>;
6757
+ }, z.core.$strict>>>>;
6607
6758
  eventTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6608
6759
  id: z.ZodString;
6609
6760
  label: z.ZodOptional<z.ZodString>;
@@ -6611,7 +6762,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6611
6762
  ownerSystemId: z.ZodOptional<z.ZodString>;
6612
6763
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6613
6764
  payload: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6614
- }, z.core.$loose>>>>;
6765
+ }, z.core.$strict>>>>;
6615
6766
  interfaceTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6616
6767
  id: z.ZodString;
6617
6768
  label: z.ZodOptional<z.ZodString>;
@@ -6619,7 +6770,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6619
6770
  ownerSystemId: z.ZodOptional<z.ZodString>;
6620
6771
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6621
6772
  properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6622
- }, z.core.$loose>>>>;
6773
+ }, z.core.$strict>>>>;
6623
6774
  valueTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6624
6775
  id: z.ZodString;
6625
6776
  label: z.ZodOptional<z.ZodString>;
@@ -6627,7 +6778,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6627
6778
  ownerSystemId: z.ZodOptional<z.ZodString>;
6628
6779
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6629
6780
  primitive: z.ZodOptional<z.ZodString>;
6630
- }, z.core.$loose>>>>;
6781
+ }, z.core.$strict>>>>;
6631
6782
  sharedProperties: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6632
6783
  id: z.ZodString;
6633
6784
  label: z.ZodOptional<z.ZodString>;
@@ -6637,7 +6788,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6637
6788
  valueType: z.ZodOptional<z.ZodString>;
6638
6789
  searchable: z.ZodOptional<z.ZodBoolean>;
6639
6790
  pii: z.ZodOptional<z.ZodBoolean>;
6640
- }, z.core.$loose>>>>;
6791
+ }, z.core.$strict>>>>;
6641
6792
  groups: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6642
6793
  id: z.ZodString;
6643
6794
  label: z.ZodOptional<z.ZodString>;
@@ -6645,7 +6796,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6645
6796
  ownerSystemId: z.ZodOptional<z.ZodString>;
6646
6797
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6647
6798
  members: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
6648
- }, z.core.$loose>>>>;
6799
+ }, z.core.$strict>>>>;
6649
6800
  endpoints: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
6650
6801
  id: z.ZodString;
6651
6802
  label: z.ZodOptional<z.ZodString>;
@@ -6653,7 +6804,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
6653
6804
  ownerSystemId: z.ZodOptional<z.ZodString>;
6654
6805
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
6655
6806
  route: z.ZodOptional<z.ZodString>;
6656
- }, z.core.$loose>>>>;
6807
+ }, z.core.$strict>>>>;
6657
6808
  }, z.core.$strict>>;
6658
6809
  type OntologyScope = z.infer<typeof OntologyScopeSchema>;
6659
6810
 
@@ -7219,7 +7370,9 @@ declare const OrganizationModelSchema: z.ZodObject<{
7219
7370
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7220
7371
  properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7221
7372
  storage: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7222
- }, z.core.$loose>>>>;
7373
+ rowSchema: z.ZodOptional<z.ZodString>;
7374
+ stateCatalogId: z.ZodOptional<z.ZodString>;
7375
+ }, z.core.$strict>>>>;
7223
7376
  linkTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7224
7377
  id: z.ZodString;
7225
7378
  label: z.ZodOptional<z.ZodString>;
@@ -7230,7 +7383,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7230
7383
  to: z.ZodString;
7231
7384
  cardinality: z.ZodOptional<z.ZodString>;
7232
7385
  via: z.ZodOptional<z.ZodString>;
7233
- }, z.core.$loose>>>>;
7386
+ }, z.core.$strict>>>>;
7234
7387
  actionTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7235
7388
  id: z.ZodString;
7236
7389
  label: z.ZodOptional<z.ZodString>;
@@ -7240,7 +7393,11 @@ declare const OrganizationModelSchema: z.ZodObject<{
7240
7393
  actsOn: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
7241
7394
  input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7242
7395
  effects: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
7243
- }, z.core.$loose>>>>;
7396
+ resourceId: z.ZodOptional<z.ZodString>;
7397
+ invocations: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
7398
+ lifecycle: z.ZodOptional<z.ZodString>;
7399
+ legacyActionId: z.ZodOptional<z.ZodString>;
7400
+ }, z.core.$strict>>>>;
7244
7401
  catalogTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7245
7402
  id: z.ZodString;
7246
7403
  label: z.ZodOptional<z.ZodString>;
@@ -7250,7 +7407,10 @@ declare const OrganizationModelSchema: z.ZodObject<{
7250
7407
  kind: z.ZodOptional<z.ZodString>;
7251
7408
  appliesTo: z.ZodOptional<z.ZodString>;
7252
7409
  entries: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7253
- }, z.core.$loose>>>>;
7410
+ legacyCatalogKey: z.ZodOptional<z.ZodString>;
7411
+ legacyPipelineKey: z.ZodOptional<z.ZodString>;
7412
+ legacyEntityKey: z.ZodOptional<z.ZodString>;
7413
+ }, z.core.$strict>>>>;
7254
7414
  eventTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7255
7415
  id: z.ZodString;
7256
7416
  label: z.ZodOptional<z.ZodString>;
@@ -7258,7 +7418,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7258
7418
  ownerSystemId: z.ZodOptional<z.ZodString>;
7259
7419
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7260
7420
  payload: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7261
- }, z.core.$loose>>>>;
7421
+ }, z.core.$strict>>>>;
7262
7422
  interfaceTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7263
7423
  id: z.ZodString;
7264
7424
  label: z.ZodOptional<z.ZodString>;
@@ -7266,7 +7426,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7266
7426
  ownerSystemId: z.ZodOptional<z.ZodString>;
7267
7427
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7268
7428
  properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
7269
- }, z.core.$loose>>>>;
7429
+ }, z.core.$strict>>>>;
7270
7430
  valueTypes: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7271
7431
  id: z.ZodString;
7272
7432
  label: z.ZodOptional<z.ZodString>;
@@ -7274,7 +7434,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7274
7434
  ownerSystemId: z.ZodOptional<z.ZodString>;
7275
7435
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7276
7436
  primitive: z.ZodOptional<z.ZodString>;
7277
- }, z.core.$loose>>>>;
7437
+ }, z.core.$strict>>>>;
7278
7438
  sharedProperties: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7279
7439
  id: z.ZodString;
7280
7440
  label: z.ZodOptional<z.ZodString>;
@@ -7284,7 +7444,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7284
7444
  valueType: z.ZodOptional<z.ZodString>;
7285
7445
  searchable: z.ZodOptional<z.ZodBoolean>;
7286
7446
  pii: z.ZodOptional<z.ZodBoolean>;
7287
- }, z.core.$loose>>>>;
7447
+ }, z.core.$strict>>>>;
7288
7448
  groups: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7289
7449
  id: z.ZodString;
7290
7450
  label: z.ZodOptional<z.ZodString>;
@@ -7292,7 +7452,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7292
7452
  ownerSystemId: z.ZodOptional<z.ZodString>;
7293
7453
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7294
7454
  members: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
7295
- }, z.core.$loose>>>>;
7455
+ }, z.core.$strict>>>>;
7296
7456
  endpoints: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
7297
7457
  id: z.ZodString;
7298
7458
  label: z.ZodOptional<z.ZodString>;
@@ -7300,7 +7460,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
7300
7460
  ownerSystemId: z.ZodOptional<z.ZodString>;
7301
7461
  aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
7302
7462
  route: z.ZodOptional<z.ZodString>;
7303
- }, z.core.$loose>>>>;
7463
+ }, z.core.$strict>>>>;
7304
7464
  }, z.core.$strict>>>;
7305
7465
  resources: z.ZodDefault<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
7306
7466
  id: z.ZodString;
@@ -8336,6 +8496,166 @@ interface CreateFolderResult {
8336
8496
  path_display: string;
8337
8497
  } | null;
8338
8498
  }
8499
+ /**
8500
+ * List folder parameters
8501
+ *
8502
+ * Pass `cursor` (from a previous result) to fetch only what changed since
8503
+ * that cursor -- Dropbox's incremental-sync mechanism, not an optional
8504
+ * convenience.
8505
+ */
8506
+ interface ListFolderParams {
8507
+ path?: string;
8508
+ recursive?: boolean;
8509
+ cursor?: string;
8510
+ }
8511
+ /**
8512
+ * A single file or folder entry returned by listFolder
8513
+ */
8514
+ interface DropboxListFolderEntry {
8515
+ '.tag': 'file' | 'folder' | 'deleted';
8516
+ id: string;
8517
+ name: string;
8518
+ path_lower?: string;
8519
+ path_display?: string;
8520
+ size?: number;
8521
+ content_hash?: string;
8522
+ }
8523
+ /**
8524
+ * List folder result
8525
+ */
8526
+ interface ListFolderResult {
8527
+ entries: DropboxListFolderEntry[];
8528
+ cursor: string;
8529
+ has_more: boolean;
8530
+ }
8531
+ /**
8532
+ * Get metadata parameters
8533
+ */
8534
+ interface GetMetadataParams {
8535
+ id: string;
8536
+ }
8537
+ /**
8538
+ * Photo/video-specific metadata
8539
+ */
8540
+ interface DropboxMediaMetadata {
8541
+ '.tag': 'photo' | 'video';
8542
+ dimensions?: {
8543
+ height: number;
8544
+ width: number;
8545
+ };
8546
+ time_taken?: string;
8547
+ }
8548
+ /**
8549
+ * Wrapper around media metadata, matching Dropbox's tagged-union response shape
8550
+ */
8551
+ interface DropboxMediaInfo {
8552
+ '.tag': 'metadata' | 'absent';
8553
+ metadata?: DropboxMediaMetadata;
8554
+ }
8555
+ /**
8556
+ * Get metadata result
8557
+ */
8558
+ interface GetMetadataResult {
8559
+ id: string;
8560
+ name: string;
8561
+ path_lower?: string;
8562
+ path_display?: string;
8563
+ size?: number;
8564
+ content_hash?: string;
8565
+ media_info?: DropboxMediaInfo;
8566
+ }
8567
+ /**
8568
+ * Get temporary link parameters
8569
+ */
8570
+ interface GetTemporaryLinkParams {
8571
+ id: string;
8572
+ }
8573
+ /**
8574
+ * Get temporary link result (valid four hours, never persist)
8575
+ */
8576
+ interface GetTemporaryLinkResult {
8577
+ link: string;
8578
+ metadata: {
8579
+ id: string;
8580
+ name: string;
8581
+ path_lower?: string;
8582
+ path_display?: string;
8583
+ };
8584
+ }
8585
+ /**
8586
+ * Create shared link parameters
8587
+ */
8588
+ interface CreateSharedLinkParams {
8589
+ id: string;
8590
+ }
8591
+ /**
8592
+ * Create shared link result (url is always the raw, bytes-inline form)
8593
+ */
8594
+ interface CreateSharedLinkResult {
8595
+ url: string;
8596
+ id: string;
8597
+ name: string;
8598
+ }
8599
+ /**
8600
+ * Download parameters
8601
+ */
8602
+ interface DownloadParams {
8603
+ id: string;
8604
+ }
8605
+ /**
8606
+ * Download result (Uint8Array for browser safety)
8607
+ */
8608
+ interface DownloadResult {
8609
+ content: Uint8Array;
8610
+ contentType: string;
8611
+ name: string;
8612
+ }
8613
+ type DropboxThumbnailFormat = 'jpeg' | 'png';
8614
+ type DropboxThumbnailSize = 'w32h32' | 'w64h64' | 'w128h128' | 'w256h256' | 'w480h320' | 'w640h480' | 'w960h640' | 'w1024h768' | 'w2048h1536';
8615
+ /**
8616
+ * Get thumbnail parameters
8617
+ */
8618
+ interface GetThumbnailParams {
8619
+ id: string;
8620
+ format?: DropboxThumbnailFormat;
8621
+ size?: DropboxThumbnailSize;
8622
+ }
8623
+ /**
8624
+ * Get thumbnail result (Uint8Array for browser safety)
8625
+ *
8626
+ * `available: false` is a normal result, not an error -- Dropbox does not
8627
+ * convert every file type (e.g. HEIC) or files over 20MB.
8628
+ */
8629
+ interface GetThumbnailResult {
8630
+ available: boolean;
8631
+ content?: Uint8Array;
8632
+ contentType?: string;
8633
+ }
8634
+ /**
8635
+ * Get thumbnail batch parameters
8636
+ *
8637
+ * Dropbox caps this at 25 ids per request.
8638
+ */
8639
+ interface GetThumbnailBatchParams {
8640
+ ids: string[];
8641
+ format?: DropboxThumbnailFormat;
8642
+ size?: DropboxThumbnailSize;
8643
+ }
8644
+ /**
8645
+ * A single entry in a batch thumbnail result (Uint8Array for browser safety)
8646
+ */
8647
+ interface ThumbnailBatchEntry {
8648
+ id: string;
8649
+ available: boolean;
8650
+ content?: Uint8Array;
8651
+ contentType?: string;
8652
+ }
8653
+ /**
8654
+ * Get thumbnail batch result
8655
+ */
8656
+ interface GetThumbnailBatchResult {
8657
+ entries: ThumbnailBatchEntry[];
8658
+ }
8339
8659
 
8340
8660
  /**
8341
8661
  * Shared Gmail param/result types (browser-safe)
@@ -9837,6 +10157,78 @@ declare const ContentDistributionStatusSchema: z.ZodString;
9837
10157
  * schema validates JSON-object shape and size only, not field membership.
9838
10158
  */
9839
10159
  declare const ContentPayloadEnvelopeSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
10160
+ /** Request-side crop: `.strict()`, the same mass-assignment guard every request schema in this file uses. */
10161
+ declare const ContentAssetCropInputSchema: z.ZodObject<{
10162
+ x: z.ZodNumber;
10163
+ y: z.ZodNumber;
10164
+ width: z.ZodNumber;
10165
+ height: z.ZodNumber;
10166
+ }, z.core.$strict>;
10167
+ declare const ContentItemSourceAssetResponseSchema: z.ZodObject<{
10168
+ id: z.ZodString;
10169
+ organizationId: z.ZodString;
10170
+ contentItemId: z.ZodString;
10171
+ sourceAssetId: z.ZodString;
10172
+ position: z.ZodNumber;
10173
+ crop: z.ZodNullable<z.ZodObject<{
10174
+ x: z.ZodNumber;
10175
+ y: z.ZodNumber;
10176
+ width: z.ZodNumber;
10177
+ height: z.ZodNumber;
10178
+ }, z.core.$strip>>;
10179
+ altText: z.ZodNullable<z.ZodString>;
10180
+ derivativePath: z.ZodNullable<z.ZodString>;
10181
+ derivativeCrop: z.ZodNullable<z.ZodObject<{
10182
+ x: z.ZodNumber;
10183
+ y: z.ZodNumber;
10184
+ width: z.ZodNumber;
10185
+ height: z.ZodNumber;
10186
+ }, z.core.$strip>>;
10187
+ derivativeRenderedAt: z.ZodNullable<z.ZodString>;
10188
+ createdAt: z.ZodString;
10189
+ }, z.core.$strip>;
10190
+ declare const ContentItemSourceAssetListResponseSchema: z.ZodObject<{
10191
+ data: z.ZodArray<z.ZodObject<{
10192
+ id: z.ZodString;
10193
+ organizationId: z.ZodString;
10194
+ contentItemId: z.ZodString;
10195
+ sourceAssetId: z.ZodString;
10196
+ position: z.ZodNumber;
10197
+ crop: z.ZodNullable<z.ZodObject<{
10198
+ x: z.ZodNumber;
10199
+ y: z.ZodNumber;
10200
+ width: z.ZodNumber;
10201
+ height: z.ZodNumber;
10202
+ }, z.core.$strip>>;
10203
+ altText: z.ZodNullable<z.ZodString>;
10204
+ derivativePath: z.ZodNullable<z.ZodString>;
10205
+ derivativeCrop: z.ZodNullable<z.ZodObject<{
10206
+ x: z.ZodNumber;
10207
+ y: z.ZodNumber;
10208
+ width: z.ZodNumber;
10209
+ height: z.ZodNumber;
10210
+ }, z.core.$strip>>;
10211
+ derivativeRenderedAt: z.ZodNullable<z.ZodString>;
10212
+ createdAt: z.ZodString;
10213
+ }, z.core.$strip>>;
10214
+ }, z.core.$strip>;
10215
+ /**
10216
+ * One membership as a caller supplies it. Two callers share it:
10217
+ * `CreateContentItemRequestSchema.sourceAssets` (the ordered set a carousel is
10218
+ * created with, in one transaction) and the body of the `addItemSourceAsset`
10219
+ * write, whose `itemId` arrives as a path param rather than in the body.
10220
+ */
10221
+ declare const ContentItemSourceAssetInputSchema: z.ZodObject<{
10222
+ sourceAssetId: z.ZodString;
10223
+ position: z.ZodNumber;
10224
+ crop: z.ZodOptional<z.ZodNullable<z.ZodObject<{
10225
+ x: z.ZodNumber;
10226
+ y: z.ZodNumber;
10227
+ width: z.ZodNumber;
10228
+ height: z.ZodNumber;
10229
+ }, z.core.$strict>>>;
10230
+ altText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
10231
+ }, z.core.$strict>;
9840
10232
  declare const ContentItemResponseSchema: z.ZodObject<{
9841
10233
  id: z.ZodString;
9842
10234
  organizationId: z.ZodString;
@@ -9848,6 +10240,29 @@ declare const ContentItemResponseSchema: z.ZodObject<{
9848
10240
  pipelineId: z.ZodNullable<z.ZodString>;
9849
10241
  clientId: z.ZodNullable<z.ZodString>;
9850
10242
  sourceAssetId: z.ZodNullable<z.ZodString>;
10243
+ sourceAssets: z.ZodOptional<z.ZodArray<z.ZodObject<{
10244
+ id: z.ZodString;
10245
+ organizationId: z.ZodString;
10246
+ contentItemId: z.ZodString;
10247
+ sourceAssetId: z.ZodString;
10248
+ position: z.ZodNumber;
10249
+ crop: z.ZodNullable<z.ZodObject<{
10250
+ x: z.ZodNumber;
10251
+ y: z.ZodNumber;
10252
+ width: z.ZodNumber;
10253
+ height: z.ZodNumber;
10254
+ }, z.core.$strip>>;
10255
+ altText: z.ZodNullable<z.ZodString>;
10256
+ derivativePath: z.ZodNullable<z.ZodString>;
10257
+ derivativeCrop: z.ZodNullable<z.ZodObject<{
10258
+ x: z.ZodNumber;
10259
+ y: z.ZodNumber;
10260
+ width: z.ZodNumber;
10261
+ height: z.ZodNumber;
10262
+ }, z.core.$strip>>;
10263
+ derivativeRenderedAt: z.ZodNullable<z.ZodString>;
10264
+ createdAt: z.ZodString;
10265
+ }, z.core.$strip>>>;
9851
10266
  processingState: z.ZodRecord<z.ZodString, z.ZodObject<{
9852
10267
  status: z.ZodEnum<{
9853
10268
  error: "error";
@@ -9882,6 +10297,29 @@ declare const ContentItemListResponseSchema: z.ZodObject<{
9882
10297
  pipelineId: z.ZodNullable<z.ZodString>;
9883
10298
  clientId: z.ZodNullable<z.ZodString>;
9884
10299
  sourceAssetId: z.ZodNullable<z.ZodString>;
10300
+ sourceAssets: z.ZodOptional<z.ZodArray<z.ZodObject<{
10301
+ id: z.ZodString;
10302
+ organizationId: z.ZodString;
10303
+ contentItemId: z.ZodString;
10304
+ sourceAssetId: z.ZodString;
10305
+ position: z.ZodNumber;
10306
+ crop: z.ZodNullable<z.ZodObject<{
10307
+ x: z.ZodNumber;
10308
+ y: z.ZodNumber;
10309
+ width: z.ZodNumber;
10310
+ height: z.ZodNumber;
10311
+ }, z.core.$strip>>;
10312
+ altText: z.ZodNullable<z.ZodString>;
10313
+ derivativePath: z.ZodNullable<z.ZodString>;
10314
+ derivativeCrop: z.ZodNullable<z.ZodObject<{
10315
+ x: z.ZodNumber;
10316
+ y: z.ZodNumber;
10317
+ width: z.ZodNumber;
10318
+ height: z.ZodNumber;
10319
+ }, z.core.$strip>>;
10320
+ derivativeRenderedAt: z.ZodNullable<z.ZodString>;
10321
+ createdAt: z.ZodString;
10322
+ }, z.core.$strip>>>;
9885
10323
  processingState: z.ZodRecord<z.ZodString, z.ZodObject<{
9886
10324
  status: z.ZodEnum<{
9887
10325
  error: "error";
@@ -9972,6 +10410,31 @@ declare const ContentSourceAssetResponseSchema: z.ZodObject<{
9972
10410
  createdAt: z.ZodString;
9973
10411
  updatedAt: z.ZodString;
9974
10412
  }, z.core.$strip>;
10413
+ /**
10414
+ * One entry in a distribution's `media_urls`.
10415
+ *
10416
+ * Two kinds genuinely coexist: an object in a Supabase storage bucket, and a
10417
+ * URL that is already fetchable. Both used to be stored as bare strings, so
10418
+ * every reader had to classify an entry by looking for a URI scheme — the same
10419
+ * guess, re-derived in each consumer, wrong the moment a storage key contains
10420
+ * a colon. The entry names its own kind instead.
10421
+ *
10422
+ * A `storage` entry carries its own `bucket` so a reader does not hardcode one;
10423
+ * the bucket is private, so the path is signed at read time rather than stored
10424
+ * as a URL that expires.
10425
+ *
10426
+ * This is deliberately NOT `z.union([z.string(), ...])`. Accepting both shapes
10427
+ * would relocate the heuristic rather than remove it, so existing rows are
10428
+ * migrated instead (`content-distribution-media-entries.sql`).
10429
+ */
10430
+ declare const ContentMediaEntrySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
10431
+ kind: z.ZodLiteral<"storage">;
10432
+ bucket: z.ZodString;
10433
+ path: z.ZodString;
10434
+ }, z.core.$strict>, z.ZodObject<{
10435
+ kind: z.ZodLiteral<"url">;
10436
+ url: z.ZodString;
10437
+ }, z.core.$strict>], "kind">;
9975
10438
  declare const ContentDistributionResponseSchema: z.ZodObject<{
9976
10439
  id: z.ZodString;
9977
10440
  organizationId: z.ZodString;
@@ -9982,7 +10445,14 @@ declare const ContentDistributionResponseSchema: z.ZodObject<{
9982
10445
  adaptedBody: z.ZodNullable<z.ZodString>;
9983
10446
  platformContent: z.ZodNullable<z.ZodUnknown>;
9984
10447
  checklist: z.ZodNullable<z.ZodUnknown>;
9985
- mediaUrls: z.ZodArray<z.ZodUnknown>;
10448
+ mediaUrls: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
10449
+ kind: z.ZodLiteral<"storage">;
10450
+ bucket: z.ZodString;
10451
+ path: z.ZodString;
10452
+ }, z.core.$strict>, z.ZodObject<{
10453
+ kind: z.ZodLiteral<"url">;
10454
+ url: z.ZodString;
10455
+ }, z.core.$strict>], "kind">>;
9986
10456
  processingState: z.ZodRecord<z.ZodString, z.ZodObject<{
9987
10457
  status: z.ZodEnum<{
9988
10458
  error: "error";
@@ -10013,11 +10483,16 @@ type ContentDistributionPlatform = z.infer<typeof ContentDistributionPlatformSch
10013
10483
  type ContentDistributionFormat = z.infer<typeof ContentDistributionFormatSchema>;
10014
10484
  type ContentDistributionStatus = z.infer<typeof ContentDistributionStatusSchema>;
10015
10485
  type ContentPayloadEnvelope = z.infer<typeof ContentPayloadEnvelopeSchema>;
10486
+ type ContentAssetCropInput = z.infer<typeof ContentAssetCropInputSchema>;
10487
+ type ContentItemSourceAssetResponse = z.infer<typeof ContentItemSourceAssetResponseSchema>;
10488
+ type ContentItemSourceAssetListResponse = z.infer<typeof ContentItemSourceAssetListResponseSchema>;
10489
+ type ContentItemSourceAssetInput = z.infer<typeof ContentItemSourceAssetInputSchema>;
10016
10490
  type ContentItemResponse = z.infer<typeof ContentItemResponseSchema>;
10017
10491
  type ContentItemListResponse = z.infer<typeof ContentItemListResponseSchema>;
10018
10492
  type ContentItemAttemptResponse = z.infer<typeof ContentItemAttemptResponseSchema>;
10019
10493
  type ContentItemAttemptListResponse = z.infer<typeof ContentItemAttemptListResponseSchema>;
10020
10494
  type ContentSourceAssetResponse = z.infer<typeof ContentSourceAssetResponseSchema>;
10495
+ type ContentMediaEntry = z.infer<typeof ContentMediaEntrySchema>;
10021
10496
  type ContentDistributionResponse = z.infer<typeof ContentDistributionResponseSchema>;
10022
10497
 
10023
10498
  /**
@@ -10451,6 +10926,34 @@ type DropboxToolMap = {
10451
10926
  params: CreateFolderParams;
10452
10927
  result: CreateFolderResult;
10453
10928
  };
10929
+ listFolder: {
10930
+ params: ListFolderParams;
10931
+ result: ListFolderResult;
10932
+ };
10933
+ getMetadata: {
10934
+ params: GetMetadataParams;
10935
+ result: GetMetadataResult;
10936
+ };
10937
+ getTemporaryLink: {
10938
+ params: GetTemporaryLinkParams;
10939
+ result: GetTemporaryLinkResult;
10940
+ };
10941
+ createSharedLink: {
10942
+ params: CreateSharedLinkParams;
10943
+ result: CreateSharedLinkResult;
10944
+ };
10945
+ download: {
10946
+ params: DownloadParams;
10947
+ result: DownloadResult;
10948
+ };
10949
+ getThumbnail: {
10950
+ params: GetThumbnailParams;
10951
+ result: GetThumbnailResult;
10952
+ };
10953
+ getThumbnailBatch: {
10954
+ params: GetThumbnailBatchParams;
10955
+ result: GetThumbnailBatchResult;
10956
+ };
10454
10957
  };
10455
10958
  type SignatureApiToolMap = {
10456
10959
  createEnvelope: {
@@ -10988,7 +11491,15 @@ type ArtifactsToolMap = {
10988
11491
  };
10989
11492
  };
10990
11493
  type ContentToolMap = {
10991
- /** Insert a new `content_items` row -- a producer's entry point for a new piece. */
11494
+ /**
11495
+ * Insert a new `content_items` row -- a producer's entry point for a new piece.
11496
+ *
11497
+ * `sourceAssets` is the ordered membership a carousel is created with, in
11498
+ * ONE transaction (Open Decision 11, 2026-08-17 -- hybrid). Index is not
11499
+ * position: each entry names its own `position`, and 0 is the cover. Every
11500
+ * later membership mutation is one of the four dedicated methods below --
11501
+ * `updateItem` never touches membership.
11502
+ */
10992
11503
  createItem: {
10993
11504
  params: {
10994
11505
  title: string;
@@ -10999,6 +11510,7 @@ type ContentToolMap = {
10999
11510
  pipelineId?: ContentPipelineId | null;
11000
11511
  clientId?: string | null;
11001
11512
  sourceAssetId?: string | null;
11513
+ sourceAssets?: ContentItemSourceAssetInput[];
11002
11514
  };
11003
11515
  result: ContentItemResponse;
11004
11516
  };
@@ -11024,6 +11536,13 @@ type ContentToolMap = {
11024
11536
  /**
11025
11537
  * Update an item's mutable fields as it advances through the pipeline.
11026
11538
  * Does NOT accept a `processingState` field -- see Decision 4 above.
11539
+ *
11540
+ * STANDING CONVENTION -- Open Decision 11 (enforced by omission): there is no
11541
+ * `sourceAssets` field here and there must not be one. A wholesale-replace
11542
+ * array would force every partial item update to say something about the
11543
+ * asset list, and once omission means "leave alone" there is no way to clear
11544
+ * membership at all. The four methods below own every membership mutation
11545
+ * after creation.
11027
11546
  */
11028
11547
  updateItem: {
11029
11548
  params: {
@@ -11038,6 +11557,72 @@ type ContentToolMap = {
11038
11557
  };
11039
11558
  result: ContentItemResponse;
11040
11559
  };
11560
+ /**
11561
+ * Link one source asset into an item at a given slide position (0 is the
11562
+ * cover). `organizationId` is never a parameter here or on the three methods
11563
+ * below: both foreign keys on `content_item_source_assets` are COMPOSITE
11564
+ * against `(id, organization_id)`, so the database refuses a cross-org link
11565
+ * structurally rather than by convention.
11566
+ *
11567
+ * There is deliberately no `listItemSourceAssets` method -- membership comes
11568
+ * back on `getItem` / `listItems` as `ContentItemResponse.sourceAssets`.
11569
+ */
11570
+ addItemSourceAsset: {
11571
+ params: {
11572
+ itemId: string;
11573
+ sourceAssetId: string;
11574
+ /** Slide order, 0 is the cover. Unique within the item. */
11575
+ position: number;
11576
+ /** Per-MEMBERSHIP crop box in normalized fractions -- the same photo crops differently per item. */
11577
+ crop?: ContentAssetCropInput | null;
11578
+ altText?: string | null;
11579
+ };
11580
+ result: ContentItemSourceAssetResponse;
11581
+ };
11582
+ /**
11583
+ * Unlink one source asset from an item. The asset row itself is untouched --
11584
+ * `content_item_source_assets.source_asset_id` is `ON DELETE RESTRICT`
11585
+ * precisely so a used asset cannot vanish out from under a published post.
11586
+ */
11587
+ removeItemSourceAsset: {
11588
+ params: {
11589
+ itemId: string;
11590
+ sourceAssetId: string;
11591
+ };
11592
+ result: void;
11593
+ };
11594
+ /**
11595
+ * Reorder an item's slides. `orderedAssetIds` is the item's COMPLETE
11596
+ * membership in its new order -- index becomes `position`, so index 0 is the
11597
+ * new cover, and a list that does not name exactly the current membership is
11598
+ * rejected.
11599
+ *
11600
+ * `UNIQUE (content_item_id, position)` is DEFERRABLE INITIALLY DEFERRED, so
11601
+ * this is plain per-row updates inside one transaction. An implementation
11602
+ * that shuffles through a temporary offset is a sign the deferrable
11603
+ * constraint was not used.
11604
+ */
11605
+ reorderItemSourceAssets: {
11606
+ params: {
11607
+ itemId: string;
11608
+ orderedAssetIds: string[];
11609
+ };
11610
+ result: ContentItemSourceAssetListResponse;
11611
+ };
11612
+ /**
11613
+ * Patch one membership's per-slide attributes. `position` is not here --
11614
+ * moving a slide is `reorderItemSourceAssets` -- and neither is
11615
+ * `sourceAssetId`: swapping the asset is a remove plus an add.
11616
+ */
11617
+ updateItemSourceAsset: {
11618
+ params: {
11619
+ itemId: string;
11620
+ sourceAssetId: string;
11621
+ crop?: ContentAssetCropInput | null;
11622
+ altText?: string | null;
11623
+ };
11624
+ result: ContentItemSourceAssetResponse;
11625
+ };
11041
11626
  /**
11042
11627
  * Record a pipeline-step attempt against an item. `attemptNumber` is
11043
11628
  * assigned server-side inside the write (Decision 6) -- never
@@ -11130,6 +11715,30 @@ type ContentToolMap = {
11130
11715
  };
11131
11716
  result: ContentSourceAssetResponse;
11132
11717
  };
11718
+ /**
11719
+ * Fetch a single distribution by id, org-scoped -- lets a producer read back
11720
+ * a distribution it just wrote before writing to it again, the idempotency
11721
+ * check `createDistribution`/`updateDistribution` alone cannot provide.
11722
+ */
11723
+ getDistribution: {
11724
+ params: {
11725
+ distributionId: string;
11726
+ };
11727
+ result: ContentDistributionResponse | null;
11728
+ };
11729
+ /** Query distributions -- e.g. a producer checking what's already been created for an item. */
11730
+ listDistributions: {
11731
+ params: {
11732
+ contentItemId?: string;
11733
+ platform?: ContentDistributionPlatform;
11734
+ status?: ContentDistributionStatus;
11735
+ limit?: number;
11736
+ offset?: number;
11737
+ };
11738
+ result: {
11739
+ data: ContentDistributionResponse[];
11740
+ };
11741
+ };
11133
11742
  /** Insert a `content_distributions` row for one platform/format target. */
11134
11743
  createDistribution: {
11135
11744
  params: {
@@ -11140,7 +11749,7 @@ type ContentToolMap = {
11140
11749
  adaptedBody?: string | null;
11141
11750
  platformContent?: unknown;
11142
11751
  checklist?: unknown;
11143
- mediaUrls?: unknown[];
11752
+ mediaUrls?: ContentMediaEntry[];
11144
11753
  };
11145
11754
  result: ContentDistributionResponse;
11146
11755
  };
@@ -11152,7 +11761,7 @@ type ContentToolMap = {
11152
11761
  adaptedBody?: string | null;
11153
11762
  platformContent?: unknown;
11154
11763
  checklist?: unknown;
11155
- mediaUrls?: unknown[];
11764
+ mediaUrls?: ContentMediaEntry[];
11156
11765
  publishMethod?: string | null;
11157
11766
  publishedAt?: string | null;
11158
11767
  platformPostId?: string | null;
@@ -12224,14 +12833,18 @@ interface DeploymentSpec {
12224
12833
  type LLMProvider = 'openai' | 'anthropic' | 'openrouter';
12225
12834
  /**
12226
12835
  * SDK LLM generate params.
12227
- * Extends LLMGenerateRequest with required provider/model for worker→platform dispatch.
12228
- * Provider and model must always be specified explicitly no implicit fallback.
12836
+ *
12837
+ * `provider` and `model` are optional, and omitting them is a real choice rather than a shorthand:
12838
+ * the platform then resolves the pair from the resource's own `modelConfig`, and failing that from
12839
+ * the `DEFAULT_LLM_MODEL` environment variable. A call that names a model always wins, so a
12840
+ * resource that states its model keeps stating it. Supply both or neither — a half-supplied pair is
12841
+ * rejected, because pairing an explicit provider with a defaulted model silently mismatches them.
12229
12842
  */
12230
12843
  interface SDKLLMGenerateParams extends Omit<LLMGenerateRequest, 'signal'> {
12231
- /** LLM provider */
12232
- provider: LLMProvider;
12233
- /** Model identifier — must be a supported LLMModel */
12234
- model: LLMModel;
12844
+ /** LLM provider. Omit to inherit the resource's `modelConfig`, then the platform default. */
12845
+ provider?: LLMProvider;
12846
+ /** Model identifier — must be a supported LLMModel. Omit to inherit alongside `provider`. */
12847
+ model?: LLMModel;
12235
12848
  }
12236
12849
  /**
12237
12850
  * Typed LLM adapter for structured output generation.
@@ -12396,7 +13009,7 @@ declare function createClickUpAdapter(credential: string): TypedAdapter<ClickUpT
12396
13009
  * Create a typed Dropbox adapter bound to a specific credential.
12397
13010
  *
12398
13011
  * @param credential - Credential name as configured in the command center
12399
- * @returns Object with 2 typed methods for Dropbox file operations
13012
+ * @returns Object with 9 typed methods for Dropbox file operations
12400
13013
  */
12401
13014
  declare function createDropboxAdapter(credential: string): TypedAdapter<DropboxToolMap>;
12402
13015
 
@@ -12620,10 +13233,12 @@ declare const list: TypedAdapter<ListToolMap>;
12620
13233
  * `kind` convention: any artifact written for the content pipeline (an
12621
13234
  * `ownerKind: 'organization'` document -- a selection brief, an idea bank,
12622
13235
  * brand settings) MUST use a `kind` prefixed with `content:`, e.g.
12623
- * `content:selection-brief`. The `artifacts_manage_content` RLS policy grants
12624
- * write access to `content.manage` holders ONLY when `kind LIKE 'content:%'`
12625
- * -- an unprefixed `kind` is rejected server-side with no compile-time error.
12626
- * Acquisition's own artifacts (audits, proposals, ICP docs) stay unprefixed.
13236
+ * `content:selection-brief`. Org-owned artifacts are the content pipeline's
13237
+ * governing documents, and `apps/api/src/deployments/tool-dispatcher.ts`
13238
+ * validates the prefix at dispatch time and fails fast with a clear error
13239
+ * when it is missing -- an unprefixed `kind` on an org-owned artifact is
13240
+ * rejected server-side with no compile-time error. Acquisition's own
13241
+ * artifacts (audits, proposals, ICP docs) stay unprefixed.
12627
13242
  * `createArtifact`'s `pipelineId` is required for a later `getActive` call to
12628
13243
  * ever find the row it writes.
12629
13244
  */
@@ -12668,6 +13283,15 @@ declare const artifacts: TypedAdapter<ArtifactsToolMap>;
12668
13283
  * briefly missing from both the tool map and the dispatcher's forward, which
12669
13284
  * meant a create-time status was accepted by the Zod schema and then dropped,
12670
13285
  * landing the row on the column default. Both were closed on 2026-08-15.
13286
+ *
13287
+ * The four `*ItemSourceAsset*` methods cover `content_item_source_assets`,
13288
+ * the ordered link between an item and its source assets. There is
13289
+ * deliberately no `listItemSourceAssets`: membership comes back on `getItem`
13290
+ * and `listItems` as `ContentItemResponse.sourceAssets`, so a separate read
13291
+ * would be a second source of truth for the same rows. `updateItem` is
13292
+ * likewise not a membership write -- `position` only moves through
13293
+ * `reorderItemSourceAssets`, which rewrites the whole ordered set in one
13294
+ * transaction.
12671
13295
  */
12672
13296
 
12673
13297
  /** The content adapter's public shape -- `TypedAdapter<ContentToolMap>` with `createAttempt` narrowed. */