@liquidmetal-ai/drizzle 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/appify/build.d.ts +8 -1
  3. package/dist/appify/build.d.ts.map +1 -1
  4. package/dist/appify/build.js +69 -1
  5. package/dist/appify/build.test.js +156 -0
  6. package/dist/appify/validate.d.ts.map +1 -1
  7. package/dist/appify/validate.js +37 -0
  8. package/dist/appify/validate.test.js +38 -1
  9. package/dist/liquidmetal/v1alpha1/bucket_name_pb.d.ts +11 -11
  10. package/dist/liquidmetal/v1alpha1/bucket_name_pb.d.ts.map +1 -1
  11. package/dist/liquidmetal/v1alpha1/bucket_name_pb.js +1 -1
  12. package/dist/liquidmetal/v1alpha1/object_pb.d.ts +8 -0
  13. package/dist/liquidmetal/v1alpha1/object_pb.d.ts.map +1 -1
  14. package/dist/liquidmetal/v1alpha1/object_pb.js +1 -1
  15. package/dist/liquidmetal/v1alpha1/payments_pb.d.ts +461 -0
  16. package/dist/liquidmetal/v1alpha1/payments_pb.d.ts.map +1 -0
  17. package/dist/liquidmetal/v1alpha1/payments_pb.js +152 -0
  18. package/dist/liquidmetal/v1alpha1/rainbow_auth_pb.d.ts +315 -0
  19. package/dist/liquidmetal/v1alpha1/rainbow_auth_pb.d.ts.map +1 -1
  20. package/dist/liquidmetal/v1alpha1/rainbow_auth_pb.js +56 -1
  21. package/dist/liquidmetal/v1alpha1/riverjack_pb.d.ts +6 -0
  22. package/dist/liquidmetal/v1alpha1/riverjack_pb.d.ts.map +1 -1
  23. package/dist/liquidmetal/v1alpha1/riverjack_pb.js +1 -1
  24. package/dist/liquidmetal/v1alpha1/search_agent_pb.d.ts +374 -0
  25. package/dist/liquidmetal/v1alpha1/search_agent_pb.d.ts.map +1 -1
  26. package/dist/liquidmetal/v1alpha1/search_agent_pb.js +46 -1
  27. package/dist/liquidmetal/v1alpha1/stripe_seller_integration_pb.d.ts +468 -0
  28. package/dist/liquidmetal/v1alpha1/stripe_seller_integration_pb.d.ts.map +1 -0
  29. package/dist/liquidmetal/v1alpha1/stripe_seller_integration_pb.js +151 -0
  30. package/package.json +3 -3
  31. package/src/appify/build.test.ts +184 -0
  32. package/src/appify/build.ts +73 -1
  33. package/src/appify/validate.test.ts +40 -1
  34. package/src/appify/validate.ts +40 -0
  35. package/src/liquidmetal/v1alpha1/bucket_name_pb.ts +12 -12
  36. package/src/liquidmetal/v1alpha1/object_pb.ts +10 -1
  37. package/src/liquidmetal/v1alpha1/payments_pb.ts +546 -0
  38. package/src/liquidmetal/v1alpha1/rainbow_auth_pb.ts +362 -1
  39. package/src/liquidmetal/v1alpha1/riverjack_pb.ts +8 -1
  40. package/src/liquidmetal/v1alpha1/search_agent_pb.ts +432 -1
  41. package/src/liquidmetal/v1alpha1/stripe_seller_integration_pb.ts +545 -0
  42. package/tsconfig.tsbuildinfo +1 -1
@@ -581,3 +581,187 @@ application "my-agent-app" {
581
581
  expect(valueOf(app.service[0]!.name)).toBe('agent-api');
582
582
  expect(valueOf(app.bucket[0]!.name)).toBe('agent-files');
583
583
  });
