@eide/foir-cli 0.49.0 → 0.51.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/cli.js +310 -65
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/cli.ts
4
4
  import { config } from "dotenv";
5
- import { resolve as resolve7, dirname as dirname4 } from "path";
5
+ import { resolve as resolve8, dirname as dirname4 } from "path";
6
6
  import { fileURLToPath } from "url";
7
7
  import { createRequire } from "module";
8
8
  import { Command } from "commander";
@@ -303,13 +303,13 @@ function withErrorHandler(optsFn, fn) {
303
303
  // src/commands/login.ts
304
304
  async function findAvailablePort(start, end) {
305
305
  for (let port = start; port <= end; port++) {
306
- const available = await new Promise((resolve8) => {
306
+ const available = await new Promise((resolve9) => {
307
307
  const server = http.createServer();
308
308
  server.listen(port, () => {
309
309
  server.close();
310
- resolve8(true);
310
+ resolve9(true);
311
311
  });
312
- server.on("error", () => resolve8(false));
312
+ server.on("error", () => resolve9(false));
313
313
  });
314
314
  if (available) return port;
315
315
  }
@@ -347,7 +347,7 @@ async function loginAction(globalOpts) {
347
347
  const state = crypto.randomBytes(16).toString("hex");
348
348
  const port = await findAvailablePort(9876, 9900);
349
349
  const redirectUri = `http://localhost:${port}/callback`;
350
- const authCode = await new Promise((resolve8, reject) => {
350
+ const authCode = await new Promise((resolve9, reject) => {
351
351
  let timeoutId;
352
352
  const server = http.createServer((req, res) => {
353
353
  const url = new URL(req.url, `http://localhost:${port}`);
@@ -386,7 +386,7 @@ async function loginAction(globalOpts) {
386
386
  );
387
387
  server.closeAllConnections();
388
388
  server.close();
389
- resolve8(code);
389
+ resolve9(code);
390
390
  }
391
391
  });
392
392
  server.listen(port);
@@ -470,6 +470,8 @@ import { file_google_protobuf_struct, file_google_protobuf_timestamp as file_goo
470
470
  import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
471
471
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
472
472
  var file_publish_v1_publish = /* @__PURE__ */ fileDesc("ChhwdWJsaXNoL3YxL3B1Ymxpc2gucHJvdG8SCnB1Ymxpc2gudjEikgEKDkJyZWFraW5nQ2hhbmdlEjQKCHNldmVyaXR5GAEgASgOMiIucHVibGlzaC52MS5CcmVha2luZ0NoYW5nZVNldmVyaXR5EhMKC2VudGl0eV9raW5kGAIgASgJEhIKCmVudGl0eV9rZXkYAyABKAkSDAoEcGF0aBgEIAEoCRITCgtkZXNjcmlwdGlvbhgFIAEoCSLKAgoNUHVibGlzaFN0YXR1cxIhChRwdWJsaXNoZWRfdmVyc2lvbl9pZBgBIAEoCUgAiAEBEh8KEmN1cnJlbnRfdmVyc2lvbl9pZBgCIAEoCUgBiAEBEjUKDHB1Ymxpc2hlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAogBARIZCgxwdWJsaXNoZWRfYnkYBCABKAlIA4gBARIbChNoYXNfcGVuZGluZ19jaGFuZ2VzGAUgASgIEjQKEGJyZWFraW5nX2NoYW5nZXMYBiADKAsyGi5wdWJsaXNoLnYxLkJyZWFraW5nQ2hhbmdlQhcKFV9wdWJsaXNoZWRfdmVyc2lvbl9pZEIVChNfY3VycmVudF92ZXJzaW9uX2lkQg8KDV9wdWJsaXNoZWRfYXRCDwoNX3B1Ymxpc2hlZF9ieSKuAQoNUGVuZGluZ0VudGl0eRITCgtlbnRpdHlfa2luZBgBIAEoCRIRCgllbnRpdHlfaWQYAiABKAkSEgoKZW50aXR5X2tleRgDIAEoCRITCgtlbnRpdHlfbmFtZRgEIAEoCRIWCg5jaGFuZ2Vfc3VtbWFyeRgFIAEoCRI0ChBicmVha2luZ19jaGFuZ2VzGAYgAygLMhoucHVibGlzaC52MS5CcmVha2luZ0NoYW5nZSpnCg1TY2hlbWFDaGFubmVsEh4KGlNDSEVNQV9DSEFOTkVMX1VOU1BFQ0lGSUVEEAASHAoYU0NIRU1BX0NIQU5ORUxfUFVCTElTSEVEEAESGAoUU0NIRU1BX0NIQU5ORUxfRFJBRlQQAiq2AQoWQnJlYWtpbmdDaGFuZ2VTZXZlcml0eRIoCiRCUkVBS0lOR19DSEFOR0VfU0VWRVJJVFlfVU5TUEVDSUZJRUQQABIlCiFCUkVBS0lOR19DSEFOR0VfU0VWRVJJVFlfQURESVRJVkUQARIkCiBCUkVBS0lOR19DSEFOR0VfU0VWRVJJVFlfV0FSTklORxACEiUKIUJSRUFLSU5HX0NIQU5HRV9TRVZFUklUWV9CUkVBS0lORxADQjtaOWdpdGh1Yi5jb20vZWlkZXN0dWRpby9mb2lyL2dlbi9wcm90by9wdWJsaXNoL3YxO3B1Ymxpc2h2MWIGcHJvdG8z", [file_google_protobuf_timestamp]);
473
+ var BreakingChangeSeveritySchema = /* @__PURE__ */ enumDesc(file_publish_v1_publish, 1);
474
+ var BreakingChangeSeverity = /* @__PURE__ */ tsEnum(BreakingChangeSeveritySchema);
473
475
 
474
476
  // ../../packages/proto-ts/src/common/v1/pagination_pb.js
475
477
  import { fileDesc as fileDesc2, messageDesc as messageDesc2 } from "@bufbuild/protobuf/codegenv2";
@@ -582,6 +584,7 @@ var DuplicateModelRequestSchema = /* @__PURE__ */ messageDesc5(file_models_v1_mo
582
584
  var ListModelVersionsRequestSchema = /* @__PURE__ */ messageDesc5(file_models_v1_models, 22);
583
585
  var RestoreModelVersionRequestSchema = /* @__PURE__ */ messageDesc5(file_models_v1_models, 26);
584
586
  var PublishModelRequestSchema = /* @__PURE__ */ messageDesc5(file_models_v1_models, 36);
587
+ var GetModelPublishStatusRequestSchema = /* @__PURE__ */ messageDesc5(file_models_v1_models, 40);
585
588
  var CacheControlScopeSchema = /* @__PURE__ */ enumDesc3(file_models_v1_models, 1);
586
589
  var CacheControlScope = /* @__PURE__ */ tsEnum3(CacheControlScopeSchema);
587
590
  var ModelsService = /* @__PURE__ */ serviceDesc2(file_models_v1_models, 0);
@@ -799,11 +802,18 @@ var HooksService = /* @__PURE__ */ serviceDesc9(file_hooks_v1_hooks, 0);
799
802
  // ../../packages/proto-ts/src/notifications/v1/notifications_pb.js
800
803
  import { enumDesc as enumDesc9, fileDesc as fileDesc14, messageDesc as messageDesc14, serviceDesc as serviceDesc10, tsEnum as tsEnum9 } from "@bufbuild/protobuf/codegenv2";
801
804
  import { file_google_protobuf_struct as file_google_protobuf_struct10, file_google_protobuf_timestamp as file_google_protobuf_timestamp11 } from "@bufbuild/protobuf/wkt";
802
- var file_notifications_v1_notifications = /* @__PURE__ */ fileDesc14("CiRub3RpZmljYXRpb25zL3YxL25vdGlmaWNhdGlvbnMucHJvdG8SEG5vdGlmaWNhdGlvbnMudjEisAUKDE5vdGlmaWNhdGlvbhIKCgJpZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEjAKBHR5cGUYAyABKA4yIi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblR5cGUSDQoFdGl0bGUYBCABKAkSFAoHbWVzc2FnZRgFIAEoCUgAiAEBEjIKDHJpY2hfY29udGVudBgGIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAYgBARJCCgtzb3VyY2VfdHlwZRgKIAEoDjIoLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU291cmNlVHlwZUgCiAEBEhYKCXNvdXJjZV9pZBgLIAEoCUgDiAEBEhcKCmFjdGlvbl91cmwYDCABKAlIBIgBARIuCghtZXRhZGF0YRgNIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIBYgBARIPCgdpc19yZWFkGBQgASgIEjAKB3JlYWRfYXQYFSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAaIAQESEQoJdGVuYW50X2lkGB4gASgJEhcKCnByb2plY3RfaWQYHyABKAlIB4gBARIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpleHBpcmVzX2F0GDMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgIiAEBQgoKCF9tZXNzYWdlQg8KDV9yaWNoX2NvbnRlbnRCDgoMX3NvdXJjZV90eXBlQgwKCl9zb3VyY2VfaWRCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0Qg0KC19wcm9qZWN0X2lkQg0KC19leHBpcmVzX2F0IskBChhMaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QSKwoFd2hlcmUYASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SACIAQESEgoFYWZ0ZXIYAiABKAlIAYgBARITCgZiZWZvcmUYAyABKAlIAogBARISCgVmaXJzdBgEIAEoBUgDiAEBEhEKBGxhc3QYBSABKAVIBIgBAUIICgZfd2hlcmVCCAoGX2FmdGVyQgkKB19iZWZvcmVCCAoGX2ZpcnN0QgcKBV9sYXN0IsMBChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEjUKDW5vdGlmaWNhdGlvbnMYASADKAsyHi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIUCgx1bnJlYWRfY291bnQYAyABKAUSKwoJcGFnZV9pbmZvGAQgASgLMhMuY29tbW9uLnYxLlBhZ2VJbmZvSACIAQESDwoHY3Vyc29ycxgFIAMoCUIMCgpfcGFnZV9pbmZvIikKG01hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIKCgJpZBgBIAEoCSIvChxNYXJrTm90aWZpY2F0aW9uUmVhZFJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiYQofTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBI1CgR0eXBlGAEgASgOMiIubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25UeXBlSACIAQFCBwoFX3R5cGUiMQogTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USDQoFY291bnQYASABKAUiJwoZRGVsZXRlTm90aWZpY2F0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCSItChpEZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIhcKFUdldFVucmVhZENvdW50UmVxdWVzdCInChZHZXRVbnJlYWRDb3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgFIrABChdTZW5kQW5ub3VuY2VtZW50UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIUCgdtZXNzYWdlGAIgASgJSACIAQESFwoKYWN0aW9uX3VybBgDIAEoCUgBiAEBEhgKC3RhcmdldF90eXBlGAQgASgJSAKIAQESEgoKdGFyZ2V0X2lkcxgFIAMoCUIKCghfbWVzc2FnZUINCgtfYWN0aW9uX3VybEIOCgxfdGFyZ2V0X3R5cGUiUAoYU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEjQKDG5vdGlmaWNhdGlvbhgBIAEoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uIpgBCh5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QSEgoFYWZ0ZXIYASABKAlIAIgBARITCgZiZWZvcmUYAiABKAlIAYgBARISCgVmaXJzdBgDIAEoBUgCiAEBEhEKBGxhc3QYBCABKAVIA4gBAUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QiswEKH0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2USNQoNYW5ub3VuY2VtZW50cxgBIAMoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uEg0KBXRvdGFsGAIgASgFEisKCXBhZ2VfaW5mbxgDIAEoCzITLmNvbW1vbi52MS5QYWdlSW5mb0gAiAEBEg8KB2N1cnNvcnMYBCADKAlCDAoKX3BhZ2VfaW5mbyKXAwoUQ3VzdG9tZXJOb3RpZmljYXRpb24SCgoCaWQYASABKAkSEwoLY3VzdG9tZXJfaWQYAiABKAkSDQoFdGl0bGUYAyABKAkSFAoHbWVzc2FnZRgEIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAUgASgJSAGIAQESFwoKYWN0aW9uX3VybBgGIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAcgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBEg8KB2lzX3JlYWQYCCABKAgSMAoHcmVhZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIBIgBARIRCgl0ZW5hbnRfaWQYFCABKAkSEgoKcHJvamVjdF9pZBgVIAEoCRIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0ItEBCiBMaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVxdWVzdBIrCgV3aGVyZRgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAIgBARISCgVhZnRlchgCIAEoCUgBiAEBEhMKBmJlZm9yZRgDIAEoCUgCiAEBEhIKBWZpcnN0GAQgASgFSAOIAQESEQoEbGFzdBgFIAEoBUgEiAEBQggKBl93aGVyZUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QivQEKIUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXNwb25zZRI9Cg1ub3RpZmljYXRpb25zGAEgAygLMiYubm90aWZpY2F0aW9ucy52MS5DdXN0b21lck5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIrCglwYWdlX2luZm8YAyABKAsyEy5jb21tb24udjEuUGFnZUluZm9IAIgBARIPCgdjdXJzb3JzGAQgAygJQgwKCl9wYWdlX2luZm8i8AEKH1NlbmRDdXN0b21lck5vdGlmaWNhdGlvblJlcXVlc3QSEwoLY3VzdG9tZXJfaWQYASABKAkSDQoFdGl0bGUYAiABKAkSFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAQgASgJSAGIAQESFwoKYWN0aW9uX3VybBgFIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBQgoKCF9tZXNzYWdlQgsKCV9jYXRlZ29yeUINCgtfYWN0aW9uX3VybEILCglfbWV0YWRhdGEiYAogU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USPAoMbm90aWZpY2F0aW9uGAEgASgLMiYubm90aWZpY2F0aW9ucy52MS5DdXN0b21lck5vdGlmaWNhdGlvbiK4AQojU2VuZEJ1bGtDdXN0b21lck5vdGlmaWNhdGlvblJlcXVlc3QSFAoMY3VzdG9tZXJfaWRzGAEgAygJEg0KBXRpdGxlGAIgASgJEhQKB21lc3NhZ2UYAyABKAlIAIgBARIVCghjYXRlZ29yeRgEIAEoCUgBiAEBEhcKCmFjdGlvbl91cmwYBSABKAlIAogBAUIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmwiNQokU2VuZEJ1bGtDdXN0b21lck5vdGlmaWNhdGlvblJlc3BvbnNlEg0KBWNvdW50GAEgASgFIjEKI01hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXF1ZXN0EgoKAmlkGAEgASgJIjcKJE1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIlMKJ01hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBIYCgtjdXN0b21lcl9pZBgBIAEoCUgAiAEBQg4KDF9jdXN0b21lcl9pZCI5CihNYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlc3BvbnNlEg0KBWNvdW50GAEgASgFItABCh9MaXN0UHJvamVjdE5vdGlmaWNhdGlvbnNSZXF1ZXN0EisKBXdoZXJlGAEgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAiAEBEhIKBWFmdGVyGAIgASgJSAGIAQESEwoGYmVmb3JlGAMgASgJSAKIAQESEgoFZmlyc3QYBCABKAVIA4gBARIRCgRsYXN0GAUgASgFSASIAQFCCAoGX3doZXJlQggKBl9hZnRlckIJCgdfYmVmb3JlQggKBl9maXJzdEIHCgVfbGFzdCK8AQogTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVzcG9uc2USPQoNbm90aWZpY2F0aW9ucxgBIAMoCzImLm5vdGlmaWNhdGlvbnMudjEuQ3VzdG9tZXJOb3RpZmljYXRpb24SDQoFdG90YWwYAiABKAUSKwoJcGFnZV9pbmZvGAMgASgLMhMuY29tbW9uLnYxLlBhZ2VJbmZvSACIAQESDwoHY3Vyc29ycxgEIAMoCUIMCgpfcGFnZV9pbmZvIm8KFk5vdGlmaWNhdGlvblByZWZlcmVuY2USEAoIY2F0ZWdvcnkYASABKAkSFQoNZW1haWxfZW5hYmxlZBgCIAEoCBIUCgxwdXNoX2VuYWJsZWQYAyABKAgSFgoOaW5fYXBwX2VuYWJsZWQYBCABKAgiOAohR2V0Tm90aWZpY2F0aW9uUHJlZmVyZW5jZXNSZXF1ZXN0EhMKC2N1c3RvbWVyX2lkGAEgASgJImMKIkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVzcG9uc2USPQoLcHJlZmVyZW5jZXMYASADKAsyKC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblByZWZlcmVuY2Ui1gEKI1VwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXF1ZXN0EhMKC2N1c3RvbWVyX2lkGAEgASgJEhAKCGNhdGVnb3J5GAIgASgJEhoKDWVtYWlsX2VuYWJsZWQYAyABKAhIAIgBARIZCgxwdXNoX2VuYWJsZWQYBCABKAhIAYgBARIbCg5pbl9hcHBfZW5hYmxlZBgFIAEoCEgCiAEBQhAKDl9lbWFpbF9lbmFibGVkQg8KDV9wdXNoX2VuYWJsZWRCEQoPX2luX2FwcF9lbmFibGVkIjcKJFVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIlIKGlJlZ2lzdGVyRGV2aWNlVG9rZW5SZXF1ZXN0EhMKC2N1c3RvbWVyX2lkGAEgASgJEg0KBXRva2VuGAIgASgJEhAKCHBsYXRmb3JtGAMgASgJIi4KG1JlZ2lzdGVyRGV2aWNlVG9rZW5SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIi0KHFVucmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QSDQoFdG9rZW4YASABKAkiMAodVW5yZWdpc3RlckRldmljZVRva2VuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCrIAgoQTm90aWZpY2F0aW9uVHlwZRIhCh1OT1RJRklDQVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEiMKH05PVElGSUNBVElPTl9UWVBFX0pPQl9DT01QTEVURUQQARIgChxOT1RJRklDQVRJT05fVFlQRV9KT0JfRkFJTEVEEAISIgoeTk9USUZJQ0FUSU9OX1RZUEVfSk9CX1BST0dSRVNTEAMSHQoZTk9USUZJQ0FUSU9OX1RZUEVfTUVOVElPThAEEiAKHE5PVElGSUNBVElPTl9UWVBFX05PVEVfUkVQTFkQBRIjCh9OT1RJRklDQVRJT05fVFlQRV9OT1RFX1JFU09MVkVEEAYSHAoYTk9USUZJQ0FUSU9OX1RZUEVfU1lTVEVNEAcSIgoeTk9USUZJQ0FUSU9OX1RZUEVfQU5OT1VOQ0VNRU5UEAgq9QEKFk5vdGlmaWNhdGlvblNvdXJjZVR5cGUSKAokTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1VOU1BFQ0lGSUVEEAASIwofTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1JFQ09SRBABEiIKHk5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9NT0RFTBACEiEKHU5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9OT1RFEAMSIAocTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX0pPQhAEEiMKH05PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9TWVNURU0QBTKTEQoUTm90aWZpY2F0aW9uc1NlcnZpY2USbAoRTGlzdE5vdGlmaWNhdGlvbnMSKi5ub3RpZmljYXRpb25zLnYxLkxpc3ROb3RpZmljYXRpb25zUmVxdWVzdBorLm5vdGlmaWNhdGlvbnMudjEuTGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZRJjCg5HZXRVbnJlYWRDb3VudBInLm5vdGlmaWNhdGlvbnMudjEuR2V0VW5yZWFkQ291bnRSZXF1ZXN0Gigubm90aWZpY2F0aW9ucy52MS5HZXRVbnJlYWRDb3VudFJlc3BvbnNlEnUKFE1hcmtOb3RpZmljYXRpb25SZWFkEi0ubm90aWZpY2F0aW9ucy52MS5NYXJrTm90aWZpY2F0aW9uUmVhZFJlcXVlc3QaLi5ub3RpZmljYXRpb25zLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USgQEKGE1hcmtBbGxOb3RpZmljYXRpb25zUmVhZBIxLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USbwoSRGVsZXRlTm90aWZpY2F0aW9uEisubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXF1ZXN0Giwubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRJpChBTZW5kQW5ub3VuY2VtZW50Eikubm90aWZpY2F0aW9ucy52MS5TZW5kQW5ub3VuY2VtZW50UmVxdWVzdBoqLm5vdGlmaWNhdGlvbnMudjEuU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEn4KF0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5EjAubm90aWZpY2F0aW9ucy52MS5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QaMS5ub3RpZmljYXRpb25zLnYxLkxpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2UShAEKGUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnMSMi5ub3RpZmljYXRpb25zLnYxLkxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXF1ZXN0GjMubm90aWZpY2F0aW9ucy52MS5MaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVzcG9uc2USgQEKGFNlbmRDdXN0b21lck5vdGlmaWNhdGlvbhIxLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHFNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb24SNS5ub3RpZmljYXRpb25zLnYxLlNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5TZW5kQnVsa0N1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHE1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWQSNS5ub3RpZmljYXRpb25zLnYxLk1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5NYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USmQEKIE1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkEjkubm90aWZpY2F0aW9ucy52MS5NYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QaOi5ub3RpZmljYXRpb25zLnYxLk1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USgQEKGExpc3RQcm9qZWN0Tm90aWZpY2F0aW9ucxIxLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVzcG9uc2UShwEKGkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzEjMubm90aWZpY2F0aW9ucy52MS5HZXROb3RpZmljYXRpb25QcmVmZXJlbmNlc1JlcXVlc3QaNC5ub3RpZmljYXRpb25zLnYxLkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVzcG9uc2USjQEKHFVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2USNS5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVzcG9uc2UScgoTUmVnaXN0ZXJEZXZpY2VUb2tlbhIsLm5vdGlmaWNhdGlvbnMudjEuUmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLS5ub3RpZmljYXRpb25zLnYxLlJlZ2lzdGVyRGV2aWNlVG9rZW5SZXNwb25zZRJ4ChVVbnJlZ2lzdGVyRGV2aWNlVG9rZW4SLi5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLy5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vZWlkZXN0dWRpby9mb2lyL2dlbi9wcm90by9ub3RpZmljYXRpb25zL3YxO25vdGlmaWNhdGlvbnN2MWIGcHJvdG8z", [file_google_protobuf_struct10, file_google_protobuf_timestamp11, file_common_v1_pagination]);
805
+ var file_notifications_v1_notifications = /* @__PURE__ */ fileDesc14("CiRub3RpZmljYXRpb25zL3YxL25vdGlmaWNhdGlvbnMucHJvdG8SEG5vdGlmaWNhdGlvbnMudjEisAUKDE5vdGlmaWNhdGlvbhIKCgJpZBgBIAEoCRIPCgd1c2VyX2lkGAIgASgJEjAKBHR5cGUYAyABKA4yIi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblR5cGUSDQoFdGl0bGUYBCABKAkSFAoHbWVzc2FnZRgFIAEoCUgAiAEBEjIKDHJpY2hfY29udGVudBgGIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAYgBARJCCgtzb3VyY2VfdHlwZRgKIAEoDjIoLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU291cmNlVHlwZUgCiAEBEhYKCXNvdXJjZV9pZBgLIAEoCUgDiAEBEhcKCmFjdGlvbl91cmwYDCABKAlIBIgBARIuCghtZXRhZGF0YRgNIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIBYgBARIPCgdpc19yZWFkGBQgASgIEjAKB3JlYWRfYXQYFSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAaIAQESEQoJdGVuYW50X2lkGB4gASgJEhcKCnByb2plY3RfaWQYHyABKAlIB4gBARIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIzCgpleHBpcmVzX2F0GDMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgIiAEBQgoKCF9tZXNzYWdlQg8KDV9yaWNoX2NvbnRlbnRCDgoMX3NvdXJjZV90eXBlQgwKCl9zb3VyY2VfaWRCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0Qg0KC19wcm9qZWN0X2lkQg0KC19leHBpcmVzX2F0IskBChhMaXN0Tm90aWZpY2F0aW9uc1JlcXVlc3QSKwoFd2hlcmUYASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SACIAQESEgoFYWZ0ZXIYAiABKAlIAYgBARITCgZiZWZvcmUYAyABKAlIAogBARISCgVmaXJzdBgEIAEoBUgDiAEBEhEKBGxhc3QYBSABKAVIBIgBAUIICgZfd2hlcmVCCAoGX2FmdGVyQgkKB19iZWZvcmVCCAoGX2ZpcnN0QgcKBV9sYXN0IsMBChlMaXN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEjUKDW5vdGlmaWNhdGlvbnMYASADKAsyHi5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIUCgx1bnJlYWRfY291bnQYAyABKAUSKwoJcGFnZV9pbmZvGAQgASgLMhMuY29tbW9uLnYxLlBhZ2VJbmZvSACIAQESDwoHY3Vyc29ycxgFIAMoCUIMCgpfcGFnZV9pbmZvIikKG01hcmtOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIKCgJpZBgBIAEoCSIvChxNYXJrTm90aWZpY2F0aW9uUmVhZFJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiYQofTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBI1CgR0eXBlGAEgASgOMiIubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25UeXBlSACIAQFCBwoFX3R5cGUiMQogTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USDQoFY291bnQYASABKAUiJwoZRGVsZXRlTm90aWZpY2F0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCSItChpEZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIIhcKFUdldFVucmVhZENvdW50UmVxdWVzdCInChZHZXRVbnJlYWRDb3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgFIrABChdTZW5kQW5ub3VuY2VtZW50UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIUCgdtZXNzYWdlGAIgASgJSACIAQESFwoKYWN0aW9uX3VybBgDIAEoCUgBiAEBEhgKC3RhcmdldF90eXBlGAQgASgJSAKIAQESEgoKdGFyZ2V0X2lkcxgFIAMoCUIKCghfbWVzc2FnZUINCgtfYWN0aW9uX3VybEIOCgxfdGFyZ2V0X3R5cGUiUAoYU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEjQKDG5vdGlmaWNhdGlvbhgBIAEoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uIpgBCh5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QSEgoFYWZ0ZXIYASABKAlIAIgBARITCgZiZWZvcmUYAiABKAlIAYgBARISCgVmaXJzdBgDIAEoBUgCiAEBEhEKBGxhc3QYBCABKAVIA4gBAUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QiswEKH0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2USNQoNYW5ub3VuY2VtZW50cxgBIAMoCzIeLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uEg0KBXRvdGFsGAIgASgFEisKCXBhZ2VfaW5mbxgDIAEoCzITLmNvbW1vbi52MS5QYWdlSW5mb0gAiAEBEg8KB2N1cnNvcnMYBCADKAlCDAoKX3BhZ2VfaW5mbyKXAwoUQ3VzdG9tZXJOb3RpZmljYXRpb24SCgoCaWQYASABKAkSEwoLY3VzdG9tZXJfaWQYAiABKAkSDQoFdGl0bGUYAyABKAkSFAoHbWVzc2FnZRgEIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAUgASgJSAGIAQESFwoKYWN0aW9uX3VybBgGIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAcgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBEg8KB2lzX3JlYWQYCCABKAgSMAoHcmVhZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIBIgBARIRCgl0ZW5hbnRfaWQYFCABKAkSEgoKcHJvamVjdF9pZBgVIAEoCRIuCgpjcmVhdGVkX2F0GDIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgoKCF9yZWFkX2F0ItEBCiBMaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVxdWVzdBIrCgV3aGVyZRgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAIgBARISCgVhZnRlchgCIAEoCUgBiAEBEhMKBmJlZm9yZRgDIAEoCUgCiAEBEhIKBWZpcnN0GAQgASgFSAOIAQESEQoEbGFzdBgFIAEoBUgEiAEBQggKBl93aGVyZUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QivQEKIUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXNwb25zZRI9Cg1ub3RpZmljYXRpb25zGAEgAygLMiYubm90aWZpY2F0aW9ucy52MS5DdXN0b21lck5vdGlmaWNhdGlvbhINCgV0b3RhbBgCIAEoBRIrCglwYWdlX2luZm8YAyABKAsyEy5jb21tb24udjEuUGFnZUluZm9IAIgBARIPCgdjdXJzb3JzGAQgAygJQgwKCl9wYWdlX2luZm8izwQKH1NlbmRDdXN0b21lck5vdGlmaWNhdGlvblJlcXVlc3QSEwoLY3VzdG9tZXJfaWQYASABKAkSDQoFdGl0bGUYAiABKAkSFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhUKCGNhdGVnb3J5GAQgASgJSAGIAQESFwoKYWN0aW9uX3VybBgFIAEoCUgCiAEBEi4KCG1ldGFkYXRhGAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgDiAEBEhYKCWRlZXBfbGluaxgKIAEoCUgEiAEBEhIKBWJhZGdlGAsgASgFSAWIAQESFgoJdGhyZWFkX2lkGAwgASgJSAaIAQESLwoJcHVzaF9kYXRhGA0gASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgHiAEBEhoKDWVtYWlsX3N1YmplY3QYFCABKAlICIgBARIXCgplbWFpbF9ib2R5GBUgASgJSAmIAQESGwoOZW1haWxfcmVwbHlfdG8YFiABKAlICogBARIuCgplbWFpbF9jdGFzGBcgAygLMhoubm90aWZpY2F0aW9ucy52MS5FbWFpbEN0YUIKCghfbWVzc2FnZUILCglfY2F0ZWdvcnlCDQoLX2FjdGlvbl91cmxCCwoJX21ldGFkYXRhQgwKCl9kZWVwX2xpbmtCCAoGX2JhZGdlQgwKCl90aHJlYWRfaWRCDAoKX3B1c2hfZGF0YUIQCg5fZW1haWxfc3ViamVjdEINCgtfZW1haWxfYm9keUIRCg9fZW1haWxfcmVwbHlfdG8iJgoIRW1haWxDdGESDQoFbGFiZWwYASABKAkSCwoDdXJsGAIgASgJImAKIFNlbmRDdXN0b21lck5vdGlmaWNhdGlvblJlc3BvbnNlEjwKDG5vdGlmaWNhdGlvbhgBIAEoCzImLm5vdGlmaWNhdGlvbnMudjEuQ3VzdG9tZXJOb3RpZmljYXRpb24iuAEKI1NlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXF1ZXN0EhQKDGN1c3RvbWVyX2lkcxgBIAMoCRINCgV0aXRsZRgCIAEoCRIUCgdtZXNzYWdlGAMgASgJSACIAQESFQoIY2F0ZWdvcnkYBCABKAlIAYgBARIXCgphY3Rpb25fdXJsGAUgASgJSAKIAQFCCgoIX21lc3NhZ2VCCwoJX2NhdGVnb3J5Qg0KC19hY3Rpb25fdXJsIjUKJFNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXNwb25zZRINCgVjb3VudBgBIAEoBSIxCiNNYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVxdWVzdBIKCgJpZBgBIAEoCSI3CiRNYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCJTCidNYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QSGAoLY3VzdG9tZXJfaWQYASABKAlIAIgBAUIOCgxfY3VzdG9tZXJfaWQiOQooTWFya0FsbEN1c3RvbWVyTm90aWZpY2F0aW9uc1JlYWRSZXNwb25zZRINCgVjb3VudBgBIAEoBSLQAQofTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVxdWVzdBIrCgV3aGVyZRgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAIgBARISCgVhZnRlchgCIAEoCUgBiAEBEhMKBmJlZm9yZRgDIAEoCUgCiAEBEhIKBWZpcnN0GAQgASgFSAOIAQESEQoEbGFzdBgFIAEoBUgEiAEBQggKBl93aGVyZUIICgZfYWZ0ZXJCCQoHX2JlZm9yZUIICgZfZmlyc3RCBwoFX2xhc3QivAEKIExpc3RQcm9qZWN0Tm90aWZpY2F0aW9uc1Jlc3BvbnNlEj0KDW5vdGlmaWNhdGlvbnMYASADKAsyJi5ub3RpZmljYXRpb25zLnYxLkN1c3RvbWVyTm90aWZpY2F0aW9uEg0KBXRvdGFsGAIgASgFEisKCXBhZ2VfaW5mbxgDIAEoCzITLmNvbW1vbi52MS5QYWdlSW5mb0gAiAEBEg8KB2N1cnNvcnMYBCADKAlCDAoKX3BhZ2VfaW5mbyJvChZOb3RpZmljYXRpb25QcmVmZXJlbmNlEhAKCGNhdGVnb3J5GAEgASgJEhUKDWVtYWlsX2VuYWJsZWQYAiABKAgSFAoMcHVzaF9lbmFibGVkGAMgASgIEhYKDmluX2FwcF9lbmFibGVkGAQgASgIIjgKIUdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVxdWVzdBITCgtjdXN0b21lcl9pZBgBIAEoCSJjCiJHZXROb3RpZmljYXRpb25QcmVmZXJlbmNlc1Jlc3BvbnNlEj0KC3ByZWZlcmVuY2VzGAEgAygLMigubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25QcmVmZXJlbmNlItYBCiNVcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVxdWVzdBITCgtjdXN0b21lcl9pZBgBIAEoCRIQCghjYXRlZ29yeRgCIAEoCRIaCg1lbWFpbF9lbmFibGVkGAMgASgISACIAQESGQoMcHVzaF9lbmFibGVkGAQgASgISAGIAQESGwoOaW5fYXBwX2VuYWJsZWQYBSABKAhIAogBAUIQCg5fZW1haWxfZW5hYmxlZEIPCg1fcHVzaF9lbmFibGVkQhEKD19pbl9hcHBfZW5hYmxlZCI3CiRVcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCJ8ChpSZWdpc3RlckRldmljZVRva2VuUmVxdWVzdBITCgtjdXN0b21lcl9pZBgBIAEoCRINCgV0b2tlbhgCIAEoCRIQCghwbGF0Zm9ybRgDIAEoCRIYCgtkZXZpY2VfbmFtZRgEIAEoCUgAiAEBQg4KDF9kZXZpY2VfbmFtZSIuChtSZWdpc3RlckRldmljZVRva2VuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCItChxVbnJlZ2lzdGVyRGV2aWNlVG9rZW5SZXF1ZXN0Eg0KBXRva2VuGAEgASgJIjAKHVVucmVnaXN0ZXJEZXZpY2VUb2tlblJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiyAMKDlB1c2hDcmVkZW50aWFsEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSEAoIcGxhdGZvcm0YAyABKAkSFgoJYnVuZGxlX2lkGAogASgJSACIAQESGQoMYXBuc190ZWFtX2lkGAsgASgJSAGIAQESGAoLYXBuc19rZXlfaWQYDCABKAlIAogBARIcCg9hcG5zX3Byb2R1Y3Rpb24YDSABKAhIA4gBARIbCg5mY21fcHJvamVjdF9pZBgUIAEoCUgEiAEBEh0KEGZjbV9jbGllbnRfZW1haWwYFSABKAlIBYgBARISCgpoYXNfc2VjcmV0GB4gASgIEi4KCmNyZWF0ZWRfYXQYMiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYMyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgwKCl9idW5kbGVfaWRCDwoNX2FwbnNfdGVhbV9pZEIOCgxfYXBuc19rZXlfaWRCEgoQX2FwbnNfcHJvZHVjdGlvbkIRCg9fZmNtX3Byb2plY3RfaWRCEwoRX2ZjbV9jbGllbnRfZW1haWwi3wIKG1VwbG9hZFB1c2hDcmVkZW50aWFsUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJEhAKCHBsYXRmb3JtGAIgASgJEhgKC2FwbnNfcDhfa2V5GAogASgJSACIAQESFgoJYnVuZGxlX2lkGAsgASgJSAGIAQESGQoMYXBuc190ZWFtX2lkGAwgASgJSAKIAQESGAoLYXBuc19rZXlfaWQYDSABKAlIA4gBARIcCg9hcG5zX3Byb2R1Y3Rpb24YDiABKAhIBIgBARIlChhmY21fc2VydmljZV9hY2NvdW50X2pzb24YFCABKAlIBYgBAUIOCgxfYXBuc19wOF9rZXlCDAoKX2J1bmRsZV9pZEIPCg1fYXBuc190ZWFtX2lkQg4KDF9hcG5zX2tleV9pZEISChBfYXBuc19wcm9kdWN0aW9uQhsKGV9mY21fc2VydmljZV9hY2NvdW50X2pzb24iVAocVXBsb2FkUHVzaENyZWRlbnRpYWxSZXNwb25zZRI0CgpjcmVkZW50aWFsGAEgASgLMiAubm90aWZpY2F0aW9ucy52MS5QdXNoQ3JlZGVudGlhbCIwChpMaXN0UHVzaENyZWRlbnRpYWxzUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJIlQKG0xpc3RQdXNoQ3JlZGVudGlhbHNSZXNwb25zZRI1CgtjcmVkZW50aWFscxgBIAMoCzIgLm5vdGlmaWNhdGlvbnMudjEuUHVzaENyZWRlbnRpYWwiKQobRGVsZXRlUHVzaENyZWRlbnRpYWxSZXF1ZXN0EgoKAmlkGAEgASgJIi8KHERlbGV0ZVB1c2hDcmVkZW50aWFsUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCrIAgoQTm90aWZpY2F0aW9uVHlwZRIhCh1OT1RJRklDQVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEiMKH05PVElGSUNBVElPTl9UWVBFX0pPQl9DT01QTEVURUQQARIgChxOT1RJRklDQVRJT05fVFlQRV9KT0JfRkFJTEVEEAISIgoeTk9USUZJQ0FUSU9OX1RZUEVfSk9CX1BST0dSRVNTEAMSHQoZTk9USUZJQ0FUSU9OX1RZUEVfTUVOVElPThAEEiAKHE5PVElGSUNBVElPTl9UWVBFX05PVEVfUkVQTFkQBRIjCh9OT1RJRklDQVRJT05fVFlQRV9OT1RFX1JFU09MVkVEEAYSHAoYTk9USUZJQ0FUSU9OX1RZUEVfU1lTVEVNEAcSIgoeTk9USUZJQ0FUSU9OX1RZUEVfQU5OT1VOQ0VNRU5UEAgq9QEKFk5vdGlmaWNhdGlvblNvdXJjZVR5cGUSKAokTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1VOU1BFQ0lGSUVEEAASIwofTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX1JFQ09SRBABEiIKHk5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9NT0RFTBACEiEKHU5PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9OT1RFEAMSIAocTk9USUZJQ0FUSU9OX1NPVVJDRV9UWVBFX0pPQhAEEiMKH05PVElGSUNBVElPTl9TT1VSQ0VfVFlQRV9TWVNURU0QBTL1EwoUTm90aWZpY2F0aW9uc1NlcnZpY2USbAoRTGlzdE5vdGlmaWNhdGlvbnMSKi5ub3RpZmljYXRpb25zLnYxLkxpc3ROb3RpZmljYXRpb25zUmVxdWVzdBorLm5vdGlmaWNhdGlvbnMudjEuTGlzdE5vdGlmaWNhdGlvbnNSZXNwb25zZRJjCg5HZXRVbnJlYWRDb3VudBInLm5vdGlmaWNhdGlvbnMudjEuR2V0VW5yZWFkQ291bnRSZXF1ZXN0Gigubm90aWZpY2F0aW9ucy52MS5HZXRVbnJlYWRDb3VudFJlc3BvbnNlEnUKFE1hcmtOb3RpZmljYXRpb25SZWFkEi0ubm90aWZpY2F0aW9ucy52MS5NYXJrTm90aWZpY2F0aW9uUmVhZFJlcXVlc3QaLi5ub3RpZmljYXRpb25zLnYxLk1hcmtOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USgQEKGE1hcmtBbGxOb3RpZmljYXRpb25zUmVhZBIxLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USbwoSRGVsZXRlTm90aWZpY2F0aW9uEisubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXF1ZXN0Giwubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25SZXNwb25zZRJpChBTZW5kQW5ub3VuY2VtZW50Eikubm90aWZpY2F0aW9ucy52MS5TZW5kQW5ub3VuY2VtZW50UmVxdWVzdBoqLm5vdGlmaWNhdGlvbnMudjEuU2VuZEFubm91bmNlbWVudFJlc3BvbnNlEn4KF0xpc3RBbm5vdW5jZW1lbnRIaXN0b3J5EjAubm90aWZpY2F0aW9ucy52MS5MaXN0QW5ub3VuY2VtZW50SGlzdG9yeVJlcXVlc3QaMS5ub3RpZmljYXRpb25zLnYxLkxpc3RBbm5vdW5jZW1lbnRIaXN0b3J5UmVzcG9uc2UShAEKGUxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnMSMi5ub3RpZmljYXRpb25zLnYxLkxpc3RDdXN0b21lck5vdGlmaWNhdGlvbnNSZXF1ZXN0GjMubm90aWZpY2F0aW9ucy52MS5MaXN0Q3VzdG9tZXJOb3RpZmljYXRpb25zUmVzcG9uc2USgQEKGFNlbmRDdXN0b21lck5vdGlmaWNhdGlvbhIxLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHFNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb24SNS5ub3RpZmljYXRpb25zLnYxLlNlbmRCdWxrQ3VzdG9tZXJOb3RpZmljYXRpb25SZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5TZW5kQnVsa0N1c3RvbWVyTm90aWZpY2F0aW9uUmVzcG9uc2USjQEKHE1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWQSNS5ub3RpZmljYXRpb25zLnYxLk1hcmtDdXN0b21lck5vdGlmaWNhdGlvblJlYWRSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5NYXJrQ3VzdG9tZXJOb3RpZmljYXRpb25SZWFkUmVzcG9uc2USmQEKIE1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkEjkubm90aWZpY2F0aW9ucy52MS5NYXJrQWxsQ3VzdG9tZXJOb3RpZmljYXRpb25zUmVhZFJlcXVlc3QaOi5ub3RpZmljYXRpb25zLnYxLk1hcmtBbGxDdXN0b21lck5vdGlmaWNhdGlvbnNSZWFkUmVzcG9uc2USgQEKGExpc3RQcm9qZWN0Tm90aWZpY2F0aW9ucxIxLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVxdWVzdBoyLm5vdGlmaWNhdGlvbnMudjEuTGlzdFByb2plY3ROb3RpZmljYXRpb25zUmVzcG9uc2UShwEKGkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzEjMubm90aWZpY2F0aW9ucy52MS5HZXROb3RpZmljYXRpb25QcmVmZXJlbmNlc1JlcXVlc3QaNC5ub3RpZmljYXRpb25zLnYxLkdldE5vdGlmaWNhdGlvblByZWZlcmVuY2VzUmVzcG9uc2USjQEKHFVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2USNS5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblByZWZlcmVuY2VSZXF1ZXN0GjYubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25QcmVmZXJlbmNlUmVzcG9uc2UScgoTUmVnaXN0ZXJEZXZpY2VUb2tlbhIsLm5vdGlmaWNhdGlvbnMudjEuUmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLS5ub3RpZmljYXRpb25zLnYxLlJlZ2lzdGVyRGV2aWNlVG9rZW5SZXNwb25zZRJ4ChVVbnJlZ2lzdGVyRGV2aWNlVG9rZW4SLi5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlcXVlc3QaLy5ub3RpZmljYXRpb25zLnYxLlVucmVnaXN0ZXJEZXZpY2VUb2tlblJlc3BvbnNlEnUKFFVwbG9hZFB1c2hDcmVkZW50aWFsEi0ubm90aWZpY2F0aW9ucy52MS5VcGxvYWRQdXNoQ3JlZGVudGlhbFJlcXVlc3QaLi5ub3RpZmljYXRpb25zLnYxLlVwbG9hZFB1c2hDcmVkZW50aWFsUmVzcG9uc2UScgoTTGlzdFB1c2hDcmVkZW50aWFscxIsLm5vdGlmaWNhdGlvbnMudjEuTGlzdFB1c2hDcmVkZW50aWFsc1JlcXVlc3QaLS5ub3RpZmljYXRpb25zLnYxLkxpc3RQdXNoQ3JlZGVudGlhbHNSZXNwb25zZRJ1ChREZWxldGVQdXNoQ3JlZGVudGlhbBItLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlUHVzaENyZWRlbnRpYWxSZXF1ZXN0Gi4ubm90aWZpY2F0aW9ucy52MS5EZWxldGVQdXNoQ3JlZGVudGlhbFJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vZWlkZXN0dWRpby9mb2lyL2dlbi9wcm90by9ub3RpZmljYXRpb25zL3YxO25vdGlmaWNhdGlvbnN2MWIGcHJvdG8z", [file_google_protobuf_struct10, file_google_protobuf_timestamp11, file_common_v1_pagination]);
803
806
  var NotificationSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 0);
804
807
  var ListNotificationsRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 1);
805
808
  var MarkNotificationReadRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 3);
806
809
  var MarkAllNotificationsReadRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 5);
810
+ var SendCustomerNotificationRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 18);
811
+ var RegisterDeviceTokenRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 34);
812
+ var UnregisterDeviceTokenRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 36);
813
+ var PushCredentialSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 38);
814
+ var UploadPushCredentialRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 39);
815
+ var ListPushCredentialsRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 41);
816
+ var DeletePushCredentialRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 43);
807
817
  var NotificationsService = /* @__PURE__ */ serviceDesc10(file_notifications_v1_notifications, 0);
