@pushwoosh/rpc-gateway-ai-assistant 0.1.278 → 0.1.280

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/data.js CHANGED
@@ -4106,630 +4106,5 @@ export const data = {
4106
4106
  "pushwoosh.templates.v1.DeleteResponse": {
4107
4107
  "type": "I",
4108
4108
  "fields": {}
4109
- },
4110
- "pushwoosh.vibeml.v1.VibeDocument": {
4111
- "type": "I",
4112
- "fields": {
4113
- "meta": {
4114
- "type": "pushwoosh.vibeml.v1.VibeMeta"
4115
- },
4116
- "theme": {
4117
- "type": "pushwoosh.vibeml.v1.VibeTheme",
4118
- "optional": true
4119
- },
4120
- "pages": {
4121
- "type": "pushwoosh.vibeml.v1.VibePage",
4122
- "array": true
4123
- },
4124
- "attributes": {
4125
- "type": "pushwoosh.vibeml.v1.VibeAttributes",
4126
- "optional": true
4127
- },
4128
- "fonts": {
4129
- "type": "pushwoosh.vibeml.v1.VibeFont",
4130
- "array": true
4131
- },
4132
- "settings": {
4133
- "type": "pushwoosh.vibeml.v1.VibeDocumentSettings"
4134
- },
4135
- "blockVariants": {
4136
- "type": "pushwoosh.vibeml.v1.VibeBlockVariants",
4137
- "mapKeyType": "string"
4138
- }
4139
- }
4140
- },
4141
- "pushwoosh.vibeml.v1.VibeBlockVariants": {
4142
- "type": "I",
4143
- "fields": {
4144
- "byName": {
4145
- "type": "pushwoosh.vibeml.v1.VibePropsDefault",
4146
- "mapKeyType": "string"
4147
- }
4148
- }
4149
- },
4150
- "pushwoosh.vibeml.v1.VibeDocumentSettings": {
4151
- "type": "I",
4152
- "fields": {
4153
- "contentWidth": {
4154
- "type": "string"
4155
- },
4156
- "background": {
4157
- "type": "string"
4158
- }
4159
- }
4160
- },
4161
- "pushwoosh.vibeml.v1.VibeAttributes": {
4162
- "type": "I",
4163
- "fields": {
4164
- "all": {
4165
- "type": "string",
4166
- "mapKeyType": "string"
4167
- },
4168
- "byType": {
4169
- "type": "pushwoosh.vibeml.v1.VibePropsDefault",
4170
- "mapKeyType": "string"
4171
- }
4172
- }
4173
- },
4174
- "pushwoosh.vibeml.v1.VibePropsDefault": {
4175
- "type": "I",
4176
- "fields": {
4177
- "props": {
4178
- "type": "string",
4179
- "mapKeyType": "string"
4180
- }
4181
- }
4182
- },
4183
- "pushwoosh.vibeml.v1.VibeFont": {
4184
- "type": "I",
4185
- "fields": {
4186
- "name": {
4187
- "type": "string"
4188
- },
4189
- "href": {
4190
- "type": "string"
4191
- }
4192
- }
4193
- },
4194
- "pushwoosh.vibeml.v1.VibePage": {
4195
- "type": "I",
4196
- "fields": {
4197
- "id": {
4198
- "type": "string"
4199
- },
4200
- "rows": {
4201
- "type": "pushwoosh.vibeml.v1.VibeRow",
4202
- "array": true
4203
- }
4204
- }
4205
- },
4206
- "pushwoosh.vibeml.v1.VibeRow": {
4207
- "type": "I",
4208
- "fields": {
4209
- "section": {
4210
- "type": "pushwoosh.vibeml.v1.VibeSection"
4211
- },
4212
- "wrapper": {
4213
- "type": "pushwoosh.vibeml.v1.VibeWrapper"
4214
- }
4215
- },
4216
- "oneofs": {
4217
- "row": {
4218
- "oneof": [
4219
- "section",
4220
- "wrapper"
4221
- ]
4222
- }
4223
- }
4224
- },
4225
- "pushwoosh.vibeml.v1.VibeWrapper": {
4226
- "type": "I",
4227
- "fields": {
4228
- "id": {
4229
- "type": "string"
4230
- },
4231
- "props": {
4232
- "type": "string",
4233
- "mapKeyType": "string"
4234
- },
4235
- "sections": {
4236
- "type": "pushwoosh.vibeml.v1.VibeSection",
4237
- "array": true
4238
- }
4239
- }
4240
- },
4241
- "pushwoosh.vibeml.v1.VibeMeta": {
4242
- "type": "I",
4243
- "fields": {
4244
- "subject": {
4245
- "type": "string"
4246
- },
4247
- "preheader": {
4248
- "type": "string"
4249
- }
4250
- }
4251
- },
4252
- "pushwoosh.vibeml.v1.VibeTheme": {
4253
- "type": "I",
4254
- "fields": {
4255
- "colors": {
4256
- "type": "string",
4257
- "mapKeyType": "string"
4258
- },
4259
- "fontFamily": {
4260
- "type": "string"
4261
- },
4262
- "headingFontFamily": {
4263
- "type": "string"
4264
- }
4265
- }
4266
- },
4267
- "pushwoosh.vibeml.v1.VibeSection": {
4268
- "type": "I",
4269
- "fields": {
4270
- "id": {
4271
- "type": "string"
4272
- },
4273
- "props": {
4274
- "type": "string",
4275
- "mapKeyType": "string"
4276
- },
4277
- "columns": {
4278
- "type": "pushwoosh.vibeml.v1.VibeColumn",
4279
- "array": true
4280
- }
4281
- }
4282
- },
4283
- "pushwoosh.vibeml.v1.VibeColumn": {
4284
- "type": "I",
4285
- "fields": {
4286
- "id": {
4287
- "type": "string"
4288
- },
4289
- "props": {
4290
- "type": "string",
4291
- "mapKeyType": "string"
4292
- },
4293
- "children": {
4294
- "type": "pushwoosh.vibeml.v1.VibeContentBlock",
4295
- "array": true
4296
- }
4297
- }
4298
- },
4299
- "pushwoosh.vibeml.v1.VibeContentBlock": {
4300
- "type": "I",
4301
- "fields": {
4302
- "text": {
4303
- "type": "pushwoosh.vibeml.v1.VibeText"
4304
- },
4305
- "image": {
4306
- "type": "pushwoosh.vibeml.v1.VibeImage"
4307
- },
4308
- "button": {
4309
- "type": "pushwoosh.vibeml.v1.VibeButton"
4310
- },
4311
- "spacer": {
4312
- "type": "pushwoosh.vibeml.v1.VibeSpacer"
4313
- },
4314
- "divider": {
4315
- "type": "pushwoosh.vibeml.v1.VibeDivider"
4316
- },
4317
- "table": {
4318
- "type": "pushwoosh.vibeml.v1.VibeTable"
4319
- },
4320
- "buttonGroup": {
4321
- "type": "pushwoosh.vibeml.v1.VibeButtonGroup"
4322
- }
4323
- },
4324
- "oneofs": {
4325
- "block": {
4326
- "oneof": [
4327
- "text",
4328
- "image",
4329
- "button",
4330
- "spacer",
4331
- "divider",
4332
- "table",
4333
- "buttonGroup"
4334
- ]
4335
- }
4336
- }
4337
- },
4338
- "pushwoosh.vibeml.v1.VibeText": {
4339
- "type": "I",
4340
- "fields": {
4341
- "id": {
4342
- "type": "string"
4343
- },
4344
- "props": {
4345
- "type": "string",
4346
- "mapKeyType": "string"
4347
- },
4348
- "content": {
4349
- "type": "string"
4350
- },
4351
- "variant": {
4352
- "type": "string"
4353
- }
4354
- }
4355
- },
4356
- "pushwoosh.vibeml.v1.VibeImage": {
4357
- "type": "I",
4358
- "fields": {
4359
- "id": {
4360
- "type": "string"
4361
- },
4362
- "props": {
4363
- "type": "string",
4364
- "mapKeyType": "string"
4365
- }
4366
- }
4367
- },
4368
- "pushwoosh.vibeml.v1.VibeButton": {
4369
- "type": "I",
4370
- "fields": {
4371
- "id": {
4372
- "type": "string"
4373
- },
4374
- "props": {
4375
- "type": "string",
4376
- "mapKeyType": "string"
4377
- },
4378
- "content": {
4379
- "type": "string"
4380
- },
4381
- "variant": {
4382
- "type": "string"
4383
- }
4384
- }
4385
- },
4386
- "pushwoosh.vibeml.v1.VibeButtonGroup": {
4387
- "type": "I",
4388
- "fields": {
4389
- "id": {
4390
- "type": "string"
4391
- },
4392
- "props": {
4393
- "type": "string",
4394
- "mapKeyType": "string"
4395
- },
4396
- "items": {
4397
- "type": "pushwoosh.vibeml.v1.VibeButtonGroupItem",
4398
- "array": true
4399
- }
4400
- }
4401
- },
4402
- "pushwoosh.vibeml.v1.VibeButtonGroupItem": {
4403
- "type": "I",
4404
- "fields": {
4405
- "button": {
4406
- "type": "pushwoosh.vibeml.v1.VibeButton"
4407
- },
4408
- "image": {
4409
- "type": "pushwoosh.vibeml.v1.VibeImage"
4410
- }
4411
- },
4412
- "oneofs": {
4413
- "item": {
4414
- "oneof": [
4415
- "button",
4416
- "image"
4417
- ]
4418
- }
4419
- }
4420
- },
4421
- "pushwoosh.vibeml.v1.VibeSpacer": {
4422
- "type": "I",
4423
- "fields": {
4424
- "id": {
4425
- "type": "string"
4426
- },
4427
- "props": {
4428
- "type": "string",
4429
- "mapKeyType": "string"
4430
- }
4431
- }
4432
- },
4433
- "pushwoosh.vibeml.v1.VibeDivider": {
4434
- "type": "I",
4435
- "fields": {
4436
- "id": {
4437
- "type": "string"
4438
- },
4439
- "props": {
4440
- "type": "string",
4441
- "mapKeyType": "string"
4442
- }
4443
- }
4444
- },
4445
- "pushwoosh.vibeml.v1.VibeTable": {
4446
- "type": "I",
4447
- "fields": {
4448
- "id": {
4449
- "type": "string"
4450
- },
4451
- "props": {
4452
- "type": "string",
4453
- "mapKeyType": "string"
4454
- },
4455
- "rows": {
4456
- "type": "pushwoosh.vibeml.v1.VibeTableRow",
4457
- "array": true
4458
- }
4459
- }
4460
- },
4461
- "pushwoosh.vibeml.v1.VibeTableRow": {
4462
- "type": "I",
4463
- "fields": {
4464
- "header": {
4465
- "type": "boolean"
4466
- },
4467
- "cells": {
4468
- "type": "string",
4469
- "array": true
4470
- }
4471
- }
4472
- },
4473
- "pushwoosh.vibeml.v1.VibeMlService": {
4474
- "type": "S",
4475
- "key": "vibeMl",
4476
- "methods": {
4477
- "Generate": {
4478
- "request": "pushwoosh.vibeml.v1.VibeMlGenerateRequest",
4479
- "response": "pushwoosh.vibeml.v1.VibeMlGenerateResponse",
4480
- "method": "post",
4481
- "path": "/api/v1/vibeml/generate"
4482
- },
4483
- "Edit": {
4484
- "request": "pushwoosh.vibeml.v1.VibeMlEditRequest",
4485
- "response": "pushwoosh.vibeml.v1.VibeMlEditResponse",
4486
- "method": "post",
4487
- "path": "/api/v1/vibeml/edit"
4488
- },
4489
- "Restyle": {
4490
- "request": "pushwoosh.vibeml.v1.VibeMlRestyleRequest",
4491
- "response": "pushwoosh.vibeml.v1.VibeMlRestyleResponse",
4492
- "method": "post",
4493
- "path": "/api/v1/vibeml/restyle"
4494
- },
4495
- "ExtractTheme": {
4496
- "request": "pushwoosh.vibeml.v1.VibeMlExtractThemeRequest",
4497
- "response": "pushwoosh.vibeml.v1.VibeMlExtractThemeResponse",
4498
- "method": "post",
4499
- "path": "/api/v1/vibeml/extract-theme"
4500
- },
4501
- "Translate": {
4502
- "request": "pushwoosh.vibeml.v1.VibeMlTranslateRequest",
4503
- "response": "pushwoosh.vibeml.v1.VibeMlTranslateResponse",
4504
- "method": "post",
4505
- "path": "/api/v1/vibeml/translate"
4506
- }
4507
- }
4508
- },
4509
- "pushwoosh.vibeml.v1.VibeSourceFormat": {
4510
- "type": "E",
4511
- "values": [
4512
- "VIBE_SOURCE_FORMAT_UNSPECIFIED",
4513
- "VIBE_SOURCE_FORMAT_TEXT",
4514
- "VIBE_SOURCE_FORMAT_MARKDOWN",
4515
- "VIBE_SOURCE_FORMAT_HTML",
4516
- "VIBE_SOURCE_FORMAT_PDF"
4517
- ]
4518
- },
4519
- "pushwoosh.vibeml.v1.VibeSource": {
4520
- "type": "I",
4521
- "fields": {
4522
- "format": {
4523
- "type": "pushwoosh.vibeml.v1.VibeSourceFormat"
4524
- },
4525
- "content": {
4526
- "type": "string"
4527
- },
4528
- "name": {
4529
- "type": "string"
4530
- }
4531
- }
4532
- },
4533
- "pushwoosh.vibeml.v1.VibeMlGenerateRequest": {
4534
- "type": "I",
4535
- "fields": {
4536
- "prompt": {
4537
- "type": "string"
4538
- },
4539
- "application": {
4540
- "type": "string"
4541
- },
4542
- "styleDocument": {
4543
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4544
- },
4545
- "llmProvider": {
4546
- "type": "string"
4547
- },
4548
- "llmModel": {
4549
- "type": "string",
4550
- "optional": true
4551
- },
4552
- "sources": {
4553
- "type": "pushwoosh.vibeml.v1.VibeSource",
4554
- "array": true
4555
- }
4556
- }
4557
- },
4558
- "pushwoosh.vibeml.v1.VibeMlGenerateResponse": {
4559
- "type": "I",
4560
- "fields": {
4561
- "document": {
4562
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4563
- },
4564
- "summary": {
4565
- "type": "string"
4566
- }
4567
- }
4568
- },
4569
- "pushwoosh.vibeml.v1.VibeMlEditRequest": {
4570
- "type": "I",
4571
- "fields": {
4572
- "prompt": {
4573
- "type": "string"
4574
- },
4575
- "document": {
4576
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4577
- },
4578
- "application": {
4579
- "type": "string"
4580
- },
4581
- "llmProvider": {
4582
- "type": "string"
4583
- },
4584
- "llmModel": {
4585
- "type": "string",
4586
- "optional": true
4587
- },
4588
- "sources": {
4589
- "type": "pushwoosh.vibeml.v1.VibeSource",
4590
- "array": true
4591
- }
4592
- }
4593
- },
4594
- "pushwoosh.vibeml.v1.VibeMlEditResponse": {
4595
- "type": "I",
4596
- "fields": {
4597
- "document": {
4598
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4599
- },
4600
- "summary": {
4601
- "type": "string"
4602
- }
4603
- }
4604
- },
4605
- "pushwoosh.vibeml.v1.VibeMlRestyleRequest": {
4606
- "type": "I",
4607
- "fields": {
4608
- "style": {
4609
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4610
- },
4611
- "content": {
4612
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4613
- },
4614
- "application": {
4615
- "type": "string"
4616
- },
4617
- "llmProvider": {
4618
- "type": "string"
4619
- },
4620
- "llmModel": {
4621
- "type": "string",
4622
- "optional": true
4623
- }
4624
- }
4625
- },
4626
- "pushwoosh.vibeml.v1.VibeMlRestyleResponse": {
4627
- "type": "I",
4628
- "fields": {
4629
- "document": {
4630
- "type": "pushwoosh.vibeml.v1.VibeDocument"
4631
- },
4632
- "summary": {
4633
- "type": "string"
4634
- }
4635
- }
4636
- },
4637
- "pushwoosh.vibeml.v1.VibeReferenceImage": {
4638
- "type": "I",
4639
- "fields": {
4640
- "mediaType": {
4641
- "type": "string"
4642
- },
4643
- "data": {
4644
- "type": "string"
4645
- }
4646
- }
4647
- },
4648
- "pushwoosh.vibeml.v1.VibeMlExtractThemeRequest": {
4649
- "type": "I",
4650
- "fields": {
4651
- "image": {
4652
- "type": "pushwoosh.vibeml.v1.VibeReferenceImage",
4653
- "optional": true
4654
- },
4655
- "application": {
4656
- "type": "string"
4657
- },
4658
- "llmProvider": {
4659
- "type": "string"
4660
- },
4661
- "llmModel": {
4662
- "type": "string",
4663
- "optional": true
4664
- },
4665
- "sources": {
4666
- "type": "pushwoosh.vibeml.v1.VibeSource",
4667
- "array": true
4668
- },
4669
- "description": {
4670
- "type": "string"
4671
- },
4672
- "siteUrl": {
4673
- "type": "string"
4674
- }
4675
- }
4676
- },
4677
- "pushwoosh.vibeml.v1.VibeMlExtractThemeResponse": {
4678
- "type": "I",
4679
- "fields": {
4680
- "theme": {
4681
- "type": "pushwoosh.vibeml.v1.VibeTheme"
4682
- },
4683
- "logoUrl": {
4684
- "type": "string"
4685
- },
4686
- "brandVoice": {
4687
- "type": "string"
4688
- }
4689
- }
4690
- },
4691
- "pushwoosh.vibeml.v1.VibeMlTranslateRequest": {
4692
- "type": "I",
4693
- "fields": {
4694
- "application": {
4695
- "type": "string"
4696
- },
4697
- "texts": {
4698
- "type": "string",
4699
- "array": true
4700
- },
4701
- "targetLanguages": {
4702
- "type": "string",
4703
- "array": true
4704
- },
4705
- "context": {
4706
- "type": "string"
4707
- },
4708
- "llmProvider": {
4709
- "type": "string"
4710
- },
4711
- "llmModel": {
4712
- "type": "string",
4713
- "optional": true
4714
- }
4715
- }
4716
- },
4717
- "pushwoosh.vibeml.v1.VibeMlTranslatedTexts": {
4718
- "type": "I",
4719
- "fields": {
4720
- "texts": {
4721
- "type": "string",
4722
- "array": true
4723
- }
4724
- }
4725
- },
4726
- "pushwoosh.vibeml.v1.VibeMlTranslateResponse": {
4727
- "type": "I",
4728
- "fields": {
4729
- "translations": {
4730
- "type": "pushwoosh.vibeml.v1.VibeMlTranslatedTexts",
4731
- "mapKeyType": "string"
4732
- }
4733
- }
4734
4109
  }
4735
4110
  };