584
+
585
+ test('payments basic parsing', () => {
586
+ const CONFIG = `
587
+ application "my-app" {
588
+ payments {
589
+ }
590
+ }
591
+ `;
592
+ const tokenizer = new Tokenizer(CONFIG);
593
+ const parser = new Parser(tokenizer);
594
+ const ast = parser.parse();
595
+ expect(parser.errors).toEqual([]);
596
+
597
+ const [apps, errors] = buildManifest(ast);
598
+ expect(errors).toEqual([]);
599
+
600
+ // Check that we have exactly one application
601
+ expect(apps.length).toBe(1);
602
+
603
+ // Check that we have exactly one payments
604
+ expect(apps[0]!.payments.length).toBe(1);
605
+
606
+ // Check the payments properties
607
+ const payments = apps[0]!.payments[0]!;
608
+ expect(valueOf(payments.name)).toBe('payments');
609
+ expect(payments.mode).toBeUndefined();
610
+ });
611
+
612
+ test('payments with mode=test', () => {
613
+ const CONFIG = `
614
+ application "my-app" {
615
+ payments {
616
+ mode = "test"
617
+ }
618
+ }
619
+ `;
620
+ const tokenizer = new Tokenizer(CONFIG);
621
+ const parser = new Parser(tokenizer);
622
+ const ast = parser.parse();
623
+ expect(parser.errors).toEqual([]);
624
+
625
+ const [apps, errors] = buildManifest(ast);
626
+ expect(errors).toEqual([]);
627
+
628
+ // Check that we have exactly one payments
629
+ expect(apps[0]!.payments.length).toBe(1);
630
+
631
+ // Check the payments properties
632
+ const payments = apps[0]!.payments[0]!;
633
+ expect(valueOf(payments.name)).toBe('payments');
634
+ expect(payments.mode).toBeDefined();
635
+ expect(valueOf(payments.mode!)).toBe('test');
636
+ });
637
+
638
+ test('payments with mode=live', () => {
639
+ const CONFIG = `
640
+ application "my-app" {
641
+ payments {
642
+ mode = "live"
643
+ }
644
+ }
645
+ `;
646
+ const tokenizer = new Tokenizer(CONFIG);
647
+ const parser = new Parser(tokenizer);
648
+ const ast = parser.parse();
649
+ expect(parser.errors).toEqual([]);
650
+
651
+ const [apps, errors] = buildManifest(ast);
652
+ expect(errors).toEqual([]);
653
+
654
+ // Check that we have exactly one payments
655
+ expect(apps[0]!.payments.length).toBe(1);
656
+
657
+ // Check the payments properties
658
+ const payments = apps[0]!.payments[0]!;
659
+ expect(valueOf(payments.name)).toBe('payments');
660
+ expect(payments.mode).toBeDefined();
661
+ expect(valueOf(payments.mode!)).toBe('live');
662
+ });
663
+
664
+ test('payments with invalid properties', () => {
665
+ const CONFIG = `
666
+ application "my-app" {
667
+ payments {
668
+ invalid_property = "should fail"
669
+ }
670
+ }
671
+ `;
672
+ const tokenizer = new Tokenizer(CONFIG);
673
+ const parser = new Parser(tokenizer);
674
+ const ast = parser.parse();
675
+ expect(parser.errors).toEqual([]);
676
+
677
+ const [, errors] = buildManifest(ast);
678
+
679
+ // Should have one error for the invalid property
680
+ expect(errors.length).toBe(1);
681
+ expect(errors[0]!.message).toContain('unexpected assignment');
682
+ });
683
+
684
+ test('payments with duplicate mode assignment', () => {
685
+ const CONFIG = `
686
+ application "my-app" {
687
+ payments {
688
+ mode = "test"
689
+ mode = "live"
690
+ }
691
+ }
692
+ `;
693
+ const tokenizer = new Tokenizer(CONFIG);
694
+ const parser = new Parser(tokenizer);
695
+ const ast = parser.parse();
696
+ expect(parser.errors).toEqual([]);
697
+
698
+ const [, errors] = buildManifest(ast);
699
+
700
+ // Should have one error for the duplicate assignment
701
+ expect(errors.length).toBe(1);
702
+ expect(errors[0]!.message).toContain('duplicate');
703
+ });
704
+
705
+ test('payments with invalid mode value', () => {
706
+ const CONFIG = `
707
+ application "my-app" {
708
+ payments {
709
+ mode = "production"
710
+ }
711
+ }
712
+ `;
713
+ const tokenizer = new Tokenizer(CONFIG);
714
+ const parser = new Parser(tokenizer);
715
+ const ast = parser.parse();
716
+ expect(parser.errors).toEqual([]);
717
+
718
+ const [_apps, errors] = buildManifest(ast);
719
+
720
+ // Should have one error for the invalid mode value
721
+ expect(errors.length).toBe(1);
722
+ expect(errors[0]!.message).toContain('mode must be either "live" or "test"');
723
+ expect(errors[0]!.message).toContain('production');
724
+ });
725
+
726
+ test('payments integration with other modules', () => {
727
+ const CONFIG = `
728
+ application "my-payment-app" {
729
+ payments {
730
+ mode = "test"
731
+ }
732
+
733
+ service "api" {
734
+ }
735
+
736
+ actor "processor" {
737
+ visibility = "protected"
738
+ }
739
+ }
740
+ `;
741
+ const tokenizer = new Tokenizer(CONFIG);
742
+ const parser = new Parser(tokenizer);
743
+ const ast = parser.parse();
744
+ expect(parser.errors).toEqual([]);
745
+
746
+ const [apps, errors] = buildManifest(ast);
747
+ expect(errors).toEqual([]);
748
+
749
+ // Check that we have exactly one application
750
+ expect(apps.length).toBe(1);
751
+ const app = apps[0]!;
752
+
753
+ // Verify all module types are parsed correctly
754
+ expect(app.payments.length).toBe(1);
755
+ expect(app.service.length).toBe(1);
756
+ expect(app.actor.length).toBe(1);
757
+
758
+ // Verify payments properties
759
+ const payments = app.payments[0]!;
760
+ expect(valueOf(payments.name)).toBe('payments');
761
+ expect(payments.mode).toBeDefined();
762
+ expect(valueOf(payments.mode!)).toBe('test');
763
+
764
+ // Verify other modules still work correctly
765
+ expect(valueOf(app.service[0]!.name)).toBe('api');
766
+ expect(valueOf(app.actor[0]!.name)).toBe('processor');
767
+ });
@@ -80,6 +80,27 @@ export function buildManifest(node: BlockNode): [Application[], ConfigError[]] {
80
80
  return [applications, errors];
81
81
  }
