@pmate/cli 0.21.10 → 0.21.12

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 (3) hide show
  1. package/dist/index.d.ts +97 -1
  2. package/dist/index.js +1040 -204
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -9435,8 +9435,8 @@ __export(index_exports, {
9435
9435
  parseCommandArgs: () => parseCommandArgs
9436
9436
  });
9437
9437
  module.exports = __toCommonJS(index_exports);
9438
- var import_node_fs20 = require("fs");
9439
- var import_node_path25 = __toESM(require("path"));
9438
+ var import_node_fs22 = require("fs");
9439
+ var import_node_path27 = __toESM(require("path"));
9440
9440
  var import_chalk4 = __toESM(require("chalk"));
9441
9441
 
9442
9442
  // src/cli.ts
@@ -14585,9 +14585,9 @@ ${indent}\`\`\``;
14585
14585
  static richTextToPlain(richText) {
14586
14586
  return richText.map((item) => item.plain_text ?? item.text?.content ?? "").join("").trim();
14587
14587
  }
14588
- static async requestJson(path26, init) {
14588
+ static async requestJson(path28, init) {
14589
14589
  const token = this.getToken();
14590
- const response = await fetch(`${this.baseUrl}${path26}`, {
14590
+ const response = await fetch(`${this.baseUrl}${path28}`, {
14591
14591
  method: init.method,
14592
14592
  headers: {
14593
14593
  Authorization: `Bearer ${token}`,
@@ -16223,8 +16223,8 @@ function descriptorPathSegments(descriptor) {
16223
16223
  return ["chains", normalized.chain, "namespaces", normalized.ns, normalized.kind, normalized.name];
16224
16224
  }
16225
16225
  function buildPathUrl(baseUrl, pathSegments, query) {
16226
- const path26 = `/${pathSegments.map((segment) => encodeURIComponent(segment)).join("/")}`;
16227
- const url = new URL(path26, baseUrl);
16226
+ const path28 = `/${pathSegments.map((segment) => encodeURIComponent(segment)).join("/")}`;
16227
+ const url = new URL(path28, baseUrl);
16228
16228
  if (query) {
16229
16229
  for (const [key, value] of Object.entries(query)) {
16230
16230
  url.searchParams.set(key, String(value));
@@ -17575,7 +17575,7 @@ var import_node_readline = require("readline");
17575
17575
  var import_chalk3 = __toESM(require("chalk"));
17576
17576
  var ServiceRuntimeRunner = class {
17577
17577
  async deploy(service, options = {}) {
17578
- switch (service.runtimeType) {
17578
+ switch (this.getType(service)) {
17579
17579
  case "vite":
17580
17580
  await this.deployVite(service, options);
17581
17581
  return;
@@ -17589,12 +17589,17 @@ var ServiceRuntimeRunner = class {
17589
17589
  case "python":
17590
17590
  await this.deployScriptManaged(service);
17591
17591
  return;
17592
+ case "ios":
17593
+ case "android":
17594
+ throw new Error(
17595
+ `Service type "${this.getType(service)}" is registry-only for now; deploy is not supported yet`
17596
+ );
17592
17597
  default:
17593
- throw new Error(`Unsupported runtimeType for deploy: ${service.runtimeType}`);
17598
+ throw new Error(`Unsupported service type for deploy: ${this.getType(service)}`);
17594
17599
  }
17595
17600
  }
17596
17601
  async init(service, options = {}) {
17597
- switch (service.runtimeType) {
17602
+ switch (this.getType(service)) {
17598
17603
  case "vite":
17599
17604
  case "static":
17600
17605
  await this.initStaticLike(service);
@@ -17606,8 +17611,13 @@ var ServiceRuntimeRunner = class {
17606
17611
  case "python":
17607
17612
  await this.initServerApp(service, options, { ensurePackageJson: false });
17608
17613
  return;
17614
+ case "ios":
17615
+ case "android":
17616
+ throw new Error(
17617
+ `Service type "${this.getType(service)}" is registry-only for now; init is not supported yet`
17618
+ );
17609
17619
  default:
17610
- throw new Error(`Unsupported runtimeType for init: ${service.runtimeType}`);
17620
+ throw new Error(`Unsupported service type for init: ${this.getType(service)}`);
17611
17621
  }
17612
17622
  }
17613
17623
  async log(service, options = {}) {
@@ -17677,14 +17687,56 @@ var ServiceRuntimeRunner = class {
17677
17687
  }
17678
17688
  }
17679
17689
  }
17680
- getDeploy(service) {
17681
- return service.deploy ?? {};
17690
+ isLegacy(service) {
17691
+ return "runtimeType" in service;
17692
+ }
17693
+ getType(service) {
17694
+ return this.isLegacy(service) ? service.runtimeType : service.type;
17695
+ }
17696
+ getSite(service) {
17697
+ if (!this.isLegacy(service) && service.site) {
17698
+ return service.site;
17699
+ }
17700
+ const deploy = this.isLegacy(service) ? service.deploy ?? {} : {};
17701
+ return {
17702
+ exposeType: "static-site",
17703
+ repository: String(deploy.repository ?? ""),
17704
+ dir: String(deploy.dir ?? ""),
17705
+ bucket: String(deploy.bucket ?? ""),
17706
+ domain: String(deploy.domain ?? ""),
17707
+ ...deploy.subdomain ? { subdomain: deploy.subdomain } : {}
17708
+ };
17709
+ }
17710
+ getNetwork(service) {
17711
+ if (!this.isLegacy(service) && service.network) {
17712
+ return service.network;
17713
+ }
17714
+ const deploy = this.isLegacy(service) ? service.deploy ?? {} : {};
17715
+ const exposeType = deploy.port === void 0 ? "internal" : deploy.serviceType === "ws" ? "websocket" : "rest";
17716
+ return {
17717
+ exposeType,
17718
+ repository: String(deploy.repository ?? ""),
17719
+ dir: String(deploy.dir ?? ""),
17720
+ server: String(deploy.server ?? ""),
17721
+ ...deploy.port !== void 0 ? { port: Number(deploy.port) } : {},
17722
+ ...deploy.domain ? { domain: deploy.domain } : {},
17723
+ ...deploy.subdomain ? { subdomain: deploy.subdomain } : {}
17724
+ };
17725
+ }
17726
+ getRunner(service) {
17727
+ if (!this.isLegacy(service) && service.runner) {
17728
+ return service.runner;
17729
+ }
17730
+ const deploy = this.isLegacy(service) ? service.deploy ?? {} : {};
17731
+ return {
17732
+ script: String(deploy.script ?? "")
17733
+ };
17682
17734
  }
17683
17735
  resolveRepoRoot(service, cwd) {
17684
17736
  if (cwd) {
17685
17737
  return import_node_path23.default.resolve(process.cwd(), cwd);
17686
17738
  }
17687
- const repository = this.getDeploy(service).repository?.trim();
17739
+ const repository = this.getType(service) === "vite" || this.getType(service) === "static" ? this.getSite(service).repository?.trim() : this.getType(service) === "ios" || this.getType(service) === "android" ? void 0 : this.getNetwork(service).repository?.trim();
17688
17740
  if (repository) {
17689
17741
  const repoName = repository.replace(/\/+$/, "").split("/").pop()?.replace(/\.git$/i, "");
17690
17742
  if (repoName) {
@@ -17698,9 +17750,9 @@ var ServiceRuntimeRunner = class {
17698
17750
  }
17699
17751
  resolveLocalDir(service, cwd) {
17700
17752
  const repoRoot = this.resolveRepoRoot(service, cwd);
17701
- const dir = this.getDeploy(service).dir?.trim();
17753
+ const dir = this.getType(service) === "vite" || this.getType(service) === "static" ? this.getSite(service).dir?.trim() : this.getType(service) === "ios" || this.getType(service) === "android" ? void 0 : this.getNetwork(service).dir?.trim();
17702
17754
  if (!dir) {
17703
- throw new Error(`Missing deploy.dir for ${service.id}`);
17755
+ throw new Error(`Missing service dir for ${service.id}`);
17704
17756
  }
17705
17757
  return import_node_path23.default.resolve(repoRoot, dir);
17706
17758
  }
@@ -17720,9 +17772,10 @@ var ServiceRuntimeRunner = class {
17720
17772
  if (!(0, import_node_fs18.existsSync)(distDir)) {
17721
17773
  throw new Error(`No dist directory found at ${distDir}`);
17722
17774
  }
17723
- const bucketName = this.getDeploy(service).bucket?.trim();
17775
+ const site = this.getSite(service);
17776
+ const bucketName = site.bucket?.trim();
17724
17777
  if (!bucketName) {
17725
- throw new Error(`Missing deploy.bucket for ${service.id}`);
17778
+ throw new Error(`Missing site.bucket for ${service.id}`);
17726
17779
  }
17727
17780
  await AliyunService.uploadDirectory(distDir, bucketName);
17728
17781
  }
@@ -17732,29 +17785,30 @@ var ServiceRuntimeRunner = class {
17732
17785
  if (!(0, import_node_fs18.existsSync)(srcDir)) {
17733
17786
  throw new Error(`No src directory found at ${srcDir}`);
17734
17787
  }
17735
- const bucketName = this.getDeploy(service).bucket?.trim();
17788
+ const site = this.getSite(service);
17789
+ const bucketName = site.bucket?.trim();
17736
17790
  if (!bucketName) {
17737
- throw new Error(`Missing deploy.bucket for ${service.id}`);
17791
+ throw new Error(`Missing site.bucket for ${service.id}`);
17738
17792
  }
17739
17793
  await AliyunService.uploadDirectory(srcDir, bucketName);
17740
17794
  }
17741
17795
  async deployNode(service) {
17742
- const deploy = this.getDeploy(service);
17743
- const server = deploy.server?.trim();
17744
- const repository = deploy.repository?.trim();
17796
+ const network = this.getNetwork(service);
17797
+ const server = network.server?.trim();
17798
+ const repository = network.repository?.trim();
17745
17799
  if (!server) {
17746
- throw new Error(`Missing deploy.server for ${service.id}`);
17800
+ throw new Error(`Missing network.server for ${service.id}`);
17747
17801
  }
17748
17802
  if (!repository) {
17749
- throw new Error(`Missing deploy.repository for ${service.id}`);
17803
+ throw new Error(`Missing network.repository for ${service.id}`);
17750
17804
  }
17751
- const port = deploy.port;
17805
+ const port = network.port;
17752
17806
  if (port !== void 0 && (!Number.isFinite(port) || port <= 0)) {
17753
- throw new Error(`Invalid deploy.port for ${service.id}`);
17807
+ throw new Error(`Invalid network.port for ${service.id}`);
17754
17808
  }
17755
- const appDir = deploy.dir?.trim();
17809
+ const appDir = network.dir?.trim();
17756
17810
  if (!appDir) {
17757
- throw new Error(`Missing deploy.dir for ${service.id}`);
17811
+ throw new Error(`Missing network.dir for ${service.id}`);
17758
17812
  }
17759
17813
  const repoDir = this.getRepoDirName(repository);
17760
17814
  const repoUrl = this.getRepoUrl(repository);
@@ -17782,18 +17836,19 @@ var ServiceRuntimeRunner = class {
17782
17836
  await this.runRemoteCommand(server, command);
17783
17837
  }
17784
17838
  async deployScriptManaged(service) {
17785
- const deploy = this.getDeploy(service);
17786
- const server = deploy.server?.trim();
17787
- const repository = deploy.repository?.trim();
17788
- const script = deploy.script?.trim();
17839
+ const network = this.getNetwork(service);
17840
+ const runner = this.getRunner(service);
17841
+ const server = network.server?.trim();
17842
+ const repository = network.repository?.trim();
17843
+ const script = runner.script?.trim();
17789
17844
  if (!server) {
17790
- throw new Error(`Missing deploy.server for ${service.id}`);
17845
+ throw new Error(`Missing network.server for ${service.id}`);
17791
17846
  }
17792
17847
  if (!repository) {
17793
- throw new Error(`Missing deploy.repository for ${service.id}`);
17848
+ throw new Error(`Missing network.repository for ${service.id}`);
17794
17849
  }
17795
17850
  if (!script) {
17796
- throw new Error(`Missing deploy.script for ${service.id}`);
17851
+ throw new Error(`Missing runner.script for ${service.id}`);
17797
17852
  }
17798
17853
  const repoDir = this.getRepoDirName(repository);
17799
17854
  const repoUrl = this.getRepoUrl(repository);
@@ -17812,43 +17867,43 @@ var ServiceRuntimeRunner = class {
17812
17867
  await this.runRemoteCommand(server, command);
17813
17868
  }
17814
17869
  async initStaticLike(service) {
17815
- const deploy = this.getDeploy(service);
17816
- const bucketName = deploy.bucket?.trim();
17817
- const baseDomain = deploy.domain?.trim();
17870
+ const site = this.getSite(service);
17871
+ const bucketName = site.bucket?.trim();
17872
+ const baseDomain = site.domain?.trim();
17818
17873
  if (!bucketName) {
17819
- throw new Error(`Missing deploy.bucket for ${service.id}`);
17874
+ throw new Error(`Missing site.bucket for ${service.id}`);
17820
17875
  }
17821
17876
  if (!baseDomain) {
17822
- throw new Error(`Missing deploy.domain for ${service.id}`);
17877
+ throw new Error(`Missing site.domain for ${service.id}`);
17823
17878
  }
17824
17879
  await setupStaticSiteBucket({
17825
17880
  bucketName,
17826
17881
  domainName: baseDomain,
17827
- subdomain: deploy.subdomain,
17828
- routeType: service.runtimeType === "vite" ? "spa" : "spa"
17882
+ subdomain: site.subdomain,
17883
+ routeType: this.getType(service) === "vite" ? "spa" : "spa"
17829
17884
  });
17830
17885
  }
17831
17886
  async initServerApp(service, options, config) {
17832
- const deploy = this.getDeploy(service);
17833
- const subdomain = deploy.subdomain?.trim();
17834
- const port = deploy.port;
17835
- const server = deploy.server?.trim();
17836
- const serviceType = (deploy.serviceType || "rest").trim();
17887
+ const network = this.getNetwork(service);
17888
+ const subdomain = "subdomain" in network ? network.subdomain?.trim() : void 0;
17889
+ const port = network.port;
17890
+ const server = network.server?.trim();
17891
+ const exposeType = network.exposeType;
17837
17892
  if (subdomain && port === void 0) {
17838
- throw new Error(`Missing deploy.port for ${service.id} (required when subdomain is set)`);
17893
+ throw new Error(`Missing network.port for ${service.id} (required when subdomain is set)`);
17839
17894
  }
17840
17895
  if (subdomain && !server) {
17841
- throw new Error(`Missing deploy.server for ${service.id}`);
17896
+ throw new Error(`Missing network.server for ${service.id}`);
17842
17897
  }
17843
- if (serviceType !== "rest" && serviceType !== "ws") {
17844
- throw new Error(`Invalid deploy.serviceType for ${service.id}`);
17898
+ if (!["rest", "rpc", "websocket", "internal"].includes(exposeType)) {
17899
+ throw new Error(`Invalid network.exposeType for ${service.id}`);
17845
17900
  }
17846
17901
  if (subdomain) {
17847
17902
  const serverAddress = await resolveServerAddress(server);
17848
- const templateName = serviceType === "ws" ? "nginx.ws.template" : "nginx.rest.template";
17903
+ const templateName = exposeType === "websocket" ? "nginx.ws.template" : "nginx.rest.template";
17849
17904
  const templatePath = this.resolveTemplatePath(templateName);
17850
17905
  const template = (0, import_node_fs18.readFileSync)(templatePath, "utf8");
17851
- const host = `${subdomain}.${deploy.domain?.trim() || "pmate.chat"}`;
17906
+ const host = `${subdomain}.${("domain" in network ? network.domain?.trim() : void 0) || "pmate.chat"}`;
17852
17907
  const rendered = template.replace(/\$\{\{PORT\}\}/g, String(port)).replace(/\$\{\{HOSTS\}\}/g, host).replace(/\$\{\{HOST\}\}/g, host);
17853
17908
  const remotePath = `/etc/nginx/sites-enabled/${subdomain}.conf`;
17854
17909
  ui.info(`Uploading nginx config to ${server}`);
@@ -17856,7 +17911,7 @@ var ServiceRuntimeRunner = class {
17856
17911
  ui.success(`Uploaded nginx config to ${server}`, remotePath);
17857
17912
  await this.reloadNginx(server);
17858
17913
  ui.success(`Reloaded nginx on ${server}`);
17859
- const baseDomain = deploy.domain?.trim() || "pmate.chat";
17914
+ const baseDomain = ("domain" in network ? network.domain?.trim() : void 0) || "pmate.chat";
17860
17915
  const existingA = await AliyunService.getARecordValue(baseDomain, subdomain);
17861
17916
  if (existingA) {
17862
17917
  if (existingA !== serverAddress) {
@@ -17899,18 +17954,19 @@ var ServiceRuntimeRunner = class {
17899
17954
  }
17900
17955
  }
17901
17956
  async showScriptLogs(service) {
17902
- const deploy = this.getDeploy(service);
17903
- const server = deploy.server?.trim();
17904
- const repository = deploy.repository?.trim();
17905
- const script = deploy.script?.trim();
17957
+ const network = this.getNetwork(service);
17958
+ const runner = this.getRunner(service);
17959
+ const server = network.server?.trim();
17960
+ const repository = network.repository?.trim();
17961
+ const script = runner.script?.trim();
17906
17962
  if (!server) {
17907
- throw new Error(`Missing deploy.server for ${service.id}`);
17963
+ throw new Error(`Missing network.server for ${service.id}`);
17908
17964
  }
17909
17965
  if (!repository) {
17910
- throw new Error(`Missing deploy.repository for ${service.id}`);
17966
+ throw new Error(`Missing network.repository for ${service.id}`);
17911
17967
  }
17912
17968
  if (!script) {
17913
- throw new Error(`Missing deploy.script for ${service.id}`);
17969
+ throw new Error(`Missing runner.script for ${service.id}`);
17914
17970
  }
17915
17971
  const repoDir = this.getRepoDirName(repository);
17916
17972
  const scriptPath = script.startsWith("/") || script.startsWith("./") ? script : `./${script}`;
@@ -18306,9 +18362,9 @@ var ServiceRuntimeRunner = class {
18306
18362
  return tokens;
18307
18363
  }
18308
18364
  readPathValue(source, pathExpr) {
18309
- const path26 = pathExpr.split(".").map((segment) => segment.trim()).filter(Boolean);
18365
+ const path28 = pathExpr.split(".").map((segment) => segment.trim()).filter(Boolean);
18310
18366
  let cursor = source;
18311
- for (const segment of path26) {
18367
+ for (const segment of path28) {
18312
18368
  if (!cursor || typeof cursor !== "object" || Array.isArray(cursor)) {
18313
18369
  return void 0;
18314
18370
  }
@@ -18480,9 +18536,6 @@ var ServiceRegistryClient = class {
18480
18536
  if (namespace && item.namespace !== namespace) {
18481
18537
  return false;
18482
18538
  }
18483
- if (server && item.deploy?.server?.trim() !== server) {
18484
- return false;
18485
- }
18486
18539
  return true;
18487
18540
  });
18488
18541
  }
@@ -18858,12 +18911,20 @@ var ServiceCommandHandler = class {
18858
18911
  if (!payload || typeof payload !== "object") {
18859
18912
  return;
18860
18913
  }
18861
- const deploy = payload.deploy;
18862
- if (!deploy || typeof deploy !== "object") {
18863
- return;
18914
+ let serverValue;
18915
+ let portValue;
18916
+ const network = payload.network;
18917
+ if (network && typeof network === "object") {
18918
+ serverValue = network.server;
18919
+ portValue = network.port;
18920
+ } else {
18921
+ const deploy = payload.deploy;
18922
+ if (!deploy || typeof deploy !== "object") {
18923
+ return;
18924
+ }
18925
+ serverValue = deploy.server;
18926
+ portValue = deploy.port;
18864
18927
  }
18865
- const serverValue = deploy.server;
18866
- const portValue = deploy.port;
18867
18928
  const server = typeof serverValue === "string" ? serverValue.trim() : "";
18868
18929
  const port = typeof portValue === "number" ? portValue : typeof portValue === "string" && portValue.trim() ? Number(portValue) : void 0;
18869
18930
  if (!server || port === void 0 || !Number.isFinite(port)) {
@@ -18871,7 +18932,8 @@ var ServiceCommandHandler = class {
18871
18932
  }
18872
18933
  const services = await registry.listServices({ server });
18873
18934
  const conflict = services.find((service) => {
18874
- if (service.deploy?.port !== port) {
18935
+ const servicePort = "network" in service && service.network && typeof service.network === "object" ? service.network.port : "deploy" in service && service.deploy && typeof service.deploy === "object" ? service.deploy.port : void 0;
18936
+ if (servicePort !== port) {
18875
18937
  return false;
18876
18938
  }
18877
18939
  if (!currentService) {
@@ -19101,13 +19163,15 @@ var RoleCommandHandler = class {
19101
19163
  };
19102
19164
 
19103
19165
  // src/commands/AccountCommandHandler.ts
19166
+ var import_node_fs20 = require("fs");
19167
+ var import_node_path25 = __toESM(require("path"));
19104
19168
  init_sessionStore();
19105
19169
  var AccountCommandHandler = class {
19106
19170
  async handle(args) {
19107
19171
  const token = this.readToken();
19108
- const baseUrl = this.resolveBaseUrl(args.baseUrl);
19109
19172
  switch (args.action) {
19110
19173
  case "view": {
19174
+ const baseUrl = this.resolveAuthBaseUrl(args.baseUrl);
19111
19175
  const result = await this.request(
19112
19176
  baseUrl,
19113
19177
  token,
@@ -19118,6 +19182,7 @@ var AccountCommandHandler = class {
19118
19182
  return;
19119
19183
  }
19120
19184
  case "role-list": {
19185
+ const baseUrl = this.resolveAuthBaseUrl(args.baseUrl);
19121
19186
  const items = await this.request(
19122
19187
  baseUrl,
19123
19188
  token,
@@ -19128,6 +19193,7 @@ var AccountCommandHandler = class {
19128
19193
  return;
19129
19194
  }
19130
19195
  case "role-add": {
19196
+ const baseUrl = this.resolveAuthBaseUrl(args.baseUrl);
19131
19197
  const item = await this.request(
19132
19198
  baseUrl,
19133
19199
  token,
@@ -19144,6 +19210,7 @@ var AccountCommandHandler = class {
19144
19210
  return;
19145
19211
  }
19146
19212
  case "role-remove": {
19213
+ const baseUrl = this.resolveAuthBaseUrl(args.baseUrl);
19147
19214
  await this.request(
19148
19215
  baseUrl,
19149
19216
  token,
@@ -19158,11 +19225,79 @@ var AccountCommandHandler = class {
19158
19225
  ui.success(`Removed ${args.role} for ${args.account} in ${args.namespace}`);
19159
19226
  return;
19160
19227
  }
19228
+ case "visible-app-list": {
19229
+ const baseUrl = this.resolveAppsBaseUrl(args.baseUrl);
19230
+ const result = await this.request(
19231
+ baseUrl,
19232
+ token,
19233
+ "GET",
19234
+ `/accounts/${encodeURIComponent(args.account)}/visible-apps`
19235
+ );
19236
+ this.renderStringList(result.items, args.json, "No visible apps found.");
19237
+ return;
19238
+ }
19239
+ case "visible-app-add": {
19240
+ const baseUrl = this.resolveAppsBaseUrl(args.baseUrl);
19241
+ const item = await this.request(
19242
+ baseUrl,
19243
+ token,
19244
+ "PUT",
19245
+ `/accounts/${encodeURIComponent(args.account)}/visible-apps/${encodePathSegment(args.app)}`
19246
+ );
19247
+ ui.success(`Added visible app ${item.appId} for ${item.ownerId}`);
19248
+ this.renderJson(item, args.json);
19249
+ return;
19250
+ }
19251
+ case "visible-app-remove": {
19252
+ const baseUrl = this.resolveAppsBaseUrl(args.baseUrl);
19253
+ const result = await this.request(
19254
+ baseUrl,
19255
+ token,
19256
+ "DELETE",
19257
+ `/accounts/${encodeURIComponent(args.account)}/visible-apps/${encodePathSegment(args.app)}`
19258
+ );
19259
+ ui.success(
19260
+ result.removed ? `Removed visible app ${result.appId} for ${result.ownerId}` : `Visible app ${result.appId} was already absent for ${result.ownerId}`
19261
+ );
19262
+ this.renderJson(result, args.json);
19263
+ return;
19264
+ }
19265
+ case "visible-app-set": {
19266
+ const baseUrl = this.resolveAppsBaseUrl(args.baseUrl);
19267
+ const items = this.resolveVisibleAppsInput(args);
19268
+ const result = await this.request(
19269
+ baseUrl,
19270
+ token,
19271
+ "PUT",
19272
+ `/accounts/${encodeURIComponent(args.account)}/visible-apps`,
19273
+ items
19274
+ );
19275
+ ui.success(`Updated visible apps for ${args.account}`);
19276
+ this.renderJson(result.items, args.json);
19277
+ return;
19278
+ }
19279
+ case "visible-app-resolve": {
19280
+ const baseUrl = this.resolveAppsBaseUrl(args.baseUrl);
19281
+ const result = await this.request(
19282
+ baseUrl,
19283
+ token,
19284
+ "GET",
19285
+ "/me/visible-apps"
19286
+ );
19287
+ this.renderJson(result.items, args.json);
19288
+ if (!args.json) {
19289
+ this.renderResolvedApps(result.items);
19290
+ }
19291
+ return;
19292
+ }
19161
19293
  }
19162
19294
  }
19163
- resolveBaseUrl(baseUrl) {
19295
+ resolveAuthBaseUrl(baseUrl) {
19164
19296
  return (baseUrl || process.env.PMATE_AUTH_API_BASE_URL || process.env.AUTH_API_BASE_URL || "https://auth-api-v2.pmate.chat").replace(/\/+$/, "");
19165
19297
  }
19298
+ resolveAppsBaseUrl(baseUrl) {
19299
+ return (baseUrl || process.env.PMATE_APPS_API_BASE_URL || "https://apps-api.pmate.chat").replace(/\/+$/, "");
19300
+ }
19166
19301
  readToken() {
19167
19302
  return readRequiredSession({
19168
19303
  preferredApp: DEFAULT_APP_ID,
@@ -19217,6 +19352,19 @@ var AccountCommandHandler = class {
19217
19352
  });
19218
19353
  }
19219
19354
  }
19355
+ renderStringList(items, asJson, emptyMessage) {
19356
+ if (asJson) {
19357
+ ui.plain(JSON.stringify(items, null, 2));
19358
+ return;
19359
+ }
19360
+ if (items.length === 0) {
19361
+ ui.warn(emptyMessage);
19362
+ return;
19363
+ }
19364
+ for (const item of items) {
19365
+ ui.plain(item);
19366
+ }
19367
+ }
19220
19368
  renderAccountView(items, asJson) {
19221
19369
  if (asJson) {
19222
19370
  ui.plain(JSON.stringify(items, null, 2));
@@ -19247,7 +19395,293 @@ var AccountCommandHandler = class {
19247
19395
  }
19248
19396
  ui.plain(JSON.stringify(value, null, 2));
19249
19397
  }
19398
+ renderResolvedApps(items) {
19399
+ if (items.length === 0) {
19400
+ ui.warn("No visible apps found.");
19401
+ return;
19402
+ }
19403
+ for (const item of items) {
19404
+ ui.plain(item.id);
19405
+ }
19406
+ }
19407
+ resolveVisibleAppsInput(args) {
19408
+ if (args.apps && args.apps.length > 0) {
19409
+ return args.apps;
19410
+ }
19411
+ if (!args.filePath) {
19412
+ throw new Error("Missing visible apps input");
19413
+ }
19414
+ const absolutePath = this.resolveFilePath(args.filePath);
19415
+ if (!(0, import_node_fs20.existsSync)(absolutePath)) {
19416
+ throw new Error(`JSON file not found: ${absolutePath}`);
19417
+ }
19418
+ const raw = (0, import_node_fs20.readFileSync)(absolutePath, "utf8");
19419
+ let parsed;
19420
+ try {
19421
+ parsed = JSON.parse(raw);
19422
+ } catch (error) {
19423
+ const message = error instanceof Error ? error.message : String(error);
19424
+ throw new Error(`Invalid JSON in ${absolutePath}: ${message}`);
19425
+ }
19426
+ if (!Array.isArray(parsed) || parsed.some((item) => typeof item !== "string")) {
19427
+ throw new Error(`Expected ${absolutePath} to contain a JSON string array`);
19428
+ }
19429
+ return parsed;
19430
+ }
19431
+ resolveFilePath(filePath) {
19432
+ return import_node_path25.default.resolve(process.cwd(), filePath);
19433
+ }
19434
+ };
19435
+ function encodePathSegment(value) {
19436
+ return value.split("/").map((segment) => encodeURIComponent(segment)).join("/");
19437
+ }
19438
+
19439
+ // src/commands/OrgCommandHandler.ts
19440
+ var import_node_fs21 = require("fs");
19441
+ var import_node_path26 = __toESM(require("path"));
19442
+ init_sessionStore();
19443
+ var OrgCommandHandler = class {
19444
+ async handle(args) {
19445
+ const token = this.readToken();
19446
+ const baseUrl = this.resolveBaseUrl(args.baseUrl);
19447
+ switch (args.action) {
19448
+ case "list": {
19449
+ const result = await this.request(baseUrl, token, "GET", "/orgs");
19450
+ this.renderJson(result.items, args.json);
19451
+ if (!args.json) {
19452
+ this.renderOrgList(result.items);
19453
+ }
19454
+ return;
19455
+ }
19456
+ case "get":
19457
+ case "view": {
19458
+ const record = await this.request(
19459
+ baseUrl,
19460
+ token,
19461
+ "GET",
19462
+ `/orgs/${encodeURIComponent(args.orgId)}`
19463
+ );
19464
+ this.renderJson(record, true);
19465
+ return;
19466
+ }
19467
+ case "create": {
19468
+ const record = await this.request(baseUrl, token, "POST", "/orgs", {
19469
+ id: args.orgId,
19470
+ displayName: args.displayName,
19471
+ members: args.members
19472
+ });
19473
+ ui.success(`Created org ${record.id}`);
19474
+ this.renderJson(record, args.json);
19475
+ return;
19476
+ }
19477
+ case "update": {
19478
+ const record = await this.request(
19479
+ baseUrl,
19480
+ token,
19481
+ "PATCH",
19482
+ `/orgs/${encodeURIComponent(args.orgId)}`,
19483
+ {
19484
+ ...args.displayName !== void 0 ? { displayName: args.displayName } : {}
19485
+ }
19486
+ );
19487
+ ui.success(`Updated org ${record.id}`);
19488
+ this.renderJson(record, args.json);
19489
+ return;
19490
+ }
19491
+ case "disable": {
19492
+ const record = await this.request(
19493
+ baseUrl,
19494
+ token,
19495
+ "DELETE",
19496
+ `/orgs/${encodeURIComponent(args.orgId)}`
19497
+ );
19498
+ ui.success(`Disabled org ${record.id}`);
19499
+ this.renderJson(record, args.json);
19500
+ return;
19501
+ }
19502
+ case "member-list": {
19503
+ const result = await this.request(
19504
+ baseUrl,
19505
+ token,
19506
+ "GET",
19507
+ `/orgs/${encodeURIComponent(args.orgId)}/members`
19508
+ );
19509
+ this.renderStringList(result.items, args.json, "No members found.");
19510
+ return;
19511
+ }
19512
+ case "member-add": {
19513
+ const record = await this.request(
19514
+ baseUrl,
19515
+ token,
19516
+ "PUT",
19517
+ `/orgs/${encodeURIComponent(args.orgId)}/members/${encodeURIComponent(args.account)}`
19518
+ );
19519
+ ui.success(`Added ${args.account} to ${record.id}`);
19520
+ this.renderJson(record, args.json);
19521
+ return;
19522
+ }
19523
+ case "member-remove": {
19524
+ const record = await this.request(
19525
+ baseUrl,
19526
+ token,
19527
+ "DELETE",
19528
+ `/orgs/${encodeURIComponent(args.orgId)}/members/${encodeURIComponent(args.account)}`
19529
+ );
19530
+ ui.success(`Removed ${args.account} from ${record.id}`);
19531
+ this.renderJson(record, args.json);
19532
+ return;
19533
+ }
19534
+ case "member-set": {
19535
+ const accounts = this.resolveStringArrayInput(args.accounts, args.filePath, "account");
19536
+ const record = await this.request(
19537
+ baseUrl,
19538
+ token,
19539
+ "PUT",
19540
+ `/orgs/${encodeURIComponent(args.orgId)}/members`,
19541
+ accounts
19542
+ );
19543
+ ui.success(`Updated members for ${record.id}`);
19544
+ this.renderJson(record, args.json);
19545
+ return;
19546
+ }
19547
+ case "visible-app-list": {
19548
+ const result = await this.request(
19549
+ baseUrl,
19550
+ token,
19551
+ "GET",
19552
+ `/orgs/${encodeURIComponent(args.orgId)}/visible-apps`
19553
+ );
19554
+ this.renderStringList(result.items, args.json, "No visible apps found.");
19555
+ return;
19556
+ }
19557
+ case "visible-app-add": {
19558
+ const record = await this.request(
19559
+ baseUrl,
19560
+ token,
19561
+ "PUT",
19562
+ `/orgs/${encodeURIComponent(args.orgId)}/visible-apps/${encodePathSegment2(args.app)}`
19563
+ );
19564
+ ui.success(`Added visible app ${record.appId} to ${args.orgId}`);
19565
+ this.renderJson(record, args.json);
19566
+ return;
19567
+ }
19568
+ case "visible-app-remove": {
19569
+ const result = await this.request(
19570
+ baseUrl,
19571
+ token,
19572
+ "DELETE",
19573
+ `/orgs/${encodeURIComponent(args.orgId)}/visible-apps/${encodePathSegment2(args.app)}`
19574
+ );
19575
+ ui.success(
19576
+ result.removed ? `Removed visible app ${result.appId} from ${result.ownerId}` : `Visible app ${result.appId} was already absent from ${result.ownerId}`
19577
+ );
19578
+ this.renderJson(result, args.json);
19579
+ return;
19580
+ }
19581
+ case "visible-app-set": {
19582
+ const apps = this.resolveStringArrayInput(args.apps, args.filePath, "app ref");
19583
+ const result = await this.request(
19584
+ baseUrl,
19585
+ token,
19586
+ "PUT",
19587
+ `/orgs/${encodeURIComponent(args.orgId)}/visible-apps`,
19588
+ apps
19589
+ );
19590
+ ui.success(`Updated visible apps for ${args.orgId}`);
19591
+ this.renderJson(result.items, args.json);
19592
+ return;
19593
+ }
19594
+ }
19595
+ }
19596
+ resolveBaseUrl(baseUrl) {
19597
+ return (baseUrl || process.env.PMATE_APPS_API_BASE_URL || "https://apps-api.pmate.chat").replace(/\/+$/, "");
19598
+ }
19599
+ readToken() {
19600
+ return readRequiredSession({
19601
+ preferredApp: DEFAULT_APP_ID,
19602
+ fallbackToActiveApp: true
19603
+ }).token;
19604
+ }
19605
+ resolveStringArrayInput(values, filePath, itemLabel) {
19606
+ if (values && values.length > 0) {
19607
+ return values;
19608
+ }
19609
+ if (!filePath) {
19610
+ throw new Error(`Missing ${itemLabel} input`);
19611
+ }
19612
+ const absolutePath = import_node_path26.default.resolve(process.cwd(), filePath);
19613
+ if (!(0, import_node_fs21.existsSync)(absolutePath)) {
19614
+ throw new Error(`JSON file not found: ${absolutePath}`);
19615
+ }
19616
+ const raw = (0, import_node_fs21.readFileSync)(absolutePath, "utf8");
19617
+ let parsed;
19618
+ try {
19619
+ parsed = JSON.parse(raw);
19620
+ } catch (error) {
19621
+ const message = error instanceof Error ? error.message : String(error);
19622
+ throw new Error(`Invalid JSON in ${absolutePath}: ${message}`);
19623
+ }
19624
+ if (!Array.isArray(parsed) || parsed.some((item) => typeof item !== "string")) {
19625
+ throw new Error(`Expected ${absolutePath} to contain a JSON string array`);
19626
+ }
19627
+ return parsed;
19628
+ }
19629
+ async request(baseUrl, token, method, pathname, body) {
19630
+ const response = await fetch(`${baseUrl}${pathname}`, {
19631
+ method,
19632
+ headers: {
19633
+ Authorization: `Bearer ${token}`,
19634
+ "Content-Type": "application/json"
19635
+ },
19636
+ ...body !== void 0 ? { body: JSON.stringify(body) } : {}
19637
+ });
19638
+ let payload = null;
19639
+ try {
19640
+ payload = await response.json();
19641
+ } catch {
19642
+ payload = null;
19643
+ }
19644
+ if (!response.ok || !payload?.success) {
19645
+ throw new Error(payload?.message || `Request failed with status ${response.status}`);
19646
+ }
19647
+ return payload.data;
19648
+ }
19649
+ renderOrgList(items) {
19650
+ if (items.length === 0) {
19651
+ ui.warn("No orgs found.");
19652
+ return;
19653
+ }
19654
+ for (const item of items) {
19655
+ ui.info(item.id, {
19656
+ displayName: item.displayName,
19657
+ status: item.status,
19658
+ members: item.members
19659
+ });
19660
+ }
19661
+ }
19662
+ renderStringList(items, asJson, emptyMessage) {
19663
+ if (asJson) {
19664
+ ui.plain(JSON.stringify(items, null, 2));
19665
+ return;
19666
+ }
19667
+ if (items.length === 0) {
19668
+ ui.warn(emptyMessage);
19669
+ return;
19670
+ }
19671
+ for (const item of items) {
19672
+ ui.plain(item);
19673
+ }
19674
+ }
19675
+ renderJson(value, asJson) {
19676
+ if (!asJson) {
19677
+ return;
19678
+ }
19679
+ ui.plain(JSON.stringify(value, null, 2));
19680
+ }
19250
19681
  };
19682
+ function encodePathSegment2(value) {
19683
+ return value.split("/").map((segment) => encodeURIComponent(segment)).join("/");
19684
+ }
19251
19685
 
19252
19686
  // src/agentCommandParser.ts
19253
19687
  init_namespacedRef();
@@ -21020,6 +21454,7 @@ function requireValue7(tokens, optionName) {
21020
21454
  }
21021
21455
 
21022
21456
  // src/accountCommandParser.ts
21457
+ init_namespacedRef();
21023
21458
  function parseAccountArgs(tokens) {
21024
21459
  const rest = [...tokens];
21025
21460
  const action = rest.shift();
@@ -21077,6 +21512,102 @@ function parseAccountArgs(tokens) {
21077
21512
  json: json2
21078
21513
  };
21079
21514
  }
21515
+ if (action === "visible-app") {
21516
+ const visibleAction = rest.shift();
21517
+ if (!visibleAction) {
21518
+ throw new Error("Missing account visible-app action. Use: account visible-app list|add|remove|set|resolve");
21519
+ }
21520
+ let account2;
21521
+ let app;
21522
+ const apps = [];
21523
+ let filePath;
21524
+ let baseUrl2;
21525
+ let json2 = false;
21526
+ while (rest.length > 0) {
21527
+ const token = rest.shift();
21528
+ switch (token) {
21529
+ case "--account":
21530
+ account2 = requireValue8(rest, token);
21531
+ break;
21532
+ case "--app":
21533
+ app = parseNamespacedRef(requireValue8(rest, token), {
21534
+ entityLabel: "app ref"
21535
+ }).fullId;
21536
+ apps.push(app);
21537
+ break;
21538
+ case "--file":
21539
+ filePath = requireValue8(rest, token);
21540
+ break;
21541
+ case "--base-url":
21542
+ baseUrl2 = requireValue8(rest, token);
21543
+ break;
21544
+ case "--json":
21545
+ json2 = true;
21546
+ break;
21547
+ default:
21548
+ throw new Error(`Unknown account visible-app option: ${token}`);
21549
+ }
21550
+ }
21551
+ if (visibleAction === "resolve") {
21552
+ if (account2 || app || apps.length > 0 || filePath) {
21553
+ throw new Error(
21554
+ "Usage: account visible-app resolve [--base-url <url>] [--json]"
21555
+ );
21556
+ }
21557
+ return {
21558
+ type: "account" /* Account */,
21559
+ action: "visible-app-resolve",
21560
+ baseUrl: baseUrl2,
21561
+ json: json2
21562
+ };
21563
+ }
21564
+ if (visibleAction === "list") {
21565
+ if (!account2) {
21566
+ throw new Error(
21567
+ "Usage: account visible-app list --account <id> [--base-url <url>] [--json]"
21568
+ );
21569
+ }
21570
+ return {
21571
+ type: "account" /* Account */,
21572
+ action: "visible-app-list",
21573
+ account: account2,
21574
+ baseUrl: baseUrl2,
21575
+ json: json2
21576
+ };
21577
+ }
21578
+ if (visibleAction === "add" || visibleAction === "remove") {
21579
+ if (!account2 || !app) {
21580
+ throw new Error(
21581
+ `Usage: account visible-app ${visibleAction} --account <id> --app <ns:app> [--base-url <url>] [--json]`
21582
+ );
21583
+ }
21584
+ return {
21585
+ type: "account" /* Account */,
21586
+ action: visibleAction === "add" ? "visible-app-add" : "visible-app-remove",
21587
+ account: account2,
21588
+ app,
21589
+ baseUrl: baseUrl2,
21590
+ json: json2
21591
+ };
21592
+ }
21593
+ if (visibleAction === "set") {
21594
+ if (!account2 || apps.length === 0 && !filePath || apps.length > 0 && filePath) {
21595
+ throw new Error(
21596
+ "Usage: account visible-app set --account <id> (--app <ns:app> ... | --file <path>) [--base-url <url>] [--json]"
21597
+ );
21598
+ }
21599
+ return {
21600
+ type: "account" /* Account */,
21601
+ action: "visible-app-set",
21602
+ account: account2,
21603
+ apps: apps.length > 0 ? apps : void 0,
21604
+ filePath,
21605
+ baseUrl: baseUrl2,
21606
+ json: json2
21607
+ };
21608
+ }
21609
+ throw new Error(`Unknown account visible-app action: ${visibleAction}`);
21610
+ }
21080
21611
  if (action !== "role") {
21081
21612
  throw new Error(`Unknown account action: ${action}`);
21082
21613
  }
@@ -21152,6 +21683,283 @@ function requireValue8(tokens, optionName) {
21152
21683
  return value;
21153
21684
  }
21154
21685
 
21686
+ // src/orgCommandParser.ts
21687
+ init_namespacedRef();
21688
+ function parseOrgArgs(tokens) {
21689
+ const rest = [...tokens];
21690
+ const rawAction = rest.shift();
21691
+ const action = rawAction === "view" ? "view" : rawAction;
21692
+ if (!action) {
21693
+ throw new Error(
21694
+ "Missing org action. Use: org list|get|view|create|update|disable|member|visible-app"
21695
+ );
21696
+ }
21697
+ let baseUrl;
21698
+ let json = false;
21699
+ const takeSharedOptions4 = () => {
21700
+ while (rest.length > 0) {
21701
+ const token = rest[0];
21702
+ if (token === "--base-url") {
21703
+ rest.shift();
21704
+ baseUrl = requireValue9(rest, token);
21705
+ continue;
21706
+ }
21707
+ if (token === "--json") {
21708
+ rest.shift();
21709
+ json = true;
21710
+ continue;
21711
+ }
21712
+ break;
21713
+ }
21714
+ };
21715
+ if (action === "list") {
21716
+ takeSharedOptions4();
21717
+ if (rest.length > 0) {
21718
+ throw new Error(`Unknown org list option: ${rest[0]}`);
21719
+ }
21720
+ return { type: "org" /* Org */, action, baseUrl, json };
21721
+ }
21722
+ if (action === "get" || action === "view" || action === "disable") {
21723
+ const orgId = parseRequiredOrgRef(rest.shift(), action);
21724
+ takeSharedOptions4();
21725
+ if (rest.length > 0) {
21726
+ throw new Error(`Unknown org ${action} option: ${rest[0]}`);
21727
+ }
21728
+ return { type: "org" /* Org */, action, orgId, baseUrl, json };
21729
+ }
21730
+ if (action === "create") {
21731
+ const orgId = parseRequiredOrgRef(rest.shift(), action);
21732
+ let displayName;
21733
+ const members = [];
21734
+ while (rest.length > 0) {
21735
+ const token = rest.shift();
21736
+ switch (token) {
21737
+ case "--display-name":
21738
+ displayName = requireValue9(rest, token);
21739
+ break;
21740
+ case "--member":
21741
+ members.push(requireValue9(rest, token));
21742
+ break;
21743
+ case "--base-url":
21744
+ baseUrl = requireValue9(rest, token);
21745
+ break;
21746
+ case "--json":
21747
+ json = true;
21748
+ break;
21749
+ default:
21750
+ throw new Error(`Unknown org create option: ${token}`);
21751
+ }
21752
+ }
21753
+ if (!displayName) {
21754
+ throw new Error(
21755
+ "Usage: org create <ns:org> --display-name <name> [--member <id> ...] [--base-url <url>] [--json]"
21756
+ );
21757
+ }
21758
+ return {
21759
+ type: "org" /* Org */,
21760
+ action,
21761
+ orgId,
21762
+ displayName,
21763
+ members,
21764
+ baseUrl,
21765
+ json
21766
+ };
21767
+ }
21768
+ if (action === "update") {
21769
+ const orgId = parseRequiredOrgRef(rest.shift(), action);
21770
+ let displayName;
21771
+ while (rest.length > 0) {
21772
+ const token = rest.shift();
21773
+ switch (token) {
21774
+ case "--display-name":
21775
+ displayName = requireValue9(rest, token);
21776
+ break;
21777
+ case "--base-url":
21778
+ baseUrl = requireValue9(rest, token);
21779
+ break;
21780
+ case "--json":
21781
+ json = true;
21782
+ break;
21783
+ default:
21784
+ throw new Error(`Unknown org update option: ${token}`);
21785
+ }
21786
+ }
21787
+ if (displayName === void 0) {
21788
+ throw new Error(
21789
+ "Usage: org update <ns:org> --display-name <name> [--base-url <url>] [--json]"
21790
+ );
21791
+ }
21792
+ return {
21793
+ type: "org" /* Org */,
21794
+ action,
21795
+ orgId,
21796
+ displayName,
21797
+ baseUrl,
21798
+ json
21799
+ };
21800
+ }
21801
+ if (action === "member") {
21802
+ return parseOrgMemberArgs(rest);
21803
+ }
21804
+ if (action === "visible-app") {
21805
+ return parseOrgVisibleAppArgs(rest);
21806
+ }
21807
+ throw new Error(`Unknown org action: ${action}`);
21808
+ function parseOrgMemberArgs(memberTokens) {
21809
+ const subAction = memberTokens.shift();
21810
+ if (!subAction) {
21811
+ throw new Error("Missing org member action. Use: org member list|add|remove|set");
21812
+ }
21813
+ const orgId = parseRequiredOrgRef(memberTokens.shift(), `member ${subAction}`);
21814
+ let account;
21815
+ const accounts = [];
21816
+ let filePath;
21817
+ while (memberTokens.length > 0) {
21818
+ const token = memberTokens.shift();
21819
+ switch (token) {
21820
+ case "--account": {
21821
+ const value = requireValue9(memberTokens, token);
21822
+ account = value;
21823
+ accounts.push(value);
21824
+ break;
21825
+ }
21826
+ case "--file":
21827
+ filePath = requireValue9(memberTokens, token);
21828
+ break;
21829
+ case "--base-url":
21830
+ baseUrl = requireValue9(memberTokens, token);
21831
+ break;
21832
+ case "--json":
21833
+ json = true;
21834
+ break;
21835
+ default:
21836
+ throw new Error(`Unknown org member option: ${token}`);
21837
+ }
21838
+ }
21839
+ if (subAction === "list") {
21840
+ return { type: "org" /* Org */, action: "member-list", orgId, baseUrl, json };
21841
+ }
21842
+ if (subAction === "add" || subAction === "remove") {
21843
+ if (!account) {
21844
+ throw new Error(
21845
+ `Usage: org member ${subAction} <ns:org> --account <id> [--base-url <url>] [--json]`
21846
+ );
21847
+ }
21848
+ return {
21849
+ type: "org" /* Org */,
21850
+ action: subAction === "add" ? "member-add" : "member-remove",
21851
+ orgId,
21852
+ account,
21853
+ baseUrl,
21854
+ json
21855
+ };
21856
+ }
21857
+ if (subAction === "set") {
21858
+ if (accounts.length === 0 && !filePath || accounts.length > 0 && filePath) {
21859
+ throw new Error(
21860
+ "Usage: org member set <ns:org> (--account <id> ... | --file <path>) [--base-url <url>] [--json]"
21861
+ );
21862
+ }
21863
+ return {
21864
+ type: "org" /* Org */,
21865
+ action: "member-set",
21866
+ orgId,
21867
+ accounts: accounts.length > 0 ? accounts : void 0,
21868
+ filePath,
21869
+ baseUrl,
21870
+ json
21871
+ };
21872
+ }
21873
+ throw new Error(`Unknown org member action: ${subAction}`);
21874
+ }
21875
+ function parseOrgVisibleAppArgs(visibleTokens) {
21876
+ const subAction = visibleTokens.shift();
21877
+ if (!subAction) {
21878
+ throw new Error(
21879
+ "Missing org visible-app action. Use: org visible-app list|add|remove|set"
21880
+ );
21881
+ }
21882
+ const orgId = parseRequiredOrgRef(visibleTokens.shift(), `visible-app ${subAction}`);
21883
+ let app;
21884
+ const apps = [];
21885
+ let filePath;
21886
+ while (visibleTokens.length > 0) {
21887
+ const token = visibleTokens.shift();
21888
+ switch (token) {
21889
+ case "--app": {
21890
+ const value = parseNamespacedRef(requireValue9(visibleTokens, token), {
21891
+ entityLabel: "app ref"
21892
+ }).fullId;
21893
+ app = value;
21894
+ apps.push(value);
21895
+ break;
21896
+ }
21897
+ case "--file":
21898
+ filePath = requireValue9(visibleTokens, token);
21899
+ break;
21900
+ case "--base-url":
21901
+ baseUrl = requireValue9(visibleTokens, token);
21902
+ break;
21903
+ case "--json":
21904
+ json = true;
21905
+ break;
21906
+ default:
21907
+ throw new Error(`Unknown org visible-app option: ${token}`);
21908
+ }
21909
+ }
21910
+ if (subAction === "list") {
21911
+ return { type: "org" /* Org */, action: "visible-app-list", orgId, baseUrl, json };
21912
+ }
21913
+ if (subAction === "add" || subAction === "remove") {
21914
+ if (!app) {
21915
+ throw new Error(
21916
+ `Usage: org visible-app ${subAction} <ns:org> --app <ns:app> [--base-url <url>] [--json]`
21917
+ );
21918
+ }
21919
+ return {
21920
+ type: "org" /* Org */,
21921
+ action: subAction === "add" ? "visible-app-add" : "visible-app-remove",
21922
+ orgId,
21923
+ app,
21924
+ baseUrl,
21925
+ json
21926
+ };
21927
+ }
21928
+ if (subAction === "set") {
21929
+ if (apps.length === 0 && !filePath || apps.length > 0 && filePath) {
21930
+ throw new Error(
21931
+ "Usage: org visible-app set <ns:org> (--app <ns:app> ... | --file <path>) [--base-url <url>] [--json]"
21932
+ );
21933
+ }
21934
+ return {
21935
+ type: "org" /* Org */,
21936
+ action: "visible-app-set",
21937
+ orgId,
21938
+ apps: apps.length > 0 ? apps : void 0,
21939
+ filePath,
21940
+ baseUrl,
21941
+ json
21942
+ };
21943
+ }
21944
+ throw new Error(`Unknown org visible-app action: ${subAction}`);
21945
+ }
21946
+ }
21947
+ function parseRequiredOrgRef(value, action) {
21948
+ if (!value || value.startsWith("-")) {
21949
+ throw new Error(`Usage: org ${action} <ns:org>`);
21950
+ }
21951
+ return parseNamespacedRef(value, {
21952
+ entityLabel: "org ref"
21953
+ }).fullId;
21954
+ }
21955
+ function requireValue9(tokens, optionName) {
21956
+ const value = tokens.shift();
21957
+ if (!value || value.startsWith("-")) {
21958
+ throw new Error(`Missing value for ${optionName}`);
21959
+ }
21960
+ return value;
21961
+ }
21962
+
21155
21963
  // src/collectCommandParser.ts
21156
21964
  function parseCollectArgs(tokens) {
21157
21965
  const rest = [...tokens];
@@ -21170,7 +21978,7 @@ function parseCollectArgs(tokens) {
21170
21978
  const token = rest.shift();
21171
21979
  switch (token) {
21172
21980
  case "--source": {
21173
- const value = requireValue9(rest, token);
21981
+ const value = requireValue10(rest, token);
21174
21982
  if (value !== "cc" && value !== "yelling") {
21175
21983
  throw new Error(`Unsupported collect source: ${value}`);
21176
21984
  }
@@ -21178,7 +21986,7 @@ function parseCollectArgs(tokens) {
21178
21986
  break;
21179
21987
  }
21180
21988
  case "--endpoint":
21181
- options.endpoint = requireValue9(rest, token);
21989
+ options.endpoint = requireValue10(rest, token);
21182
21990
  break;
21183
21991
  default:
21184
21992
  throw new Error(`Unknown collect option: ${token}`);
@@ -21194,7 +22002,7 @@ function parseCollectArgs(tokens) {
21194
22002
  }
21195
22003
  return { type: "collect" /* Collect */, ...options };
21196
22004
  }
21197
- function requireValue9(tokens, optionName) {
22005
+ function requireValue10(tokens, optionName) {
21198
22006
  const value = tokens.shift();
21199
22007
  if (!value) {
21200
22008
  throw new Error(`Missing value for ${optionName}`);
@@ -21229,7 +22037,7 @@ function parsePrepareDevArgs(tokens) {
21229
22037
  close = true;
21230
22038
  break;
21231
22039
  case "--env": {
21232
- const rawValue = requireValue10(rest, token);
22040
+ const rawValue = requireValue11(rest, token);
21233
22041
  const parsed = Number.parseInt(rawValue, 10);
21234
22042
  if (!Number.isInteger(parsed) || parsed < 0) {
21235
22043
  throw new Error(`Invalid --env value: ${rawValue}`);
@@ -21238,13 +22046,13 @@ function parsePrepareDevArgs(tokens) {
21238
22046
  break;
21239
22047
  }
21240
22048
  case "--env-root":
21241
- envRoot = requireValue10(rest, token);
22049
+ envRoot = requireValue11(rest, token);
21242
22050
  break;
21243
22051
  case "--base-root":
21244
- baseRoot = requireValue10(rest, token);
22052
+ baseRoot = requireValue11(rest, token);
21245
22053
  break;
21246
22054
  case "--note":
21247
- note = requireValue10(rest, token);
22055
+ note = requireValue11(rest, token);
21248
22056
  break;
21249
22057
  case "--json":
21250
22058
  json = true;
@@ -21280,7 +22088,7 @@ function parsePrepareDevArgs(tokens) {
21280
22088
  json
21281
22089
  };
21282
22090
  }
21283
- function requireValue10(tokens, option) {
22091
+ function requireValue11(tokens, option) {
21284
22092
  const value = tokens.shift();
21285
22093
  if (!value || value.startsWith("-")) {
21286
22094
  throw new Error(`Missing value for ${option}`);
@@ -21290,7 +22098,7 @@ function requireValue10(tokens, option) {
21290
22098
 
21291
22099
  // src/index.ts
21292
22100
  var pkg = JSON.parse(
21293
- (0, import_node_fs20.readFileSync)(import_node_path25.default.resolve(__dirname, "..", "package.json"), "utf8")
22101
+ (0, import_node_fs22.readFileSync)(import_node_path27.default.resolve(__dirname, "..", "package.json"), "utf8")
21294
22102
  );
21295
22103
  var HELP_TEXT = [
21296
22104
  import_chalk4.default.bold(`pmate v${pkg.version}`),
@@ -21406,7 +22214,27 @@ var HELP_TEXT = [
21406
22214
  ` ${import_chalk4.default.gray(" role list --account <id> [--namespace <ns>] [--base-url <url>] [--json]")}`,
21407
22215
  ` ${import_chalk4.default.gray(" role add --account <id> --namespace <ns> --role <role> [--base-url <url>] [--json]")}`,
21408
22216
  ` ${import_chalk4.default.gray(" role remove --account <id> --namespace <ns> --role <role> [--base-url <url>] [--json]")}`,
22217
+ ` ${import_chalk4.default.gray(" visible-app list --account <id> [--base-url <url>] [--json]")}`,
22218
+ ` ${import_chalk4.default.gray(" visible-app add --account <id> --app <ns:app> [--base-url <url>] [--json]")}`,
22219
+ ` ${import_chalk4.default.gray(" visible-app remove --account <id> --app <ns:app> [--base-url <url>] [--json]")}`,
22220
+ ` ${import_chalk4.default.gray(" visible-app set --account <id> (--app <ns:app> ... | --file <path>) [--base-url <url>] [--json]")}`,
22221
+ ` ${import_chalk4.default.gray(" visible-app resolve [--base-url <url>] [--json]")}`,
21409
22222
  ` ${import_chalk4.default.gray(" default base URL: https://auth-api-v2.pmate.chat")}`,
22223
+ ` ${import_chalk4.default.cyan("org")} Manage orgs, org members, and org visible apps via apps-api`,
22224
+ ` ${import_chalk4.default.gray(" list [--base-url <url>] [--json]")}`,
22225
+ ` ${import_chalk4.default.gray(" get <ns:org> [--base-url <url>] [--json]")}`,
22226
+ ` ${import_chalk4.default.gray(" create <ns:org> --display-name <name> [--member <id> ...] [--base-url <url>] [--json]")}`,
22227
+ ` ${import_chalk4.default.gray(" update <ns:org> --display-name <name> [--base-url <url>] [--json]")}`,
22228
+ ` ${import_chalk4.default.gray(" disable <ns:org> [--base-url <url>] [--json]")}`,
22229
+ ` ${import_chalk4.default.gray(" member list <ns:org> [--base-url <url>] [--json]")}`,
22230
+ ` ${import_chalk4.default.gray(" member add <ns:org> --account <id> [--base-url <url>] [--json]")}`,
22231
+ ` ${import_chalk4.default.gray(" member remove <ns:org> --account <id> [--base-url <url>] [--json]")}`,
22232
+ ` ${import_chalk4.default.gray(" member set <ns:org> (--account <id> ... | --file <path>) [--base-url <url>] [--json]")}`,
22233
+ ` ${import_chalk4.default.gray(" visible-app list <ns:org> [--base-url <url>] [--json]")}`,
22234
+ ` ${import_chalk4.default.gray(" visible-app add <ns:org> --app <ns:app> [--base-url <url>] [--json]")}`,
22235
+ ` ${import_chalk4.default.gray(" visible-app remove <ns:org> --app <ns:app> [--base-url <url>] [--json]")}`,
22236
+ ` ${import_chalk4.default.gray(" visible-app set <ns:org> (--app <ns:app> ... | --file <path>) [--base-url <url>] [--json]")}`,
22237
+ ` ${import_chalk4.default.gray(" default base URL: https://apps-api.pmate.chat")}`,
21410
22238
  ` ${import_chalk4.default.cyan("store")} Manage @pmate/store namespaces, tables, and kv stores`,
21411
22239
  ` ${import_chalk4.default.gray(" namespace list [--chain <chain>] [--indexer-base-url <url>] [--json]")}`,
21412
22240
  ` ${import_chalk4.default.gray(" table list|get|exists|create|update|delete <name> [options]")}`,
@@ -21498,7 +22326,7 @@ function parseCommandArgs(args) {
21498
22326
  const token = rest.shift();
21499
22327
  switch (token) {
21500
22328
  case "--app":
21501
- app = requireValue11(rest, token);
22329
+ app = requireValue12(rest, token);
21502
22330
  break;
21503
22331
  default:
21504
22332
  throw new Error(`Unknown login option: ${token}`);
@@ -21575,6 +22403,9 @@ function parseCommandArgs(args) {
21575
22403
  if (args.rest[0] === "account") {
21576
22404
  return parseAccountArgs(args.rest.slice(1));
21577
22405
  }
22406
+ if (args.rest[0] === "org") {
22407
+ return parseOrgArgs(args.rest.slice(1));
22408
+ }
21578
22409
  if (args.rest[0] === "store") {
21579
22410
  return parseStoreArgs(args.rest.slice(1));
21580
22411
  }
@@ -21601,7 +22432,7 @@ function parseVercelArgs(tokens) {
21601
22432
  const token = rest.shift();
21602
22433
  switch (token) {
21603
22434
  case "--scope":
21604
- scope = requireValue11(rest, token);
22435
+ scope = requireValue12(rest, token);
21605
22436
  break;
21606
22437
  default:
21607
22438
  throw new Error(`Unknown vercel option: ${token}`);
@@ -21621,10 +22452,10 @@ function parseVercelArgs(tokens) {
21621
22452
  const token = rest.shift();
21622
22453
  switch (token) {
21623
22454
  case "--scope":
21624
- scope = requireValue11(rest, token);
22455
+ scope = requireValue12(rest, token);
21625
22456
  break;
21626
22457
  case "--project":
21627
- project = requireValue11(rest, token);
22458
+ project = requireValue12(rest, token);
21628
22459
  break;
21629
22460
  case "--last-week":
21630
22461
  lastWeek = true;
@@ -21655,16 +22486,16 @@ function parseAddDnsArgs(tokens) {
21655
22486
  const token = rest.shift();
21656
22487
  switch (token) {
21657
22488
  case "--type":
21658
- options.dnsType = requireValue11(rest, token);
22489
+ options.dnsType = requireValue12(rest, token);
21659
22490
  break;
21660
22491
  case "--value":
21661
- options.dnsValue = requireValue11(rest, token);
22492
+ options.dnsValue = requireValue12(rest, token);
21662
22493
  break;
21663
22494
  case "--rr":
21664
- options.dnsRr = requireValue11(rest, token);
22495
+ options.dnsRr = requireValue12(rest, token);
21665
22496
  break;
21666
22497
  case "--ttl": {
21667
- const ttlValue = requireValue11(rest, token);
22498
+ const ttlValue = requireValue12(rest, token);
21668
22499
  const ttl = Number.parseInt(ttlValue, 10);
21669
22500
  if (!Number.isFinite(ttl) || ttl <= 0) {
21670
22501
  throw new Error(`Invalid --ttl value: ${ttlValue}`);
@@ -21673,7 +22504,7 @@ function parseAddDnsArgs(tokens) {
21673
22504
  break;
21674
22505
  }
21675
22506
  case "--domain":
21676
- options.dnsDomain = requireValue11(rest, token);
22507
+ options.dnsDomain = requireValue12(rest, token);
21677
22508
  break;
21678
22509
  default:
21679
22510
  throw new Error(`Unknown add-dns option: ${token}`);
@@ -21706,13 +22537,13 @@ function parseBucketArgs(tokens) {
21706
22537
  options.bucketCreate = true;
21707
22538
  break;
21708
22539
  case "--name":
21709
- options.bucketName = requireValue11(rest, token);
22540
+ options.bucketName = requireValue12(rest, token);
21710
22541
  break;
21711
22542
  case "--subdomain":
21712
- options.bucketSubdomain = requireValue11(rest, token);
22543
+ options.bucketSubdomain = requireValue12(rest, token);
21713
22544
  break;
21714
22545
  case "--domain":
21715
- options.bucketDomain = requireValue11(rest, token);
22546
+ options.bucketDomain = requireValue12(rest, token);
21716
22547
  break;
21717
22548
  default:
21718
22549
  throw new Error(`Unknown bucket option: ${token}`);
@@ -21744,7 +22575,7 @@ function parseDevArgs(tokens) {
21744
22575
  const token = rest.shift();
21745
22576
  switch (token) {
21746
22577
  case "--cwd":
21747
- options.devCwd = requireValue11(rest, token);
22578
+ options.devCwd = requireValue12(rest, token);
21748
22579
  break;
21749
22580
  default:
21750
22581
  throw new Error(`Unknown dev option: ${token}`);
@@ -21764,7 +22595,7 @@ function parseDeleteArgs(tokens) {
21764
22595
  const token = rest.shift();
21765
22596
  switch (token) {
21766
22597
  case "--cwd":
21767
- deleteCwd = requireValue11(rest, token);
22598
+ deleteCwd = requireValue12(rest, token);
21768
22599
  break;
21769
22600
  default:
21770
22601
  throw new Error(`Unknown delete option: ${token}`);
@@ -21798,13 +22629,13 @@ function parseOssArgs(tokens) {
21798
22629
  const token = rest.shift();
21799
22630
  switch (token) {
21800
22631
  case "--bucket":
21801
- bucket = requireValue11(rest, token);
22632
+ bucket = requireValue12(rest, token);
21802
22633
  break;
21803
22634
  case "--file":
21804
- filePath = requireValue11(rest, token);
22635
+ filePath = requireValue12(rest, token);
21805
22636
  break;
21806
22637
  case "--key":
21807
- objectKey = requireValue11(rest, token);
22638
+ objectKey = requireValue12(rest, token);
21808
22639
  break;
21809
22640
  default:
21810
22641
  throw new Error(`Unknown oss option: ${token}`);
@@ -21837,7 +22668,7 @@ function parseEnvArgs(tokens) {
21837
22668
  throw new Error("Only one env action is allowed.");
21838
22669
  }
21839
22670
  action = "set";
21840
- key = requireValue11(rest, token);
22671
+ key = requireValue12(rest, token);
21841
22672
  break;
21842
22673
  case "--list":
21843
22674
  if (action) {
@@ -21850,17 +22681,17 @@ function parseEnvArgs(tokens) {
21850
22681
  throw new Error("Only one env action is allowed.");
21851
22682
  }
21852
22683
  action = "delete";
21853
- key = requireValue11(rest, token);
22684
+ key = requireValue12(rest, token);
21854
22685
  break;
21855
22686
  case "--value":
21856
- value = requireValue11(rest, token);
22687
+ value = requireValue12(rest, token);
21857
22688
  break;
21858
22689
  case "--verbose":
21859
22690
  case "-v":
21860
22691
  verbose = true;
21861
22692
  break;
21862
22693
  case "--cwd":
21863
- cwd = requireValue11(rest, token);
22694
+ cwd = requireValue12(rest, token);
21864
22695
  break;
21865
22696
  default:
21866
22697
  throw new Error(`Unknown env option: ${token}`);
@@ -21918,7 +22749,7 @@ function parseCommitArgs(tokens) {
21918
22749
  push = true;
21919
22750
  break;
21920
22751
  case "--cwd":
21921
- cwd = requireValue11(rest, token);
22752
+ cwd = requireValue12(rest, token);
21922
22753
  break;
21923
22754
  default:
21924
22755
  throw new Error(`Unknown commit option: ${token}`);
@@ -21934,10 +22765,10 @@ function parseSummaryArgs(tokens) {
21934
22765
  const token = rest.shift();
21935
22766
  switch (token) {
21936
22767
  case "--pr":
21937
- prRef = requireValue11(rest, token);
22768
+ prRef = requireValue12(rest, token);
21938
22769
  break;
21939
22770
  case "--cwd":
21940
- cwd = requireValue11(rest, token);
22771
+ cwd = requireValue12(rest, token);
21941
22772
  break;
21942
22773
  default:
21943
22774
  throw new Error(`Unknown summary option: ${token}`);
@@ -21962,13 +22793,13 @@ function parseQuizArgs(tokens) {
21962
22793
  const token = rest.shift();
21963
22794
  switch (token) {
21964
22795
  case "--paper-id":
21965
- paperId = requireValue11(rest, token);
22796
+ paperId = requireValue12(rest, token);
21966
22797
  break;
21967
22798
  case "--base-url":
21968
- apiBaseUrl = requireValue11(rest, token);
22799
+ apiBaseUrl = requireValue12(rest, token);
21969
22800
  break;
21970
22801
  case "--link-base":
21971
- linkBaseUrl = requireValue11(rest, token);
22802
+ linkBaseUrl = requireValue12(rest, token);
21972
22803
  break;
21973
22804
  default:
21974
22805
  throw new Error(`Unknown quiz create-draft option: ${token}`);
@@ -21994,16 +22825,16 @@ function parseQuizArgs(tokens) {
21994
22825
  const token = rest.shift();
21995
22826
  switch (token) {
21996
22827
  case "--paper-id":
21997
- paperId = requireValue11(rest, token);
22828
+ paperId = requireValue12(rest, token);
21998
22829
  break;
21999
22830
  case "--file":
22000
- filePath = requireValue11(rest, token);
22831
+ filePath = requireValue12(rest, token);
22001
22832
  break;
22002
22833
  case "--base-url":
22003
- apiBaseUrl = requireValue11(rest, token);
22834
+ apiBaseUrl = requireValue12(rest, token);
22004
22835
  break;
22005
22836
  case "--link-base":
22006
- linkBaseUrl = requireValue11(rest, token);
22837
+ linkBaseUrl = requireValue12(rest, token);
22007
22838
  break;
22008
22839
  default:
22009
22840
  throw new Error(`Unknown quiz update-meta option: ${token}`);
@@ -22033,16 +22864,16 @@ function parseQuizArgs(tokens) {
22033
22864
  const token = rest.shift();
22034
22865
  switch (token) {
22035
22866
  case "--paper-id":
22036
- paperId = requireValue11(rest, token);
22867
+ paperId = requireValue12(rest, token);
22037
22868
  break;
22038
22869
  case "--file":
22039
- filePath = requireValue11(rest, token);
22870
+ filePath = requireValue12(rest, token);
22040
22871
  break;
22041
22872
  case "--base-url":
22042
- apiBaseUrl = requireValue11(rest, token);
22873
+ apiBaseUrl = requireValue12(rest, token);
22043
22874
  break;
22044
22875
  case "--link-base":
22045
- linkBaseUrl = requireValue11(rest, token);
22876
+ linkBaseUrl = requireValue12(rest, token);
22046
22877
  break;
22047
22878
  default:
22048
22879
  throw new Error(`Unknown quiz append-step option: ${token}`);
@@ -22073,19 +22904,19 @@ function parseQuizArgs(tokens) {
22073
22904
  const token = rest.shift();
22074
22905
  switch (token) {
22075
22906
  case "--paper-id":
22076
- paperId = requireValue11(rest, token);
22907
+ paperId = requireValue12(rest, token);
22077
22908
  break;
22078
22909
  case "--step-id":
22079
- stepId = requireValue11(rest, token);
22910
+ stepId = requireValue12(rest, token);
22080
22911
  break;
22081
22912
  case "--file":
22082
- filePath = requireValue11(rest, token);
22913
+ filePath = requireValue12(rest, token);
22083
22914
  break;
22084
22915
  case "--base-url":
22085
- apiBaseUrl = requireValue11(rest, token);
22916
+ apiBaseUrl = requireValue12(rest, token);
22086
22917
  break;
22087
22918
  case "--link-base":
22088
- linkBaseUrl = requireValue11(rest, token);
22919
+ linkBaseUrl = requireValue12(rest, token);
22089
22920
  break;
22090
22921
  default:
22091
22922
  throw new Error(`Unknown quiz update-step option: ${token}`);
@@ -22119,16 +22950,16 @@ function parseQuizArgs(tokens) {
22119
22950
  const token = rest.shift();
22120
22951
  switch (token) {
22121
22952
  case "--paper-id":
22122
- paperId = requireValue11(rest, token);
22953
+ paperId = requireValue12(rest, token);
22123
22954
  break;
22124
22955
  case "--step-ids":
22125
- stepIdsRaw = requireValue11(rest, token);
22956
+ stepIdsRaw = requireValue12(rest, token);
22126
22957
  break;
22127
22958
  case "--base-url":
22128
- apiBaseUrl = requireValue11(rest, token);
22959
+ apiBaseUrl = requireValue12(rest, token);
22129
22960
  break;
22130
22961
  case "--link-base":
22131
- linkBaseUrl = requireValue11(rest, token);
22962
+ linkBaseUrl = requireValue12(rest, token);
22132
22963
  break;
22133
22964
  default:
22134
22965
  throw new Error(`Unknown quiz reorder option: ${token}`);
@@ -22161,13 +22992,13 @@ function parseQuizArgs(tokens) {
22161
22992
  const token = rest.shift();
22162
22993
  switch (token) {
22163
22994
  case "--paper-id":
22164
- paperId = requireValue11(rest, token);
22995
+ paperId = requireValue12(rest, token);
22165
22996
  break;
22166
22997
  case "--base-url":
22167
- apiBaseUrl = requireValue11(rest, token);
22998
+ apiBaseUrl = requireValue12(rest, token);
22168
22999
  break;
22169
23000
  case "--link-base":
22170
- linkBaseUrl = requireValue11(rest, token);
23001
+ linkBaseUrl = requireValue12(rest, token);
22171
23002
  break;
22172
23003
  default:
22173
23004
  throw new Error(`Unknown quiz activate option: ${token}`);
@@ -22192,13 +23023,13 @@ function parseQuizArgs(tokens) {
22192
23023
  const token = rest.shift();
22193
23024
  switch (token) {
22194
23025
  case "--paper-id":
22195
- paperId = requireValue11(rest, token);
23026
+ paperId = requireValue12(rest, token);
22196
23027
  break;
22197
23028
  case "--base-url":
22198
- apiBaseUrl = requireValue11(rest, token);
23029
+ apiBaseUrl = requireValue12(rest, token);
22199
23030
  break;
22200
23031
  case "--link-base":
22201
- linkBaseUrl = requireValue11(rest, token);
23032
+ linkBaseUrl = requireValue12(rest, token);
22202
23033
  break;
22203
23034
  default:
22204
23035
  throw new Error(`Unknown quiz view option: ${token}`);
@@ -22227,22 +23058,22 @@ function parseQuizArgs(tokens) {
22227
23058
  const token = rest.shift();
22228
23059
  switch (token) {
22229
23060
  case "--paper-id":
22230
- paperId = requireValue11(rest, token);
23061
+ paperId = requireValue12(rest, token);
22231
23062
  break;
22232
23063
  case "--step-id":
22233
- stepId = requireValue11(rest, token);
23064
+ stepId = requireValue12(rest, token);
22234
23065
  break;
22235
23066
  case "--file":
22236
- filePath = requireValue11(rest, token);
23067
+ filePath = requireValue12(rest, token);
22237
23068
  break;
22238
23069
  case "--new-paper-id":
22239
- newPaperId = requireValue11(rest, token);
23070
+ newPaperId = requireValue12(rest, token);
22240
23071
  break;
22241
23072
  case "--base-url":
22242
- apiBaseUrl = requireValue11(rest, token);
23073
+ apiBaseUrl = requireValue12(rest, token);
22243
23074
  break;
22244
23075
  case "--link-base":
22245
- linkBaseUrl = requireValue11(rest, token);
23076
+ linkBaseUrl = requireValue12(rest, token);
22246
23077
  break;
22247
23078
  case "--activate":
22248
23079
  activate = true;
@@ -22332,10 +23163,10 @@ function parseLinearPrArgs(tokens) {
22332
23163
  const token = rest.shift();
22333
23164
  switch (token) {
22334
23165
  case "--account":
22335
- account = requireValue11(rest, token);
23166
+ account = requireValue12(rest, token);
22336
23167
  break;
22337
23168
  case "--cwd":
22338
- cwd = requireValue11(rest, token);
23169
+ cwd = requireValue12(rest, token);
22339
23170
  break;
22340
23171
  default:
22341
23172
  throw new Error(`Unknown linear option: ${token}`);
@@ -22364,35 +23195,35 @@ function parseLinearCreateArgs(tokens) {
22364
23195
  const token = rest.shift();
22365
23196
  switch (token) {
22366
23197
  case "--account":
22367
- account = requireValue11(rest, token);
23198
+ account = requireValue12(rest, token);
22368
23199
  break;
22369
23200
  case "--repl":
22370
23201
  useRepl = true;
22371
23202
  break;
22372
23203
  case "--title":
22373
- title = requireValue11(rest, token);
23204
+ title = requireValue12(rest, token);
22374
23205
  break;
22375
23206
  case "--desc":
22376
23207
  case "--description":
22377
- description = decodeEscapedNewlines(requireValue11(rest, token));
23208
+ description = decodeEscapedNewlines(requireValue12(rest, token));
22378
23209
  break;
22379
23210
  case "--team-id":
22380
- teamId = requireValue11(rest, token);
23211
+ teamId = requireValue12(rest, token);
22381
23212
  break;
22382
23213
  case "--team-key":
22383
- teamKey = requireValue11(rest, token);
23214
+ teamKey = requireValue12(rest, token);
22384
23215
  break;
22385
23216
  case "--priority":
22386
- priority = parseLinearPriority(requireValue11(rest, token));
23217
+ priority = parseLinearPriority(requireValue12(rest, token));
22387
23218
  break;
22388
23219
  case "--parent-id":
22389
- parentId = requireValue11(rest, token);
23220
+ parentId = requireValue12(rest, token);
22390
23221
  break;
22391
23222
  case "--state-id":
22392
- stateId = requireValue11(rest, token);
23223
+ stateId = requireValue12(rest, token);
22393
23224
  break;
22394
23225
  case "--cwd":
22395
- cwd = requireValue11(rest, token);
23226
+ cwd = requireValue12(rest, token);
22396
23227
  break;
22397
23228
  default:
22398
23229
  throw new Error(`Unknown linear option: ${token}`);
@@ -22427,10 +23258,10 @@ function parseLinearWhoamiArgs(tokens) {
22427
23258
  const token = rest.shift();
22428
23259
  switch (token) {
22429
23260
  case "--account":
22430
- account = requireValue11(rest, token);
23261
+ account = requireValue12(rest, token);
22431
23262
  break;
22432
23263
  case "--cwd":
22433
- cwd = requireValue11(rest, token);
23264
+ cwd = requireValue12(rest, token);
22434
23265
  break;
22435
23266
  default:
22436
23267
  throw new Error(`Unknown linear option: ${token}`);
@@ -22455,10 +23286,10 @@ function parseLinearViewArgs(tokens) {
22455
23286
  const token = rest.shift();
22456
23287
  switch (token) {
22457
23288
  case "--account":
22458
- account = requireValue11(rest, token);
23289
+ account = requireValue12(rest, token);
22459
23290
  break;
22460
23291
  case "--cwd":
22461
- cwd = requireValue11(rest, token);
23292
+ cwd = requireValue12(rest, token);
22462
23293
  break;
22463
23294
  default:
22464
23295
  throw new Error(`Unknown linear option: ${token}`);
@@ -22493,32 +23324,32 @@ function parseLinearUpdateArgs(tokens) {
22493
23324
  const token = rest.shift();
22494
23325
  switch (token) {
22495
23326
  case "--account":
22496
- account = requireValue11(rest, token);
23327
+ account = requireValue12(rest, token);
22497
23328
  break;
22498
23329
  case "--title":
22499
- title = requireValue11(rest, token);
23330
+ title = requireValue12(rest, token);
22500
23331
  break;
22501
23332
  case "--desc":
22502
23333
  case "--description":
22503
- description = decodeEscapedNewlines(requireValue11(rest, token));
23334
+ description = decodeEscapedNewlines(requireValue12(rest, token));
22504
23335
  break;
22505
23336
  case "--team-id":
22506
- teamId = requireValue11(rest, token);
23337
+ teamId = requireValue12(rest, token);
22507
23338
  break;
22508
23339
  case "--team-key":
22509
- teamKey = requireValue11(rest, token);
23340
+ teamKey = requireValue12(rest, token);
22510
23341
  break;
22511
23342
  case "--priority":
22512
- priority = parseLinearPriority(requireValue11(rest, token));
23343
+ priority = parseLinearPriority(requireValue12(rest, token));
22513
23344
  break;
22514
23345
  case "--parent-id":
22515
- parentId = requireValue11(rest, token);
23346
+ parentId = requireValue12(rest, token);
22516
23347
  break;
22517
23348
  case "--state-id":
22518
- stateId = requireValue11(rest, token);
23349
+ stateId = requireValue12(rest, token);
22519
23350
  break;
22520
23351
  case "--cwd":
22521
- cwd = requireValue11(rest, token);
23352
+ cwd = requireValue12(rest, token);
22522
23353
  break;
22523
23354
  default:
22524
23355
  throw new Error(`Unknown linear option: ${token}`);
@@ -22556,10 +23387,10 @@ function parseLinearSubIssuesArgs(tokens) {
22556
23387
  const token = rest.shift();
22557
23388
  switch (token) {
22558
23389
  case "--account":
22559
- account = requireValue11(rest, token);
23390
+ account = requireValue12(rest, token);
22560
23391
  break;
22561
23392
  case "--cwd":
22562
- cwd = requireValue11(rest, token);
23393
+ cwd = requireValue12(rest, token);
22563
23394
  break;
22564
23395
  default:
22565
23396
  throw new Error(`Unknown linear option: ${token}`);
@@ -22586,15 +23417,15 @@ function parseLinearCommentArgs(tokens) {
22586
23417
  const token = rest.shift();
22587
23418
  switch (token) {
22588
23419
  case "--account":
22589
- account = requireValue11(rest, token);
23420
+ account = requireValue12(rest, token);
22590
23421
  break;
22591
23422
  case "--body":
22592
23423
  case "--desc":
22593
23424
  case "--description":
22594
- body = decodeEscapedNewlines(requireValue11(rest, token));
23425
+ body = decodeEscapedNewlines(requireValue12(rest, token));
22595
23426
  break;
22596
23427
  case "--cwd":
22597
- cwd = requireValue11(rest, token);
23428
+ cwd = requireValue12(rest, token);
22598
23429
  break;
22599
23430
  default:
22600
23431
  throw new Error(`Unknown linear option: ${token}`);
@@ -22624,10 +23455,10 @@ function parseLinearCommentsArgs(tokens) {
22624
23455
  const token = rest.shift();
22625
23456
  switch (token) {
22626
23457
  case "--account":
22627
- account = requireValue11(rest, token);
23458
+ account = requireValue12(rest, token);
22628
23459
  break;
22629
23460
  case "--cwd":
22630
- cwd = requireValue11(rest, token);
23461
+ cwd = requireValue12(rest, token);
22631
23462
  break;
22632
23463
  default:
22633
23464
  throw new Error(`Unknown linear option: ${token}`);
@@ -22651,16 +23482,16 @@ function parseLinearCycleArgs(tokens) {
22651
23482
  const token = rest.shift();
22652
23483
  switch (token) {
22653
23484
  case "--account":
22654
- account = requireValue11(rest, token);
23485
+ account = requireValue12(rest, token);
22655
23486
  break;
22656
23487
  case "--team-id":
22657
- teamId = requireValue11(rest, token);
23488
+ teamId = requireValue12(rest, token);
22658
23489
  break;
22659
23490
  case "--team-key":
22660
- teamKey = requireValue11(rest, token);
23491
+ teamKey = requireValue12(rest, token);
22661
23492
  break;
22662
23493
  case "--cwd":
22663
- cwd = requireValue11(rest, token);
23494
+ cwd = requireValue12(rest, token);
22664
23495
  break;
22665
23496
  default:
22666
23497
  throw new Error(`Unknown linear option: ${token}`);
@@ -22683,10 +23514,10 @@ function parseLinearTeamsArgs(tokens) {
22683
23514
  const token = rest.shift();
22684
23515
  switch (token) {
22685
23516
  case "--account":
22686
- account = requireValue11(rest, token);
23517
+ account = requireValue12(rest, token);
22687
23518
  break;
22688
23519
  case "--cwd":
22689
- cwd = requireValue11(rest, token);
23520
+ cwd = requireValue12(rest, token);
22690
23521
  break;
22691
23522
  default:
22692
23523
  throw new Error(`Unknown linear option: ${token}`);
@@ -22713,16 +23544,16 @@ function parseLinearUserIssuesArgs(tokens) {
22713
23544
  const token = rest.shift();
22714
23545
  switch (token) {
22715
23546
  case "--account":
22716
- account = requireValue11(rest, token);
23547
+ account = requireValue12(rest, token);
22717
23548
  break;
22718
23549
  case "--cycle":
22719
- cycle = parseLinearCycle(requireValue11(rest, token));
23550
+ cycle = parseLinearCycle(requireValue12(rest, token));
22720
23551
  break;
22721
23552
  case "--status":
22722
- status = parseLinearStatus(requireValue11(rest, token));
23553
+ status = parseLinearStatus(requireValue12(rest, token));
22723
23554
  break;
22724
23555
  case "--cwd":
22725
- cwd = requireValue11(rest, token);
23556
+ cwd = requireValue12(rest, token);
22726
23557
  break;
22727
23558
  default:
22728
23559
  throw new Error(`Unknown linear option: ${token}`);
@@ -22756,28 +23587,28 @@ function parseLinearIssuesArgs(tokens) {
22756
23587
  const token = rest.shift();
22757
23588
  switch (token) {
22758
23589
  case "--account":
22759
- account = requireValue11(rest, token);
23590
+ account = requireValue12(rest, token);
22760
23591
  break;
22761
23592
  case "--team-id":
22762
- teamId = requireValue11(rest, token);
23593
+ teamId = requireValue12(rest, token);
22763
23594
  break;
22764
23595
  case "--team-key":
22765
- teamKey = requireValue11(rest, token);
23596
+ teamKey = requireValue12(rest, token);
22766
23597
  break;
22767
23598
  case "--user":
22768
- user = requireValue11(rest, token);
23599
+ user = requireValue12(rest, token);
22769
23600
  break;
22770
23601
  case "--cycle":
22771
- cycle = parseLinearCycle(requireValue11(rest, token));
23602
+ cycle = parseLinearCycle(requireValue12(rest, token));
22772
23603
  break;
22773
23604
  case "--status":
22774
- status = parseLinearStatus(requireValue11(rest, token));
23605
+ status = parseLinearStatus(requireValue12(rest, token));
22775
23606
  break;
22776
23607
  case "--query":
22777
- query = requireValue11(rest, token).trim();
23608
+ query = requireValue12(rest, token).trim();
22778
23609
  break;
22779
23610
  case "--limit": {
22780
- const value = Number.parseInt(requireValue11(rest, token), 10);
23611
+ const value = Number.parseInt(requireValue12(rest, token), 10);
22781
23612
  if (!Number.isInteger(value) || value < 1 || value > 250) {
22782
23613
  throw new Error("Invalid --limit. Expected an integer between 1 and 250.");
22783
23614
  }
@@ -22785,7 +23616,7 @@ function parseLinearIssuesArgs(tokens) {
22785
23616
  break;
22786
23617
  }
22787
23618
  case "--cwd":
22788
- cwd = requireValue11(rest, token);
23619
+ cwd = requireValue12(rest, token);
22789
23620
  break;
22790
23621
  default:
22791
23622
  throw new Error(`Unknown linear option: ${token}`);
@@ -22826,10 +23657,10 @@ function parseLinearLegacyArgs(tokens) {
22826
23657
  useScreenshot = true;
22827
23658
  break;
22828
23659
  case "--account":
22829
- account = requireValue11(rest, token);
23660
+ account = requireValue12(rest, token);
22830
23661
  break;
22831
23662
  case "--cwd":
22832
- cwd = requireValue11(rest, token);
23663
+ cwd = requireValue12(rest, token);
22833
23664
  break;
22834
23665
  default:
22835
23666
  throw new Error(`Unknown linear option: ${token}`);
@@ -22923,19 +23754,19 @@ function parseNotionArgs(tokens) {
22923
23754
  const token = rest.shift();
22924
23755
  switch (token) {
22925
23756
  case "--parent":
22926
- parentPageId = requireValue11(rest, token);
23757
+ parentPageId = requireValue12(rest, token);
22927
23758
  break;
22928
23759
  case "--title":
22929
- title = requireValue11(rest, token);
23760
+ title = requireValue12(rest, token);
22930
23761
  break;
22931
23762
  case "--private":
22932
23763
  isPrivate = true;
22933
23764
  break;
22934
23765
  case "--content":
22935
- content2 = requireValue11(rest, token);
23766
+ content2 = requireValue12(rest, token);
22936
23767
  break;
22937
23768
  case "--file":
22938
- filePath2 = requireValue11(rest, token);
23769
+ filePath2 = requireValue12(rest, token);
22939
23770
  break;
22940
23771
  default:
22941
23772
  throw new Error(`Unknown notion option: ${token}`);
@@ -22979,10 +23810,10 @@ function parseNotionArgs(tokens) {
22979
23810
  const token = rest.shift();
22980
23811
  switch (token) {
22981
23812
  case "--content":
22982
- content = requireValue11(rest, token);
23813
+ content = requireValue12(rest, token);
22983
23814
  break;
22984
23815
  case "--file":
22985
- filePath = requireValue11(rest, token);
23816
+ filePath = requireValue12(rest, token);
22986
23817
  break;
22987
23818
  case "--append":
22988
23819
  append = true;
@@ -23027,11 +23858,11 @@ function parseRandomArgs(tokens) {
23027
23858
  mode = "easy";
23028
23859
  break;
23029
23860
  case "--length":
23030
- length = parsePositiveInt(requireValue11(rest, token), token);
23861
+ length = parsePositiveInt(requireValue12(rest, token), token);
23031
23862
  seenLength = true;
23032
23863
  break;
23033
23864
  case "--charset": {
23034
- const value = requireValue11(rest, token);
23865
+ const value = requireValue12(rest, token);
23035
23866
  if (!["base64url", "hex", "alnum", "ascii"].includes(value)) {
23036
23867
  throw new Error(
23037
23868
  `Invalid --charset value: ${value}. Use base64url|hex|alnum|ascii.`
@@ -23042,18 +23873,18 @@ function parseRandomArgs(tokens) {
23042
23873
  break;
23043
23874
  }
23044
23875
  case "--count":
23045
- count = parsePositiveInt(requireValue11(rest, token), token);
23876
+ count = parsePositiveInt(requireValue12(rest, token), token);
23046
23877
  break;
23047
23878
  case "--words":
23048
- words = parsePositiveInt(requireValue11(rest, token), token);
23879
+ words = parsePositiveInt(requireValue12(rest, token), token);
23049
23880
  seenWords = true;
23050
23881
  break;
23051
23882
  case "--digits":
23052
- digits = parseNonNegativeInt(requireValue11(rest, token), token);
23883
+ digits = parseNonNegativeInt(requireValue12(rest, token), token);
23053
23884
  seenDigits = true;
23054
23885
  break;
23055
23886
  case "--separator":
23056
- separator = requireValue11(rest, token);
23887
+ separator = requireValue12(rest, token);
23057
23888
  seenSeparator = true;
23058
23889
  break;
23059
23890
  default:
@@ -23084,7 +23915,7 @@ function parseRandomArgs(tokens) {
23084
23915
  count
23085
23916
  };
23086
23917
  }
23087
- function requireValue11(tokens, optionName) {
23918
+ function requireValue12(tokens, optionName) {
23088
23919
  const value = tokens.shift();
23089
23920
  if (!value) {
23090
23921
  throw new Error(`Missing value for ${optionName}`);
@@ -23245,6 +24076,11 @@ async function main() {
23245
24076
  await handler.handle(commandArgs);
23246
24077
  return;
23247
24078
  }
24079
+ case "org" /* Org */: {
24080
+ const handler = new OrgCommandHandler();
24081
+ await handler.handle(commandArgs);
24082
+ return;
24083
+ }
23248
24084
  case "store" /* Store */: {
23249
24085
  const handler = new StoreCommandHandler();
23250
24086
  await handler.handle(commandArgs);