package/index.d.ts CHANGED
@@ -2,12 +2,10 @@ import { AgentRunner as pushwoosh_agentrunner_v1_AgentRunner } from './pushwoosh
2
2
  import { AiGenService as pushwoosh_aigen_v1_AiGenService } from './pushwoosh_aigen_v1';
3
3
  import { AssistantService as pushwoosh_accounts_assistant_v1_AssistantService } from './pushwoosh_accounts_assistant_v1';
4
4
  import { TemplatesService as pushwoosh_templates_v1_TemplatesService } from './pushwoosh_templates_v1';
5
- import { VibeMlService as pushwoosh_vibeml_v1_VibeMlService } from './pushwoosh_vibeml_v1';
6
5
  export type API = {
7
6
  agentRunner: pushwoosh_agentrunner_v1_AgentRunner;
8
7
  aiGen: pushwoosh_aigen_v1_AiGenService;
9
8
  assistant: pushwoosh_accounts_assistant_v1_AssistantService;
10
9
  templates: pushwoosh_templates_v1_TemplatesService;
11
- vibeMl: pushwoosh_vibeml_v1_VibeMlService;
12
10
  };
13
11
  export { data } from './data';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushwoosh/rpc-gateway-ai-assistant",
3
- "version": "0.1.278",
3
+ "version": "0.1.280",
4
4
  "description": "AI Assistant api gateway HTTP API Types and Data",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -73,7 +73,7 @@ export interface AiGenService {
73
73
  ExtractStyle: AiGenService_ExtractStyle;
74
74
  /**
75
75
  * ExtractTheme samples a full brand theme (every palette role + both font stacks) and
76
- * the brand voice from any mix of materials. See documents/vibeml-architecture.md.
76
+ * the brand voice from any mix of materials. See documents/aigen-brand-utilities.md.
77
77
  */
78
78
  ExtractTheme: AiGenService_ExtractTheme;
79
79
  /**
@@ -1,698 +0,0 @@
1
- import { RpcMethod } from './commonTypes';
2
- export type VibeDocument = {
3
- meta: VibeMeta;
4
- /** Optional document theme. Block-level props win over theme values. */
5
- theme?: VibeTheme;
6
- /**
7
- * Pages, in render order. MVP documents always carry exactly one page;
8
- * the repeated form is a forward-looking hook for multi-page documents
9
- * (e.g. email digests with tabs) so adding pages later is not a wire
10
- * break.
11
- */
12
- pages: VibePage[];
13
- /** Document-wide default props (MJML mj-attributes analog). Optional. */
14
- attributes?: VibeAttributes;
15
- /**
16
- * Web fonts to import (MJML mj-font analog), so font-family chains in
17
- * the theme/props can reference them. Order is not significant.
18
- */
19
- fonts: VibeFont[];
20
- /**
21
- * Document-wide rendering settings: the email canvas width and
22
- * background (the MJML mj-body width/background analog). Document-level
23
- * and independent of the optional theme — there is no body component in
24
- * the AST to carry them, and they must be settable even when no theme is
25
- * given. Optional; an absent message / empty fields = renderer defaults.
26
- */
27
- settings: VibeDocumentSettings;
28
- /**
29
- * Named styling variants ("presets") keyed by block type, e.g.
30
- * block_variants["button"] = {primary, secondary}. A block opts into one by
31
- * name via its own `variant` field (currently only VibeButton has one). Like
32
- * `attributes`, this is client-managed style: the model READS it to pick a
33
- * variant per block but never produces or edits the map itself. Optional.
34
- */
35
- blockVariants: Record<string, VibeBlockVariants>;
36
- };
37
- /**
38
- * VibeBlockVariants holds the named styling variants for one block type:
39
- * variant name ("primary", "secondary", ...) → its prop overrides. The
40
- * overrides have the same shape and semantics as VibeAttributes.by_type
41
- * values (a partial prop map validated against that block type). A block that
42
- * names a variant resolves props highest-first: block's own prop > variant >
43
- * attributes by_type > attributes all > registry default.
44
- */
45
- export type VibeBlockVariants = {
46
- byName: Record<string, VibePropsDefault>;
47
- };
48
- /**
49
- * VibeDocumentSettings holds document-wide rendering settings that are
50
- * neither palette nor content. Today just the email canvas; a bucket so
51
- * future document-level knobs (e.g. direction, default link behaviour) land
52
- * here without touching theme or pages. Part of the client-managed style:
53
- * the model is told these values but never produces or edits them.
54
- */
55
- export type VibeDocumentSettings = {
56
- /**
57
- * Email canvas width — the MJML mj-body width analog: the fixed pixel (or
58
- * %) width the content column is laid out in. A unit value like "600px".
59
- * Empty = the renderer's default (~600px).
60
- */
61
- contentWidth: string;
62
- /**
63
- * Email canvas / body background color — the MJML mj-body background
64
- * analog: the area behind the content column. Hex ("#f4f4f4"),
65
- * "transparent", or a theme color token ("$background"). Empty = the
66
- * renderer's default.
67
- */
68
- background: string;
69
- };
70
- /**
71
- * VibeAttributes ~ mj-attributes: document-wide default props. Two layers,
72
- * both optional; the effective value of a prop on a block is resolved
73
- * highest-first: block's own prop > by_type[block type] > all > the
74
- * registry default. Values use the same CSS-flavoured strings and the
75
- * same per-block prop vocabulary as blocks; font-family is NOT a block
76
- * prop here — set it via the theme.
77
- */
78
- export type VibeAttributes = {
79
- /**
80
- * mj-all: defaults applied to every block. A prop only takes effect on a
81
- * block whose type actually accepts it (per the registry).
82
- */
83
- all: Record<string, string>;
84
- /**
85
- * Defaults per block type, keyed by type name ("section", "column",
86
- * "text", "image", "button", "spacer", "divider", "table"). Each value's
87
- * props are validated against that type in the registry.
88
- */
89
- byType: Record<string, VibePropsDefault>;
90
- };
91
- /**
92
- * VibePropsDefault wraps a prop map so it can be a proto map value
93
- * (proto3 map values cannot themselves be maps).
94
- */
95
- export type VibePropsDefault = {
96
- props: Record<string, string>;
97
- };
98
- /**
99
- * VibeFont ~ mj-font: a web font to import. name is the font-family name
100
- * referenced elsewhere; href is the stylesheet/font URL to load.
101
- */
102
- export type VibeFont = {
103
- name: string;
104
- href: string;
105
- };
106
- /**
107
- * VibePage is one page of a (future) multi-page document: an ordered list
108
- * of layout rows. MVP documents always carry exactly one page.
109
- */
110
- export type VibePage = {
111
- /**
112
- * Unique within the document. Generated by the server and preserved
113
- * across edits. The forward-looking addressing unit for multi-page
114
- * documents.
115
- */
116
- id: string;
117
- /**
118
- * Top-level rows of this page, in render order: each is a bare section or
119
- * a wrapper grouping several sections.
120
- */
121
- rows: VibeRow[];
122
- };
123
- export type VibeRow_row_section = {
124
- type: 'section';
125
- data: VibeSection;
126
- };
127
- export type VibeRow_row_wrapper = {
128
- type: 'wrapper';
129
- data: VibeWrapper;
130
- };
131
- export type VibeRow_row = VibeRow_row_section | VibeRow_row_wrapper;
132
- /**
133
- * VibeRow is one top-level page row: exactly one of a bare section or a
134
- * wrapper (mirrors MJML mj-body children — mj-section / mj-wrapper).
135
- */
136
- export type VibeRow = {
137
- row: VibeRow_row;
138
- };
139
- /**
140
- * VibeWrapper ~ mj-wrapper: groups several sections under a shared
141
- * background, border and padding (a card or banded region). Holds sections,
142
- * not columns; wrappers cannot nest.
143
- */
144
- export type VibeWrapper = {
145
- /**
146
- * Unique within the document. Generated by the model on create, preserved
147
- * across edits.
148
- */
149
- id: string;
150
- /**
151
- * Allowed props (see registry): padding, background-color, border,
152
- * border-radius, full-width, gap.
153
- */
154
- props: Record<string, string>;
155
- sections: VibeSection[];
156
- };
157
- export type VibeMeta = {
158
- subject: string;
159
- preheader: string;
160
- };
161
- /**
162
- * VibeTheme is the minimal MVP theme: a role-keyed palette plus base
163
- * typography. Renderers and the LLM read it as the document-wide
164
- * defaults; individual blocks may override via their props.
165
- */
166
- export type VibeTheme = {
167
- /**
168
- * Design-token palette keyed by semantic role (background, surface, text,
169
- * heading, text-secondary, accent, text-on-accent, border, link). Free-form
170
- * string keys — no key is guaranteed present. Any color-typed prop value
171
- * (block props, attributes, block_variants, settings.background) may
172
- * reference an entry by token: "$accent" means colors["accent"], resolved
173
- * by the renderer at render time — so re-theming a document is just
174
- * swapping this palette. Values here are strictly hex colors ("#155F50");
175
- * a token cannot reference another token. The canvas background is NOT
176
- * here — it is a guaranteed field on VibeDocumentSettings.
177
- */
178
- colors: Record<string, string>;
179
- /** CSS font-family chain for body text. */
180
- fontFamily: string;
181
- /** CSS font-family chain for headings. Empty = same as font_family. */
182
- headingFontFamily: string;
183
- };
184
- /**
185
- * VibeSection ~ mj-section: a full-width horizontal row containing
186
- * columns. Sections cannot nest.
187
- */
188
- export type VibeSection = {
189
- /**
190
- * Unique within the document. Generated by the model on create,
191
- * preserved across edits.
192
- */
193
- id: string;
194
- /**
195
- * Allowed props (see registry): padding, background-color,
196
- * border-radius, full-width, text-align, columns-gap.
197
- */
198
- props: Record<string, string>;
199
- columns: VibeColumn[];
200
- };
201
- /**
202
- * VibeColumn ~ mj-column: a vertical slice of a section holding
203
- * content blocks. Columns cannot nest.
204
- */
205
- export type VibeColumn = {
206
- id: string;
207
- /**
208
- * Allowed props (see registry): width, padding, background-color,
209
- * vertical-align, border-radius.
210
- */
211
- props: Record<string, string>;
212
- children: VibeContentBlock[];
213
- };
214
- export type VibeContentBlock_block_text = {
215
- type: 'text';
216
- data: VibeText;
217
- };
218
- export type VibeContentBlock_block_image = {
219
- type: 'image';
220
- data: VibeImage;
221
- };
222
- export type VibeContentBlock_block_button = {
223
- type: 'button';
224
- data: VibeButton;
225
- };
226
- export type VibeContentBlock_block_spacer = {
227
- type: 'spacer';
228
- data: VibeSpacer;
229
- };
230
- export type VibeContentBlock_block_divider = {
231
- type: 'divider';
232
- data: VibeDivider;
233
- };
234
- export type VibeContentBlock_block_table = {
235
- type: 'table';
236
- data: VibeTable;
237
- };
238
- export type VibeContentBlock_block_buttonGroup = {
239
- type: 'buttonGroup';
240
- data: VibeButtonGroup;
241
- };
242
- export type VibeContentBlock_block = VibeContentBlock_block_text | VibeContentBlock_block_image | VibeContentBlock_block_button | VibeContentBlock_block_spacer | VibeContentBlock_block_divider | VibeContentBlock_block_table | VibeContentBlock_block_buttonGroup;
243
- /** VibeContentBlock is one leaf content block inside a column. */
244
- export type VibeContentBlock = {
245
- block: VibeContentBlock_block;
246
- };
247
- /**
248
- * VibeText ~ mj-text. Content is text with a limited inline-HTML
249
- * allowlist (strong, b, em, i, u, s, br, span, a, small, sup, sub);
250
- * anything else is rejected by the server validator.
251
- */
252
- export type VibeText = {
253
- id: string;
254
- /**
255
- * Allowed props: align, color, font-size, font-weight, font-family,
256
- * line-height, padding.
257
- */
258
- props: Record<string, string>;
259
- content: string;
260
- /**
261
- * Optional name of a styling variant to apply, resolved against
262
- * VibeDocument.block_variants["text"] (e.g. "h1", "h2", "body", "caption").
263
- * The variant's props are merged under the text block's own props. Empty =
264
- * no variant. Mirror of VibeButton.variant.
265
- */
266
- variant: string;
267
- };
268
- /**
269
- * VibeImage ~ mj-image. No content; the image itself is addressed by
270
- * the src prop. MVP does not generate images — src is either a client
271
- * supplied URL or a placeholder.
272
- */
273
- export type VibeImage = {
274
- id: string;
275
- /**
276
- * Allowed props: src, alt, href, width, align, padding,
277
- * border-radius.
278
- */
279
- props: Record<string, string>;
280
- };
281
- /** VibeButton ~ mj-button. Content is the plain-text label. */
282
- export type VibeButton = {
283
- id: string;
284
- /**
285
- * Allowed props: href, align, background-color, color, border,
286
- * border-radius, font-size, font-weight, padding, inner-padding, width.
287
- */
288
- props: Record<string, string>;
289
- content: string;
290
- /**
291
- * Optional name of a styling variant to apply, resolved against
292
- * VibeDocument.block_variants["button"] (e.g. "primary", "secondary"). The
293
- * variant's props are merged under the button's own props. Empty = no
294
- * variant.
295
- */
296
- variant: string;
297
- };
298
- /**
299
- * VibeButtonGroup is a row of inline items sharing one alignment — the
300
- * primitive for "two CTAs side by side, aligned together" (plus app-store
301
- * badges and similar inline images) that a stack of standalone blocks cannot
302
- * express (analog of ai-builder's buttonGroup). The group owns the layout
303
- * (align/gap/padding); the items inside carry only their own look. Their own
304
- * align and outer padding are meaningless here — the renderer ignores them.
305
- */
306
- export type VibeButtonGroup = {
307
- id: string;
308
- /** Allowed props (see registry): align, gap, padding, background-color. */
309
- props: Record<string, string>;
310
- /**
311
- * The items in the group, in render order: each a button or an image (e.g.
312
- * CTAs plus store badges / inline logos). At least one is required. An image
313
- * item renders at its natural size — it is NOT stretched to the full width;
314
- * set the image's `width` prop to resize it and the height scales
315
- * proportionally.
316
- */
317
- items: VibeButtonGroupItem[];
318
- };
319
- export type VibeButtonGroupItem_item_button = {
320
- type: 'button';
321
- data: VibeButton;
322
- };
323
- export type VibeButtonGroupItem_item_image = {
324
- type: 'image';
325
- data: VibeImage;
326
- };
327
- export type VibeButtonGroupItem_item = VibeButtonGroupItem_item_button | VibeButtonGroupItem_item_image;
328
- /**
329
- * VibeButtonGroupItem is one entry of a button-group: a button or an image.
330
- * A dedicated wrapper (not a bare VibeContentBlock) so the wire can only carry
331
- * the two allowed kinds — no nested groups, text or tables.
332
- */
333
- export type VibeButtonGroupItem = {
334
- item: VibeButtonGroupItem_item;
335
- };
336
- /** VibeSpacer ~ mj-spacer: fixed vertical gap. */
337
- export type VibeSpacer = {
338
- id: string;
339
- /** Allowed props: height. */
340
- props: Record<string, string>;
341
- };
342
- /** VibeDivider ~ mj-divider: horizontal rule. */
343
- export type VibeDivider = {
344
- id: string;
345
- /**
346
- * Allowed props: border-color, border-width, border-style, width,
347
- * align, padding.
348
- */
349
- props: Record<string, string>;
350
- };
351
- /**
352
- * VibeTable ~ mj-table, structured-only: rows/cells are explicit, raw
353
- * table HTML is not accepted. Cell text follows the same inline-HTML
354
- * allowlist as VibeText.
355
- */
356
- export type VibeTable = {
357
- id: string;
358
- /** Allowed props: cell-padding, align, width, font-size. */
359
- props: Record<string, string>;
360
- rows: VibeTableRow[];
361
- };
362
- export type VibeTableRow = {
363
- /**
364
- * Header row renders as th cells (compiler concern; preview/LLM treat
365
- * it as a styling hint).
366
- */
367
- header: boolean;
368
- cells: string[];
369
- };
370
- export type VibeMlService_Generate = RpcMethod<VibeMlGenerateRequest, VibeMlGenerateResponse>;
371
- export type VibeMlService_Edit = RpcMethod<VibeMlEditRequest, VibeMlEditResponse>;
372
- export type VibeMlService_Restyle = RpcMethod<VibeMlRestyleRequest, VibeMlRestyleResponse>;
373
- export type VibeMlService_ExtractTheme = RpcMethod<VibeMlExtractThemeRequest, VibeMlExtractThemeResponse>;
374
- export type VibeMlService_Translate = RpcMethod<VibeMlTranslateRequest, VibeMlTranslateResponse>;
375
- /**
376
- * VibeMlService is the email-template generation service built around a
377
- * semantic, MJML-inspired (but NOT MJML) document model.
378
- *
379
- * The canonical artefact is the VibeDocument AST (see
380
- * vibe_document.proto): a strict section → column → content-block tree.
381
- * Preview HTML and final email-safe HTML are derived representations
382
- * produced elsewhere — this service only creates and edits the AST.
383
- *
384
- * Both editing RPCs are stateless and unary: the client owns document
385
- * storage and sends the full document on every Edit. Internally the LLM
386
- * speaks JSON against a schema generated from the server-side block
387
- * registry; on Edit the model returns patch operations which the server
388
- * applies and validates before responding — only the resulting document
389
- * crosses the wire.
390
- */
391
- export interface VibeMlService {
392
- /** Generate creates a new VibeDocument from a free-form prompt. */
393
- Generate: VibeMlService_Generate;
394
- /**
395
- * Edit mutates an existing VibeDocument according to a free-form
396
- * instruction. Layout-preserving by default: the model is told to keep
397
- * existing ids, links and structure unless the instruction asks
398
- * otherwise.
399
- */
400
- Edit: VibeMlService_Edit;
401
- /**
402
- * Restyle re-skins a content document with the look of a style document.
403
- * It takes two VibeDocuments — a style source and a content document — and
404
- * returns the content document re-skinned to look like the style source:
405
- * ALL of the content document's content is preserved (text, structure,
406
- * ids, meta) and ONLY its styling changes. Document-level style
407
- * (theme/settings/attributes/fonts) is copied verbatim from the style
408
- * source; per-block props (colors, paddings, radii, alignment, widths) are
409
- * aligned to the style source's visual language by the model, which can
410
- * only set props — never edit text or structure — so content can't drift.
411
- * The style source's own text is irrelevant.
412
- */
413
- Restyle: VibeMlService_Restyle;
414
- /**
415
- * ExtractTheme samples a brand theme — the full role-keyed palette plus
416
- * body/heading font stacks — from any mix of brand materials: an image, a
417
- * brand-book PDF, HTML/markdown/text sources, a written brand description
418
- * and/or a public site_url the server reads the brand off. At least one
419
- * input (image, source, description or site_url) is required; any
420
- * combination is allowed — files with a description, a site alone. Returned as a VibeTheme ready to seed a
421
- * Generate request. Pure extractor — materials in, theme out, no document.
422
- *
423
- * The model MUST return every palette role (background, surface, text,
424
- * heading, text-secondary, accent, text-on-accent, border, link) and both font
425
- * families — even when the materials give no clear typographic signal it
426
- * picks reasonable stacks rather than leaving them empty.
427
- *
428
- * When an image is attached the chosen model must be vision-capable; a
429
- * PDF source requires a document-capable provider (claude/openai/gemini).
430
- * Since llm_model is a client override and capability can't be derived
431
- * from a model name, there is no up-front vision check: a non-vision
432
- * model fails at the upstream call. Unary; the result is small.
433
- */
434
- ExtractTheme: VibeMlService_ExtractTheme;
435
- /**
436
- * Translate renders a batch of email texts into the requested target
437
- * languages in one call per language. Texts may carry the editors'
438
- * inline-HTML subset plus dynamic syntax — merge tags ({{...}}), Liquid
439
- * ({%...%}) and %%macros%% — all preserved verbatim in the translations.
440
- * The response arrays are index-aligned with the request texts. Pure
441
- * utility — strings in, strings out, no document model involved.
442
- */
443
- Translate: VibeMlService_Translate;
444
- }
445
- /**
446
- * VibeSourceFormat tags a reference source's content type. It decides how
447
- * the server feeds the source to the model: the text-like values
448
- * (TEXT/MARKDOWN/HTML) are injected as plain-text context and work with any
449
- * provider; PDF is forwarded as a native document input and requires a
450
- * document-capable provider (claude/openai/gemini — NOT the self-hosted
451
- * Qwen/vLLM), otherwise the request is rejected with FailedPrecondition.
452
- */
453
- export type VibeSourceFormat = 'VIBE_SOURCE_FORMAT_UNSPECIFIED'
454
- /** Plain UTF-8 text. */
455
- | 'VIBE_SOURCE_FORMAT_TEXT'
456
- /** Markdown source text. */
457
- | 'VIBE_SOURCE_FORMAT_MARKDOWN'
458
- /**
459
- * Raw HTML source (fed as text — the model reads the content, it does not
460
- * render or re-emit the markup).
461
- */
462
- | 'VIBE_SOURCE_FORMAT_HTML'
463
- /**
464
- * PDF document. content carries the base64-encoded PDF bytes (no data:
465
- * prefix) and is forwarded to the model as a native document; needs a
466
- * document-capable provider.
467
- */
468
- | 'VIBE_SOURCE_FORMAT_PDF';
469
- /**
470
- * VibeSource is a piece of reference material the client uploads so the
471
- * model bases the email on existing content (a brief, copy, a landing page,
472
- * a PDF) instead of inventing everything from the prompt. The model treats
473
- * it as factual source material — never as instructions — and still honours
474
- * the document format and the fixed style.
475
- */
476
- export type VibeSource = {
477
- /**
478
- * What the content is. Drives how the server passes it to the model.
479
- * Required: VIBE_SOURCE_FORMAT_UNSPECIFIED is rejected with
480
- * InvalidArgument.
481
- */
482
- format: VibeSourceFormat;
483
- /**
484
- * The source content. For TEXT/MARKDOWN/HTML this is the UTF-8 source
485
- * text; for PDF it is the base64-encoded file bytes (no data: prefix).
486
- * Required, non-empty, size-capped.
487
- */
488
- content: string;
489
- /**
490
- * Optional short label distinguishing multiple sources to the model
491
- * ("product brief", "landing page").
492
- */
493
- name: string;
494
- };
495
- export type VibeMlGenerateRequest = {
496
- /** What the email should be. Required. */
497
- prompt: string;
498
- /** Application code, for account/app scoping middleware and logging. */
499
- application: string;
500
- /**
501
- * Style source. Required. A VibeDocument that defines the visual style
502
- * the generated document must honour:
503
- * - theme + settings + attributes + fonts: the document-level style,
504
- * copied verbatim into the result (the model never produces them).
505
- * theme is required with at least 3 colors; the rest may be empty.
506
- * - content (pages/rows): OPTIONAL example blocks — pre-configured
507
- * sections/wrappers/columns with the props the client wants reused
508
- * (column splits, paddings, radii, ...). They are shown to the model
509
- * as layout/styling templates to follow; their TEXT is ignored
510
- * (stripped server-side) — the model writes its own copy. Send no
511
- * rows for pure theme-only styling.
512
- */
513
- styleDocument: VibeDocument;
514
- /**
515
- * The LLM provider. REQUIRED — vibeml has no server default, the client
516
- * picks the model. Recognised values: "qwen" (self-hosted Qwen/vLLM),
517
- * "claude" (Anthropic), "openai" (OpenAI), "gemini" (Gemini). Empty or
518
- * unknown → InvalidArgument.
519
- */
520
- llmProvider: string;
521
- /**
522
- * Optional concrete model name for the chosen provider. Empty = the
523
- * provider's configured default.
524
- */
525
- llmModel?: string;
526
- /**
527
- * Optional reference material the model should base the email on (brief,
528
- * copy, a web page). Injected as plain-text context; the model pulls
529
- * content from it but still follows the format and fixed style.
530
- */
531
- sources: VibeSource[];
532
- };
533
- export type VibeMlGenerateResponse = {
534
- /** The generated, server-validated document. */
535
- document: VibeDocument;
536
- /** Short human-facing note about what was generated. */
537
- summary: string;
538
- };
539
- export type VibeMlEditRequest = {
540
- /** The edit instruction. Required. */
541
- prompt: string;
542
- /**
543
- * The document to edit. Required. The server validates it before
544
- * feeding it to the model, so a client carrying a corrupted document
545
- * gets InvalidArgument instead of a garbage edit.
546
- */
547
- document: VibeDocument;
548
- /** Application code, same semantics as on Generate. */
549
- application: string;
550
- /**
551
- * Provider/model, same semantics as on Generate: llm_provider is
552
- * REQUIRED, llm_model optional.
553
- */
554
- llmProvider: string;
555
- llmModel?: string;
556
- /**
557
- * Optional reference material, same semantics as on Generate — lets an
558
- * edit lean on an uploaded brief/page. Read-only context; never modified.
559
- */
560
- sources: VibeSource[];
561
- };
562
- export type VibeMlEditResponse = {
563
- /**
564
- * The full post-edit, server-validated document. Patch operations the
565
- * model produced are an internal mechanism and are not exposed.
566
- */
567
- document: VibeDocument;
568
- /** Short human-facing note about what was changed. */
569
- summary: string;
570
- };
571
- export type VibeMlRestyleRequest = {
572
- /**
573
- * The look to adopt. Its document-level style (theme/settings/attributes/
574
- * fonts) is copied verbatim and its per-block props (colors, spacings,
575
- * radii, ...) define the target appearance the model aligns to. Its text
576
- * content is irrelevant. Required.
577
- */
578
- style: VibeDocument;
579
- /**
580
- * The document to re-skin. All of its content is preserved — only styling
581
- * changes. Required; validated before use (a corrupt document yields
582
- * InvalidArgument).
583
- */
584
- content: VibeDocument;
585
- /** Application code, same semantics as on Generate. */
586
- application: string;
587
- /**
588
- * Provider/model, same semantics as on Generate: llm_provider is REQUIRED,
589
- * llm_model optional.
590
- */
591
- llmProvider: string;
592
- llmModel?: string;
593
- };
594
- export type VibeMlRestyleResponse = {
595
- /** The content document, re-skinned and server-validated. */
596
- document: VibeDocument;
597
- /** Short human-facing note about the restyle. */
598
- summary: string;
599
- };
600
- /**
601
- * VibeReferenceImage is an inline image fed to a vision model. Same shape
602
- * as the AiGen reference image: a MIME type plus the base64 payload (no
603
- * data: URI prefix). Named distinctly from the VibeImage content block.
604
- */
605
- export type VibeReferenceImage = {
606
- /** image/* MIME type, e.g. "image/png", "image/jpeg". */
607
- mediaType: string;
608
- /** Base64-encoded image bytes, without a data: URI prefix. */
609
- data: string;
610
- };
611
- export type VibeMlExtractThemeRequest = {
612
- /**
613
- * An image to sample the theme from (screenshot, logo, moodboard).
614
- * Optional — one of image / sources / description must be present. When
615
- * set, the selected model must be vision-capable.
616
- */
617
- image?: VibeReferenceImage;
618
- /** Application code, for account/app scoping middleware and logging. */
619
- application: string;
620
- /**
621
- * Provider/model, same semantics as on Generate: llm_provider is
622
- * REQUIRED, llm_model optional.
623
- */
624
- llmProvider: string;
625
- llmModel?: string;
626
- /**
627
- * Brand materials to sample the theme from: a brand-book PDF, an HTML
628
- * page, markdown or plain text. Same shape, formats and limits as
629
- * Generate's sources (PDF needs a document-capable provider). Optional.
630
- */
631
- sources: VibeSource[];
632
- /**
633
- * A written brand description ("dark green, minimalist, premium outdoor
634
- * brand") the model derives the palette from. Optional; may accompany or
635
- * replace the image/sources.
636
- */
637
- description: string;
638
- /**
639
- * A public website to read the brand off ("acme.com" — the scheme may be
640
- * omitted). The server fetches the page and its stylesheets and distils the
641
- * brand signals (CSS custom properties, the most used colours, font stacks,
642
- * meta) into one source; the logo it finds is downloaded as the reference
643
- * image when none is attached, so a vision-capable model is preferred.
644
- * Optional; counts as an input on its own.
645
- */
646
- siteUrl: string;
647
- };
648
- export type VibeMlExtractThemeResponse = {
649
- /**
650
- * The extracted theme: full role-keyed palette + body/heading fonts.
651
- * Ready to pass back as VibeMlGenerateRequest.theme.
652
- */
653
- theme: VibeTheme;
654
- /**
655
- * Absolute URL of the logo found on site_url, empty when none was found or
656
- * no site was given. The client decides whether to adopt it.
657
- */
658
- logoUrl: string;
659
- /**
660
- * How the brand talks, 1-3 sentences, read off the copy in the materials —
661
- * for a copywriter to imitate. Empty when the materials carry no copy.
662
- */
663
- brandVoice: string;
664
- };
665
- export type VibeMlTranslateRequest = {
666
- /** Application code, for account/app scoping middleware and logging. */
667
- application: string;
668
- /**
669
- * Source texts in the document's default language. Each may be plain text
670
- * or the editors' inline-HTML subset, and may embed merge tags / Liquid /
671
- * %%macros%% — the model keeps all markup and dynamic syntax verbatim.
672
- */
673
- texts: string[];
674
- /**
675
- * Language codes to translate into, as the editor names them ("es", "de",
676
- * "pt-BR"). The default/source language must not be in the list.
677
- */
678
- targetLanguages: string[];
679
- /**
680
- * Optional hint steering tone and terminology (campaign topic, brand
681
- * voice). Free text.
682
- */
683
- context: string;
684
- /**
685
- * Provider/model, same semantics as on Generate: llm_provider is
686
- * REQUIRED, llm_model optional.
687
- */
688
- llmProvider: string;
689
- llmModel?: string;
690
- };
691
- export type VibeMlTranslatedTexts = {
692
- /** Translations index-aligned with VibeMlTranslateRequest.texts. */
693
- texts: string[];
694
- };
695
- export type VibeMlTranslateResponse = {
696
- /** Keyed by target language, exactly the requested set. */
697
- translations: Record<string, VibeMlTranslatedTexts>;
698
- };
@@ -1,3 +0,0 @@
1
- /* eslint-disable */
2
- /* Autogenerated code */
3
- export {};