@eide/foir-cli 0.50.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 +245 -36
  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);
@@ -802,11 +802,18 @@ var HooksService = /* @__PURE__ */ serviceDesc9(file_hooks_v1_hooks, 0);
802
802
  // ../../packages/proto-ts/src/notifications/v1/notifications_pb.js
803
803
  import { enumDesc as enumDesc9, fileDesc as fileDesc14, messageDesc as messageDesc14, serviceDesc as serviceDesc10, tsEnum as tsEnum9 } from "@bufbuild/protobuf/codegenv2";
804
804
  import { file_google_protobuf_struct as file_google_protobuf_struct10, file_google_protobuf_timestamp as file_google_protobuf_timestamp11 } from "@bufbuild/protobuf/wkt";
805
- 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]);
806
806
  var NotificationSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 0);
807
807
  var ListNotificationsRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 1);
808
808
  var MarkNotificationReadRequestSchema = /* @__PURE__ */ messageDesc14(file_notifications_v1_notifications, 3);
809
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);
810
817
  var NotificationsService = /* @__PURE__ */ serviceDesc10(file_notifications_v1_notifications, 0);
811
818
 
812
819
  // ../../packages/proto-ts/src/schedules/v1/schedules_pb.js
@@ -3241,6 +3248,73 @@ function createNotificationsMethods(client) {
3241
3248
  create11(MarkAllNotificationsReadRequestSchema, {})
3242
3249
  );
3243
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;
3244
3318
  }
3245
3319
  };
3246
3320
  }
@@ -9486,6 +9560,140 @@ function registerNotificationsCommands(program2, globalOpts) {
9486
9560
  );
9487
9561
  }
9488
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
+
9489
9697
  // src/commands/configs.ts