808
818
 
809
819
  // ../../packages/proto-ts/src/schedules/v1/schedules_pb.js
@@ -1798,6 +1808,15 @@ function createModelsMethods(client) {
1798
1808
  create3(PublishModelRequestSchema, { id })
1799
1809
  );
1800
1810
  return resp.model ?? null;
1811
+ },
1812
+ // Pending-publish state for one model: whether the draft diverges from
1813
+ // the published snapshot, and the severity-tagged change list. CLI push
1814
+ // reads this to decide whether an update is safe to auto-publish.
1815
+ async getModelPublishStatus(id) {
1816
+ const resp = await client.getModelPublishStatus(
1817
+ create3(GetModelPublishStatusRequestSchema, { id })
1818
+ );
1819
+ return resp.status ?? null;
1801
1820
  }
1802
1821
  };
1803
1822
  }
@@ -3229,6 +3248,73 @@ function createNotificationsMethods(client) {
3229
3248
  create11(MarkAllNotificationsReadRequestSchema, {})
3230
3249
  );
3231
3250
  return resp.count;
3251
+ },
3252
+ // ── Push Credentials ────────────────────────────────────────
3253
+ async listPushCredentials(params) {
3254
+ return client.listPushCredentials(
3255
+ create11(ListPushCredentialsRequestSchema, {
3256
+ projectId: params.projectId
3257
+ })
3258
+ );
3259
+ },
3260
+ async uploadPushCredential(params) {
3261
+ const resp = await client.uploadPushCredential(
3262
+ create11(UploadPushCredentialRequestSchema, {
3263
+ projectId: params.projectId,
3264
+ platform: params.platform,
3265
+ apnsP8Key: params.apnsP8Key,
3266
+ bundleId: params.bundleId,
3267
+ apnsTeamId: params.apnsTeamId,
3268
+ apnsKeyId: params.apnsKeyId,
3269
+ apnsProduction: params.apnsProduction,
3270
+ fcmServiceAccountJson: params.fcmServiceAccountJson
3271
+ })
3272
+ );
3273
+ return resp.credential ?? null;
3274
+ },
3275
+ async deletePushCredential(params) {
3276
+ const resp = await client.deletePushCredential(
3277
+ create11(DeletePushCredentialRequestSchema, { id: params.id })
3278
+ );
3279
+ return resp.success;
3280
+ },
3281
+ // ── Device Tokens ────────────────────────────────────────────
3282
+ async registerDeviceToken(params) {
3283
+ const resp = await client.registerDeviceToken(
3284
+ create11(RegisterDeviceTokenRequestSchema, {
3285
+ customerId: params.customerId,
3286
+ token: params.token,
3287
+ platform: params.platform,
3288
+ deviceName: params.deviceName
3289
+ })
3290
+ );
3291
+ return resp.success;
3292
+ },
3293
+ async unregisterDeviceToken(token) {
3294
+ const resp = await client.unregisterDeviceToken(
3295
+ create11(UnregisterDeviceTokenRequestSchema, { token })
3296
+ );
3297
+ return resp.success;
3298
+ },
3299
+ // ── Customer Notifications ───────────────────────────────────
3300
+ async sendCustomerNotification(params) {
3301
+ const resp = await client.sendCustomerNotification(
3302
+ create11(SendCustomerNotificationRequestSchema, {
3303
+ customerId: params.customerId,
3304
+ title: params.title,
3305
+ message: params.message,
3306
+ category: params.category,
3307
+ actionUrl: params.actionUrl,
3308
+ deepLink: params.deepLink,
3309
+ badge: params.badge,
3310
+ threadId: params.threadId,
3311
+ emailSubject: params.emailSubject,
3312
+ emailBody: params.emailBody,
3313
+ emailReplyTo: params.emailReplyTo,
3314
+ emailCtas: params.emailCtas
3315
+ })
3316
+ );
3317
+ return resp.notification ?? null;
3232
3318
  }