82
82
 
83
+ // buildName0 is a helper function for stanzas that don't take a name argument.
84
+ // It generates a hardcoded name token based on the stanza type.
85
+ function buildName0(stanzaName: string, node: StanzaNode): [TokenString, ConfigError[]] {
86
+ const errors: ConfigError[] = [];
87
+ if (node.args.length > 0) {
88
+ errors.push({ message: `${stanzaName} does not take a name argument`, ...node.args[0]! });
89
+ }
90
+ // Generate a token with the hardcoded name
91
+ return [
92
+ {
93
+ type: 'string',
94
+ value: `"${stanzaName}"`,
95
+ line: node.line,
96
+ column: node.column,
97
+ start: node.start,
98
+ end: node.block?.start || node.end,
99
+ } as TokenString,
100
+ errors,
101
+ ];
102
+ }
103
+
83
104
  // buildName1 is a helper function for parsing a name from a stanza
84
105
  // node arguments and asserting there should only be 1, string
85
106
  // argument.
@@ -252,6 +273,9 @@ export function buildApplication(node: StanzaNode): [Application | undefined, Co
252
273
  case 'smartmemory':
253
274
  buildStanza(buildSmartMemory, child, app.smartMemory, errors);
254
275
  break;
276
+ case 'payments':
277
+ buildStanza(buildPayments, child, app.payments, errors);
278
+ break;
255
279
  default:
256
280
  errors.push({ message: 'unexpected stanza', ...child });
257
281
  }
@@ -602,6 +626,42 @@ function buildSmartMemory(stanza: StanzaNode): [SmartMemory, ConfigError[]] {
602
626
  return [smartMemory, errors];
603
627
  }
604
628
 
