farseer-cli 1.0.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 (120) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +741 -0
  3. package/dist/commands/app.d.ts +2 -0
  4. package/dist/commands/app.js +349 -0
  5. package/dist/commands/app.js.map +7 -0
  6. package/dist/commands/apps.d.ts +2 -0
  7. package/dist/commands/apps.js +111 -0
  8. package/dist/commands/apps.js.map +7 -0
  9. package/dist/commands/checkout.d.ts +2 -0
  10. package/dist/commands/checkout.js +166 -0
  11. package/dist/commands/checkout.js.map +7 -0
  12. package/dist/commands/config.d.ts +2 -0
  13. package/dist/commands/config.js +139 -0
  14. package/dist/commands/config.js.map +7 -0
  15. package/dist/commands/diff.d.ts +2 -0
  16. package/dist/commands/diff.js +183 -0
  17. package/dist/commands/diff.js.map +7 -0
  18. package/dist/commands/files.js +99 -0
  19. package/dist/commands/files.js.map +7 -0
  20. package/dist/commands/install.d.ts +2 -0
  21. package/dist/commands/install.js +79 -0
  22. package/dist/commands/install.js.map +7 -0
  23. package/dist/commands/list.d.ts +2 -0
  24. package/dist/commands/list.js +92 -0
  25. package/dist/commands/list.js.map +7 -0
  26. package/dist/commands/login.d.ts +2 -0
  27. package/dist/commands/login.js +134 -0
  28. package/dist/commands/login.js.map +7 -0
  29. package/dist/commands/logout.d.ts +2 -0
  30. package/dist/commands/logout.js +59 -0
  31. package/dist/commands/logout.js.map +7 -0
  32. package/dist/commands/mcp-server.d.ts +8 -0
  33. package/dist/commands/mcp-server.js +41 -0
  34. package/dist/commands/mcp-server.js.map +7 -0
  35. package/dist/commands/model.d.ts +2 -0
  36. package/dist/commands/model.js +189 -0
  37. package/dist/commands/model.js.map +7 -0
  38. package/dist/commands/pull.d.ts +2 -0
  39. package/dist/commands/pull.js +287 -0
  40. package/dist/commands/pull.js.map +7 -0
  41. package/dist/commands/push.d.ts +2 -0
  42. package/dist/commands/push.js +251 -0
  43. package/dist/commands/push.js.map +7 -0
  44. package/dist/commands/run.d.ts +2 -0
  45. package/dist/commands/run.js +246 -0
  46. package/dist/commands/run.js.map +7 -0
  47. package/dist/commands/setup.d.ts +2 -0
  48. package/dist/commands/setup.js +137 -0
  49. package/dist/commands/status.d.ts +2 -0
  50. package/dist/commands/status.js +145 -0
  51. package/dist/commands/status.js.map +7 -0
  52. package/dist/commands/unsetup.d.ts +2 -0
  53. package/dist/commands/unsetup.js +122 -0
  54. package/dist/commands/whoami.d.ts +2 -0
  55. package/dist/commands/whoami.js +63 -0
  56. package/dist/commands/whoami.js.map +7 -0
  57. package/dist/index.d.ts +2 -0
  58. package/dist/index.js +135 -0
  59. package/dist/index.js.map +7 -0
  60. package/dist/mcp/index.d.ts +7 -0
  61. package/dist/mcp/index.js +35 -0
  62. package/dist/mcp/index.js.map +7 -0
  63. package/dist/mcp/prompts/workflows.d.ts +7 -0
  64. package/dist/mcp/prompts/workflows.js +374 -0
  65. package/dist/mcp/prompts/workflows.js.map +7 -0
  66. package/dist/mcp/resources/documentation.d.ts +8 -0
  67. package/dist/mcp/resources/documentation.js +167 -0
  68. package/dist/mcp/resources/documentation.js.map +7 -0
  69. package/dist/mcp/server.d.ts +7 -0
  70. package/dist/mcp/server.js +49 -0
  71. package/dist/mcp/server.js.map +7 -0
  72. package/dist/mcp/tools/appTools.d.ts +7 -0
  73. package/dist/mcp/tools/appTools.js +377 -0
  74. package/dist/mcp/tools/appTools.js.map +7 -0
  75. package/dist/mcp/tools/authTools.d.ts +7 -0
  76. package/dist/mcp/tools/authTools.js +158 -0
  77. package/dist/mcp/tools/authTools.js.map +7 -0
  78. package/dist/mcp/tools/modelTools.d.ts +7 -0
  79. package/dist/mcp/tools/modelTools.js +331 -0
  80. package/dist/mcp/tools/modelTools.js.map +7 -0
  81. package/dist/mcp/tools/runTools.d.ts +7 -0
  82. package/dist/mcp/tools/runTools.js +231 -0
  83. package/dist/mcp/tools/runTools.js.map +7 -0
  84. package/dist/mcp/tools/syncTools.d.ts +7 -0
  85. package/dist/mcp/tools/syncTools.js +382 -0
  86. package/dist/mcp/tools/syncTools.js.map +7 -0
  87. package/dist/mcp/utils/helpers.d.ts +69 -0
  88. package/dist/mcp/utils/helpers.js +113 -0
  89. package/dist/mcp/utils/helpers.js.map +7 -0
  90. package/dist/services/appSyncService.d.ts +75 -0
  91. package/dist/services/appSyncService.js +370 -0
  92. package/dist/services/appSyncService.js.map +7 -0
  93. package/dist/services/configService.d.ts +39 -0
  94. package/dist/services/configService.js +196 -0
  95. package/dist/services/configService.js.map +7 -0
  96. package/dist/services/farseerApi.d.ts +166 -0
  97. package/dist/services/farseerApi.js +378 -0
  98. package/dist/services/farseerApi.js.map +7 -0
  99. package/dist/services/farseerFactory.d.ts +88 -0
  100. package/dist/services/farseerFactory.js +179 -0
  101. package/dist/services/farseerFactory.js.map +7 -0
  102. package/dist/services/farseerService.d.ts +96 -0
  103. package/dist/services/farseerService.js +614 -0
  104. package/dist/services/farseerService.js.map +7 -0
  105. package/dist/services/gitService.d.ts +31 -0
  106. package/dist/services/gitService.js +134 -0
  107. package/dist/services/gitService.js.map +7 -0
  108. package/dist/services/syncService.d.ts +44 -0
  109. package/dist/services/syncService.js +320 -0
  110. package/dist/services/syncService.js.map +7 -0
  111. package/dist/utils/constants.d.ts +7 -0
  112. package/dist/utils/constants.js +46 -0
  113. package/dist/utils/constants.js.map +7 -0
  114. package/dist/utils/helpers.d.ts +69 -0
  115. package/dist/utils/helpers.js +413 -0
  116. package/dist/utils/helpers.js.map +7 -0
  117. package/dist/utils/logger.d.ts +14 -0
  118. package/dist/utils/logger.js +76 -0
  119. package/dist/utils/logger.js.map +7 -0
  120. package/package.json +62 -0