3233
3319
  };
3234
3320
  }
@@ -5968,6 +6054,13 @@ function discoverConfigFile() {
5968
6054
  }
5969
6055
  return null;
5970
6056
  }
6057
+ function classifyAdditivePublish(changes) {
6058
+ if (changes.length === 0) return "skip";
6059
+ const hasBlocking = changes.some(
6060
+ (c) => c.severity === BreakingChangeSeverity.BREAKING || c.severity === BreakingChangeSeverity.WARNING
6061
+ );
6062
+ return hasBlocking ? "draft" : "publish";
6063
+ }
5971
6064
  function syncEnvVar(envPath, key, value) {
5972
6065
  const envContent = existsSync4(envPath) ? readFileSync(envPath, "utf-8") : "";
5973
6066
  const pattern = new RegExp(`^${key}=(.*)$`, "m");
@@ -6025,7 +6118,7 @@ function registerPushCommand(program2, globalOpts) {
6025
6118
  false
6026
6119
  ).option(
6027
6120
  "--publish",
6028
- "Promote updated models, operations, auth providers, profile schema, and design tokens to the published channel after the push. New resources auto-publish; this flag covers updates, which are otherwise left as drafts.",
6121
+ "Promote ALL updated resources \u2014 including breaking model changes \u2014 to the published channel after the push. By default, new resources and additive model updates auto-publish, while breaking model changes and updated operations / auth providers / profile schema are left as drafts; this flag releases them too.",
6029
6122
  false
6030
6123
  ).option(
6031
6124
  "--rebuild",
@@ -6124,17 +6217,30 @@ function registerPushCommand(program2, globalOpts) {
6124
6217
  console.log(` Config Key: ${chalk6.cyan(config2.key)}`);
6125
6218
  console.log();
6126
6219
  printSummary(summary);
6127
- if (opts.publish) {
6128
- const publishCounts = {
6129
- models: 0,
6130
- operations: 0,
6131
- authProviders: 0,
6132
- profileSchema: false
6133
- };
6134
- for (const id of summary.updatedModelIds) {
6220
+ const publishCounts = {
6221
+ models: 0,
6222
+ operations: 0,
6223
+ authProviders: 0,
6224
+ profileSchema: false
6225
+ };
6226
+ const draftedBreakingModelIds = [];
6227
+ for (const id of summary.updatedModelIds) {
6228
+ if (opts.publish) {
6229
+ await client.models.publishModel(id);
6230
+ publishCounts.models++;
6231
+ continue;
6232
+ }
6233
+ const status = await client.models.getModelPublishStatus(id);
6234
+ const decision = classifyAdditivePublish(status?.breakingChanges ?? []);
6235
+ if (decision === "skip") continue;
6236
+ if (decision === "draft") {
6237
+ draftedBreakingModelIds.push(id);
6238
+ } else {
6135
6239
  await client.models.publishModel(id);
6136
6240
  publishCounts.models++;
6137
6241
  }
6242
+ }
6243
+ if (opts.publish) {
6138
6244
  for (const id of summary.updatedOperationIds) {
6139
6245
  await client.operations.publishOperation(id);
6140
6246
  publishCounts.operations++;
@@ -6147,30 +6253,34 @@ function registerPushCommand(program2, globalOpts) {
6147
6253
  await client.settings.publishProfileSchema();
6148
6254
  publishCounts.profileSchema = true;
6149
6255
  }
6150
- const lines = [];
6151
- if (publishCounts.models)
6152
- lines.push(`${publishCounts.models} models`);
6153
- if (publishCounts.operations)
6154
- lines.push(`${publishCounts.operations} operations`);
6155
- if (publishCounts.authProviders)
6156
- lines.push(`${publishCounts.authProviders} auth providers`);
6157
- if (publishCounts.profileSchema) lines.push("profile schema");
6158
- if (summary.designTokensPublished) lines.push("design tokens");
6256
+ }
6257
+ const lines = [];
6258
+ if (publishCounts.models) lines.push(`${publishCounts.models} models`);
6259
+ if (publishCounts.operations)
6260
+ lines.push(`${publishCounts.operations} operations`);
6261
+ if (publishCounts.authProviders)
6262
+ lines.push(`${publishCounts.authProviders} auth providers`);
6263
+ if (publishCounts.profileSchema) lines.push("profile schema");
6264
+ if (summary.designTokensPublished) lines.push("design tokens");
6265
+ if (lines.length > 0) {
6159
6266
  console.log();
6160
- if (lines.length > 0) {
6161
- console.log(
6162
- chalk6.green("\u2713 Published: ") + chalk6.dim(lines.join(", "))
6163
- );
6164
- } else {
6165
- console.log(
6166
- chalk6.dim(" Nothing to publish (no resources were updated).")
6167
- );
6168
- }
6169
- } else if (summary.updatedModelIds.length + summary.updatedOperationIds.length + summary.updatedAuthProviderIds.length > 0 || summary.profileSchemaUpdated || summary.designTokensUpdated) {
6267
+ const how = opts.publish ? "Published" : "Published (additive)";
6268
+ console.log(chalk6.green(`\u2713 ${how}: `) + chalk6.dim(lines.join(", ")));
6269
+ }
6270
+ if (draftedBreakingModelIds.length > 0) {
6271
+ const n = draftedBreakingModelIds.length;
6272
+ console.log();
6273
+ console.log(
6274
+ chalk6.yellow(
6275
+ ` ${n} model${n === 1 ? "" : "s"} with breaking changes left as drafts. Re-run with --publish to release ${n === 1 ? "it" : "them"}, or publish from the admin app.`
6276
+ )
6277
+ );
6278
+ }
6279
+ if (!opts.publish && (summary.updatedOperationIds.length + summary.updatedAuthProviderIds.length > 0 || summary.profileSchemaUpdated || summary.designTokensUpdated)) {
6170
6280
  console.log();
6171
6281
  console.log(
6172
6282
  chalk6.dim(
6173
- " Updates left as drafts. Re-run with --publish to release them, or publish from the admin app."
6283
+ " Updated operations / auth providers / profile schema / design tokens left as drafts. Re-run with --publish to release them."
6174
6284
  )
6175
6285
  );
6176
6286
  }
@@ -9450,6 +9560,140 @@ function registerNotificationsCommands(program2, globalOpts) {
9450
9560
  );
9451
9561
  }
9452
9562
 
9563
+ // src/commands/push-credentials.ts
9564
+ import { existsSync as existsSync7, readFileSync as readFileSync3 } from "fs";
9565
+ import { resolve as resolve7 } from "path";
9566
+ function registerPushCredentialsCommands(program2, globalOpts) {
9567
+ const cmd = program2.command("push-credentials").alias("push-creds").description("Manage per-project push credentials (APNs / FCM)");
9568
+ cmd.command("list").description("List push credentials for the current project").action(
9569
+ withErrorHandler(globalOpts, async () => {
9570
+ const opts = globalOpts();
9571
+ const resolved = await requireProject(opts);
9572
+ const client = await createPlatformClient(opts);
9573
+ const resp = await client.notifications.listPushCredentials({
9574
+ projectId: resolved.project.id
9575
+ });
9576
+ formatListProto(PushCredentialSchema, resp.credentials, opts, {
9577
+ columns: [
9578
+ { key: "id", header: "ID", width: 28 },
9579
+ { key: "platform", header: "Platform", width: 10 },
9580
+ {
9581
+ key: "bundleId",
9582
+ header: "Bundle ID",
9583
+ width: 28,
9584
+ format: (v) => v ? String(v) : ""
9585
+ },
9586
+ {
9587
+ key: "fcmProjectId",
9588
+ header: "FCM project",
9589
+ width: 22,
9590
+ format: (v) => v ? String(v) : ""
9591
+ },
9592
+ {
9593
+ key: "apnsProduction",
9594
+ header: "Env",
9595
+ width: 8,
9596
+ format: (v) => {
9597
+ if (v === true) return "prod";
9598
+ if (v === false) return "sandbox";
9599
+ return "";
9600
+ }
9601
+ },
9602
+ {
9603
+ key: "updatedAt",
9604
+ header: "Updated",
9605
+ width: 12,
9606
+ format: (v) => {
9607
+ if (!v) return "";
9608
+ const d = new Date(v);
9609
+ if (Number.isNaN(d.getTime())) return "";
9610
+ return d.toLocaleDateString();
9611
+ }
9612
+ }
9613
+ ]
9614
+ });
9615
+ })
9616
+ );
9617
+ cmd.command("upload-ios").description("Upload an APNs (.p8) credential for iOS").requiredOption("--p8 <path>", "Path to the APNs .p8 private key").requiredOption("--bundle-id <id>", "iOS app bundle identifier").requiredOption("--team-id <id>", "Apple Developer Team ID (10 chars)").requiredOption("--key-id <id>", "APNs Key ID (10 chars)").option("--production", "Use the production APNs endpoint (default: sandbox)").action(
9618
+ withErrorHandler(globalOpts, async (cmdOpts) => {
9619
+ const opts = globalOpts();
9620
+ const resolved = await requireProject(opts);
9621
+ const client = await createPlatformClient(opts);
9622
+ const p8Path = resolve7(String(cmdOpts.p8));
9623
+ if (!existsSync7(p8Path)) {
9624
+ throw new Error(`APNs .p8 file not found: ${p8Path}`);
9625
+ }
9626
+ const p8 = readFileSync3(p8Path, "utf-8");
9627
+ const cred = await client.notifications.uploadPushCredential({
9628
+ projectId: resolved.project.id,
9629
+ platform: "ios",
9630
+ apnsP8Key: p8,
9631
+ bundleId: String(cmdOpts.bundleId),
9632
+ apnsTeamId: String(cmdOpts.teamId),
9633
+ apnsKeyId: String(cmdOpts.keyId),
9634
+ apnsProduction: Boolean(cmdOpts.production)
9635
+ });
9636
+ if (cred) formatOutputProto(PushCredentialSchema, cred, opts);
9637
+ if (!(opts.json || opts.jsonl || opts.quiet)) {
9638
+ success(
9639
+ `Uploaded iOS push credential for ${cmdOpts.bundleId} (${cmdOpts.production ? "production" : "sandbox"})`
9640
+ );
9641
+ }
9642
+ })
9643
+ );
9644
+ cmd.command("upload-android").description("Upload an FCM service-account JSON for Android").requiredOption(
9645
+ "--service-account <path>",
9646
+ "Path to the Firebase service-account JSON"
9647
+ ).action(
9648
+ withErrorHandler(globalOpts, async (cmdOpts) => {
9649
+ const opts = globalOpts();
9650
+ const resolved = await requireProject(opts);
9651
+ const client = await createPlatformClient(opts);
9652
+ const jsonPath = resolve7(String(cmdOpts.serviceAccount));
9653
+ if (!existsSync7(jsonPath)) {
9654
+ throw new Error(`Service account JSON not found: ${jsonPath}`);
9655
+ }
9656
+ const json = readFileSync3(jsonPath, "utf-8");
9657
+ try {
9658
+ const parsed = JSON.parse(json);
9659
+ if (!parsed.project_id) {
9660
+ throw new Error("service-account JSON is missing project_id");
9661
+ }
9662
+ } catch (err) {
9663
+ throw new Error(`Invalid service account JSON: ${err.message}`);
9664
+ }
9665
+ const cred = await client.notifications.uploadPushCredential({
9666
+ projectId: resolved.project.id,
9667
+ platform: "android",
9668
+ fcmServiceAccountJson: json
9669
+ });
9670
+ if (cred) formatOutputProto(PushCredentialSchema, cred, opts);
9671
+ if (!(opts.json || opts.jsonl || opts.quiet)) {
9672
+ success("Uploaded Android push credential");
9673
+ }
9674
+ })
9675
+ );
9676
+ cmd.command("delete <id>").description("Delete a push credential by id").action(
9677
+ withErrorHandler(globalOpts, async (id) => {
9678
+ const opts = globalOpts();
9679
+ const client = await createPlatformClient(opts);
9680
+ await client.notifications.deletePushCredential({ id });
9681
+ if (!(opts.json || opts.jsonl || opts.quiet)) {
9682
+ success(`Deleted push credential ${id}`);
9683
+ }
9684
+ })
9685
+ );
9686
+ }
9687
+ async function requireProject(opts) {
9688
+ const resolved = await resolveProjectContext(opts);
9689
+ if (!resolved) {
9690
+ throw new Error(
9691
+ "No project selected. Run `foir select-project` or set FOIR_PROJECT."
9692
+ );
9693
+ }
9694
+ return resolved;
9695
+ }
9696
+
9453
9697
  // src/commands/configs.ts
9454
9698
  function registerConfigsCommands(program2, globalOpts) {
9455
9699
  const configs = program2.command("configs").description("Manage configs (apps, webhooks)");
@@ -9525,7 +9769,7 @@ function registerConfigsCommands(program2, globalOpts) {
9525
9769
  // src/commands/apps.ts
9526
9770
  import chalk17 from "chalk";
9527
9771
  import { spawn as spawn2 } from "child_process";
9528
- import { existsSync as existsSync7, watch as fsWatch } from "fs";
9772
+ import { existsSync as existsSync8, watch as fsWatch } from "fs";
9529
9773
  import { resolve as resolvePath } from "path";
9530
9774
 
9531
9775
  // src/lib/tunnel.ts
@@ -9540,7 +9784,7 @@ async function startTunnel(opts) {
9540
9784
  }
9541
9785
  var CLOUDFLARED_URL_RE = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/i;
9542
9786
  function startCloudflared(host, port, logs) {
9543
- return new Promise((resolve8, reject) => {
9787
+ return new Promise((resolve9, reject) => {
9544
9788
  let child;
9545
9789
  try {
9546
9790
  child = spawn(
@@ -9574,7 +9818,7 @@ function startCloudflared(host, port, logs) {
9574
9818
  resolved = true;
9575
9819
  const url = match[0];
9576
9820
  const exited = waitForExit(child);
9577
- resolve8({
9821
+ resolve9({
9578
9822
  url,
9579
9823
  exited,
9580
9824
  stop: () => stopChild(child)
@@ -9604,7 +9848,7 @@ ${buffered}`));
9604
9848
  });
9605
9849
  }
9606
9850
  function startNgrok(port, logs) {
9607
- return new Promise((resolve8, reject) => {
9851
+ return new Promise((resolve9, reject) => {
9608
9852
  let child;
9609
9853
  try {
9610
9854
  child = spawn("ngrok", ["http", String(port), "--log=stdout"], {
@@ -9640,7 +9884,7 @@ function startNgrok(port, logs) {
9640
9884
  const https = data.tunnels.find((t) => t.public_url.startsWith("https://"));
9641
9885
  if (https) {
9642
9886
  resolved = true;
9643
- resolve8({
9887
+ resolve9({
9644
9888
  url: https.public_url,
9645
9889
  exited: waitForExit(child),
9646
9890
  stop: () => stopChild(child)
@@ -9685,7 +9929,7 @@ function registerAppsCommands(program2, globalOpts) {
9685
9929
  apps.command("list").description("List installed apps").action(
9686
9930
  withErrorHandler(globalOpts, async () => {
9687
9931
  const opts = globalOpts();
9688
- const resolved = await requireProject(opts);
9932
+ const resolved = await requireProject2(opts);
9689
9933
  const client = await createPlatformClient(opts);
9690
9934
  const resp = await client.apps.listApps({
9691
9935
  tenantId: resolved.project.tenantId,
@@ -9719,7 +9963,7 @@ function registerAppsCommands(program2, globalOpts) {
9719
9963
  apps.command("get <name>").description("Get an installed app by name").action(
9720
9964
  withErrorHandler(globalOpts, async (name) => {
9721
9965
  const opts = globalOpts();
9722
- const resolved = await requireProject(opts);
9966
+ const resolved = await requireProject2(opts);
9723
9967
  const client = await createPlatformClient(opts);
9724
9968
  const app = await client.apps.getApp(
9725
9969
  resolved.project.tenantId,
@@ -9744,7 +9988,7 @@ function registerAppsCommands(program2, globalOpts) {
9744
9988
  globalOpts,
9745
9989
  async (manifestUrl, cmdOpts) => {
9746
9990
  const opts = globalOpts();
9747
- const resolved = await requireProject(opts);
9991
+ const resolved = await requireProject2(opts);
9748
9992
  const client = await createPlatformClient(opts);
9749
9993
  const installResp = await client.apps.installApp(
9750
9994
  resolved.project.tenantId,
@@ -9803,7 +10047,7 @@ function registerAppsCommands(program2, globalOpts) {
9803
10047
  globalOpts,
9804
10048
  async (name, cmdOpts) => {
9805
10049
  const opts = globalOpts();
9806
- const resolved = await requireProject(opts);
10050
+ const resolved = await requireProject2(opts);
9807
10051
  const client = await createPlatformClient(opts);
9808
10052
  const updateResp = await client.apps.updateApp(
9809
10053
  resolved.project.tenantId,
@@ -9851,7 +10095,7 @@ function registerAppsCommands(program2, globalOpts) {
9851
10095
  globalOpts,
9852
10096
  async (name, cmdOpts) => {
9853
10097
  const opts = globalOpts();
9854
- const resolved = await requireProject(opts);
10098
+ const resolved = await requireProject2(opts);
9855
10099
  const client = await createPlatformClient(opts);
9856
10100
  const resp = await client.apps.uninstallApp(
9857
10101
  resolved.project.tenantId,
@@ -9873,7 +10117,7 @@ function registerAppsCommands(program2, globalOpts) {
9873
10117
  globalOpts,
9874
10118
  async (appName, operationKey, cmdOpts) => {
9875
10119
  const opts = globalOpts();
9876
- const resolved = await requireProject(opts);
10120
+ const resolved = await requireProject2(opts);
9877
10121
  const client = await createPlatformClient(opts);
9878
10122
  const stored = operationKey.includes("/") ? operationKey : `${appName}/${operationKey}`;
9879
10123
  const input = cmdOpts.data ? JSON.parse(String(cmdOpts.data)) : void 0;
@@ -10038,7 +10282,7 @@ function hostOf(url) {
10038
10282
  }
10039
10283
  }
10040
10284
  function runPush(host, jsonMode) {
10041
- return new Promise((resolve8, reject) => {
10285
+ return new Promise((resolve9, reject) => {
10042
10286
  if (!jsonMode) {
10043
10287
  console.log();
10044
10288
  console.log(chalk17.dim(`\u2192 foir push (${FOIR_APPS_HOST_ENV}=${host})`));
@@ -10054,14 +10298,14 @@ function runPush(host, jsonMode) {
10054
10298
  });
10055
10299
  child.once("error", (err) => reject(err));
10056
10300
  child.once("exit", (code) => {
10057
- if (code === 0) resolve8();
10301
+ if (code === 0) resolve9();
10058
10302
  else reject(new Error(`foir push exited with code ${code ?? "null"}`));
10059
10303
  });
10060
10304
  });
10061
10305
  }
10062
10306
  function startWatchLoop(host, jsonMode) {
10063
10307
  const cwd = process.cwd();
10064
- const target = WATCH_FILES.map((n) => resolvePath(cwd, n)).find((p) => existsSync7(p));
10308
+ const target = WATCH_FILES.map((n) => resolvePath(cwd, n)).find((p) => existsSync8(p));
10065
10309
  if (!target) {
10066
10310
  if (!jsonMode) {
10067
10311
  console.error(chalk17.yellow(`! --watch: no foir.config.* in ${cwd}; skipping watch loop.`));
@@ -10095,21 +10339,21 @@ function startWatchLoop(host, jsonMode) {
10095
10339
  return watcher;
10096
10340
  }
10097
10341
  function runWatchLoop(host, jsonMode) {
10098
- return new Promise((resolve8) => {
10342
+ return new Promise((resolve9) => {
10099
10343
  const watcher = startWatchLoop(host, jsonMode);
10100
10344
  if (!watcher) {
10101
- resolve8();
10345
+ resolve9();
10102
10346
  return;
10103
10347
  }
10104
10348
  const close = () => {
10105
10349
  watcher.close();
10106
- resolve8();
10350
+ resolve9();
10107
10351
  };
10108
10352
  process.once("SIGINT", close);
10109
10353
  process.once("SIGTERM", close);
10110
10354
  });
10111
10355
  }
10112
- async function requireProject(opts) {
10356
+ async function requireProject2(opts) {
10113
10357
  const resolved = await resolveProjectContext(opts);
10114
10358
  if (!resolved) {
10115
10359
  throw new Error(
@@ -10140,7 +10384,7 @@ function classToLabel(n) {
10140
10384
  }
10141
10385
 
10142
10386
  // src/commands/secrets.ts
10143
- import { existsSync as existsSync8 } from "fs";
10387
+ import { existsSync as existsSync9 } from "fs";
10144
10388
  import { promises as fs5 } from "fs";
10145
10389
  import { resolve as resolvePath2 } from "path";
10146
10390
  function registerSecretsCommands(program2, globalOpts) {
@@ -10148,7 +10392,7 @@ function registerSecretsCommands(program2, globalOpts) {
10148
10392
  secrets.command("put").description("Store a new secret and print its ref").option("--label <label>", "Optional human-readable label").option("--app <name>", "Owner: app name (defaults to project-owned)").option("--file <path>", "Read plaintext from file (binary-safe)").option("--value <plaintext>", "Plaintext value (string only; prefer --file for binary)").action(
10149
10393
  withErrorHandler(globalOpts, async (cmdOpts) => {
10150
10394
  const opts = globalOpts();
10151
- const resolved = await requireProject2(opts);
10395
+ const resolved = await requireProject3(opts);
10152
10396
  const plaintext = await readPlaintext(cmdOpts);
10153
10397
  const client = await createPlatformClient(opts);
10154
10398
  const ownerKind = cmdOpts.app ? OwnerKind.APP : OwnerKind.PROJECT;
@@ -10175,7 +10419,7 @@ function registerSecretsCommands(program2, globalOpts) {
10175
10419
  secrets.command("list").description("List secrets metadata (no plaintext)").option("--app <name>", "List app-owned secrets for this app").option("--include-soft-deleted", "Include soft-deleted entries").action(
10176
10420
  withErrorHandler(globalOpts, async (cmdOpts) => {
10177
10421
  const opts = globalOpts();
10178
- const resolved = await requireProject2(opts);
10422
+ const resolved = await requireProject3(opts);
10179
10423
  const client = await createPlatformClient(opts);
10180
10424
  const ownerKind = cmdOpts.app ? OwnerKind.APP : OwnerKind.PROJECT;
10181
10425
  const resp = await client.secrets.list({
@@ -10266,7 +10510,7 @@ function registerSecretsCommands(program2, globalOpts) {
10266
10510
  ).option("--config <path>", "Path to foir.secrets.ts (default: auto-discover)").option("--plaintext <path>", "Path to local.foir.secrets.ts (default: auto-discover)").option("--rotate", "Rotate plaintext for secrets that already exist").option("--dry-run", "Show what would change without calling PutSecret/RotateSecret").action(
10267
10511
  withErrorHandler(globalOpts, async (cmdOpts) => {
10268
10512
  const opts = globalOpts();
10269
- const resolved = await requireProject2(opts);
10513
+ const resolved = await requireProject3(opts);
10270
10514
  const configPath = await resolveSecretsConfigPath(
10271
10515
  typeof cmdOpts.config === "string" ? cmdOpts.config : void 0
10272
10516
  );
@@ -10376,7 +10620,7 @@ function registerSecretsCommands(program2, globalOpts) {
10376
10620
  console.log("Aborted.");
10377
10621
  return;
10378
10622
  }
10379
- const resolved = await requireProject2(opts);
10623
+ const resolved = await requireProject3(opts);
10380
10624
  const client = await createPlatformClient(opts);
10381
10625
  const count = await client.secrets.purge({
10382
10626
  tenantId: resolved.project.tenantId,
@@ -10386,7 +10630,7 @@ function registerSecretsCommands(program2, globalOpts) {
10386
10630
  })
10387
10631
  );
10388
10632
  }
10389
- async function requireProject2(opts) {
10633
+ async function requireProject3(opts) {
10390
10634
  const resolved = await resolveProjectContext(opts);
10391
10635
  if (!resolved) {
10392
10636
  throw new Error(
@@ -10441,14 +10685,14 @@ var PLAINTEXT_CONFIG_NAMES = [
10441
10685
  ];
10442
10686
  async function resolveSecretsConfigPath(explicit) {
10443
10687
  if (explicit) {
10444
- if (!existsSync8(explicit)) {
10688
+ if (!existsSync9(explicit)) {
10445
10689
  throw new Error(`Secrets config not found: ${explicit}`);
10446
10690
  }
10447
10691
  return resolvePath2(explicit);
10448
10692
  }
10449
10693
  for (const name of SECRETS_CONFIG_NAMES) {
10450
10694
  const path3 = resolvePath2(process.cwd(), name);
10451
- if (existsSync8(path3)) return path3;
10695
+ if (existsSync9(path3)) return path3;
10452
10696
  }
10453
10697
  throw new Error(
10454
10698
  `No secrets config found. Looked for: ${SECRETS_CONFIG_NAMES.join(", ")}.`
@@ -10456,14 +10700,14 @@ async function resolveSecretsConfigPath(explicit) {
10456
10700
  }
10457
10701
  async function resolvePlaintextPath(explicit) {
10458
10702
  if (explicit) {
10459
- if (!existsSync8(explicit)) {
10703
+ if (!existsSync9(explicit)) {
10460
10704
  throw new Error(`Plaintext file not found: ${explicit}`);
10461
10705
  }
10462
10706
  return resolvePath2(explicit);
10463
10707
  }
10464
10708
  for (const name of PLAINTEXT_CONFIG_NAMES) {
10465
10709
  const path3 = resolvePath2(process.cwd(), name);
10466
- if (existsSync8(path3)) return path3;
10710
+ if (existsSync9(path3)) return path3;
10467
10711
  }
10468
10712
  return null;
10469
10713
  }
@@ -10546,7 +10790,7 @@ function formatPushPlan(plan, opts) {
10546
10790
  // src/cli.ts
10547
10791
  var __filename = fileURLToPath(import.meta.url);
10548
10792
  var __dirname = dirname4(__filename);
10549
- config({ path: resolve7(__dirname, "../.env.local") });
10793
+ config({ path: resolve8(__dirname, "../.env.local") });
10550
10794
  var require2 = createRequire(import.meta.url);
10551
10795
  var { version } = require2("../package.json");
10552
10796
  var program = new Command();
@@ -10594,6 +10838,7 @@ registerVariantCatalogCommands(program, getGlobalOpts);
10594
10838
  registerFilesCommands(program, getGlobalOpts);
10595
10839
  registerNotesCommands(program, getGlobalOpts);
10596
10840
  registerNotificationsCommands(program, getGlobalOpts);
10841
+ registerPushCredentialsCommands(program, getGlobalOpts);
10597
10842
  registerConfigsCommands(program, getGlobalOpts);
10598
10843
  registerAppsCommands(program, getGlobalOpts);
10599
10844
  registerSecretsCommands(program, getGlobalOpts);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eide/foir-cli",
3
- "version": "0.49.0",
3
+ "version": "0.51.0",
4
4
  "description": "Universal platform CLI for Foir platform",
5
5
  "type": "module",
6
6
  "publishConfig": {