9490
9698
  function registerConfigsCommands(program2, globalOpts) {
9491
9699
  const configs = program2.command("configs").description("Manage configs (apps, webhooks)");
@@ -9561,7 +9769,7 @@ function registerConfigsCommands(program2, globalOpts) {
9561
9769
  // src/commands/apps.ts
9562
9770
  import chalk17 from "chalk";
9563
9771
  import { spawn as spawn2 } from "child_process";
9564
- import { existsSync as existsSync7, watch as fsWatch } from "fs";
9772
+ import { existsSync as existsSync8, watch as fsWatch } from "fs";
9565
9773
  import { resolve as resolvePath } from "path";
9566
9774
 
9567
9775
  // src/lib/tunnel.ts
@@ -9576,7 +9784,7 @@ async function startTunnel(opts) {
9576
9784
  }
9577
9785
  var CLOUDFLARED_URL_RE = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/i;
9578
9786
  function startCloudflared(host, port, logs) {
9579
- return new Promise((resolve8, reject) => {
9787
+ return new Promise((resolve9, reject) => {
9580
9788
  let child;
9581
9789
  try {
9582
9790
  child = spawn(
@@ -9610,7 +9818,7 @@ function startCloudflared(host, port, logs) {
9610
9818
  resolved = true;
9611
9819
  const url = match[0];
9612
9820
  const exited = waitForExit(child);
9613
- resolve8({
9821
+ resolve9({
9614
9822
  url,
9615
9823
  exited,
9616
9824
  stop: () => stopChild(child)
@@ -9640,7 +9848,7 @@ ${buffered}`));
9640
9848
  });
9641
9849
  }
9642
9850
  function startNgrok(port, logs) {
9643
- return new Promise((resolve8, reject) => {
9851
+ return new Promise((resolve9, reject) => {
9644
9852
  let child;
9645
9853
  try {
9646
9854
  child = spawn("ngrok", ["http", String(port), "--log=stdout"], {
@@ -9676,7 +9884,7 @@ function startNgrok(port, logs) {
9676
9884
  const https = data.tunnels.find((t) => t.public_url.startsWith("https://"));
9677
9885
  if (https) {
9678
9886
  resolved = true;
9679
- resolve8({
9887
+ resolve9({
9680
9888
  url: https.public_url,
9681
9889
  exited: waitForExit(child),
9682
9890
  stop: () => stopChild(child)
@@ -9721,7 +9929,7 @@ function registerAppsCommands(program2, globalOpts) {
9721
9929
  apps.command("list").description("List installed apps").action(
9722
9930
  withErrorHandler(globalOpts, async () => {
9723
9931
  const opts = globalOpts();
9724
- const resolved = await requireProject(opts);
9932
+ const resolved = await requireProject2(opts);
9725
9933
  const client = await createPlatformClient(opts);
9726
9934
  const resp = await client.apps.listApps({
9727
9935
  tenantId: resolved.project.tenantId,
@@ -9755,7 +9963,7 @@ function registerAppsCommands(program2, globalOpts) {
9755
9963
  apps.command("get <name>").description("Get an installed app by name").action(
9756
9964
  withErrorHandler(globalOpts, async (name) => {
9757
9965
  const opts = globalOpts();
9758
- const resolved = await requireProject(opts);
9966
+ const resolved = await requireProject2(opts);
9759
9967
  const client = await createPlatformClient(opts);
9760
9968
  const app = await client.apps.getApp(
9761
9969
  resolved.project.tenantId,
@@ -9780,7 +9988,7 @@ function registerAppsCommands(program2, globalOpts) {
9780
9988
  globalOpts,
9781
9989
  async (manifestUrl, cmdOpts) => {
9782
9990
  const opts = globalOpts();
9783
- const resolved = await requireProject(opts);
9991
+ const resolved = await requireProject2(opts);
9784
9992
  const client = await createPlatformClient(opts);
9785
9993
  const installResp = await client.apps.installApp(
9786
9994
  resolved.project.tenantId,
@@ -9839,7 +10047,7 @@ function registerAppsCommands(program2, globalOpts) {
9839
10047
  globalOpts,
9840
10048
  async (name, cmdOpts) => {
9841
10049
  const opts = globalOpts();
9842
- const resolved = await requireProject(opts);
10050
+ const resolved = await requireProject2(opts);
9843
10051
  const client = await createPlatformClient(opts);
9844
10052
  const updateResp = await client.apps.updateApp(
9845
10053
  resolved.project.tenantId,
@@ -9887,7 +10095,7 @@ function registerAppsCommands(program2, globalOpts) {
9887
10095
  globalOpts,
9888
10096
  async (name, cmdOpts) => {
9889
10097
  const opts = globalOpts();
9890
- const resolved = await requireProject(opts);
10098
+ const resolved = await requireProject2(opts);
9891
10099
  const client = await createPlatformClient(opts);
9892
10100
  const resp = await client.apps.uninstallApp(
9893
10101
  resolved.project.tenantId,
@@ -9909,7 +10117,7 @@ function registerAppsCommands(program2, globalOpts) {
9909
10117
  globalOpts,
9910
10118
  async (appName, operationKey, cmdOpts) => {
9911
10119
  const opts = globalOpts();
9912
- const resolved = await requireProject(opts);
10120
+ const resolved = await requireProject2(opts);
9913
10121
  const client = await createPlatformClient(opts);
9914
10122
  const stored = operationKey.includes("/") ? operationKey : `${appName}/${operationKey}`;
9915
10123
  const input = cmdOpts.data ? JSON.parse(String(cmdOpts.data)) : void 0;
@@ -10074,7 +10282,7 @@ function hostOf(url) {
10074
10282
  }
10075
10283
  }
10076
10284
  function runPush(host, jsonMode) {
10077
- return new Promise((resolve8, reject) => {
10285
+ return new Promise((resolve9, reject) => {
10078
10286
  if (!jsonMode) {
10079
10287
  console.log();
10080
10288
  console.log(chalk17.dim(`\u2192 foir push (${FOIR_APPS_HOST_ENV}=${host})`));
@@ -10090,14 +10298,14 @@ function runPush(host, jsonMode) {
10090
10298
  });
10091
10299
  child.once("error", (err) => reject(err));
10092
10300
  child.once("exit", (code) => {
10093
- if (code === 0) resolve8();
10301
+ if (code === 0) resolve9();
10094
10302
  else reject(new Error(`foir push exited with code ${code ?? "null"}`));
10095
10303
  });
10096
10304
  });
10097
10305
  }
10098
10306
  function startWatchLoop(host, jsonMode) {
10099
10307
  const cwd = process.cwd();
10100
- 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));
10101
10309
  if (!target) {
10102
10310
  if (!jsonMode) {
10103
10311
  console.error(chalk17.yellow(`! --watch: no foir.config.* in ${cwd}; skipping watch loop.`));
@@ -10131,21 +10339,21 @@ function startWatchLoop(host, jsonMode) {
10131
10339
  return watcher;
10132
10340
  }
10133
10341
  function runWatchLoop(host, jsonMode) {
10134
- return new Promise((resolve8) => {
10342
+ return new Promise((resolve9) => {
10135
10343
  const watcher = startWatchLoop(host, jsonMode);
10136
10344
  if (!watcher) {
10137
- resolve8();
10345
+ resolve9();
10138
10346
  return;
10139
10347
  }
10140
10348
  const close = () => {
10141
10349
  watcher.close();
10142
- resolve8();
10350
+ resolve9();
10143
10351
  };
10144
10352
  process.once("SIGINT", close);
10145
10353
  process.once("SIGTERM", close);
10146
10354
  });
10147
10355
  }
10148
- async function requireProject(opts) {
10356
+ async function requireProject2(opts) {
10149
10357
  const resolved = await resolveProjectContext(opts);
10150
10358
  if (!resolved) {
10151
10359
  throw new Error(
@@ -10176,7 +10384,7 @@ function classToLabel(n) {
10176
10384
  }
10177
10385
 
10178
10386
  // src/commands/secrets.ts
10179
- import { existsSync as existsSync8 } from "fs";
10387
+ import { existsSync as existsSync9 } from "fs";
10180
10388
  import { promises as fs5 } from "fs";
10181
10389
  import { resolve as resolvePath2 } from "path";
10182
10390
  function registerSecretsCommands(program2, globalOpts) {
@@ -10184,7 +10392,7 @@ function registerSecretsCommands(program2, globalOpts) {
10184
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(
10185
10393
  withErrorHandler(globalOpts, async (cmdOpts) => {
10186
10394
  const opts = globalOpts();
10187
- const resolved = await requireProject2(opts);
10395
+ const resolved = await requireProject3(opts);
10188
10396
  const plaintext = await readPlaintext(cmdOpts);
10189
10397
  const client = await createPlatformClient(opts);
10190
10398
  const ownerKind = cmdOpts.app ? OwnerKind.APP : OwnerKind.PROJECT;
@@ -10211,7 +10419,7 @@ function registerSecretsCommands(program2, globalOpts) {
10211
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(
10212
10420
  withErrorHandler(globalOpts, async (cmdOpts) => {
10213
10421
  const opts = globalOpts();
10214
- const resolved = await requireProject2(opts);
10422
+ const resolved = await requireProject3(opts);
10215
10423
  const client = await createPlatformClient(opts);
10216
10424
  const ownerKind = cmdOpts.app ? OwnerKind.APP : OwnerKind.PROJECT;
10217
10425
  const resp = await client.secrets.list({
@@ -10302,7 +10510,7 @@ function registerSecretsCommands(program2, globalOpts) {
10302
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(
10303
10511
  withErrorHandler(globalOpts, async (cmdOpts) => {
10304
10512
  const opts = globalOpts();
10305
- const resolved = await requireProject2(opts);
10513
+ const resolved = await requireProject3(opts);
10306
10514
  const configPath = await resolveSecretsConfigPath(
10307
10515
  typeof cmdOpts.config === "string" ? cmdOpts.config : void 0
10308
10516
  );
@@ -10412,7 +10620,7 @@ function registerSecretsCommands(program2, globalOpts) {
10412
10620
  console.log("Aborted.");
10413
10621
  return;
10414
10622
  }
10415
- const resolved = await requireProject2(opts);
10623
+ const resolved = await requireProject3(opts);
10416
10624
  const client = await createPlatformClient(opts);
10417
10625
  const count = await client.secrets.purge({
10418
10626
  tenantId: resolved.project.tenantId,
@@ -10422,7 +10630,7 @@ function registerSecretsCommands(program2, globalOpts) {
10422
10630
  })
10423
10631
  );
10424
10632
  }
10425
- async function requireProject2(opts) {
10633
+ async function requireProject3(opts) {
10426
10634
  const resolved = await resolveProjectContext(opts);
10427
10635
  if (!resolved) {
10428
10636
  throw new Error(
@@ -10477,14 +10685,14 @@ var PLAINTEXT_CONFIG_NAMES = [
10477
10685
  ];
10478
10686
  async function resolveSecretsConfigPath(explicit) {
10479
10687
  if (explicit) {
10480
- if (!existsSync8(explicit)) {
10688
+ if (!existsSync9(explicit)) {
10481
10689
  throw new Error(`Secrets config not found: ${explicit}`);
10482
10690
  }
10483
10691
  return resolvePath2(explicit);
10484
10692
  }
10485
10693
  for (const name of SECRETS_CONFIG_NAMES) {
10486
10694
  const path3 = resolvePath2(process.cwd(), name);
10487
- if (existsSync8(path3)) return path3;
10695
+ if (existsSync9(path3)) return path3;
10488
10696
  }
10489
10697
  throw new Error(
10490
10698
  `No secrets config found. Looked for: ${SECRETS_CONFIG_NAMES.join(", ")}.`
@@ -10492,14 +10700,14 @@ async function resolveSecretsConfigPath(explicit) {
10492
10700
  }
10493
10701
  async function resolvePlaintextPath(explicit) {
10494
10702
  if (explicit) {
10495
- if (!existsSync8(explicit)) {
10703
+ if (!existsSync9(explicit)) {
10496
10704
  throw new Error(`Plaintext file not found: ${explicit}`);
10497
10705
  }
10498
10706
  return resolvePath2(explicit);
10499
10707
  }
10500
10708
  for (const name of PLAINTEXT_CONFIG_NAMES) {
10501
10709
  const path3 = resolvePath2(process.cwd(), name);
10502
- if (existsSync8(path3)) return path3;
10710
+ if (existsSync9(path3)) return path3;
10503
10711
  }
10504
10712
  return null;
10505
10713
  }
@@ -10582,7 +10790,7 @@ function formatPushPlan(plan, opts) {
10582
10790
  // src/cli.ts
10583
10791
  var __filename = fileURLToPath(import.meta.url);
10584
10792
  var __dirname = dirname4(__filename);
10585
- config({ path: resolve7(__dirname, "../.env.local") });
10793
+ config({ path: resolve8(__dirname, "../.env.local") });
10586
10794
  var require2 = createRequire(import.meta.url);
10587
10795
  var { version } = require2("../package.json");
10588
10796
  var program = new Command();
@@ -10630,6 +10838,7 @@ registerVariantCatalogCommands(program, getGlobalOpts);
10630
10838
  registerFilesCommands(program, getGlobalOpts);
10631
10839
  registerNotesCommands(program, getGlobalOpts);
10632
10840
  registerNotificationsCommands(program, getGlobalOpts);
10841
+ registerPushCredentialsCommands(program, getGlobalOpts);
10633
10842
  registerConfigsCommands(program, getGlobalOpts);
10634
10843
  registerAppsCommands(program, getGlobalOpts);
10635
10844
  registerSecretsCommands(program, getGlobalOpts);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eide/foir-cli",
3
- "version": "0.50.0",
3
+ "version": "0.51.0",
4
4
  "description": "Universal platform CLI for Foir platform",
5
5
  "type": "module",
6
6
  "publishConfig": {