629
+ function buildPayments(stanza: StanzaNode): [Payments, ConfigError[]] {
630
+ const errors: ConfigError[] = [];
631
+ const [name, nameErrors] = buildName0('payments', stanza);
632
+ errors.push(...nameErrors);
633
+ const payments = new Payments(name, stanza);
634
+ for (const child of stanza.block?.children ?? []) {
635
+ switch (child.type) {
636
+ case 'assignment':
637
+ switch (child.key.value) {
638
+ case 'mode':
639
+ buildAssignment(payments, 'mode', 'string', child, errors);
640
+ // Validate that mode is either "live" or "test"
641
+ if (payments.mode && child.value.type === 'string') {
642
+ const modeValue = valueOf(payments.mode);
643
+ if (modeValue !== 'live' && modeValue !== 'test') {
644
+ errors.push({
645
+ message: `mode must be either "live" or "test", got "${modeValue}"`,
646
+ ...child.value
647
+ });
648
+ }
649
+ }
650
+ break;
651
+ default:
652
+ errors.push({ message: 'unexpected assignment', ...child });
653
+ }
654
+ break;
655
+ case 'comment':
656
+ case 'newline':
657
+ break;
658
+ default:
659
+ errors.push({ message: `unexpected ${child.type}`, ...child });
660
+ }
661
+ }
662
+ return [payments, errors];
663
+ }
664
+
605
665
  function buildObserver(stanza: StanzaNode): [Observer, ConfigError[]] {
606
666
  const errors: ConfigError[] = [];
607
667
  const [name, nameErrors] = buildName1(stanza);
@@ -922,6 +982,7 @@ export class Application {
922
982
  smartBucket: SmartBucket[] = [];
923
983
  smartSql: SmartSql[] = [];
924
984
  smartMemory: SmartMemory[] = [];
985
+ payments: Payments[] = [];
925
986
  labels: Record<string, string> = {};
926
987
  mcpService: McpService[] = [];
927
988
 
@@ -1186,7 +1247,18 @@ export class SmartMemory {
1186
1247
  }
1187
1248
  }
1188
1249
 
1189
- export const VISIBILITIES = ['none', 'public', 'private', 'protected', 'application', 'suite', 'tenant'] as const;
1250
+ export class Payments {
1251
+ name: TokenString;
1252
+ obj: ConfigObject;
1253
+ mode?: TokenString;
1254
+
1255
+ constructor(name: TokenString, obj: ConfigObject) {
1256
+ this.name = name;
1257
+ this.obj = obj;
1258
+ }
1259
+ }
1260
+
1261
+ export const VISIBILITIES = ['none', 'public', 'private', 'protected', 'paid', 'application', 'suite', 'tenant'] as const;
1190
1262
  export type Visibility = (typeof VISIBILITIES)[number];
1191
1263
 
1192
1264
  export const TASK_TYPES = ['cron'] as const;
@@ -225,7 +225,7 @@ application "my-app" {
225
225
  const validateErrors = await validate(builtApps, VALIDATORS);
226
226
  expect(validateErrors).toMatchObject([
227
227
  {
228
- message: 'visibility must be one of none, public, private, protected, application, suite, tenant',
228
+ message: 'visibility must be one of none, public, private, protected, paid, application, suite, tenant',
229
229
  line: 4,
230
230
  column: 18,
231
231
  start: 66,
@@ -533,3 +533,42 @@ describe('task validator', async () => {
533
533
  }
534
534
  });
535
535
  });
536
+
537
+ test('paymentsValidator - multiple payments blocks', async () => {
538
+ const manifest = `
539
+ application "my-app" {
540
+ payments {}
541
+
542
+ payments {}
543
+ }
544
+ `;
545
+ const tokenizer = new Tokenizer(manifest);
546
+ const parser = new Parser(tokenizer);
547
+ const parsedManifest = parser.parse();
548
+ const [builtApps] = buildManifest(parsedManifest);
549
+ const validateErrors = await validate(builtApps, VALIDATORS);
550
+ expect(validateErrors).toMatchObject([
551
+ {
552
+ message: 'only one payments block is allowed per application',
553
+ line: 5,
554
+ column: 3,
555
+ severity: 'error',
556
+ },
557
+ ]);
558
+ });
559
+
560
+ test('paymentsValidator - single payments block', async () => {
561
+ const manifest = `
562
+ application "my-app" {
563
+ payments {}
564
+ }
565
+ `;
566
+ const tokenizer = new Tokenizer(manifest);
567
+ const parser = new Parser(tokenizer);
568
+ const parsedManifest = parser.parse();
569
+ const [builtApps] = buildManifest(parsedManifest);
570
+ const validateErrors = await validate(builtApps, VALIDATORS);
571
+ // Filter out other validation errors, only check for payments-related errors
572
+ const paymentsErrors = validateErrors.filter((e) => e.message.includes('payments'));
573
+ expect(paymentsErrors).toEqual([]);
574
+ });
@@ -543,6 +543,44 @@ const locationHintValidator: Validator = {
543
543
  },
544
544
  };
545
545
 
546
+ const paymentsValidator: Validator = {
547
+ onApplication: async (app: Application, _application: Application): Promise<ValidationError[]> => {
548
+ const errors: ValidationError[] = [];
549
+ if (app.payments.length > 1) {
550
+ // Report error on the second payments declaration
551
+ const secondPayments = app.payments[1];
552
+ if (secondPayments) {
553
+ errors.push({
554
+ message: 'only one payments block is allowed per application',
555
+ severity: 'error',
556
+ ...secondPayments.obj,
557
+ });
558
+ }
559
+ }
560
+ return errors;
561
+ },
562
+ };
563
+
564
+ async function paidVisibilityValidatorFn(app: Application, obj: { visibility?: TokenString }): Promise<ValidationError[]> {
565
+ const errors: ValidationError[] = [];
566
+ if (obj.visibility && valueOf(obj.visibility) === 'paid' && app.payments.length === 0) {
567
+ errors.push({
568
+ message: 'visibility="paid" requires a payments block in the application manifest',
569
+ severity: 'error',
570
+ ...(obj.visibility || obj),
571
+ });
572
+ }
573
+ return errors;
574
+ }
575
+
576
+ const paidVisibilityValidator: Validator = {
577
+ onService: paidVisibilityValidatorFn,
578
+ onActor: paidVisibilityValidatorFn,
579
+ onTask: paidVisibilityValidatorFn,
580
+ onQueue: paidVisibilityValidatorFn,
581
+ onBucket: paidVisibilityValidatorFn,
582
+ };
583
+
546
584
  export const VALIDATORS: Validator[] = [
547
585
  bindingNameValidator,
548
586
  bindingValueValidator,
@@ -555,4 +593,6 @@ export const VALIDATORS: Validator[] = [
555
593
  vectorIndexValidator,
556
594
  duplicateModuleValidator,
557
595
  locationHintValidator,
596
+ paymentsValidator,
597
+ paidVisibilityValidator,
558
598
  ];
@@ -10,10 +10,10 @@ import type { Message } from "@bufbuild/protobuf";
10
10
  * Describes the file liquidmetal/v1alpha1/bucket_name.proto.
11
11
  */
12
12
  export const file_liquidmetal_v1alpha1_bucket_name: GenFile = /*@__PURE__*/
13
- fileDesc("CiZsaXF1aWRtZXRhbC92MWFscGhhMS9idWNrZXRfbmFtZS5wcm90bxIUbGlxdWlkbWV0YWwudjFhbHBoYTEicAoKQnVja2V0TmFtZRIMCgRuYW1lGAEgASgJEhQKB3ZlcnNpb24YAiABKAlIAIgBARIdChBhcHBsaWNhdGlvbl9uYW1lGAMgASgJSAGIAQFCCgoIX3ZlcnNpb25CEwoRX2FwcGxpY2F0aW9uX25hbWUiawoNQnVja2V0TG9jYXRvchITCgltb2R1bGVfaWQYASABKAlIABIyCgZidWNrZXQYAiABKAsyIC5saXF1aWRtZXRhbC52MWFscGhhMS5CdWNrZXROYW1lSABCEQoPYnVja2V0X2xvY2F0aW9uInIKDkJ1Y2tldFJlc3BvbnNlEhEKCW1vZHVsZV9pZBgBIAEoCRITCgtidWNrZXRfbmFtZRgCIAEoCRIeChZhcHBsaWNhdGlvbl92ZXJzaW9uX2lkGAQgASgJEhgKEGFwcGxpY2F0aW9uX25hbWUYBSABKAlC6gEKGGNvbS5saXF1aWRtZXRhbC52MWFscGhhMUIPQnVja2V0TmFtZVByb3RvUAFaTGdpdGh1Yi5jb20vbGlxdWlkbWV0YWwtYWkvcHJvdG9nZW4yL2xpcXVpZG1ldGFsL3YxYWxwaGExO2xpcXVpZG1ldGFsdjFhbHBoYTGiAgNMWFiqAhRMaXF1aWRtZXRhbC5WMWFscGhhMcoCFExpcXVpZG1ldGFsXFYxYWxwaGEx4gIgTGlxdWlkbWV0YWxcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAhVMaXF1aWRtZXRhbDo6VjFhbHBoYTFiBnByb3RvMw");
13
+ fileDesc("CiZsaXF1aWRtZXRhbC92MWFscGhhMS9idWNrZXRfbmFtZS5wcm90bxIUbGlxdWlkbWV0YWwudjFhbHBoYTEiRQoKQnVja2V0TmFtZRIMCgRuYW1lGAEgASgJEg8KB3ZlcnNpb24YAiABKAkSGAoQYXBwbGljYXRpb25fbmFtZRgDIAEoCSJrCg1CdWNrZXRMb2NhdG9yEhMKCW1vZHVsZV9pZBgBIAEoCUgAEjIKBmJ1Y2tldBgCIAEoCzIgLmxpcXVpZG1ldGFsLnYxYWxwaGExLkJ1Y2tldE5hbWVIAEIRCg9idWNrZXRfbG9jYXRpb24icgoOQnVja2V0UmVzcG9uc2USEQoJbW9kdWxlX2lkGAEgASgJEhMKC2J1Y2tldF9uYW1lGAIgASgJEh4KFmFwcGxpY2F0aW9uX3ZlcnNpb25faWQYBCABKAkSGAoQYXBwbGljYXRpb25fbmFtZRgFIAEoCULqAQoYY29tLmxpcXVpZG1ldGFsLnYxYWxwaGExQg9CdWNrZXROYW1lUHJvdG9QAVpMZ2l0aHViLmNvbS9saXF1aWRtZXRhbC1haS9wcm90b2dlbjIvbGlxdWlkbWV0YWwvdjFhbHBoYTE7bGlxdWlkbWV0YWx2MWFscGhhMaICA0xYWKoCFExpcXVpZG1ldGFsLlYxYWxwaGExygIUTGlxdWlkbWV0YWxcVjFhbHBoYTHiAiBMaXF1aWRtZXRhbFxWMWFscGhhMVxHUEJNZXRhZGF0YeoCFUxpcXVpZG1ldGFsOjpWMWFscGhhMWIGcHJvdG8z");
14
14
 
15
15
  /**
16
- * BucketName represents a bucket name with an optional version
16
+ * BucketName represents a bucket name with version and application name
17
17
  *
18
18
  * @generated from message liquidmetal.v1alpha1.BucketName
19
19
  */
@@ -28,22 +28,22 @@ export type BucketName = Message<"liquidmetal.v1alpha1.BucketName"> & {
28
28
  name: string;
29
29
 
30
30
  /**
31
- * Optional version of the bucket
31
+ * The version of the bucket
32
32
  * __EXAMPLE__ "01jtryx2f2f61ryk06vd8mr91p"
33
- * __REQUIRED__ FALSE
33
+ * __REQUIRED__ TRUE
34
34
  *
35
- * @generated from field: optional string version = 2;
35
+ * @generated from field: string version = 2;
36
36
  */
37
- version?: string;
37
+ version: string;
38
38
 
39
39
  /**
40
- * Optional Application
40
+ * The application name
41
41
  * __EXAMPLE__ "my-app"
42
- * __REQUIRED__ FALSE
42
+ * __REQUIRED__ TRUE
43
43
  *
44
- * @generated from field: optional string application_name = 3;
44
+ * @generated from field: string application_name = 3;
45
45
  */
46
- applicationName?: string;
46
+ applicationName: string;
47
47
  };
48
48
 
49
49
  /**
@@ -58,7 +58,7 @@ export const BucketNameSchema: GenMessage<BucketName> = /*@__PURE__*/
58
58
  */
59
59
  export type BucketLocator = Message<"liquidmetal.v1alpha1.BucketLocator"> & {
60
60
  /**
61
- * __EXAMPLE__ { name: 'my-smartbucket' }
61
+ * __EXAMPLE__ { name: 'my-smartbucket', version: '01jtryx2f2f61ryk06vd8mr91p', application_name: 'my-app' }
62
62
  * __REQUIRED__ TRUE
63
63
  *
64
64
  * @generated from oneof liquidmetal.v1alpha1.BucketLocator.bucket_location
@@ -74,7 +74,7 @@ export type BucketLocator = Message<"liquidmetal.v1alpha1.BucketLocator"> & {
74
74
  case: "moduleId";
75
75
  } | {
76
76
  /**
77
- * __EXAMPLE__ { name: 'my-smartbucket' }
77
+ * __EXAMPLE__ { name: 'my-smartbucket', version: '01jtryx2f2f61ryk06vd8mr91p', application_name: 'my-app' }
78
78
  * __REQUIRED__ FALSE
79
79
  *
80
80
  * @generated from field: liquidmetal.v1alpha1.BucketName bucket = 2;
@@ -17,7 +17,7 @@ import type { Message } from "@bufbuild/protobuf";
17
17
  * Describes the file liquidmetal/v1alpha1/object.proto.
18
18
  */
19
19
  export const file_liquidmetal_v1alpha1_object: GenFile = /*@__PURE__*/
20
- fileDesc("CiFsaXF1aWRtZXRhbC92MWFscGhhMS9vYmplY3QucHJvdG8SFGxpcXVpZG1ldGFsLnYxYWxwaGExIrQBChBQdXRPYmplY3RSZXF1ZXN0EhcKD29yZ2FuaXphdGlvbl9pZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEgsKA2tleRgEIAEoCRIPCgdjb250ZW50GAUgASgMEhQKDGNvbnRlbnRfdHlwZRgGIAEoCRI8Cg9idWNrZXRfbG9jYXRpb24YByABKAsyIy5saXF1aWRtZXRhbC52MWFscGhhMS5CdWNrZXRMb2NhdG9ySgQIAxAEIlYKEVB1dE9iamVjdFJlc3BvbnNlEjQKBmJ1Y2tldBgBIAEoCzIkLmxpcXVpZG1ldGFsLnYxYWxwaGExLkJ1Y2tldFJlc3BvbnNlEgsKA2tleRgCIAEoCSKNAQoQR2V0T2JqZWN0UmVxdWVzdBIXCg9vcmdhbml6YXRpb25faWQYASABKAkSDwoHdXNlcl9pZBgCIAEoCRILCgNrZXkYBCABKAkSPAoPYnVja2V0X2xvY2F0aW9uGAUgASgLMiMubGlxdWlkbWV0YWwudjFhbHBoYTEuQnVja2V0TG9jYXRvckoECAMQBCI6ChFHZXRPYmplY3RSZXNwb25zZRIPCgdjb250ZW50GAEgASgMEhQKDGNvbnRlbnRfdHlwZRgCIAEoCSKQAQoTRGVsZXRlT2JqZWN0UmVxdWVzdBIXCg9vcmdhbml6YXRpb25faWQYASABKAkSDwoHdXNlcl9pZBgCIAEoCRILCgNrZXkYBCABKAkSPAoPYnVja2V0X2xvY2F0aW9uGAUgASgLMiMubGlxdWlkbWV0YWwudjFhbHBoYTEuQnVja2V0TG9jYXRvckoECAMQBCIWChREZWxldGVPYmplY3RSZXNwb25zZSKCAQoSTGlzdE9iamVjdHNSZXF1ZXN0EhcKD29yZ2FuaXphdGlvbl9pZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEjwKD2J1Y2tldF9sb2NhdGlvbhgEIAEoCzIjLmxpcXVpZG1ldGFsLnYxYWxwaGExLkJ1Y2tldExvY2F0b3JKBAgDEAQizgEKE0xpc3RPYmplY3RzUmVzcG9uc2USRQoHb2JqZWN0cxgBIAMoCzI0LmxpcXVpZG1ldGFsLnYxYWxwaGExLkxpc3RPYmplY3RzUmVzcG9uc2UuT2JqZWN0SW5mbxpwCgpPYmplY3RJbmZvEgsKA2tleRgBIAEoCRIMCgRzaXplGAIgASgDEhQKDGNvbnRlbnRfdHlwZRgDIAEoCRIxCg1sYXN0X21vZGlmaWVkGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcDKIBAoNT2JqZWN0U2VydmljZRJ3CglQdXRPYmplY3QSJi5saXF1aWRtZXRhbC52MWFscGhhMS5QdXRPYmplY3RSZXF1ZXN0GicubGlxdWlkbWV0YWwudjFhbHBoYTEuUHV0T2JqZWN0UmVzcG9uc2UiGYLT5JMCEzoBKiIOL3YxL3B1dF9vYmplY3QSdwoJR2V0T2JqZWN0EiYubGlxdWlkbWV0YWwudjFhbHBoYTEuR2V0T2JqZWN0UmVxdWVzdBonLmxpcXVpZG1ldGFsLnYxYWxwaGExLkdldE9iamVjdFJlc3BvbnNlIhmC0+STAhM6ASoiDi92MS9nZXRfb2JqZWN0EoMBCgxEZWxldGVPYmplY3QSKS5saXF1aWRtZXRhbC52MWFscGhhMS5EZWxldGVPYmplY3RSZXF1ZXN0GioubGlxdWlkbWV0YWwudjFhbHBoYTEuRGVsZXRlT2JqZWN0UmVzcG9uc2UiHILT5JMCFjoBKiIRL3YxL2RlbGV0ZV9vYmplY3QSfwoLTGlzdE9iamVjdHMSKC5saXF1aWRtZXRhbC52MWFscGhhMS5MaXN0T2JqZWN0c1JlcXVlc3QaKS5saXF1aWRtZXRhbC52MWFscGhhMS5MaXN0T2JqZWN0c1Jlc3BvbnNlIhuC0+STAhU6ASoiEC92MS9saXN0X29iamVjdHNC5gEKGGNvbS5saXF1aWRtZXRhbC52MWFscGhhMUILT2JqZWN0UHJvdG9QAVpMZ2l0aHViLmNvbS9saXF1aWRtZXRhbC1haS9wcm90b2dlbjIvbGlxdWlkbWV0YWwvdjFhbHBoYTE7bGlxdWlkbWV0YWx2MWFscGhhMaICA0xYWKoCFExpcXVpZG1ldGFsLlYxYWxwaGExygIUTGlxdWlkbWV0YWxcVjFhbHBoYTHiAiBMaXF1aWRtZXRhbFxWMWFscGhhMVxHUEJNZXRhZGF0YeoCFUxpcXVpZG1ldGFsOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_liquidmetal_v1alpha1_bucket_name]);
20
+ fileDesc("CiFsaXF1aWRtZXRhbC92MWFscGhhMS9vYmplY3QucHJvdG8SFGxpcXVpZG1ldGFsLnYxYWxwaGExIrQBChBQdXRPYmplY3RSZXF1ZXN0EhcKD29yZ2FuaXphdGlvbl9pZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEgsKA2tleRgEIAEoCRIPCgdjb250ZW50GAUgASgMEhQKDGNvbnRlbnRfdHlwZRgGIAEoCRI8Cg9idWNrZXRfbG9jYXRpb24YByABKAsyIy5saXF1aWRtZXRhbC52MWFscGhhMS5CdWNrZXRMb2NhdG9ySgQIAxAEIlYKEVB1dE9iamVjdFJlc3BvbnNlEjQKBmJ1Y2tldBgBIAEoCzIkLmxpcXVpZG1ldGFsLnYxYWxwaGExLkJ1Y2tldFJlc3BvbnNlEgsKA2tleRgCIAEoCSKNAQoQR2V0T2JqZWN0UmVxdWVzdBIXCg9vcmdhbml6YXRpb25faWQYASABKAkSDwoHdXNlcl9pZBgCIAEoCRILCgNrZXkYBCABKAkSPAoPYnVja2V0X2xvY2F0aW9uGAUgASgLMiMubGlxdWlkbWV0YWwudjFhbHBoYTEuQnVja2V0TG9jYXRvckoECAMQBCI6ChFHZXRPYmplY3RSZXNwb25zZRIPCgdjb250ZW50GAEgASgMEhQKDGNvbnRlbnRfdHlwZRgCIAEoCSKQAQoTRGVsZXRlT2JqZWN0UmVxdWVzdBIXCg9vcmdhbml6YXRpb25faWQYASABKAkSDwoHdXNlcl9pZBgCIAEoCRILCgNrZXkYBCABKAkSPAoPYnVja2V0X2xvY2F0aW9uGAUgASgLMiMubGlxdWlkbWV0YWwudjFhbHBoYTEuQnVja2V0TG9jYXRvckoECAMQBCIWChREZWxldGVPYmplY3RSZXNwb25zZSKiAQoSTGlzdE9iamVjdHNSZXF1ZXN0EhcKD29yZ2FuaXphdGlvbl9pZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEjwKD2J1Y2tldF9sb2NhdGlvbhgEIAEoCzIjLmxpcXVpZG1ldGFsLnYxYWxwaGExLkJ1Y2tldExvY2F0b3ISEwoGcHJlZml4GAUgASgJSACIAQFCCQoHX3ByZWZpeEoECAMQBCLOAQoTTGlzdE9iamVjdHNSZXNwb25zZRJFCgdvYmplY3RzGAEgAygLMjQubGlxdWlkbWV0YWwudjFhbHBoYTEuTGlzdE9iamVjdHNSZXNwb25zZS5PYmplY3RJbmZvGnAKCk9iamVjdEluZm8SCwoDa2V5GAEgASgJEgwKBHNpemUYAiABKAMSFAoMY29udGVudF90eXBlGAMgASgJEjEKDWxhc3RfbW9kaWZpZWQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wMogECg1PYmplY3RTZXJ2aWNlEncKCVB1dE9iamVjdBImLmxpcXVpZG1ldGFsLnYxYWxwaGExLlB1dE9iamVjdFJlcXVlc3QaJy5saXF1aWRtZXRhbC52MWFscGhhMS5QdXRPYmplY3RSZXNwb25zZSIZgtPkkwITOgEqIg4vdjEvcHV0X29iamVjdBJ3CglHZXRPYmplY3QSJi5saXF1aWRtZXRhbC52MWFscGhhMS5HZXRPYmplY3RSZXF1ZXN0GicubGlxdWlkbWV0YWwudjFhbHBoYTEuR2V0T2JqZWN0UmVzcG9uc2UiGYLT5JMCEzoBKiIOL3YxL2dldF9vYmplY3QSgwEKDERlbGV0ZU9iamVjdBIpLmxpcXVpZG1ldGFsLnYxYWxwaGExLkRlbGV0ZU9iamVjdFJlcXVlc3QaKi5saXF1aWRtZXRhbC52MWFscGhhMS5EZWxldGVPYmplY3RSZXNwb25zZSIcgtPkkwIWOgEqIhEvdjEvZGVsZXRlX29iamVjdBJ/CgtMaXN0T2JqZWN0cxIoLmxpcXVpZG1ldGFsLnYxYWxwaGExLkxpc3RPYmplY3RzUmVxdWVzdBopLmxpcXVpZG1ldGFsLnYxYWxwaGExLkxpc3RPYmplY3RzUmVzcG9uc2UiG4LT5JMCFToBKiIQL3YxL2xpc3Rfb2JqZWN0c0LmAQoYY29tLmxpcXVpZG1ldGFsLnYxYWxwaGExQgtPYmplY3RQcm90b1ABWkxnaXRodWIuY29tL2xpcXVpZG1ldGFsLWFpL3Byb3RvZ2VuMi9saXF1aWRtZXRhbC92MWFscGhhMTtsaXF1aWRtZXRhbHYxYWxwaGExogIDTFhYqgIUTGlxdWlkbWV0YWwuVjFhbHBoYTHKAhRMaXF1aWRtZXRhbFxWMWFscGhhMeICIExpcXVpZG1ldGFsXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIVTGlxdWlkbWV0YWw6OlYxYWxwaGExYgZwcm90bzM", [file_google_protobuf_timestamp, file_liquidmetal_v1alpha1_bucket_name]);
21
21
 
22
22
  /**
23
23
  * @generated from message liquidmetal.v1alpha1.PutObjectRequest
@@ -244,6 +244,15 @@ export type ListObjectsRequest = Message<"liquidmetal.v1alpha1.ListObjectsReques
244
244
  * @generated from field: liquidmetal.v1alpha1.BucketLocator bucket_location = 4;
245
245
  */
246
246
  bucketLocation?: BucketLocator;
247
+
248
+ /**
249
+ * __DESCRIPTION__ Optional prefix to filter object keys (e.g., "documents/" to only list objects in documents folder)
250
+ * __EXAMPLE__ "documents/"
251
+ * __REQUIRED__ FALSE
252
+ *
253
+ * @generated from field: optional string prefix = 5;
254
+ */
255
+ prefix?: string;
247
256
  };
248
257
 
249
258
  /**