@runtypelabs/cli 2.33.16 → 2.34.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 (2) hide show
  1. package/dist/index.js +443 -192
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -15167,7 +15167,7 @@ var CANONICAL_LOG_COLUMN_SET = {
15167
15167
  };
15168
15168
  var CANONICAL_LOG_COLUMNS = Object.keys(CANONICAL_LOG_COLUMN_SET);
15169
15169
 
15170
- // ../shared/dist/chunk-TM4OWUMO.mjs
15170
+ // ../shared/dist/chunk-2GMXBACL.mjs
15171
15171
  var MODEL_FAMILY_PROVIDER_IDS = {
15172
15172
  "claude-fable-5": {
15173
15173
  "anthropic": "claude-fable-5",
@@ -15272,6 +15272,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15272
15272
  "deepseek-v4-flash-0731": {
15273
15273
  "vercel": "deepseek/deepseek-v4-flash-0731"
15274
15274
  },
15275
+ "deepseek-v4-flash-vision-exp": {
15276
+ "vercel": "deepseek/deepseek-v4-flash-vision-exp"
15277
+ },
15275
15278
  "deepseek-v4-pro": {
15276
15279
  "vercel": "deepseek/deepseek-v4-pro"
15277
15280
  },
@@ -15355,9 +15358,6 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15355
15358
  "google": "gemini-3.5-flash-lite",
15356
15359
  "vercel": "google/gemini-3.5-flash-lite"
15357
15360
  },
15358
- "gemini-3-5-live-translate": {
15359
- "google": "gemini-3.5-live-translate-preview"
15360
- },
15361
15361
  "gemini-3-6-flash": {
15362
15362
  "google": "gemini-3.6-flash",
15363
15363
  "vercel": "google/gemini-3.6-flash"
@@ -15409,9 +15409,6 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15409
15409
  "google": "gemini-3.5-flash-lite",
15410
15410
  "vercel": "google/gemini-3.5-flash-lite"
15411
15411
  },
15412
- "gemini-3.5-live-translate-preview": {
15413
- "google": "gemini-3.5-live-translate-preview"
15414
- },
15415
15412
  "gemini-3.6-flash": {
15416
15413
  "google": "gemini-3.6-flash",
15417
15414
  "vercel": "google/gemini-3.6-flash"
@@ -15453,6 +15450,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15453
15450
  "glm-5-2-fast": {
15454
15451
  "vercel": "zai/glm-5.2-fast"
15455
15452
  },
15453
+ "glm-5-3": {
15454
+ "vercel": "zai/glm-5.3"
15455
+ },
15456
15456
  "glm-5.2": {
15457
15457
  "mixlayer": "z-ai/glm-5.2",
15458
15458
  "vercel": "zai/glm-5.2"
@@ -15460,50 +15460,71 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15460
15460
  "glm-5.2-fast": {
15461
15461
  "vercel": "zai/glm-5.2-fast"
15462
15462
  },
15463
+ "glm-5.3": {
15464
+ "vercel": "zai/glm-5.3"
15465
+ },
15463
15466
  "gpt-4-1": {
15464
15467
  "openai": "gpt-4.1",
15465
15468
  "vercel": "openai/gpt-4.1"
15466
15469
  },
15470
+ "gpt-4-1-fast": {
15471
+ "vercel": "openai/gpt-4.1-fast"
15472
+ },
15467
15473
  "gpt-4-1-mini": {
15468
15474
  "openai": "gpt-4.1-mini",
15469
15475
  "vercel": "openai/gpt-4.1-mini"
15470
15476
  },
15477
+ "gpt-4-1-mini-fast": {
15478
+ "vercel": "openai/gpt-4.1-mini-fast"
15479
+ },
15471
15480
  "gpt-4-1-nano": {
15472
15481
  "openai": "gpt-4.1-nano",
15473
15482
  "vercel": "openai/gpt-4.1-nano"
15474
15483
  },
15484
+ "gpt-4-1-nano-fast": {
15485
+ "vercel": "openai/gpt-4.1-nano-fast"
15486
+ },
15475
15487
  "gpt-4.1": {
15476
15488
  "openai": "gpt-4.1",
15477
15489
  "vercel": "openai/gpt-4.1"
15478
15490
  },
15491
+ "gpt-4.1-fast": {
15492
+ "vercel": "openai/gpt-4.1-fast"
15493
+ },
15479
15494
  "gpt-4.1-mini": {
15480
15495
  "openai": "gpt-4.1-mini",
15481
15496
  "vercel": "openai/gpt-4.1-mini"
15482
15497
  },
15498
+ "gpt-4.1-mini-fast": {
15499
+ "vercel": "openai/gpt-4.1-mini-fast"
15500
+ },
15483
15501
  "gpt-4.1-nano": {
15484
15502
  "openai": "gpt-4.1-nano",
15485
15503
  "vercel": "openai/gpt-4.1-nano"
15486
15504
  },
15505
+ "gpt-4.1-nano-fast": {
15506
+ "vercel": "openai/gpt-4.1-nano-fast"
15507
+ },
15487
15508
  "gpt-4o": {
15488
15509
  "openai": "gpt-4o",
15489
15510
  "vercel": "openai/gpt-4o"
15490
15511
  },
15512
+ "gpt-4o-fast": {
15513
+ "vercel": "openai/gpt-4o-fast"
15514
+ },
15491
15515
  "gpt-4o-mini": {
15492
15516
  "openai": "gpt-4o-mini",
15493
15517
  "vercel": "openai/gpt-4o-mini"
15494
15518
  },
15519
+ "gpt-4o-mini-fast": {
15520
+ "vercel": "openai/gpt-4o-mini-fast"
15521
+ },
15495
15522
  "gpt-4o-mini-search": {
15496
15523
  "vercel": "openai/gpt-4o-mini-search-preview"
15497
15524
  },
15498
15525
  "gpt-4o-mini-search-preview": {
15499
15526
  "vercel": "openai/gpt-4o-mini-search-preview"
15500
15527
  },
15501
- "gpt-4o-mini-transcribe": {
15502
- "vercel": "openai/gpt-4o-mini-transcribe"
15503
- },
15504
- "gpt-4o-transcribe": {
15505
- "vercel": "openai/gpt-4o-transcribe"
15506
- },
15507
15528
  "gpt-5": {
15508
15529
  "openai": "gpt-5",
15509
15530
  "vercel": "openai/gpt-5"
@@ -15520,6 +15541,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15520
15541
  "gpt-5-1-codex-mini": {
15521
15542
  "vercel": "openai/gpt-5.1-codex-mini"
15522
15543
  },
15544
+ "gpt-5-1-thinking-fast": {
15545
+ "vercel": "openai/gpt-5.1-thinking-fast"
15546
+ },
15523
15547
  "gpt-5-2": {
15524
15548
  "openai": "gpt-5.2",
15525
15549
  "vercel": "openai/gpt-5.2"
@@ -15527,6 +15551,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15527
15551
  "gpt-5-2-codex": {
15528
15552
  "vercel": "openai/gpt-5.2-codex"
15529
15553
  },
15554
+ "gpt-5-2-fast": {
15555
+ "vercel": "openai/gpt-5.2-fast"
15556
+ },
15530
15557
  "gpt-5-2-pro": {
15531
15558
  "openai": "gpt-5.2-pro",
15532
15559
  "vercel": "openai/gpt-5.2-pro"
@@ -15535,6 +15562,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15535
15562
  "openai": "gpt-5.3-codex",
15536
15563
  "vercel": "openai/gpt-5.3-codex"
15537
15564
  },
15565
+ "gpt-5-3-codex-fast": {
15566
+ "vercel": "openai/gpt-5.3-codex-fast"
15567
+ },
15538
15568
  "gpt-5-3-codex-spark": {
15539
15569
  "openai": "gpt-5.3-codex-spark"
15540
15570
  },
@@ -15542,10 +15572,16 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15542
15572
  "openai": "gpt-5.4",
15543
15573
  "vercel": "openai/gpt-5.4"
15544
15574
  },
15575
+ "gpt-5-4-fast": {
15576
+ "vercel": "openai/gpt-5.4-fast"
15577
+ },
15545
15578
  "gpt-5-4-mini": {
15546
15579
  "openai": "gpt-5.4-mini",
15547
15580
  "vercel": "openai/gpt-5.4-mini"
15548
15581
  },
15582
+ "gpt-5-4-mini-fast": {
15583
+ "vercel": "openai/gpt-5.4-mini-fast"
15584
+ },
15549
15585
  "gpt-5-4-nano": {
15550
15586
  "openai": "gpt-5.4-nano",
15551
15587
  "vercel": "openai/gpt-5.4-nano"
@@ -15558,6 +15594,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15558
15594
  "openai": "gpt-5.5",
15559
15595
  "vercel": "openai/gpt-5.5"
15560
15596
  },
15597
+ "gpt-5-5-fast": {
15598
+ "vercel": "openai/gpt-5.5-fast"
15599
+ },
15561
15600
  "gpt-5-5-pro": {
15562
15601
  "openai": "gpt-5.5-pro",
15563
15602
  "vercel": "openai/gpt-5.5-pro"
@@ -15569,21 +15608,36 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15569
15608
  "openai": "gpt-5.6-luna",
15570
15609
  "vercel": "openai/gpt-5.6-luna"
15571
15610
  },
15611
+ "gpt-5-6-luna-fast": {
15612
+ "vercel": "openai/gpt-5.6-luna-fast"
15613
+ },
15572
15614
  "gpt-5-6-sol": {
15573
15615
  "openai": "gpt-5.6-sol",
15574
15616
  "vercel": "openai/gpt-5.6-sol"
15575
15617
  },
15618
+ "gpt-5-6-sol-fast": {
15619
+ "vercel": "openai/gpt-5.6-sol-fast"
15620
+ },
15576
15621
  "gpt-5-6-terra": {
15577
15622
  "openai": "gpt-5.6-terra",
15578
15623
  "vercel": "openai/gpt-5.6-terra"
15579
15624
  },
15625
+ "gpt-5-6-terra-fast": {
15626
+ "vercel": "openai/gpt-5.6-terra-fast"
15627
+ },
15580
15628
  "gpt-5-codex": {
15581
15629
  "vercel": "openai/gpt-5-codex"
15582
15630
  },
15631
+ "gpt-5-fast": {
15632
+ "vercel": "openai/gpt-5-fast"
15633
+ },
15583
15634
  "gpt-5-mini": {
15584
15635
  "openai": "gpt-5-mini",
15585
15636
  "vercel": "openai/gpt-5-mini"
15586
15637
  },
15638
+ "gpt-5-mini-fast": {
15639
+ "vercel": "openai/gpt-5-mini-fast"
15640
+ },
15587
15641
  "gpt-5-nano": {
15588
15642
  "openai": "gpt-5-nano",
15589
15643
  "vercel": "openai/gpt-5-nano"
@@ -15604,6 +15658,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15604
15658
  "gpt-5.1-codex-mini": {
15605
15659
  "vercel": "openai/gpt-5.1-codex-mini"
15606
15660
  },
15661
+ "gpt-5.1-thinking-fast": {
15662
+ "vercel": "openai/gpt-5.1-thinking-fast"
15663
+ },
15607
15664
  "gpt-5.2": {
15608
15665
  "openai": "gpt-5.2",
15609
15666
  "vercel": "openai/gpt-5.2"
@@ -15611,6 +15668,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15611
15668
  "gpt-5.2-codex": {
15612
15669
  "vercel": "openai/gpt-5.2-codex"
15613
15670
  },
15671
+ "gpt-5.2-fast": {
15672
+ "vercel": "openai/gpt-5.2-fast"
15673
+ },
15614
15674
  "gpt-5.2-pro": {
15615
15675
  "openai": "gpt-5.2-pro",
15616
15676
  "vercel": "openai/gpt-5.2-pro"
@@ -15619,6 +15679,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15619
15679
  "openai": "gpt-5.3-codex",
15620
15680
  "vercel": "openai/gpt-5.3-codex"
15621
15681
  },
15682
+ "gpt-5.3-codex-fast": {
15683
+ "vercel": "openai/gpt-5.3-codex-fast"
15684
+ },
15622
15685
  "gpt-5.3-codex-spark": {
15623
15686
  "openai": "gpt-5.3-codex-spark"
15624
15687
  },
@@ -15626,10 +15689,16 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15626
15689
  "openai": "gpt-5.4",
15627
15690
  "vercel": "openai/gpt-5.4"
15628
15691
  },
15692
+ "gpt-5.4-fast": {
15693
+ "vercel": "openai/gpt-5.4-fast"
15694
+ },
15629
15695
  "gpt-5.4-mini": {
15630
15696
  "openai": "gpt-5.4-mini",
15631
15697
  "vercel": "openai/gpt-5.4-mini"
15632
15698
  },
15699
+ "gpt-5.4-mini-fast": {
15700
+ "vercel": "openai/gpt-5.4-mini-fast"
15701
+ },
15633
15702
  "gpt-5.4-nano": {
15634
15703
  "openai": "gpt-5.4-nano",
15635
15704
  "vercel": "openai/gpt-5.4-nano"
@@ -15642,6 +15711,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15642
15711
  "openai": "gpt-5.5",
15643
15712
  "vercel": "openai/gpt-5.5"
15644
15713
  },
15714
+ "gpt-5.5-fast": {
15715
+ "vercel": "openai/gpt-5.5-fast"
15716
+ },
15645
15717
  "gpt-5.5-pro": {
15646
15718
  "openai": "gpt-5.5-pro",
15647
15719
  "vercel": "openai/gpt-5.5-pro"
@@ -15653,14 +15725,23 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15653
15725
  "openai": "gpt-5.6-luna",
15654
15726
  "vercel": "openai/gpt-5.6-luna"
15655
15727
  },
15728
+ "gpt-5.6-luna-fast": {
15729
+ "vercel": "openai/gpt-5.6-luna-fast"
15730
+ },
15656
15731
  "gpt-5.6-sol": {
15657
15732
  "openai": "gpt-5.6-sol",
15658
15733
  "vercel": "openai/gpt-5.6-sol"
15659
15734
  },
15735
+ "gpt-5.6-sol-fast": {
15736
+ "vercel": "openai/gpt-5.6-sol-fast"
15737
+ },
15660
15738
  "gpt-5.6-terra": {
15661
15739
  "openai": "gpt-5.6-terra",
15662
15740
  "vercel": "openai/gpt-5.6-terra"
15663
15741
  },
15742
+ "gpt-5.6-terra-fast": {
15743
+ "vercel": "openai/gpt-5.6-terra-fast"
15744
+ },
15664
15745
  "gpt-image-1-5": {
15665
15746
  "openai": "gpt-image-1.5"
15666
15747
  },
@@ -15670,9 +15751,6 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15670
15751
  "gpt-image-1.5": {
15671
15752
  "openai": "gpt-image-1.5"
15672
15753
  },
15673
- "gpt-realtime-whisper": {
15674
- "vercel": "openai/gpt-realtime-whisper"
15675
- },
15676
15754
  "grok-4-20-0309-non-reasoning": {
15677
15755
  "xai": "grok-4.20-0309-non-reasoning"
15678
15756
  },
@@ -15680,27 +15758,27 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15680
15758
  "xai": "grok-4.20-0309-reasoning"
15681
15759
  },
15682
15760
  "grok-4-20-multi-agent": {
15683
- "vercel": "xai/grok-4.20-multi-agent"
15761
+ "vercel": "spacexai/grok-4.20-multi-agent"
15684
15762
  },
15685
15763
  "grok-4-20-multi-agent-0309": {
15686
15764
  "xai": "grok-4.20-multi-agent-0309"
15687
15765
  },
15688
15766
  "grok-4-20-non-reasoning": {
15689
- "vercel": "xai/grok-4.20-non-reasoning"
15767
+ "vercel": "spacexai/grok-4.20-non-reasoning"
15690
15768
  },
15691
15769
  "grok-4-20-reasoning": {
15692
- "vercel": "xai/grok-4.20-reasoning"
15770
+ "vercel": "spacexai/grok-4.20-reasoning"
15693
15771
  },
15694
15772
  "grok-4-3": {
15695
- "vercel": "xai/grok-4.3",
15773
+ "vercel": "spacexai/grok-4.3",
15696
15774
  "xai": "grok-4.3"
15697
15775
  },
15698
15776
  "grok-4-5": {
15699
- "vercel": "xai/grok-4.5",
15777
+ "vercel": "spacexai/grok-4.5",
15700
15778
  "xai": "grok-4.5"
15701
15779
  },
15702
15780
  "grok-4-6": {
15703
- "vercel": "xai/grok-4.6",
15781
+ "vercel": "spacexai/grok-4.6",
15704
15782
  "xai": "grok-4.6"
15705
15783
  },
15706
15784
  "grok-4.20-0309-non-reasoning": {
@@ -15710,54 +15788,57 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15710
15788
  "xai": "grok-4.20-0309-reasoning"
15711
15789
  },
15712
15790
  "grok-4.20-multi-agent": {
15713
- "vercel": "xai/grok-4.20-multi-agent"
15791
+ "vercel": "spacexai/grok-4.20-multi-agent"
15714
15792
  },
15715
15793
  "grok-4.20-multi-agent-0309": {
15716
15794
  "xai": "grok-4.20-multi-agent-0309"
15717
15795
  },
15718
15796
  "grok-4.20-non-reasoning": {
15719
- "vercel": "xai/grok-4.20-non-reasoning"
15797
+ "vercel": "spacexai/grok-4.20-non-reasoning"
15720
15798
  },
15721
15799
  "grok-4.20-reasoning": {
15722
- "vercel": "xai/grok-4.20-reasoning"
15800
+ "vercel": "spacexai/grok-4.20-reasoning"
15723
15801
  },
15724
15802
  "grok-4.3": {
15725
- "vercel": "xai/grok-4.3",
15803
+ "vercel": "spacexai/grok-4.3",
15726
15804
  "xai": "grok-4.3"
15727
15805
  },
15728
15806
  "grok-4.5": {
15729
- "vercel": "xai/grok-4.5",
15807
+ "vercel": "spacexai/grok-4.5",
15730
15808
  "xai": "grok-4.5"
15731
15809
  },
15732
15810
  "grok-4.6": {
15733
- "vercel": "xai/grok-4.6",
15811
+ "vercel": "spacexai/grok-4.6",
15734
15812
  "xai": "grok-4.6"
15735
15813
  },
15736
15814
  "grok-build-0-1": {
15737
- "vercel": "xai/grok-build-0.1",
15815
+ "vercel": "spacexai/grok-build-0.1",
15738
15816
  "xai": "grok-build-0.1"
15739
15817
  },
15740
15818
  "grok-build-0.1": {
15741
- "vercel": "xai/grok-build-0.1",
15819
+ "vercel": "spacexai/grok-build-0.1",
15742
15820
  "xai": "grok-build-0.1"
15743
15821
  },
15744
- "grok-imagine-image": {
15745
- "vercel": "xai/grok-imagine-image"
15746
- },
15747
- "grok-stt": {
15748
- "vercel": "xai/grok-stt"
15749
- },
15750
15822
  "grok-voice-think-fast-1-0": {
15751
- "vercel": "xai/grok-voice-think-fast-1.0"
15823
+ "vercel": "spacexai/grok-voice-think-fast-1.0"
15752
15824
  },
15753
15825
  "grok-voice-think-fast-1.0": {
15754
- "vercel": "xai/grok-voice-think-fast-1.0"
15826
+ "vercel": "spacexai/grok-voice-think-fast-1.0"
15755
15827
  },
15756
15828
  "grok-voice-think-fast-2-0": {
15757
- "vercel": "xai/grok-voice-think-fast-2.0"
15829
+ "vercel": "spacexai/grok-voice-think-fast-2.0"
15758
15830
  },
15759
15831
  "grok-voice-think-fast-2.0": {
15760
- "vercel": "xai/grok-voice-think-fast-2.0"
15832
+ "vercel": "spacexai/grok-voice-think-fast-2.0"
15833
+ },
15834
+ "hy-mt2-lite": {
15835
+ "vercel": "tencent/hy-mt2-lite"
15836
+ },
15837
+ "hy-mt2-plus": {
15838
+ "vercel": "tencent/hy-mt2-plus"
15839
+ },
15840
+ "hy-mt2-pro": {
15841
+ "vercel": "tencent/hy-mt2-pro"
15761
15842
  },
15762
15843
  "hy3": {
15763
15844
  "vercel": "tencent/hy3"
@@ -15837,15 +15918,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15837
15918
  "ling-3-0-flash": {
15838
15919
  "vercel": "inclusionai/ling-3.0-flash"
15839
15920
  },
15840
- "ling-3-0-tiny-free": {
15841
- "vercel": "inclusionai/ling-3.0-tiny-free"
15842
- },
15843
15921
  "ling-3.0-flash": {
15844
15922
  "vercel": "inclusionai/ling-3.0-flash"
15845
15923
  },
15846
- "ling-3.0-tiny-free": {
15847
- "vercel": "inclusionai/ling-3.0-tiny-free"
15848
- },
15849
15924
  "llama-3.1-70b": {
15850
15925
  "vercel": "meta/llama-3.1-70b"
15851
15926
  },
@@ -15966,6 +16041,12 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15966
16041
  "namazu": {
15967
16042
  "vercel": "sakana/namazu"
15968
16043
  },
16044
+ "nemotron-3-5-lightning": {
16045
+ "vercel": "nvidia/nemotron-3.5-lightning"
16046
+ },
16047
+ "nemotron-3-5-lightning-free": {
16048
+ "vercel": "nvidia/nemotron-3.5-lightning-free"
16049
+ },
15969
16050
  "nemotron-3-nano-30b-a3b": {
15970
16051
  "vercel": "nvidia/nemotron-3-nano-30b-a3b"
15971
16052
  },
@@ -15975,6 +16056,12 @@ var MODEL_FAMILY_PROVIDER_IDS = {
15975
16056
  "nemotron-3-ultra-550b-a55b": {
15976
16057
  "vercel": "nvidia/nemotron-3-ultra-550b-a55b"
15977
16058
  },
16059
+ "nemotron-3.5-lightning": {
16060
+ "vercel": "nvidia/nemotron-3.5-lightning"
16061
+ },
16062
+ "nemotron-3.5-lightning-free": {
16063
+ "vercel": "nvidia/nemotron-3.5-lightning-free"
16064
+ },
15978
16065
  "nemotron-nano-12b-v2-vl": {
15979
16066
  "vercel": "nvidia/nemotron-nano-12b-v2-vl"
15980
16067
  },
@@ -16069,6 +16156,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
16069
16156
  "qwen3-8-2-4t-a95b": {
16070
16157
  "vercel": "alibaba/qwen3.8-2.4t-a95b"
16071
16158
  },
16159
+ "qwen3-8-27b": {
16160
+ "vercel": "alibaba/qwen3.8-27b"
16161
+ },
16072
16162
  "qwen3-8-max": {
16073
16163
  "vercel": "alibaba/qwen3.8-max"
16074
16164
  },
@@ -16157,6 +16247,9 @@ var MODEL_FAMILY_PROVIDER_IDS = {
16157
16247
  "qwen3.8-2.4t-a95b": {
16158
16248
  "vercel": "alibaba/qwen3.8-2.4t-a95b"
16159
16249
  },
16250
+ "qwen3.8-27b": {
16251
+ "vercel": "alibaba/qwen3.8-27b"
16252
+ },
16160
16253
  "qwen3.8-max": {
16161
16254
  "vercel": "alibaba/qwen3.8-max"
16162
16255
  },
@@ -16214,9 +16307,6 @@ var MODEL_FAMILY_PROVIDER_IDS = {
16214
16307
  "text-embedding-ada-002": {
16215
16308
  "openai": "text-embedding-ada-002"
16216
16309
  },
16217
- "transcribe-1": {
16218
- "vercel": "fish-audio/transcribe-1"
16219
- },
16220
16310
  "trinity-large": {
16221
16311
  "vercel": "arcee-ai/trinity-large-thinking"
16222
16312
  },
@@ -16225,9 +16315,6 @@ var MODEL_FAMILY_PROVIDER_IDS = {
16225
16315
  },
16226
16316
  "trinity-mini": {
16227
16317
  "vercel": "arcee-ai/trinity-mini"
16228
- },
16229
- "whisper-1": {
16230
- "vercel": "openai/whisper-1"
16231
16318
  }
16232
16319
  };
16233
16320
  var PLATFORM_KEY_PROVIDER_MAP = {
@@ -16261,15 +16348,24 @@ var MANUAL_PROVIDER_MAP_OVERRIDES = {
16261
16348
  "bedrock": "anthropic.claude-3-5-sonnet-20241022-v2:0"
16262
16349
  },
16263
16350
  // Legacy xAI aliases route to the current successor model IDs.
16351
+ //
16352
+ // The `vercel` values carry the GATEWAY namespace, which the Vercel AI
16353
+ // Gateway renamed `xai/` → `spacexai/` on 2026-08-22. This table is
16354
+ // hand-maintained — `pnpm update-models` never rewrites it — so the rename
16355
+ // does not reach it on its own, and these three families route Vercel-first
16356
+ // (`grok-4-fast` and `grok-4.1-fast-non-reasoning` with `fallback: []`).
16357
+ // A stale `xai/…` target here is a hard model-not-found, not a degrade.
16358
+ // The `xai` values are DIRECT-provider model ids and are unprefixed by
16359
+ // construction, so the rename does not touch them.
16264
16360
  "grok-4": {
16265
- "vercel": "xai/grok-4.3",
16361
+ "vercel": "spacexai/grok-4.3",
16266
16362
  "xai": "grok-4.3"
16267
16363
  },
16268
16364
  "grok-4-fast": {
16269
- "vercel": "xai/grok-4.20-non-reasoning"
16365
+ "vercel": "spacexai/grok-4.20-non-reasoning"
16270
16366
  },
16271
16367
  "grok-4.1-fast-non-reasoning": {
16272
- "vercel": "xai/grok-4.20-non-reasoning"
16368
+ "vercel": "spacexai/grok-4.20-non-reasoning"
16273
16369
  },
16274
16370
  "kimi-k2.6": {
16275
16371
  "workers-ai": "@cf/moonshotai/kimi-k2.6"
@@ -16686,7 +16782,44 @@ var BuiltInToolIdPrefix = {
16686
16782
  PLATFORM: "platform"
16687
16783
  };
16688
16784
 
16689
- // ../shared/dist/chunk-STHRX6ZL.mjs
16785
+ // ../shared/dist/chunk-D5RN66ZS.mjs
16786
+ function sanitizeToolNameForAiSdk(name) {
16787
+ return name.replace(/[^a-zA-Z0-9_]/g, "_").toLowerCase().replace(/_+/g, "_").replace(/^_|_$/g, "");
16788
+ }
16789
+ function toolNamesCollideForAiSdk(left, right) {
16790
+ return sanitizeToolNameForAiSdk(left) === sanitizeToolNameForAiSdk(right);
16791
+ }
16792
+ var BUILTIN_TOOLS_REGISTRY = BUILTIN_TOOLS_LEAN;
16793
+ function formatSystemToolId(tool) {
16794
+ const prefix = tool.idPrefix ?? BuiltInToolIdPrefix.BUILTIN;
16795
+ return `${prefix}:${tool.id}`;
16796
+ }
16797
+ function getAllBuiltInTools(opts) {
16798
+ return BUILTIN_TOOLS_REGISTRY.filter(
16799
+ (tool) => !tool.hidden && !(opts?.hideExperimental && tool.experimental)
16800
+ );
16801
+ }
16802
+ function getBuiltInToolById(toolId) {
16803
+ const cleanId = toolId.replace(/^(builtin|platform):/, "");
16804
+ return BUILTIN_TOOLS_REGISTRY.find(
16805
+ (tool) => tool.id === cleanId || tool.aliases?.includes(cleanId)
16806
+ );
16807
+ }
16808
+ function isToolCompatibleWithModel(toolId, modelId, provider) {
16809
+ const tool = getBuiltInToolById(toolId);
16810
+ if (!tool) return false;
16811
+ const providerKey = provider;
16812
+ if (!tool.providers.includes(providerKey) && !tool.providers.includes(BuiltInToolProvider.MULTI)) {
16813
+ return false;
16814
+ }
16815
+ if (!tool.modelCompatibility || tool.modelCompatibility.length === 0) {
16816
+ return true;
16817
+ }
16818
+ const compatibility = tool.modelCompatibility.find((c2) => c2.provider === providerKey);
16819
+ if (!compatibility) return true;
16820
+ if (compatibility.models.length === 0) return true;
16821
+ return compatibility.models.some((m2) => modelId.includes(m2));
16822
+ }
16690
16823
  var DEFAULT_BEDROCK_REGION = "us-east-1";
16691
16824
  var DEFAULT_VERTEX_LOCATION = "us-central1";
16692
16825
  var PROVIDER_SECRET_SPECS = [
@@ -16795,37 +16928,6 @@ function resolveModelOptionalSettings(model) {
16795
16928
  }
16796
16929
  return [];
16797
16930
  }
16798
- var BUILTIN_TOOLS_REGISTRY = BUILTIN_TOOLS_LEAN;
16799
- function formatSystemToolId(tool) {
16800
- const prefix = tool.idPrefix ?? BuiltInToolIdPrefix.BUILTIN;
16801
- return `${prefix}:${tool.id}`;
16802
- }
16803
- function getAllBuiltInTools(opts) {
16804
- return BUILTIN_TOOLS_REGISTRY.filter(
16805
- (tool) => !tool.hidden && !(opts?.hideExperimental && tool.experimental)
16806
- );
16807
- }
16808
- function getBuiltInToolById(toolId) {
16809
- const cleanId = toolId.replace(/^(builtin|platform):/, "");
16810
- return BUILTIN_TOOLS_REGISTRY.find(
16811
- (tool) => tool.id === cleanId || tool.aliases?.includes(cleanId)
16812
- );
16813
- }
16814
- function isToolCompatibleWithModel(toolId, modelId, provider) {
16815
- const tool = getBuiltInToolById(toolId);
16816
- if (!tool) return false;
16817
- const providerKey = provider;
16818
- if (!tool.providers.includes(providerKey) && !tool.providers.includes(BuiltInToolProvider.MULTI)) {
16819
- return false;
16820
- }
16821
- if (!tool.modelCompatibility || tool.modelCompatibility.length === 0) {
16822
- return true;
16823
- }
16824
- const compatibility = tool.modelCompatibility.find((c2) => c2.provider === providerKey);
16825
- if (!compatibility) return true;
16826
- if (compatibility.models.length === 0) return true;
16827
- return compatibility.models.some((m2) => modelId.includes(m2));
16828
- }
16829
16931
 
16830
16932
  // ../shared/dist/chunk-CZYEGUYG.mjs
16831
16933
  var apiReleaseChannelSchema = external_exports.enum(["staging", "production"]);
@@ -17109,7 +17211,7 @@ var recordCollectionSchemaSchema = external_exports.strictObject({
17109
17211
  additionalProperties: external_exports.boolean().optional()
17110
17212
  }).superRefine((schema, ctx) => addSemanticIssues(schema, ctx));
17111
17213
 
17112
- // ../shared/dist/chunk-YFKHFG7R.mjs
17214
+ // ../shared/dist/chunk-PFWPHO6A.mjs
17113
17215
  var MCPServerCategory = {
17114
17216
  COMMUNICATION: "communication",
17115
17217
  PRODUCTIVITY: "productivity",
@@ -17383,7 +17485,11 @@ var SURFACE_TYPE_METADATA = {
17383
17485
  interactiveUI: "generative",
17384
17486
  inboundMediaSupport: true,
17385
17487
  consumerType: "human",
17386
- approvalCapture: "native-controls",
17488
+ // Client Chat has no authenticated decision rail that can return an
17489
+ // owner-approved result to the visitor's session. The browser must not
17490
+ // approve its own gated tool call, so reachable approvals are rejected
17491
+ // before execution rather than exposed as native controls.
17492
+ approvalCapture: "none",
17387
17493
  reasoningVisibility: "pass_through",
17388
17494
  markdownDialect: "mdx",
17389
17495
  threadModel: "flat",
@@ -17696,7 +17802,7 @@ var SURFACE_TYPE_METADATA = {
17696
17802
  // wrong without imposing a hard truncate that would clip mid-thought.
17697
17803
  maxResponseLength: 1200,
17698
17804
  executionHint: [
17699
- "You are responding via iMessage. Hard rules:",
17805
+ "You are responding via iMessage. Channel defaults:",
17700
17806
  "- Plain text only. No markdown \u2014 no **bold**, no # headings, no - bullets, no `code`, no > quotes, no fenced code blocks.",
17701
17807
  "- 1\u20133 sentences per reply, under 300 characters total when possible.",
17702
17808
  "- Texting tone: conversational, lowercase is fine, contractions welcome.",
@@ -17962,7 +18068,11 @@ var SURFACE_TYPE_METADATA = {
17962
18068
  // @snake-case-ok: surface type identifier
17963
18069
  "hosted-page": {
17964
18070
  description: "White-label hosted page (dotapp): a publisher-branded web surface served from a claimed subdomain that embeds the product for signed-in end users. Dispatch delegates to the product chat endpoint via a co-provisioned client token.",
17965
- useCases: ["white-label customer portals", "branded assistant pages", "publisher-hosted support"],
18071
+ useCases: [
18072
+ "white-label customer portals",
18073
+ "branded assistant pages",
18074
+ "publisher-hosted support"
18075
+ ],
17966
18076
  examples: ["Publisher-hosted support portal", "Branded customer assistant page"],
17967
18077
  // Not in the dashboard picker or MCP create_surface enums — internal /
17968
18078
  // API-only today. Runtime trait lookups still resolve; agent-facing
@@ -20048,7 +20158,7 @@ function resolveFallback(parsed, context, tracking, options = {}) {
20048
20158
  }
20049
20159
  var templateEngine = new SimpleTemplateEngine();
20050
20160
 
20051
- // ../shared/dist/chunk-SOKXZLOQ.mjs
20161
+ // ../shared/dist/chunk-4R2DUEEJ.mjs
20052
20162
  function unwrapVectorSourceTemplate(source) {
20053
20163
  const trimmed2 = source.trim();
20054
20164
  if (!trimmed2.startsWith("{{") || !trimmed2.endsWith("}}")) return source;
@@ -21926,6 +22036,13 @@ function stripTrailingChars(value, char) {
21926
22036
  }
21927
22037
  return end === value.length ? value : value.slice(0, end);
21928
22038
  }
22039
+ var RUNTYPE_SET_STATE_TOOL_NAME = "runtype_set_state";
22040
+ function isReservedRuntypeToolName(name) {
22041
+ return toolNamesCollideForAiSdk(name, RUNTYPE_SET_STATE_TOOL_NAME);
22042
+ }
22043
+ function reservedToolNameMessage(subject, name) {
22044
+ return `${subject} "${name}" collides with the reserved tool name "${RUNTYPE_SET_STATE_TOOL_NAME}" (the agent state write tool). Tool names are lowercased and non-alphanumeric characters become "_" before the model sees them, so every spelling that normalizes to it is reserved with it. "runtype_" is a reserved tool namespace. Rename the tool.`;
22045
+ }
21929
22046
  var configurationStatusSchema = external_exports.enum(["configured", "needs_configuration", "invalid"]);
21930
22047
  var secretDocsUrlSchema = external_exports.url({ protocol: /^https$/ }).max(2048);
21931
22048
  var secretRequirementSourceSchema = external_exports.object({
@@ -25589,6 +25706,39 @@ function validateReservedIdentityVariables(flowSteps, buckets, skipStepIndices)
25589
25706
  }
25590
25707
  }
25591
25708
  }
25709
+ var RESERVED_TOOL_NAME_CODE = "RESERVED_TOOL_NAME";
25710
+ function validateReservedToolNames(flowSteps, buckets) {
25711
+ for (const [stepIndex, step] of flowSteps.entries()) {
25712
+ if (!isObjectRecord(step.config)) continue;
25713
+ const tools = step.config.tools;
25714
+ if (!isObjectRecord(tools)) continue;
25715
+ const runtimeTools = tools.runtimeTools;
25716
+ if (!Array.isArray(runtimeTools)) continue;
25717
+ for (const [toolIndex, tool] of runtimeTools.entries()) {
25718
+ if (!isObjectRecord(tool)) continue;
25719
+ const name = tool.name;
25720
+ if (typeof name !== "string" || !isReservedRuntypeToolName(name)) continue;
25721
+ addIssue(
25722
+ "error",
25723
+ {
25724
+ code: RESERVED_TOOL_NAME_CODE,
25725
+ // Single-sourced with the api's author-time reject and the FPO agent
25726
+ // validator: one author sees this text from whichever lane catches it
25727
+ // first, and three hand-copies drift with nothing comparing them.
25728
+ message: reservedToolNameMessage("Runtime tool", name),
25729
+ path: `flowSteps[${stepIndex}].config.tools.runtimeTools[${toolIndex}].name`,
25730
+ step: { index: stepIndex, name: step.name, type: step.type },
25731
+ details: {
25732
+ name,
25733
+ reservedName: RUNTYPE_SET_STATE_TOOL_NAME,
25734
+ sanitizedName: sanitizeToolNameForAiSdk(name)
25735
+ }
25736
+ },
25737
+ buckets
25738
+ );
25739
+ }
25740
+ }
25741
+ }
25592
25742
  function promptResponseFormatIsNonJson(responseFormat) {
25593
25743
  if (typeof responseFormat !== "string") return true;
25594
25744
  return responseFormat.trim().toLowerCase() !== "json";
@@ -25667,8 +25817,9 @@ function validatePromptSystemPromptVolatility(flowSteps, buckets) {
25667
25817
  }
25668
25818
  }
25669
25819
  var APPROVAL_ENFORCED_ON_ATTENDED_SURFACES_ONLY_CODE = "APPROVAL_ENFORCED_ON_ATTENDED_SURFACES_ONLY";
25670
- var APPROVAL_ATTENDED_SURFACES = ["dispatch", "client-chat", "agent-execute"];
25820
+ var APPROVAL_ATTENDED_SURFACES = ["dispatch", "agent-execute"];
25671
25821
  var APPROVAL_UNATTENDED_SURFACES = [
25822
+ "client-chat",
25672
25823
  "schedule",
25673
25824
  "webhook",
25674
25825
  "batch",
@@ -25677,6 +25828,10 @@ var APPROVAL_UNATTENDED_SURFACES = [
25677
25828
  "mcp",
25678
25829
  "a2a"
25679
25830
  ];
25831
+ var APPROVAL_PREFLIGHT_REJECTED_SURFACES = ["client-chat"];
25832
+ var APPROVAL_LEGACY_FOLD_SURFACES = APPROVAL_UNATTENDED_SURFACES.filter(
25833
+ (surface) => surface !== "client-chat"
25834
+ );
25680
25835
  function validatePromptApprovalSurfaceEnforcement(flowSteps, buckets) {
25681
25836
  for (const [stepIndex, step] of flowSteps.entries()) {
25682
25837
  if (step.enabled === false) continue;
@@ -25686,18 +25841,20 @@ function validatePromptApprovalSurfaceEnforcement(flowSteps, buckets) {
25686
25841
  "warning",
25687
25842
  {
25688
25843
  code: APPROVAL_ENFORCED_ON_ATTENDED_SURFACES_ONLY_CODE,
25689
- message: `Step "${step.name}" arms a human approval gate (config.tools.approval.require), which is enforced only on attended surfaces that can present the prompt and resume the run: interactive dispatch, client chat, and agent execute. On unattended surfaces (${APPROVAL_UNATTENDED_SURFACES.join(", ")}) the flow runs on the legacy engine, which arms an approval gate only from the agent it dispatches and never from a flow step's own tools.approval, so these tools run without waiting for a decision. If they must not run unattended, keep this flow on attended surfaces, or move the approval requirement onto the agent an unattended surface dispatches so the gate travels with it.`,
25844
+ message: `Step "${step.name}" arms a human approval gate (config.tools.approval.require), which is enforced only on attended surfaces that can present the prompt and resume the run: interactive dispatch and agent execute. Client chat rejects approval-gated execution because it has no secure continuation channel back to the visitor. On the other unattended surfaces (${APPROVAL_LEGACY_FOLD_SURFACES.join(", ")}) the flow runs on the legacy engine, which arms an approval gate only from the agent it dispatches and never from a flow step's own tools.approval, so these tools run without waiting for a decision. If they must not run unattended, keep this flow on attended surfaces, or move the approval requirement onto the agent an unattended surface dispatches so the gate travels with it.`,
25690
25845
  path: `flowSteps[${stepIndex}].config.tools.approval`,
25691
25846
  step: { index: stepIndex, name: step.name, type: step.type },
25692
25847
  details: {
25693
25848
  attendedSurfaces: [...APPROVAL_ATTENDED_SURFACES],
25694
- unattendedSurfaces: [...APPROVAL_UNATTENDED_SURFACES]
25849
+ unattendedSurfaces: [...APPROVAL_UNATTENDED_SURFACES],
25850
+ preflightRejectedSurfaces: [...APPROVAL_PREFLIGHT_REJECTED_SURFACES]
25695
25851
  }
25696
25852
  },
25697
25853
  buckets
25698
25854
  );
25699
25855
  }
25700
25856
  }
25857
+ var STORE_VECTOR_MODEL_MISSING_CODE = "STORE_VECTOR_MODEL_MISSING";
25701
25858
  var STORE_VECTOR_SOURCE_MODELLESS_CODE = "STORE_VECTOR_SOURCE_MODELLESS";
25702
25859
  function validateStoreVectorSource(flowSteps, buckets, declaredFlowInputs) {
25703
25860
  const declaredVariables = collectDeclaredFlowInputs(flowSteps, declaredFlowInputs);
@@ -25728,23 +25885,53 @@ function validateStoreVectorSource(flowSteps, buckets, declaredFlowInputs) {
25728
25885
  "warning",
25729
25886
  {
25730
25887
  code: "STORE_VECTOR_SOURCE_UNRESOLVED",
25731
- message: `Vectors source "${rawSource}" references variable "${rootVariable}", but no earlier step declares an output variable "${rootVariable}" (and it is not a flow input). This will fail at runtime with "Could not resolve vectors". Set a prior step's outputVariable to "${rootVariable}" (typically a generate-embedding step), or declare "${rootVariable}" as a flow input.`,
25888
+ message: `Vectors source "${rawSource}" references variable "${rootVariable}", but no earlier step declares an output variable "${rootVariable}" (and it is not a flow input). This will fail at runtime because vectorsSource does not resolve to an embedding. Set a prior step's outputVariable to "${rootVariable}" (typically a generate-embedding step), or declare "${rootVariable}" as a flow input.`,
25732
25889
  path: `flowSteps[${stepIndex}].config.vectorsSource`,
25733
25890
  step: { index: stepIndex, name: step.name, type: step.type },
25734
25891
  details: { vectorsSource: rawSource, rootVariable }
25735
25892
  },
25736
25893
  buckets
25737
25894
  );
25895
+ } else if (config3.inputMode === "batch" && config3.destination === "pgvector") {
25896
+ const itemsField = typeof config3.inputVariable === "string" && config3.inputVariable.trim() ? "inputVariable" : "vectorsSource";
25897
+ const itemsVariable = itemsField === "inputVariable" ? config3.inputVariable.trim() : rootVariable;
25898
+ const itemsProducer = itemsVariable ? producers.get(itemsVariable) : void 0;
25899
+ if (itemsProducer?.type === "transform-data") {
25900
+ const searchNote = hasVectorSearchInFlow ? " This flow also runs a vector-search step, which could never have found a modelless row." : "";
25901
+ addIssue(
25902
+ "recommendation",
25903
+ {
25904
+ code: STORE_VECTOR_SOURCE_MODELLESS_CODE,
25905
+ message: `This pgvector batch store reads its items from "${itemsProducer.name}" (transform-data), whose output shape is script-defined. Each batch item must carry its own non-empty "embedding_model" string: the pgvector destination refuses a modelless item at execution time (a per-item "No embedding model" failure; a modelless row would be invisible to the vector-search step's model-filtered predicate).${searchNote} Stamp embedding_model on every item \u2014 a batch-mode generate-embedding step does this automatically \u2014 or spread each generate-embedding item's envelope when enriching.`,
25906
+ path: `flowSteps[${stepIndex}].config.${itemsField}`,
25907
+ step: { index: stepIndex, name: step.name, type: step.type },
25908
+ details: {
25909
+ vectorsSource: rawSource,
25910
+ inputMode: "batch",
25911
+ itemsField,
25912
+ itemsVariable,
25913
+ producerStepType: itemsProducer.type,
25914
+ producerStepIndex: itemsProducer.index,
25915
+ producerStepName: itemsProducer.name,
25916
+ hasVectorSearchInFlow
25917
+ }
25918
+ },
25919
+ buckets
25920
+ );
25921
+ }
25738
25922
  } else if (producer && config3.inputMode !== "batch" && config3.destination === "pgvector") {
25739
25923
  const dropsEnvelope = producer.type === "generate-embedding" && referencePath === "embedding";
25740
25924
  const isTransform = producer.type === "transform-data";
25741
25925
  if (dropsEnvelope || isTransform) {
25742
- const searchNote = hasVectorSearchInFlow ? " This flow also runs a vector-search step, so the row stored here would not come back from it." : "";
25743
- const message = dropsEnvelope ? `Vectors source "${rawSource}" reads "${referencePath}" off "${producer.name}" (generate-embedding), which extracts only the vector and drops the envelope's model and dimensions. store-vector has no embeddingModel config field, so the embedding_model column stays NULL on a first store and vector search (embedding_model = $model) never matches NULL \u2014 the row is stored but unfindable.${searchNote} Reference the whole output variable ("${rootVariable}") so the model and dimensions travel with the vector.` : `Vectors source "${rawSource}" comes from "${producer.name}" (transform-data), whose output shape is script-defined. store-vector has no embeddingModel config field: unless the script preserves the generate-embedding envelope's "model" string and numeric "dimensions", the embedding_model column stays NULL on a first store and vector search (embedding_model = $model) never matches NULL. Fabricating BOTH keys with unrelated values (e.g. the LLM model that produced the text) is worse \u2014 it passes the model-carrier check and overwrites a previously-correct embedding_model.${searchNote} Spread the whole generate-embedding envelope when enriching (e.g. { ...embeddingOutput, ...extras }), or feed store-vector from the generate-embedding output directly.`;
25926
+ const searchNote = hasVectorSearchInFlow ? " This flow also runs a vector-search step, which could never have found the row a modelless store would have written." : "";
25927
+ const eh = config3.errorHandling;
25928
+ const swallowsOnContinue = eh === "continue" || eh === "default" || isObjectRecord(eh) && (eh.onError === "continue" || eh.onError === "default");
25929
+ const executionOutcome = swallowsOnContinue ? `has its store refused and swallowed at execution time (your errorHandling: 'continue' substitutes the default value; nothing is stored)` : `fails at execution time`;
25930
+ const message = dropsEnvelope ? `Vectors source "${rawSource}" reads "${referencePath}" off "${producer.name}" (generate-embedding), which extracts only the vector and drops the envelope's model and dimensions. store-vector has no embeddingModel config field, and the pgvector destination requires the embedding model (the embedding_model column is part of the vector-search step's model-filtered predicate, and the label must describe the stored vector), so this step ${executionOutcome} instead of storing a row model-filtered vector search could never find.${searchNote} Reference the whole output variable ("${rootVariable}") so the model and dimensions travel with the vector.` : `Vectors source "${rawSource}" comes from "${producer.name}" (transform-data), whose output shape is script-defined. store-vector has no embeddingModel config field: unless the script preserves the generate-embedding envelope's "model" string and numeric "dimensions", the pgvector destination refuses the store at execution time (a modelless row would be invisible to the vector-search step's model-filtered predicate). Fabricating BOTH keys with unrelated values (e.g. the LLM model that produced the text) is worse \u2014 it passes the model-carrier check and overwrites a previously-correct embedding_model.${searchNote} Spread the whole generate-embedding envelope when enriching (e.g. { ...embeddingOutput, ...extras }), or feed store-vector from the generate-embedding output directly.`;
25744
25931
  addIssue(
25745
- "recommendation",
25932
+ dropsEnvelope ? "error" : "recommendation",
25746
25933
  {
25747
- code: STORE_VECTOR_SOURCE_MODELLESS_CODE,
25934
+ code: dropsEnvelope ? STORE_VECTOR_MODEL_MISSING_CODE : STORE_VECTOR_SOURCE_MODELLESS_CODE,
25748
25935
  message,
25749
25936
  path: `flowSteps[${stepIndex}].config.vectorsSource`,
25750
25937
  step: { index: stepIndex, name: step.name, type: step.type },
@@ -26853,6 +27040,7 @@ function collectFlowStructureIssues(flowData, deps, buckets) {
26853
27040
  deps.declaredFlowInputs
26854
27041
  );
26855
27042
  validateReservedIdentityVariables(flowData.flowSteps, buckets, conditionalStepsExceedingDepth);
27043
+ validateReservedToolNames(flowData.flowSteps, buckets);
26856
27044
  validateUpsertRecordSourceShape(flowData.flowSteps, buckets);
26857
27045
  validateStoreVectorSource(flowData.flowSteps, buckets, deps.declaredFlowInputs);
26858
27046
  validateConditionExpressions(flowData.flowSteps, buckets, conditionalStepsExceedingDepth);
@@ -26904,6 +27092,39 @@ var SERIALIZED_HELPERS_SOURCE = `
26904
27092
  // Transform helper functions generated from the canonical portable factory.
26905
27093
  const helpers = (${createPortableHelpers.toString()})(${parseHTMLWithRegex.toString()})
26906
27094
  `.trim();
27095
+ function extractSecretReferences(template) {
27096
+ const keys = /* @__PURE__ */ new Set();
27097
+ let match;
27098
+ const regex = new RegExp(SECRET_REF_PATTERN.source, "g");
27099
+ while ((match = regex.exec(template)) !== null) {
27100
+ const key = match[1];
27101
+ if (key) keys.add(key);
27102
+ }
27103
+ return Array.from(keys);
27104
+ }
27105
+ function extractSecretReferencesFromAnyValue(value, maxDepth = 10) {
27106
+ const keys = /* @__PURE__ */ new Set();
27107
+ walk(value, 0);
27108
+ return Array.from(keys);
27109
+ function walk(v2, depth) {
27110
+ if (depth > maxDepth) return;
27111
+ if (typeof v2 === "string") {
27112
+ for (const key of extractSecretReferences(v2)) keys.add(key);
27113
+ return;
27114
+ }
27115
+ if (Array.isArray(v2)) {
27116
+ for (const item of v2) walk(item, depth + 1);
27117
+ return;
27118
+ }
27119
+ if (v2 && typeof v2 === "object") {
27120
+ for (const inner of Object.values(v2)) {
27121
+ walk(inner, depth + 1);
27122
+ }
27123
+ }
27124
+ }
27125
+ }
27126
+ var STORE_ASSET_MAX_BYTES = 25 * 1024 * 1024;
27127
+ var STORE_ASSET_MAX_BASE64_LENGTH = Math.ceil(STORE_ASSET_MAX_BYTES * (4 / 3)) + 16;
26907
27128
  var EMBEDDING_COST_PER_1K_TOKENS = Object.freeze({
26908
27129
  "text-embedding-3-small": 2e-5,
26909
27130
  // $0.02 per 1M tokens
@@ -28646,37 +28867,6 @@ var identityProofSchema = external_exports.object({
28646
28867
  }).describe(
28647
28868
  "Customer-native auth proof for the Identity Exchange. When present and the surface has a matching integration, the verified tenant/end-user replace any body-asserted tenant/endUser (which are never trusted for web-embedded callers). When Identity Exchange admission is disabled for the caller, the proof is accepted but ignored and confers no trust."
28648
28869
  );
28649
- function extractSecretReferences(template) {
28650
- const keys = /* @__PURE__ */ new Set();
28651
- let match;
28652
- const regex = new RegExp(SECRET_REF_PATTERN.source, "g");
28653
- while ((match = regex.exec(template)) !== null) {
28654
- const key = match[1];
28655
- if (key) keys.add(key);
28656
- }
28657
- return Array.from(keys);
28658
- }
28659
- function extractSecretReferencesFromAnyValue(value, maxDepth = 10) {
28660
- const keys = /* @__PURE__ */ new Set();
28661
- walk(value, 0);
28662
- return Array.from(keys);
28663
- function walk(v2, depth) {
28664
- if (depth > maxDepth) return;
28665
- if (typeof v2 === "string") {
28666
- for (const key of extractSecretReferences(v2)) keys.add(key);
28667
- return;
28668
- }
28669
- if (Array.isArray(v2)) {
28670
- for (const item of v2) walk(item, depth + 1);
28671
- return;
28672
- }
28673
- if (v2 && typeof v2 === "object") {
28674
- for (const inner of Object.values(v2)) {
28675
- walk(inner, depth + 1);
28676
- }
28677
- }
28678
- }
28679
- }
28680
28870
  var ACCOUNT_QUERY_PARAM = "account";
28681
28871
  function buildDashboardUrl(opts) {
28682
28872
  const base = stripTrailingChars(opts.baseUrl, "/");
@@ -28884,7 +29074,10 @@ var agentExternalConfigSchema = external_exports.object({
28884
29074
  auth: external_exports.record(external_exports.string(), external_exports.any()).optional(),
28885
29075
  timeout: external_exports.number().positive().optional(),
28886
29076
  retryCount: external_exports.number().int().nonnegative().optional(),
28887
- skillOrchestration: external_exports.boolean().optional()
29077
+ // Canonical enum plus the historical boolean input. The ensure path
29078
+ // normalizes booleans before persistence, so newly converged rows never
29079
+ // perpetuate the legacy representation.
29080
+ skillOrchestration: external_exports.union([external_exports.enum(["delegate", "managed"]), external_exports.boolean()]).optional()
28888
29081
  });
28889
29082
  var agentClaudeManagedConfigSchema = external_exports.object({
28890
29083
  setupMode: external_exports.enum(["create", "connect"]).optional(),
@@ -29485,7 +29678,11 @@ function mergeResults(...results) {
29485
29678
  merged.valid = merged.errors.length === 0;
29486
29679
  return merged;
29487
29680
  }
29488
- var NAMESPACE_VARIABLE_CODES = new Set(NAMESPACE_VARIABLE_REFERENCE_CODES);
29681
+ var FORWARDED_CORE_CODES = /* @__PURE__ */ new Set([
29682
+ ...NAMESPACE_VARIABLE_REFERENCE_CODES,
29683
+ RESERVED_TOOL_NAME_CODE,
29684
+ STORE_VECTOR_MODEL_MISSING_CODE
29685
+ ]);
29489
29686
  function validateFlowDefinition(flow, capIndex, context) {
29490
29687
  const result = emptyResult();
29491
29688
  const base = `capabilities[${capIndex}].flow`;
@@ -29546,19 +29743,19 @@ function validateFlowDefinition(flow, capIndex, context) {
29546
29743
  }
29547
29744
  }
29548
29745
  }
29549
- appendNamespaceVariableIssues(flow, base, result);
29746
+ appendForwardedCoreIssues(flow, base, result);
29550
29747
  return finalize2(result);
29551
29748
  }
29552
29749
  function reprefixCorePath(corePath, base) {
29553
29750
  if (!corePath) return `${base}.steps`;
29554
29751
  return corePath.replace(/^flowSteps\[/, `${base}.steps[`);
29555
29752
  }
29556
- function appendNamespaceVariableIssues(flow, base, result) {
29753
+ function appendForwardedCoreIssues(flow, base, result) {
29557
29754
  const parsed = parseCreateFlowValidationInput({ name: flow.name, flowSteps: flow.steps });
29558
29755
  if (!parsed.success) return;
29559
29756
  const coreResult = validateFlowStructure(parsed.data);
29560
29757
  const push = (issue2, severity) => {
29561
- if (!NAMESPACE_VARIABLE_CODES.has(issue2.code)) return;
29758
+ if (!FORWARDED_CORE_CODES.has(issue2.code)) return;
29562
29759
  const bucket = severity === "error" ? result.errors : result.warnings;
29563
29760
  bucket.push(createIssue(severity, issue2.code, issue2.message, reprefixCorePath(issue2.path, base)));
29564
29761
  };
@@ -29569,6 +29766,14 @@ function finalize2(r) {
29569
29766
  r.valid = r.errors.length === 0;
29570
29767
  return r;
29571
29768
  }
29769
+ function reservedToolNameIssue(name, path20) {
29770
+ return createIssue(
29771
+ "error",
29772
+ RESERVED_TOOL_NAME_CODE,
29773
+ reservedToolNameMessage("Runtime tool", name),
29774
+ path20
29775
+ );
29776
+ }
29572
29777
  function validateAgentDefinition(agent, capIndex) {
29573
29778
  const result = emptyResult();
29574
29779
  const base = `capabilities[${capIndex}].agent`;
@@ -29627,6 +29832,10 @@ function validateFlatAgent(agent, base, result) {
29627
29832
  result.errors.push(
29628
29833
  createIssue("error", "RUNTIME_TOOL_NAME_EMPTY", "Runtime tool name is required", `${base}.toolsConfig.runtimeTools[${i}].name`)
29629
29834
  );
29835
+ } else if (isReservedRuntypeToolName(tool.name)) {
29836
+ result.errors.push(
29837
+ reservedToolNameIssue(tool.name, `${base}.toolsConfig.runtimeTools[${i}].name`)
29838
+ );
29630
29839
  }
29631
29840
  if (tool.toolType === "flow" && (!tool.config?.steps || !Array.isArray(tool.config.steps) || tool.config.steps.length === 0)) {
29632
29841
  result.warnings.push(
@@ -29656,6 +29865,10 @@ function validateNestedAgent(agent, base, result) {
29656
29865
  result.errors.push(
29657
29866
  createIssue("error", "RUNTIME_TOOL_NAME_EMPTY", "Runtime tool name is required", `${base}.config.tools.runtimeTools[${i}].name`)
29658
29867
  );
29868
+ } else if (isReservedRuntypeToolName(tool.name)) {
29869
+ result.errors.push(
29870
+ reservedToolNameIssue(tool.name, `${base}.config.tools.runtimeTools[${i}].name`)
29871
+ );
29659
29872
  }
29660
29873
  if (tool.toolType === "flow" && (!tool.config?.steps || !Array.isArray(tool.config.steps) || tool.config.steps.length === 0)) {
29661
29874
  result.warnings.push(
@@ -30819,9 +31032,9 @@ var RecordInputSchema = external_exports.object({
30819
31032
  id: external_exports.string().min(1).optional(),
30820
31033
  name: external_exports.string().min(1).optional(),
30821
31034
  type: external_exports.string().min(1).optional(),
30822
- // First-class owner field. Stored as `metadata.ownerId` and queryable via
30823
- // the `?ownerId=` conversations list filter; a top-level value overrides
30824
- // any `metadata.ownerId`.
31035
+ // First-class owner field. Persisted to the dedicated indexed `owner_id`
31036
+ // column (#3395) and queryable via the `?ownerId=` filter on the
31037
+ // conversations AND records list endpoints.
30825
31038
  ownerId: external_exports.string().min(1).optional(),
30826
31039
  metadata: external_exports.record(external_exports.string(), external_exports.any()).optional()
30827
31040
  }).refine((data) => data.id || data.name && data.type, {
@@ -31129,16 +31342,17 @@ var DispatchRequestEnvelopeSchema = external_exports.object({
31129
31342
  debugMode: external_exports.boolean().optional().default(false),
31130
31343
  loggingPolicy: external_exports.enum(["default", "on", "off"]).optional(),
31131
31344
  useRuntimePackage: external_exports.boolean().optional().describe(
31132
- "For FLOW dispatches this compatibility field is accepted but ignored: eligible flows always use the @runtypelabs/runtime lane, while ineligible flows still fold to legacy silently. Agent dispatches still require an explicit `true` and remain subject to their separate runtime-agent rollout gate."
31345
+ "Compatibility execution-lane OPT-OUT. For FLOW dispatches the field is accepted but ignored: eligible flows always use the @runtypelabs/runtime lane, while ineligible flows still fold to legacy silently. For AGENT dispatches, an eligible agent now uses the @runtypelabs/runtime lane by DEFAULT when this field is omitted; only an explicit `false` forces the legacy engine. Definitions the runtime lane cannot execute faithfully still fold to legacy on their own."
31133
31346
  ),
31134
31347
  /** Route prompt model calls through an attached dashboard browser. */
31135
31348
  localInference: LocalInferenceSelectionSchema.optional(),
31136
31349
  /**
31137
31350
  * Resume a checkpointed agent-loop execution from its latest (or a
31138
- * specific) iteration-boundary snapshot. Runtime-path only: requires
31139
- * `useRuntimePackage: true` and an `agent` input — the legacy engine
31140
- * has no checkpoint hook, so sending this without the runtime path is
31141
- * rejected (400) rather than silently starting a fresh conversation.
31351
+ * specific) iteration-boundary snapshot. Runtime-path only: requires a
31352
+ * runtime-eligible `agent` input and no `useRuntimePackage: false`
31353
+ * opt-out — the legacy engine has no checkpoint hook, so sending this
31354
+ * without the runtime path is rejected (400) rather than silently
31355
+ * starting a fresh conversation.
31142
31356
  * `executionId` is the handle carried on every agent SSE event of the
31143
31357
  * original run. Per the runtime resume contract, `messages` on this
31144
31358
  * request are APPENDED after the snapshot's conversation history —
@@ -31207,12 +31421,12 @@ var DispatchRequestSchema = external_exports.union([
31207
31421
  DispatchRequestEnvelopeSchema.extend({ agent: AgentInputSchema })
31208
31422
  ]).superRefine((data, ctx) => {
31209
31423
  if (!data.options.localInference) return;
31210
- const runtimeLaneDisabled = data.agent != null && data.options.useRuntimePackage !== true;
31424
+ const runtimeLaneDisabled = data.agent != null && data.options.useRuntimePackage === false;
31211
31425
  if (runtimeLaneDisabled) {
31212
31426
  ctx.addIssue({
31213
31427
  code: "custom",
31214
31428
  path: ["options", "useRuntimePackage"],
31215
- message: data.agent != null ? "Local agent inference requires useRuntimePackage to be enabled" : "Local flow inference cannot use the legacy engine"
31429
+ message: data.agent != null ? "Local agent inference cannot use the legacy engine; remove useRuntimePackage: false" : "Local flow inference cannot use the legacy engine"
31216
31430
  });
31217
31431
  }
31218
31432
  if (data.options.modelOverride) {
@@ -31274,7 +31488,8 @@ var RuntimeProxyMessageSchema = external_exports.object({
31274
31488
  var RuntimeProxyToolSchema = external_exports.object({
31275
31489
  name: external_exports.string().min(1),
31276
31490
  description: external_exports.string(),
31277
- parametersSchema: external_exports.record(external_exports.string(), external_exports.unknown())
31491
+ parametersSchema: external_exports.record(external_exports.string(), external_exports.unknown()),
31492
+ builtinNameCompatibility: external_exports.object({ canonicalToolId: external_exports.string(), legacyModelName: external_exports.string() }).optional()
31278
31493
  });
31279
31494
  var RuntimeProxyProviderToolSchema = external_exports.object({
31280
31495
  id: external_exports.string().min(1),
@@ -31390,7 +31605,11 @@ var RuntimeStoredRecordSchema = external_exports.object({
31390
31605
  metadataLabels: external_exports.record(external_exports.string(), external_exports.string()).nullable().optional(),
31391
31606
  schemaValid: external_exports.boolean().nullable().optional(),
31392
31607
  messages: external_exports.array(external_exports.object({ role: external_exports.string(), content: external_exports.string() })).nullable().optional(),
31393
- productSurfaceId: external_exports.string().nullable().optional()
31608
+ productSurfaceId: external_exports.string().nullable().optional(),
31609
+ // First-class owner key (#3395) — part of the same projection as the public
31610
+ // GET /v1/records response (recordResponseColumns), which surfaces the column
31611
+ // value. Optional for api/runtime version skew, like the columns above.
31612
+ ownerId: external_exports.string().nullable().optional()
31394
31613
  });
31395
31614
  var FILTER_FIELD_NAME_RE = /^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,63}$/;
31396
31615
  var runtimeRecordFilterConditionSchema = external_exports.object({
@@ -31916,6 +32135,7 @@ var appRoutingDocSchema = external_exports.object({
31916
32135
  });
31917
32136
  var DEFAULT_STEP_TIMEOUT_MS = 5 * 60 * 1e3;
31918
32137
  var DEFAULT_FLOW_TIMEOUT_MS = 15 * 60 * 1e3;
32138
+ var DEFAULT_AGENT_WALL_CLOCK_TIMEOUT_MS = 5 * 60 * 1e3;
31919
32139
 
31920
32140
  // src/config/env.ts
31921
32141
  function getApiUrl() {
@@ -33900,10 +34120,24 @@ function renderMessageContentWithImages(content, protocol) {
33900
34120
  }
33901
34121
 
33902
34122
  // src/commands/records.ts
34123
+ function resolveOwnerIdUpdate(options) {
34124
+ if (options.clearOwner && options.ownerId !== void 0) {
34125
+ throw new Error("--owner-id and --clear-owner are mutually exclusive");
34126
+ }
34127
+ if (options.clearOwner) return { ownerId: null };
34128
+ if (options.ownerId === void 0) return void 0;
34129
+ if (options.ownerId.trim() === "") {
34130
+ throw new Error("--owner-id cannot be empty; use --clear-owner to remove the owner");
34131
+ }
34132
+ return { ownerId: options.ownerId };
34133
+ }
33903
34134
  function printRecordDetail(data, imageProtocol) {
33904
34135
  console.log(` ID: ${data.id}`);
33905
34136
  console.log(` Name: ${data.name}`);
33906
34137
  console.log(` Type: ${data.type}`);
34138
+ if (data.ownerId) {
34139
+ console.log(` Owner: ${data.ownerId}`);
34140
+ }
33907
34141
  if (data.metadata) {
33908
34142
  console.log(` Metadata: ${JSON.stringify(data.metadata, null, 2)}`);
33909
34143
  }
@@ -33929,13 +34163,14 @@ Messages (${messages.length}):`));
33929
34163
  }
33930
34164
  }
33931
34165
  var recordsCommand = new Command3("records").description("Manage records");
33932
- recordsCommand.command("list").description("List all records").option("--type <type>", "Filter by record type").option("--limit <n>", "Limit number of results", "20").option("--cursor <cursor>", "Pagination cursor for the next page").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(
34166
+ recordsCommand.command("list").description("List all records").option("--type <type>", "Filter by record type").option("--owner-id <id>", "Filter by owner key (the indexed owner_id column)").option("--limit <n>", "Limit number of results", "20").option("--cursor <cursor>", "Pagination cursor for the next page").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(
33933
34167
  async (options) => {
33934
34168
  const apiKey = await ensureAuth();
33935
34169
  if (!apiKey) return;
33936
34170
  const client = createCliClient(apiKey);
33937
34171
  const params = { limit: options.limit };
33938
34172
  if (options.type) params.type = options.type;
34173
+ if (options.ownerId) params.ownerId = options.ownerId;
33939
34174
  if (options.cursor) params.cursor = options.cursor;
33940
34175
  if (!isTTY(options) || options.json) {
33941
34176
  try {
@@ -34047,6 +34282,7 @@ recordsCommand.command("get <id>").description("Get record details").option("--j
34047
34282
  { label: "ID", value: record2.id, color: "green" },
34048
34283
  { label: "Name", value: record2.name },
34049
34284
  { label: "Type", value: record2.type },
34285
+ { label: "Owner", value: record2.ownerId ?? null },
34050
34286
  {
34051
34287
  label: "Metadata",
34052
34288
  value: record2.metadata ? JSON.stringify(record2.metadata) : null
@@ -34191,7 +34427,7 @@ recordsCommand.command("costs <id>").description("Get aggregated cost breakdown
34191
34427
  const { waitUntilExit } = render3(React3.createElement(App));
34192
34428
  await waitUntilExit();
34193
34429
  });
34194
- recordsCommand.command("create").description("Create a new record").requiredOption("-n, --name <name>", "Record name").requiredOption("-t, --type <type>", "Record type").option("-m, --metadata <json>", "Metadata as JSON string").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(
34430
+ recordsCommand.command("create").description("Create a new record").requiredOption("-n, --name <name>", "Record name").requiredOption("-t, --type <type>", "Record type").option("-m, --metadata <json>", "Metadata as JSON string").option("--owner-id <id>", "Owner key for the record (the indexed owner_id column)").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(
34195
34431
  async (options) => {
34196
34432
  const apiKey = await ensureAuth();
34197
34433
  if (!apiKey) return;
@@ -34205,11 +34441,13 @@ recordsCommand.command("create").description("Create a new record").requiredOpti
34205
34441
  process.exit(1);
34206
34442
  }
34207
34443
  }
34444
+ const ownerFields = options.ownerId !== void 0 ? { ownerId: options.ownerId } : {};
34208
34445
  if (!isTTY(options) || options.json) {
34209
34446
  try {
34210
34447
  const data = await client.post("/records", {
34211
34448
  name: options.name,
34212
34449
  type: options.type,
34450
+ ...ownerFields,
34213
34451
  metadata
34214
34452
  });
34215
34453
  if (options.json) {
@@ -34235,6 +34473,7 @@ recordsCommand.command("create").description("Create a new record").requiredOpti
34235
34473
  client.post("/records", {
34236
34474
  name: options.name,
34237
34475
  type: options.type,
34476
+ ...ownerFields,
34238
34477
  metadata
34239
34478
  }).then((data) => {
34240
34479
  setResult(data);
@@ -34323,7 +34562,7 @@ recordsCommand.command("delete <id>").description("Delete a record").option("--t
34323
34562
  const { waitUntilExit } = render3(React3.createElement(App));
34324
34563
  await waitUntilExit();
34325
34564
  });
34326
- recordsCommand.command("update <id>").description("Update a record (name, type, and/or metadata)").option("-n, --name <name>", "New record name").option("-t, --type <type>", "New record type").option("-m, --metadata <json>", "Metadata as JSON string").option("--from-file <path>", "Read the full update payload from a JSON file").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(
34565
+ recordsCommand.command("update <id>").description("Update a record (name, type, and/or metadata)").option("-n, --name <name>", "New record name").option("-t, --type <type>", "New record type").option("-m, --metadata <json>", "Metadata as JSON string").option("--owner-id <id>", "Reassign the owner key (the indexed owner_id column)").option("--clear-owner", "Clear the owner key (sends an explicit null)").option("--from-file <path>", "Read the full update payload from a JSON file").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(
34327
34566
  async (id, options) => {
34328
34567
  const apiKey = await ensureAuth();
34329
34568
  if (!apiKey) return;
@@ -34342,9 +34581,18 @@ recordsCommand.command("update <id>").description("Update a record (name, type,
34342
34581
  process.exit(1);
34343
34582
  }
34344
34583
  }
34584
+ try {
34585
+ const ownerUpdate = resolveOwnerIdUpdate(options);
34586
+ if (ownerUpdate) body.ownerId = ownerUpdate.ownerId;
34587
+ } catch (error51) {
34588
+ console.error(chalk6.red(error51 instanceof Error ? error51.message : String(error51)));
34589
+ process.exit(1);
34590
+ }
34345
34591
  if (Object.keys(body).length === 0) {
34346
34592
  console.error(
34347
- chalk6.red("Error: provide at least one of --name, --type, --metadata, or --from-file")
34593
+ chalk6.red(
34594
+ "Error: provide at least one of --name, --type, --metadata, --owner-id, --clear-owner, or --from-file"
34595
+ )
34348
34596
  );
34349
34597
  process.exit(1);
34350
34598
  }
@@ -34359,6 +34607,7 @@ recordsCommand.command("update <id>").description("Update a record (name, type,
34359
34607
  console.log(` ID: ${chalk6.green(data.id)}`);
34360
34608
  console.log(` Name: ${data.name}`);
34361
34609
  console.log(` Type: ${data.type}`);
34610
+ console.log(` Owner: ${data.ownerId ?? "(none)"}`);
34362
34611
  if (data.metadata) {
34363
34612
  console.log(` Metadata: ${JSON.stringify(data.metadata)}`);
34364
34613
  }
@@ -34384,6 +34633,7 @@ recordsCommand.command("update <id>").description("Update a record (name, type,
34384
34633
  { label: "ID", value: data.id, color: "green" },
34385
34634
  { label: "Name", value: data.name },
34386
34635
  { label: "Type", value: data.type },
34636
+ { label: "Owner", value: data.ownerId ?? null },
34387
34637
  {
34388
34638
  label: "Metadata",
34389
34639
  value: data.metadata ? JSON.stringify(data.metadata) : null,
@@ -34561,48 +34811,49 @@ recordsCommand.command("bulk-edit").description("Bulk edit record metadata (payl
34561
34811
  const { waitUntilExit } = render3(React3.createElement(App));
34562
34812
  await waitUntilExit();
34563
34813
  });
34564
- recordsCommand.command("export").description("Export records to a file").option("--type <type>", "Filter by record type").option("--limit <n>", "Maximum records to export", "100").option("-o, --output <file>", "Output file path").option("--format <format>", "Export format (json, csv)", "json").action(async (options) => {
34565
- const apiKey = await ensureAuth();
34566
- if (!apiKey) return;
34567
- console.log(chalk6.gray("Exporting records..."));
34568
- try {
34569
- const client = createCliClient(apiKey);
34570
- const params = { limit: options.limit };
34571
- if (options.type) params.type = options.type;
34572
- const data = await client.get("/records", params);
34573
- const records = data.data ?? [];
34574
- if (records.length === 0) {
34575
- console.log(chalk6.yellow("No records to export"));
34576
- return;
34577
- }
34578
- let content;
34579
- if (options.format === "csv") {
34580
- const headers = ["id", "name", "type", "metadata"];
34581
- const rows = records.map((r) => [
34582
- r.id,
34583
- r.name,
34584
- r.type,
34585
- r.metadata ? JSON.stringify(r.metadata) : ""
34586
- ]);
34587
- content = [headers.join(","), ...rows.map((r) => r.map(csvEscape).join(","))].join("\n");
34588
- } else {
34589
- content = JSON.stringify(records, null, 2);
34814
+ recordsCommand.command("export").description("Export records to a file").option("--type <type>", "Filter by record type").option("--owner-id <id>", "Filter by owner key (the indexed owner_id column)").option("--limit <n>", "Maximum records to export", "100").option("-o, --output <file>", "Output file path").option("--format <format>", "Export format (json, csv)", "json").action(
34815
+ async (options) => {
34816
+ const apiKey = await ensureAuth();
34817
+ if (!apiKey) return;
34818
+ console.log(chalk6.gray("Exporting records..."));
34819
+ try {
34820
+ const client = createCliClient(apiKey);
34821
+ const params = { limit: options.limit };
34822
+ if (options.type) params.type = options.type;
34823
+ if (options.ownerId) params.ownerId = options.ownerId;
34824
+ const data = await client.get("/records", params);
34825
+ const records = data.data ?? [];
34826
+ if (records.length === 0) {
34827
+ console.log(chalk6.yellow("No records to export"));
34828
+ return;
34829
+ }
34830
+ let content;
34831
+ if (options.format === "csv") {
34832
+ const headers = ["id", "name", "type", "ownerId", "metadata"];
34833
+ const rows = records.map((r) => [
34834
+ r.id,
34835
+ r.name,
34836
+ r.type,
34837
+ r.ownerId ?? "",
34838
+ r.metadata ? JSON.stringify(r.metadata) : ""
34839
+ ]);
34840
+ content = [headers.join(","), ...rows.map((r) => r.map(csvEscape).join(","))].join("\n");
34841
+ } else {
34842
+ content = JSON.stringify(records, null, 2);
34843
+ }
34844
+ const filename = options.output || `records-export-${Date.now()}.${options.format === "csv" ? "csv" : "json"}`;
34845
+ writeFileSync(filename, content);
34846
+ console.log(chalk6.green(`Exported ${records.length} records to ${filename}`));
34847
+ } catch (error51) {
34848
+ const message = error51 instanceof Error ? error51.message : "Unknown error";
34849
+ console.error(chalk6.red(`Failed to export records: ${message}`));
34850
+ process.exit(1);
34590
34851
  }
34591
- const filename = options.output || `records-export-${Date.now()}.${options.format === "csv" ? "csv" : "json"}`;
34592
- writeFileSync(filename, content);
34593
- console.log(chalk6.green(`Exported ${records.length} records to ${filename}`));
34594
- } catch (error51) {
34595
- const message = error51 instanceof Error ? error51.message : "Unknown error";
34596
- console.error(chalk6.red(`Failed to export records: ${message}`));
34597
- process.exit(1);
34598
34852
  }
34599
- });
34853
+ );
34600
34854
  recordsCommand.command("typegen").description(
34601
34855
  "Generate TypeScript types for your schematized record collections. Writes a .d.ts that augments the @runtypelabs/sdk RecordCollections map so client.records.from(slug) types record metadata. Commit the file and re-run this in CI, diffing against the committed copy (e.g. `runtype records typegen -o runtype-records.d.ts && git diff --exit-code runtype-records.d.ts`), to catch collection-schema drift."
34602
- ).option(
34603
- "-o, --output <file>",
34604
- "Write the declarations to a file (default: print to stdout)"
34605
- ).action(async (options) => {
34856
+ ).option("-o, --output <file>", "Write the declarations to a file (default: print to stdout)").action(async (options) => {
34606
34857
  const apiKey = await ensureAuth();
34607
34858
  if (!apiKey) return;
34608
34859
  const client = createCliClient(apiKey);
@@ -39061,11 +39312,11 @@ Messages (${messages.length}):`));
39061
39312
  }
39062
39313
  }
39063
39314
  var conversationsCommand = new Command16("conversations").description("Manage conversations");
39064
- conversationsCommand.command("list").description("List your conversations").option("--limit <n>", "Limit results (defaults to the API page size)").option("--cursor <cursor>", "Pagination cursor for the next page").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(async (options) => {
39315
+ conversationsCommand.command("list").description("List your conversations").option("--owner-id <id>", "Filter by owner key (the indexed owner_id column)").option("--limit <n>", "Limit results (defaults to the API page size)").option("--cursor <cursor>", "Pagination cursor for the next page").option("--json", "Output as JSON").option("--tty", "Force TTY mode").option("--no-tty", "Force non-TTY mode").action(async (options) => {
39065
39316
  const apiKey = await ensureAuth();
39066
39317
  if (!apiKey) return;
39067
39318
  const client = createCliClient(apiKey);
39068
- const params = buildListParams(options);
39319
+ const params = buildListParams(options, { ownerId: options.ownerId });
39069
39320
  if (!isTTY(options) || options.json) {
39070
39321
  try {
39071
39322
  const data = await client.get("/conversations", params);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/cli",
3
- "version": "2.33.16",
3
+ "version": "2.34.0",
4
4
  "description": "Command-line interface for Runtype AI platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,7 +27,7 @@
27
27
  "rosie-skills": "0.8.1",
28
28
  "yaml": "^2.9.0",
29
29
  "@runtypelabs/ink-components": "0.3.7",
30
- "@runtypelabs/sdk": "9.0.0",
30
+ "@runtypelabs/sdk": "9.1.0",
31
31
  "@runtypelabs/terminal-animations": "0.2.4"
32
32
  },
33
33
  "devDependencies": {
@@ -43,7 +43,7 @@
43
43
  "tsx": "^4.7.1",
44
44
  "typescript": "^6.0.3",
45
45
  "vitest": "^4.1.0",
46
- "@runtypelabs/shared": "3.28.0"
46
+ "@runtypelabs/shared": "3.30.0"
47
47
  },
48
48
  "engines": {
49
49
  "node": ">=22.12.0"