@@ -0,0 +1,99 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var files_exports = {};
19
+ __export(files_exports, {
20
+ registerFilesCommand: () => registerFilesCommand
21
+ });
22
+ module.exports = __toCommonJS(files_exports);
23
+ var import_logger = require("../utils/logger");
24
+ var import_farseerFactory = require("../services/farseerFactory");
25
+ var import_helpers = require("../utils/helpers");
26
+ function registerFilesCommand(program) {
27
+ const filesCmd = program.command("files").description("Manage files on a Farseer instance").addHelpText("after", `
28
+ Commands:
29
+ list [tenant] List all files on remote
30
+
31
+ Examples:
32
+ $ farseer files list # List script files
33
+ $ farseer files list --all # List all files
34
+ $ farseer files list mycompany # List files on specific tenant
35
+ `);
36
+ filesCmd.command("list [arg1] [arg2]").description("List all files on a Farseer instance\n\nUsage: list <org> <tenant> OR list <tenant> (if org is known)").option("--all", "List all files (default: only scripts .ts, .js)").action(async (arg1, arg2, options) => {
37
+ const { organisation, tenant } = (0, import_helpers.resolveTenantWithOrgMapping)(arg1, arg2);
38
+ const result = await (0, import_farseerFactory.getFarseerClientWithFallback)(organisation, tenant);
39
+ if (!result) {
40
+ (0, import_farseerFactory.showLoginPrompt)(tenant);
41
+ process.exit(1);
42
+ }
43
+ const authLabel = result.authType === "apiKey" ? "API key" : "browser login";
44
+ import_logger.logger.info(`Fetching files from ${tenant} (using ${authLabel})...`);
45
+ let files;
46
+ try {
47
+ files = await result.client.listFiles();
48
+ } catch (error) {
49
+ if ((0, import_farseerFactory.isAuthError)(error)) {
50
+ (0, import_farseerFactory.showLoginPrompt)(tenant);
51
+ } else {
52
+ import_logger.logger.error("Failed to list files.");
53
+ if (error instanceof Error) {
54
+ import_logger.logger.dim(error.message);
55
+ }
56
+ }
57
+ process.exit(1);
58
+ }
59
+ if (!options.all) {
60
+ files = files.filter(
61
+ (f) => import_farseerFactory.DEFAULT_SCRIPT_EXTENSIONS.some((ext) => f.name.toLowerCase().endsWith(ext))
62
+ );
63
+ }
64
+ if (files.length === 0) {
65
+ import_logger.logger.warning("No files found in Files/");
66
+ import_logger.logger.dim(options.all ? "The folder might be empty or does not exist." : "No script files (.ts, .js) found. Use --all to see all files.");
67
+ return;
68
+ }
69
+ import_logger.logger.header(`Files on ${tenant} (Files/)`);
70
+ const grouped = {};
71
+ for (const file of files) {
72
+ const parts = file.path.split("/");
73
+ const fileName = parts.pop();
74
+ const dir = parts.length > 0 ? parts.join("/") + "/" : "";
75
+ if (!grouped[dir]) {
76
+ grouped[dir] = [];
77
+ }
78
+ grouped[dir].push(fileName);
79
+ }
80
+ const dirs = Object.keys(grouped).sort();
81
+ for (const dir of dirs) {
82
+ if (dir) {
83
+ console.log(` ${dir}`);
84
+ }
85
+ const dirFiles = grouped[dir].sort();
86
+ for (const file of dirFiles) {
87
+ const prefix = dir ? " " : " ";
88
+ console.log(`${prefix}${file}`);
89
+ }
90
+ }
91
+ console.log();
92
+ import_logger.logger.dim(`Total: ${files.length} file(s)`);
93
+ });
94
+ }
95
+ // Annotate the CommonJS export names for ESM import in node:
96
+ 0 && (module.exports = {
97
+ registerFilesCommand
98
+ });
99
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/files.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport { getFarseerClientWithFallback, showLoginPrompt, isAuthError, DEFAULT_SCRIPT_EXTENSIONS } from '../services/farseerFactory';\nimport { resolveTenantWithOrgMapping } from '../utils/helpers';\n\nexport function registerFilesCommand(program: Command): void {\n const filesCmd = program\n .command('files')\n .description('Manage files on a Farseer instance')\n .addHelpText('after', `\nCommands:\n list [tenant] List all files on remote\n\nExamples:\n $ farseer files list # List script files\n $ farseer files list --all # List all files\n $ farseer files list mycompany # List files on specific tenant\n`);\n\n // List files\n filesCmd\n .command('list [arg1] [arg2]')\n .description('List all files on a Farseer instance\\n\\nUsage: list <org> <tenant> OR list <tenant> (if org is known)')\n .option('--all', 'List all files (default: only scripts .ts, .js)')\n .action(async (arg1, arg2, options) => {\n const { organisation, tenant } = resolveTenantWithOrgMapping(arg1, arg2);\n const result = await getFarseerClientWithFallback(organisation, tenant);\n\n if (!result) {\n showLoginPrompt(tenant);\n process.exit(1);\n }\n\n const authLabel = result.authType === 'apiKey' ? 'API key' : 'browser login';\n logger.info(`Fetching files from ${tenant} (using ${authLabel})...`);\n\n let files;\n try {\n files = await result.client.listFiles();\n } catch (error) {\n if (isAuthError(error)) {\n showLoginPrompt(tenant);\n } else {\n logger.error('Failed to list files.');\n if (error instanceof Error) {\n logger.dim(error.message);\n }\n }\n process.exit(1);\n }\n\n // Filter to scripts only unless --all is specified\n if (!options.all) {\n files = files.filter(f =>\n DEFAULT_SCRIPT_EXTENSIONS.some(ext => f.name.toLowerCase().endsWith(ext))\n );\n }\n\n if (files.length === 0) {\n logger.warning('No files found in Files/');\n logger.dim(options.all ? 'The folder might be empty or does not exist.' : 'No script files (.ts, .js) found. Use --all to see all files.');\n return;\n }\n\n logger.header(`Files on ${tenant} (Files/)`);\n\n // Group by directory\n const grouped: Record<string, string[]> = {};\n\n for (const file of files) {\n const parts = file.path.split('/');\n const fileName = parts.pop()!;\n const dir = parts.length > 0 ? parts.join('/') + '/' : '';\n\n if (!grouped[dir]) {\n grouped[dir] = [];\n }\n grouped[dir].push(fileName);\n }\n\n // Sort directories\n const dirs = Object.keys(grouped).sort();\n\n for (const dir of dirs) {\n if (dir) {\n console.log(` ${dir}`);\n }\n\n const dirFiles = grouped[dir].sort();\n for (const file of dirFiles) {\n const prefix = dir ? ' ' : ' ';\n console.log(`${prefix}${file}`);\n }\n }\n\n console.log();\n logger.dim(`Total: ${files.length} file(s)`);\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AACvB,4BAAsG;AACtG,qBAA4C;AAErC,SAAS,qBAAqB,SAAwB;AACzD,QAAM,WAAW,QACZ,QAAQ,OAAO,EACf,YAAY,oCAAoC,EAChD,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAQ7B;AAGG,WACK,QAAQ,oBAAoB,EAC5B,YAAY,uGAAuG,EACnH,OAAO,SAAS,iDAAiD,EACjE,OAAO,OAAO,MAAM,MAAM,YAAY;AACnC,UAAM,EAAE,cAAc,OAAO,QAAI,4CAA4B,MAAM,IAAI;AACvE,UAAM,SAAS,UAAM,oDAA6B,cAAc,MAAM;AAEtE,QAAI,CAAC,QAAQ;AACT,iDAAgB,MAAM;AACtB,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,YAAY,OAAO,aAAa,WAAW,YAAY;AAC7D,yBAAO,KAAK,uBAAuB,MAAM,WAAW,SAAS,MAAM;AAEnE,QAAI;AACJ,QAAI;AACA,cAAQ,MAAM,OAAO,OAAO,UAAU;AAAA,IAC1C,SAAS,OAAO;AACZ,cAAI,mCAAY,KAAK,GAAG;AACpB,mDAAgB,MAAM;AAAA,MAC1B,OAAO;AACH,6BAAO,MAAM,uBAAuB;AACpC,YAAI,iBAAiB,OAAO;AACxB,+BAAO,IAAI,MAAM,OAAO;AAAA,QAC5B;AAAA,MACJ;AACA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,QAAI,CAAC,QAAQ,KAAK;AACd,cAAQ,MAAM;AAAA,QAAO,OACjB,gDAA0B,KAAK,SAAO,EAAE,KAAK,YAAY,EAAE,SAAS,GAAG,CAAC;AAAA,MAC5E;AAAA,IACJ;AAEA,QAAI,MAAM,WAAW,GAAG;AACpB,2BAAO,QAAQ,0BAA0B;AACzC,2BAAO,IAAI,QAAQ,MAAM,iDAAiD,+DAA+D;AACzI;AAAA,IACJ;AAEA,yBAAO,OAAO,YAAY,MAAM,WAAW;AAG3C,UAAM,UAAoC,CAAC;AAE3C,eAAW,QAAQ,OAAO;AACtB,YAAM,QAAQ,KAAK,KAAK,MAAM,GAAG;AACjC,YAAM,WAAW,MAAM,IAAI;AAC3B,YAAM,MAAM,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM;AAEvD,UAAI,CAAC,QAAQ,GAAG,GAAG;AACf,gBAAQ,GAAG,IAAI,CAAC;AAAA,MACpB;AACA,cAAQ,GAAG,EAAE,KAAK,QAAQ;AAAA,IAC9B;AAGA,UAAM,OAAO,OAAO,KAAK,OAAO,EAAE,KAAK;AAEvC,eAAW,OAAO,MAAM;AACpB,UAAI,KAAK;AACL,gBAAQ,IAAI,KAAK,GAAG,EAAE;AAAA,MAC1B;AAEA,YAAM,WAAW,QAAQ,GAAG,EAAE,KAAK;AACnC,iBAAW,QAAQ,UAAU;AACzB,cAAM,SAAS,MAAM,SAAS;AAC9B,gBAAQ,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE;AAAA,MAClC;AAAA,IACJ;AAEA,YAAQ,IAAI;AACZ,yBAAO,IAAI,UAAU,MAAM,MAAM,UAAU;AAAA,EAC/C,CAAC;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInstallCommand(program: Command): void;
@@ -0,0 +1,79 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var install_exports = {};
29
+ __export(install_exports, {
30
+ registerInstallCommand: () => registerInstallCommand
31
+ });
32
+ module.exports = __toCommonJS(install_exports);
33
+ var import_logger = require("../utils/logger");
34
+ var import_helpers = require("../utils/helpers");
35
+ var fs = __toESM(require("fs"));
36
+ var import_child_process = require("child_process");
37
+ function registerInstallCommand(program) {
38
+ program.command("install [tenant]").description("Install npm dependencies for a tenant (runs npm install)").action(async (tenantArg) => {
39
+ const tenant = (0, import_helpers.resolveTenantOrExit)(tenantArg);
40
+ const tenantDir = (0, import_helpers.getTenantDir)(tenant);
41
+ if (!fs.existsSync(tenantDir)) {
42
+ import_logger.logger.error(`Tenant folder not found: apps/${tenant}/`);
43
+ import_logger.logger.dim('Run "farseer pull <tenant>" first to initialize the folder.');
44
+ process.exit(1);
45
+ }
46
+ const packageJsonPath = `${tenantDir}/package.json`;
47
+ if (!fs.existsSync(packageJsonPath)) {
48
+ import_logger.logger.error(`No package.json found in apps/${tenant}/`);
49
+ import_logger.logger.dim('Create a package.json first or run "npm init" in that folder.');
50
+ process.exit(1);
51
+ }
52
+ import_logger.logger.info(`Installing dependencies for ${tenant}...`);
53
+ import_logger.logger.dim(`Running: npm install in apps/${tenant}/`);
54
+ console.log();
55
+ const child = (0, import_child_process.spawn)("npm", ["install"], {
56
+ stdio: "inherit",
57
+ cwd: tenantDir,
58
+ shell: true
59
+ });
60
+ child.on("close", (code) => {
61
+ if (code === 0) {
62
+ console.log();
63
+ import_logger.logger.success("Dependencies installed successfully!");
64
+ } else {
65
+ import_logger.logger.error(`npm install exited with code ${code}`);
66
+ process.exit(code || 1);
67
+ }
68
+ });
69
+ child.on("error", (err) => {
70
+ import_logger.logger.error(`Failed to run npm install: ${err.message}`);
71
+ process.exit(1);
72
+ });
73
+ });
74
+ }
75
+ // Annotate the CommonJS export names for ESM import in node:
76
+ 0 && (module.exports = {
77
+ registerInstallCommand
78
+ });
79
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/install.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport { getTenantDir, resolveTenantOrExit } from '../utils/helpers';\nimport * as fs from 'fs';\nimport { spawn } from 'child_process';\n\nexport function registerInstallCommand(program: Command): void {\n program\n .command('install [tenant]')\n .description('Install npm dependencies for a tenant (runs npm install)')\n .action(async (tenantArg) => {\n const tenant = resolveTenantOrExit(tenantArg);\n const tenantDir = getTenantDir(tenant);\n\n if (!fs.existsSync(tenantDir)) {\n logger.error(`Tenant folder not found: apps/${tenant}/`);\n logger.dim('Run \"farseer pull <tenant>\" first to initialize the folder.');\n process.exit(1);\n }\n\n const packageJsonPath = `${tenantDir}/package.json`;\n\n if (!fs.existsSync(packageJsonPath)) {\n logger.error(`No package.json found in apps/${tenant}/`);\n logger.dim('Create a package.json first or run \"npm init\" in that folder.');\n process.exit(1);\n }\n\n logger.info(`Installing dependencies for ${tenant}...`);\n logger.dim(`Running: npm install in apps/${tenant}/`);\n console.log();\n\n const child = spawn('npm', ['install'], {\n stdio: 'inherit',\n cwd: tenantDir,\n shell: true,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n console.log();\n logger.success('Dependencies installed successfully!');\n } else {\n logger.error(`npm install exited with code ${code}`);\n process.exit(code || 1);\n }\n });\n\n child.on('error', (err) => {\n logger.error(`Failed to run npm install: ${err.message}`);\n process.exit(1);\n });\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AACvB,qBAAkD;AAClD,SAAoB;AACpB,2BAAsB;AAEf,SAAS,uBAAuB,SAAwB;AAC3D,UACK,QAAQ,kBAAkB,EAC1B,YAAY,0DAA0D,EACtE,OAAO,OAAO,cAAc;AACzB,UAAM,aAAS,oCAAoB,SAAS;AAC5C,UAAM,gBAAY,6BAAa,MAAM;AAErC,QAAI,CAAC,GAAG,WAAW,SAAS,GAAG;AAC3B,2BAAO,MAAM,iCAAiC,MAAM,GAAG;AACvD,2BAAO,IAAI,6DAA6D;AACxE,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,kBAAkB,GAAG,SAAS;AAEpC,QAAI,CAAC,GAAG,WAAW,eAAe,GAAG;AACjC,2BAAO,MAAM,iCAAiC,MAAM,GAAG;AACvD,2BAAO,IAAI,+DAA+D;AAC1E,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,yBAAO,KAAK,+BAA+B,MAAM,KAAK;AACtD,yBAAO,IAAI,gCAAgC,MAAM,GAAG;AACpD,YAAQ,IAAI;AAEZ,UAAM,YAAQ,4BAAM,OAAO,CAAC,SAAS,GAAG;AAAA,MACpC,OAAO;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,IACX,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AACxB,UAAI,SAAS,GAAG;AACZ,gBAAQ,IAAI;AACZ,6BAAO,QAAQ,sCAAsC;AAAA,MACzD,OAAO;AACH,6BAAO,MAAM,gCAAgC,IAAI,EAAE;AACnD,gBAAQ,KAAK,QAAQ,CAAC;AAAA,MAC1B;AAAA,IACJ,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,QAAQ;AACvB,2BAAO,MAAM,8BAA8B,IAAI,OAAO,EAAE;AACxD,cAAQ,KAAK,CAAC;AAAA,IAClB,CAAC;AAAA,EACL,CAAC;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerListCommand(program: Command): void;
@@ -0,0 +1,92 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var list_exports = {};
19
+ __export(list_exports, {
20
+ registerListCommand: () => registerListCommand
21
+ });
22
+ module.exports = __toCommonJS(list_exports);
23
+ var import_logger = require("../utils/logger");
24
+ var import_farseerFactory = require("../services/farseerFactory");
25
+ var import_helpers = require("../utils/helpers");
26
+ function registerListCommand(program) {
27
+ program.command("list [arg1] [arg2]").description('[DEPRECATED] Use "farseer files list" instead').option("--all", "List all files (default: only scripts .ts, .js)").action(async (arg1, arg2, options) => {
28
+ import_logger.logger.warning('Deprecation: "farseer list" is deprecated. Use "farseer files list" instead.');
29
+ console.log();
30
+ const { organisation, tenant } = (0, import_helpers.resolveTenantWithOrgMapping)(arg1, arg2);
31
+ const result = await (0, import_farseerFactory.getFarseerClientWithFallback)(organisation, tenant);
32
+ if (!result) {
33
+ (0, import_farseerFactory.showLoginPrompt)(tenant);
34
+ process.exit(1);
35
+ }
36
+ const authLabel = result.authType === "apiKey" ? "API key" : "browser login";
37
+ import_logger.logger.info(`Fetching files from ${tenant} (using ${authLabel})...`);
38
+ let files;
39
+ try {
40
+ files = await result.client.listFiles();
41
+ } catch (error) {
42
+ if ((0, import_farseerFactory.isAuthError)(error)) {
43
+ (0, import_farseerFactory.showLoginPrompt)(tenant);
44
+ } else {
45
+ import_logger.logger.error("Failed to list files.");
46
+ if (error instanceof Error) {
47
+ import_logger.logger.dim(error.message);
48
+ }
49
+ }
50
+ process.exit(1);
51
+ }
52
+ if (!options.all) {
53
+ files = files.filter(
54
+ (f) => import_farseerFactory.DEFAULT_SCRIPT_EXTENSIONS.some((ext) => f.name.toLowerCase().endsWith(ext))
55
+ );
56
+ }
57
+ if (files.length === 0) {
58
+ import_logger.logger.warning("No files found in Files/");
59
+ import_logger.logger.dim(options.all ? "The folder might be empty or does not exist." : "No script files (.ts, .js) found. Use --all to see all files.");
60
+ return;
61
+ }
62
+ import_logger.logger.header(`Files on ${tenant} (Files/)`);
63
+ const grouped = {};
64
+ for (const file of files) {
65
+ const parts = file.path.split("/");
66
+ const fileName = parts.pop();
67
+ const dir = parts.length > 0 ? parts.join("/") + "/" : "";
68
+ if (!grouped[dir]) {
69
+ grouped[dir] = [];
70
+ }
71
+ grouped[dir].push(fileName);
72
+ }
73
+ const dirs = Object.keys(grouped).sort();
74
+ for (const dir of dirs) {
75
+ if (dir) {
76
+ console.log(` ${dir}`);
77
+ }
78
+ const dirFiles = grouped[dir].sort();
79
+ for (const file of dirFiles) {
80
+ const prefix = dir ? " " : " ";
81
+ console.log(`${prefix}${file}`);
82
+ }
83
+ }
84
+ console.log();
85
+ import_logger.logger.dim(`Total: ${files.length} file(s)`);
86
+ });
87
+ }
88
+ // Annotate the CommonJS export names for ESM import in node:
89
+ 0 && (module.exports = {
90
+ registerListCommand
91
+ });
92
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/list.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport { getFarseerClientWithFallback, showLoginPrompt, isAuthError, DEFAULT_SCRIPT_EXTENSIONS } from '../services/farseerFactory';\nimport { resolveTenantWithOrgMapping } from '../utils/helpers';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list [arg1] [arg2]')\n .description('[DEPRECATED] Use \"farseer files list\" instead')\n .option('--all', 'List all files (default: only scripts .ts, .js)')\n .action(async (arg1, arg2, options) => {\n logger.warning('Deprecation: \"farseer list\" is deprecated. Use \"farseer files list\" instead.');\n console.log();\n const { organisation, tenant } = resolveTenantWithOrgMapping(arg1, arg2);\n const result = await getFarseerClientWithFallback(organisation, tenant);\n\n if (!result) {\n showLoginPrompt(tenant);\n process.exit(1);\n }\n\n const authLabel = result.authType === 'apiKey' ? 'API key' : 'browser login';\n logger.info(`Fetching files from ${tenant} (using ${authLabel})...`);\n\n let files;\n try {\n files = await result.client.listFiles();\n } catch (error) {\n if (isAuthError(error)) {\n showLoginPrompt(tenant);\n } else {\n logger.error('Failed to list files.');\n if (error instanceof Error) {\n logger.dim(error.message);\n }\n }\n process.exit(1);\n }\n\n // Filter to scripts only unless --all is specified\n if (!options.all) {\n files = files.filter(f =>\n DEFAULT_SCRIPT_EXTENSIONS.some(ext => f.name.toLowerCase().endsWith(ext))\n );\n }\n\n if (files.length === 0) {\n logger.warning('No files found in Files/');\n logger.dim(options.all ? 'The folder might be empty or does not exist.' : 'No script files (.ts, .js) found. Use --all to see all files.');\n return;\n }\n\n logger.header(`Files on ${tenant} (Files/)`);\n\n // Group by directory\n const grouped: Record<string, string[]> = {};\n\n for (const file of files) {\n const parts = file.path.split('/');\n const fileName = parts.pop()!;\n const dir = parts.length > 0 ? parts.join('/') + '/' : '';\n\n if (!grouped[dir]) {\n grouped[dir] = [];\n }\n grouped[dir].push(fileName);\n }\n\n // Sort directories\n const dirs = Object.keys(grouped).sort();\n\n for (const dir of dirs) {\n if (dir) {\n console.log(` ${dir}`);\n }\n\n const dirFiles = grouped[dir].sort();\n for (const file of dirFiles) {\n const prefix = dir ? ' ' : ' ';\n console.log(`${prefix}${file}`);\n }\n }\n\n console.log();\n logger.dim(`Total: ${files.length} file(s)`);\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AACvB,4BAAsG;AACtG,qBAA4C;AAErC,SAAS,oBAAoB,SAAwB;AACxD,UACK,QAAQ,oBAAoB,EAC5B,YAAY,+CAA+C,EAC3D,OAAO,SAAS,iDAAiD,EACjE,OAAO,OAAO,MAAM,MAAM,YAAY;AACnC,yBAAO,QAAQ,8EAA8E;AAC7F,YAAQ,IAAI;AACZ,UAAM,EAAE,cAAc,OAAO,QAAI,4CAA4B,MAAM,IAAI;AACvE,UAAM,SAAS,UAAM,oDAA6B,cAAc,MAAM;AAEtE,QAAI,CAAC,QAAQ;AACT,iDAAgB,MAAM;AACtB,cAAQ,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,YAAY,OAAO,aAAa,WAAW,YAAY;AAC7D,yBAAO,KAAK,uBAAuB,MAAM,WAAW,SAAS,MAAM;AAEnE,QAAI;AACJ,QAAI;AACA,cAAQ,MAAM,OAAO,OAAO,UAAU;AAAA,IAC1C,SAAS,OAAO;AACZ,cAAI,mCAAY,KAAK,GAAG;AACpB,mDAAgB,MAAM;AAAA,MAC1B,OAAO;AACH,6BAAO,MAAM,uBAAuB;AACpC,YAAI,iBAAiB,OAAO;AACxB,+BAAO,IAAI,MAAM,OAAO;AAAA,QAC5B;AAAA,MACJ;AACA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAGA,QAAI,CAAC,QAAQ,KAAK;AACd,cAAQ,MAAM;AAAA,QAAO,OACjB,gDAA0B,KAAK,SAAO,EAAE,KAAK,YAAY,EAAE,SAAS,GAAG,CAAC;AAAA,MAC5E;AAAA,IACJ;AAEA,QAAI,MAAM,WAAW,GAAG;AACpB,2BAAO,QAAQ,0BAA0B;AACzC,2BAAO,IAAI,QAAQ,MAAM,iDAAiD,+DAA+D;AACzI;AAAA,IACJ;AAEA,yBAAO,OAAO,YAAY,MAAM,WAAW;AAG3C,UAAM,UAAoC,CAAC;AAE3C,eAAW,QAAQ,OAAO;AACtB,YAAM,QAAQ,KAAK,KAAK,MAAM,GAAG;AACjC,YAAM,WAAW,MAAM,IAAI;AAC3B,YAAM,MAAM,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM;AAEvD,UAAI,CAAC,QAAQ,GAAG,GAAG;AACf,gBAAQ,GAAG,IAAI,CAAC;AAAA,MACpB;AACA,cAAQ,GAAG,EAAE,KAAK,QAAQ;AAAA,IAC9B;AAGA,UAAM,OAAO,OAAO,KAAK,OAAO,EAAE,KAAK;AAEvC,eAAW,OAAO,MAAM;AACpB,UAAI,KAAK;AACL,gBAAQ,IAAI,KAAK,GAAG,EAAE;AAAA,MAC1B;AAEA,YAAM,WAAW,QAAQ,GAAG,EAAE,KAAK;AACnC,iBAAW,QAAQ,UAAU;AACzB,cAAM,SAAS,MAAM,SAAS;AAC9B,gBAAQ,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE;AAAA,MAClC;AAAA,IACJ;AAEA,YAAQ,IAAI;AACZ,yBAAO,IAAI,UAAU,MAAM,MAAM,UAAU;AAAA,EAC/C,CAAC;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLoginCommand(program: Command): void;
@@ -0,0 +1,134 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var login_exports = {};
29
+ __export(login_exports, {
30
+ registerLoginCommand: () => registerLoginCommand
31
+ });
32
+ module.exports = __toCommonJS(login_exports);
33
+ var import_inquirer = __toESM(require("inquirer"));
34
+ var import_logger = require("../utils/logger");
35
+ var import_configService = require("../services/configService");
36
+ var import_farseerService = require("../services/farseerService");
37
+ function registerLoginCommand(program) {
38
+ program.command("login").description("Login to Farseer (opens browser or use --api-key)").option("--api-key", "Login using API key instead of browser").option("--realm <realm>", "Keycloak realm to use (default: master)").action(async (options) => {
39
+ if (options.apiKey) {
40
+ await loginWithApiKey();
41
+ } else {
42
+ await loginViaBrowser(options.realm);
43
+ }
44
+ });
45
+ }
46
+ async function loginViaBrowser(realm) {
47
+ const realmToUse = realm || "master";
48
+ import_logger.logger.header("Farseer Login");
49
+ if (realm) {
50
+ import_logger.logger.info(`Using realm: ${realmToUse}`);
51
+ }
52
+ import_logger.logger.info("Opening browser for login...");
53
+ import_logger.logger.dim("Waiting for authentication (timeout: 5 minutes)...");
54
+ const result = await (0, import_farseerService.loginWithBrowser)(realmToUse);
55
+ if (!result) {
56
+ import_logger.logger.error("Login failed or timed out.");
57
+ import_logger.logger.dim("Try using --api-key for manual API key login.");
58
+ process.exit(1);
59
+ }
60
+ const expiresAt = new Date(Date.now() + result.expiresIn * 1e3);
61
+ (0, import_configService.setUserAuth)({
62
+ accessToken: result.accessToken,
63
+ refreshToken: result.refreshToken,
64
+ expiresAt: expiresAt.toISOString(),
65
+ realm: realmToUse
66
+ });
67
+ import_logger.logger.success("Login successful!");
68
+ import_logger.logger.dim(`Token expires at: ${expiresAt.toLocaleString()}`);
69
+ if (realm) {
70
+ import_logger.logger.dim(`Realm: ${realmToUse}`);
71
+ }
72
+ import_logger.logger.dim("You can now access any tenant you have permissions for.");
73
+ process.exit(0);
74
+ }
75
+ async function loginWithApiKey() {
76
+ import_logger.logger.header("Farseer Login (API Key)");
77
+ const answers = await import_inquirer.default.prompt([
78
+ {
79
+ type: "input",
80
+ name: "tenant",
81
+ message: "Tenant ID (e.g., tthotels):",
82
+ validate: (input) => {
83
+ if (!input || input.trim() === "") {
84
+ return "Tenant ID is required";
85
+ }
86
+ return true;
87
+ }
88
+ },
89
+ {
90
+ type: "input",
91
+ name: "organisation",
92
+ message: "Organisation (leave empty if same as tenant):"
93
+ },
94
+ {
95
+ type: "password",
96
+ name: "apiKey",
97
+ message: "API Key:",
98
+ mask: "*",
99
+ validate: (input) => {
100
+ if (!input || input.trim() === "") {
101
+ return "API Key is required";
102
+ }
103
+ return true;
104
+ }
105
+ }
106
+ ]);
107
+ const tenant = answers.tenant.trim();
108
+ const organisation = answers.organisation.trim() || tenant;
109
+ const apiKey = answers.apiKey.trim();
110
+ const basePath = (0, import_configService.generateBasePath)(organisation);
111
+ import_logger.logger.info("Testing connection...");
112
+ const credential = {
113
+ type: "apiKey",
114
+ tenantId: tenant,
115
+ apiKey,
116
+ basePath
117
+ };
118
+ const service = new import_farseerService.FarseerService(credential);
119
+ const isConnected = await service.testConnection();
120
+ if (!isConnected) {
121
+ import_logger.logger.error("Connection failed. Please check your credentials.");
122
+ import_logger.logger.dim(`Tried to connect to: ${basePath}`);
123
+ process.exit(1);
124
+ }
125
+ (0, import_configService.setCredential)(tenant, credential);
126
+ import_logger.logger.success(`Successfully connected to ${tenant}!`);
127
+ import_logger.logger.dim(`Credentials saved for tenant: ${tenant}`);
128
+ import_logger.logger.dim(`Base path: ${basePath}`);
129
+ }
130
+ // Annotate the CommonJS export names for ESM import in node:
131
+ 0 && (module.exports = {
132
+ registerLoginCommand
133
+ });
134
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/login.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport { logger } from '../utils/logger';\nimport {\n setCredential,\n setUserAuth,\n generateBasePath,\n ApiKeyCredential,\n} from '../services/configService';\nimport { loginWithBrowser, FarseerService } from '../services/farseerService';\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Login to Farseer (opens browser or use --api-key)')\n .option('--api-key', 'Login using API key instead of browser')\n .option('--realm <realm>', 'Keycloak realm to use (default: master)')\n .action(async (options) => {\n if (options.apiKey) {\n await loginWithApiKey();\n } else {\n await loginViaBrowser(options.realm);\n }\n });\n}\n\nasync function loginViaBrowser(realm?: string): Promise<void> {\n const realmToUse = realm || 'master';\n\n logger.header('Farseer Login');\n if (realm) {\n logger.info(`Using realm: ${realmToUse}`);\n }\n logger.info('Opening browser for login...');\n logger.dim('Waiting for authentication (timeout: 5 minutes)...');\n\n const result = await loginWithBrowser(realmToUse);\n\n if (!result) {\n logger.error('Login failed or timed out.');\n logger.dim('Try using --api-key for manual API key login.');\n process.exit(1);\n }\n\n const expiresAt = new Date(Date.now() + result.expiresIn * 1000);\n\n setUserAuth({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresAt: expiresAt.toISOString(),\n realm: realmToUse,\n });\n\n logger.success('Login successful!');\n logger.dim(`Token expires at: ${expiresAt.toLocaleString()}`);\n if (realm) {\n logger.dim(`Realm: ${realmToUse}`);\n }\n logger.dim('You can now access any tenant you have permissions for.');\n process.exit(0);\n}\n\nasync function loginWithApiKey(): Promise<void> {\n logger.header('Farseer Login (API Key)');\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'tenant',\n message: 'Tenant ID (e.g., tthotels):',\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'Tenant ID is required';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'organisation',\n message: 'Organisation (leave empty if same as tenant):',\n },\n {\n type: 'password',\n name: 'apiKey',\n message: 'API Key:',\n mask: '*',\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'API Key is required';\n }\n return true;\n },\n },\n ]);\n\n const tenant = answers.tenant.trim();\n const organisation = answers.organisation.trim() || tenant;\n const apiKey = answers.apiKey.trim();\n const basePath = generateBasePath(organisation);\n\n logger.info('Testing connection...');\n\n const credential: ApiKeyCredential = {\n type: 'apiKey',\n tenantId: tenant,\n apiKey: apiKey,\n basePath: basePath,\n };\n\n const service = new FarseerService(credential);\n const isConnected = await service.testConnection();\n\n if (!isConnected) {\n logger.error('Connection failed. Please check your credentials.');\n logger.dim(`Tried to connect to: ${basePath}`);\n process.exit(1);\n }\n\n setCredential(tenant, credential);\n\n logger.success(`Successfully connected to ${tenant}!`);\n logger.dim(`Credentials saved for tenant: ${tenant}`);\n logger.dim(`Base path: ${basePath}`);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["inquirer"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLogoutCommand(program: Command): void;
@@ -0,0 +1,59 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var logout_exports = {};
19
+ __export(logout_exports, {
20
+ registerLogoutCommand: () => registerLogoutCommand
21
+ });
22
+ module.exports = __toCommonJS(logout_exports);
23
+ var import_logger = require("../utils/logger");
24
+ var import_configService = require("../services/configService");
25
+ function registerLogoutCommand(program) {
26
+ program.command("logout [tenant]").description("Logout from Farseer (remove credentials)").option("--all", "Remove all credentials").action(async (tenant, options) => {
27
+ if (options.all) {
28
+ const credentials = (0, import_configService.listCredentials)();
29
+ const tenants = Object.keys(credentials);
30
+ if (tenants.length === 0) {
31
+ import_logger.logger.info("No credentials stored.");
32
+ return;
33
+ }
34
+ for (const t of tenants) {
35
+ (0, import_configService.removeCredential)(t);
36
+ }
37
+ (0, import_configService.clearUserAuth)();
38
+ import_logger.logger.success(`Removed credentials for ${tenants.length} tenant(s).`);
39
+ return;
40
+ }
41
+ if (tenant) {
42
+ const removed = (0, import_configService.removeCredential)(tenant);
43
+ if (removed) {
44
+ import_logger.logger.success(`Removed credentials for tenant: ${tenant}`);
45
+ } else {
46
+ import_logger.logger.warning(`No credentials found for tenant: ${tenant}`);
47
+ }
48
+ } else {
49
+ (0, import_configService.clearUserAuth)();
50
+ import_logger.logger.success("Logged out (user token cleared).");
51
+ import_logger.logger.dim('API key credentials are still stored. Use "farseer logout <tenant>" to remove specific ones.');
52
+ }
53
+ });
54
+ }
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ registerLogoutCommand
58
+ });
59
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/logout.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport { removeCredential, clearUserAuth, listCredentials } from '../services/configService';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout [tenant]')\n .description('Logout from Farseer (remove credentials)')\n .option('--all', 'Remove all credentials')\n .action(async (tenant, options) => {\n if (options.all) {\n // Remove all credentials\n const credentials = listCredentials();\n const tenants = Object.keys(credentials);\n\n if (tenants.length === 0) {\n logger.info('No credentials stored.');\n return;\n }\n\n for (const t of tenants) {\n removeCredential(t);\n }\n clearUserAuth();\n\n logger.success(`Removed credentials for ${tenants.length} tenant(s).`);\n return;\n }\n\n if (tenant) {\n // Remove specific tenant\n const removed = removeCredential(tenant);\n if (removed) {\n logger.success(`Removed credentials for tenant: ${tenant}`);\n } else {\n logger.warning(`No credentials found for tenant: ${tenant}`);\n }\n } else {\n // Remove user auth token\n clearUserAuth();\n logger.success('Logged out (user token cleared).');\n logger.dim('API key credentials are still stored. Use \"farseer logout <tenant>\" to remove specific ones.');\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAuB;AACvB,2BAAiE;AAE1D,SAAS,sBAAsB,SAAwB;AAC1D,UACK,QAAQ,iBAAiB,EACzB,YAAY,0CAA0C,EACtD,OAAO,SAAS,wBAAwB,EACxC,OAAO,OAAO,QAAQ,YAAY;AAC/B,QAAI,QAAQ,KAAK;AAEb,YAAM,kBAAc,sCAAgB;AACpC,YAAM,UAAU,OAAO,KAAK,WAAW;AAEvC,UAAI,QAAQ,WAAW,GAAG;AACtB,6BAAO,KAAK,wBAAwB;AACpC;AAAA,MACJ;AAEA,iBAAW,KAAK,SAAS;AACrB,mDAAiB,CAAC;AAAA,MACtB;AACA,8CAAc;AAEd,2BAAO,QAAQ,2BAA2B,QAAQ,MAAM,aAAa;AACrE;AAAA,IACJ;AAEA,QAAI,QAAQ;AAER,YAAM,cAAU,uCAAiB,MAAM;AACvC,UAAI,SAAS;AACT,6BAAO,QAAQ,mCAAmC,MAAM,EAAE;AAAA,MAC9D,OAAO;AACH,6BAAO,QAAQ,oCAAoC,MAAM,EAAE;AAAA,MAC/D;AAAA,IACJ,OAAO;AAEH,8CAAc;AACd,2BAAO,QAAQ,kCAAkC;AACjD,2BAAO,IAAI,8FAA8F;AAAA,IAC7G;AAAA,EACJ,CAAC;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * MCP Server Command
3
+ *
4
+ * Starts the Farseer MCP (Model Context Protocol) server for AI assistant integration.
5
+ * This allows Claude, Cursor, and other AI assistants to directly use Farseer functionality.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerMcpServerCommand(program: Command): void;
@@ -0,0 +1,41 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var mcp_server_exports = {};
19
+ __export(mcp_server_exports, {
20
+ registerMcpServerCommand: () => registerMcpServerCommand
21
+ });
22
+ module.exports = __toCommonJS(mcp_server_exports);
23
+ var import_mcp = require("../mcp");
24
+ function registerMcpServerCommand(program) {
25
+ program.command("mcp-server").description("Start MCP server for AI assistant integration (Claude, Cursor, etc.)").action(async () => {
26
+ try {
27
+ await (0, import_mcp.startMcpServer)();
28
+ } catch (error) {
29
+ console.error(
30
+ "Failed to start MCP server:",
31
+ error instanceof Error ? error.message : "Unknown error"
32
+ );
33
+ process.exit(1);
34
+ }
35
+ });
36
+ }
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ registerMcpServerCommand
40
+ });
41
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/mcp-server.ts"],
4
+ "sourcesContent": ["/**\n * MCP Server Command\n *\n * Starts the Farseer MCP (Model Context Protocol) server for AI assistant integration.\n * This allows Claude, Cursor, and other AI assistants to directly use Farseer functionality.\n */\n\nimport { Command } from 'commander';\nimport { startMcpServer } from '../mcp';\n\nexport function registerMcpServerCommand(program: Command): void {\n program\n .command('mcp-server')\n .description('Start MCP server for AI assistant integration (Claude, Cursor, etc.)')\n .action(async () => {\n try {\n await startMcpServer();\n } catch (error) {\n // MCP servers communicate errors via JSON-RPC, not stderr\n // Only log to stderr for unexpected startup failures\n console.error(\n 'Failed to start MCP server:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,iBAA+B;AAExB,SAAS,yBAAyB,SAAwB;AAC7D,UACK,QAAQ,YAAY,EACpB,YAAY,sEAAsE,EAClF,OAAO,YAAY;AAChB,QAAI;AACA,gBAAM,2BAAe;AAAA,IACzB,SAAS,OAAO;AAGZ,cAAQ;AAAA,QACJ;AAAA,QACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC7C;AACA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ,CAAC;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerModelCommand(program: Command): void;