@ankimcp/anki-mcp-server 0.12.1 → 0.13.0-tunnel.1

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 (94) hide show
  1. package/bin/ankimcp.js +10 -1
  2. package/dist/app-config.service.d.ts +21 -0
  3. package/dist/app-config.service.js +76 -0
  4. package/dist/app-config.service.js.map +1 -0
  5. package/dist/app.module.d.ts +4 -2
  6. package/dist/app.module.js +98 -11
  7. package/dist/app.module.js.map +1 -1
  8. package/dist/bootstrap.d.ts +6 -1
  9. package/dist/bootstrap.js +7 -2
  10. package/dist/bootstrap.js.map +1 -1
  11. package/dist/cli/__tests__/cli-output.manual.d.ts +2 -0
  12. package/dist/cli/__tests__/cli-output.manual.js +13 -0
  13. package/dist/cli/__tests__/cli-output.manual.js.map +1 -0
  14. package/dist/cli/cli-output.d.ts +20 -0
  15. package/dist/cli/cli-output.js +69 -0
  16. package/dist/cli/cli-output.js.map +1 -0
  17. package/dist/cli/index.d.ts +1 -0
  18. package/dist/cli/index.js +18 -0
  19. package/dist/cli/index.js.map +1 -0
  20. package/dist/cli.d.ts +4 -0
  21. package/dist/cli.js +20 -6
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config/config.factory.d.ts +12 -0
  24. package/dist/config/config.factory.js +29 -0
  25. package/dist/config/config.factory.js.map +1 -0
  26. package/dist/config/config.schema.d.ts +32 -0
  27. package/dist/config/config.schema.js +48 -0
  28. package/dist/config/config.schema.js.map +1 -0
  29. package/dist/config/index.d.ts +3 -0
  30. package/dist/config/index.js +11 -0
  31. package/dist/config/index.js.map +1 -0
  32. package/dist/http/guards/origin-validation.guard.d.ts +1 -0
  33. package/dist/http/guards/origin-validation.guard.js +5 -3
  34. package/dist/http/guards/origin-validation.guard.js.map +1 -1
  35. package/dist/main-http.js +19 -9
  36. package/dist/main-http.js.map +1 -1
  37. package/dist/main-stdio.js +6 -3
  38. package/dist/main-stdio.js.map +1 -1
  39. package/dist/main-tunnel.d.ts +1 -0
  40. package/dist/main-tunnel.js +26 -0
  41. package/dist/main-tunnel.js.map +1 -0
  42. package/dist/mcp/primitives/essential/index.d.ts +1 -0
  43. package/dist/mcp/primitives/essential/index.js +8 -1
  44. package/dist/mcp/primitives/essential/index.js.map +1 -1
  45. package/dist/mcp/primitives/gui/index.d.ts +1 -0
  46. package/dist/mcp/primitives/gui/index.js +8 -1
  47. package/dist/mcp/primitives/gui/index.js.map +1 -1
  48. package/dist/services/ngrok.service.d.ts +1 -0
  49. package/dist/services/ngrok.service.js +5 -3
  50. package/dist/services/ngrok.service.js.map +1 -1
  51. package/dist/test-fixtures/mock-data.d.ts +8 -0
  52. package/dist/test-fixtures/mock-data.js +8 -0
  53. package/dist/test-fixtures/mock-data.js.map +1 -1
  54. package/dist/tsconfig.build.tsbuildinfo +1 -1
  55. package/dist/tunnel/commands/index.d.ts +3 -0
  56. package/dist/tunnel/commands/index.js +10 -0
  57. package/dist/tunnel/commands/index.js.map +1 -0
  58. package/dist/tunnel/commands/login.command.d.ts +1 -0
  59. package/dist/tunnel/commands/login.command.js +108 -0
  60. package/dist/tunnel/commands/login.command.js.map +1 -0
  61. package/dist/tunnel/commands/logout.command.d.ts +1 -0
  62. package/dist/tunnel/commands/logout.command.js +26 -0
  63. package/dist/tunnel/commands/logout.command.js.map +1 -0
  64. package/dist/tunnel/commands/tunnel.command.d.ts +1 -0
  65. package/dist/tunnel/commands/tunnel.command.js +183 -0
  66. package/dist/tunnel/commands/tunnel.command.js.map +1 -0
  67. package/dist/tunnel/credentials.service.d.ts +23 -0
  68. package/dist/tunnel/credentials.service.js +152 -0
  69. package/dist/tunnel/credentials.service.js.map +1 -0
  70. package/dist/tunnel/device-flow.service.d.ts +46 -0
  71. package/dist/tunnel/device-flow.service.js +237 -0
  72. package/dist/tunnel/device-flow.service.js.map +1 -0
  73. package/dist/tunnel/in-memory.transport.d.ts +14 -0
  74. package/dist/tunnel/in-memory.transport.js +63 -0
  75. package/dist/tunnel/in-memory.transport.js.map +1 -0
  76. package/dist/tunnel/index.d.ts +6 -0
  77. package/dist/tunnel/index.js +31 -0
  78. package/dist/tunnel/index.js.map +1 -0
  79. package/dist/tunnel/tunnel-mcp.service.d.ts +15 -0
  80. package/dist/tunnel/tunnel-mcp.service.js +100 -0
  81. package/dist/tunnel/tunnel-mcp.service.js.map +1 -0
  82. package/dist/tunnel/tunnel.client.d.ts +60 -0
  83. package/dist/tunnel/tunnel.client.js +381 -0
  84. package/dist/tunnel/tunnel.client.js.map +1 -0
  85. package/dist/tunnel/tunnel.protocol.d.ts +67 -0
  86. package/dist/tunnel/tunnel.protocol.js +25 -0
  87. package/dist/tunnel/tunnel.protocol.js.map +1 -0
  88. package/dist/version.d.ts +2 -0
  89. package/dist/version.js +21 -0
  90. package/dist/version.js.map +1 -0
  91. package/package.json +5 -2
  92. package/dist/anki-config.service.d.ts +0 -10
  93. package/dist/anki-config.service.js +0 -42
  94. package/dist/anki-config.service.js.map +0 -1
package/bin/ankimcp.js CHANGED
@@ -1,11 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // Check if --stdio flag is present
3
+ // Determine mode based on CLI flags
4
4
  const isStdioMode = process.argv.includes('--stdio');
5
+ const isTunnelMode = process.argv.some(arg =>
6
+ arg === '--tunnel' ||
7
+ arg.startsWith('--tunnel=') ||
8
+ arg === '--login' ||
9
+ arg === '--logout'
10
+ );
5
11
 
6
12
  if (isStdioMode) {
7
13
  // STDIO mode - for MCP clients like Cursor, Cline, Zed, etc.
8
14
  require('../dist/main-stdio.js');
15
+ } else if (isTunnelMode) {
16
+ // Tunnel mode - for remote MCP access via tunnel service
17
+ require('../dist/main-tunnel.js');
9
18
  } else {
10
19
  // HTTP mode (default) - for web-based AI assistants
11
20
  require('../dist/main-http.js');
@@ -0,0 +1,21 @@
1
+ import { IAnkiConfig } from "./mcp/config/anki-config.interface";
2
+ import type { AppConfig } from "@/config";
3
+ export declare class AppConfigService implements IAnkiConfig {
4
+ private readonly config;
5
+ constructor(config: AppConfig);
6
+ get port(): number;
7
+ get host(): string;
8
+ get nodeEnv(): "development" | "production" | "test";
9
+ get isDevelopment(): boolean;
10
+ get isProduction(): boolean;
11
+ get isTest(): boolean;
12
+ get ankiConnectUrl(): string;
13
+ get ankiConnectApiVersion(): number;
14
+ get ankiConnectApiKey(): string | undefined;
15
+ get ankiConnectTimeout(): number;
16
+ get authUrl(): string;
17
+ get authRealm(): string;
18
+ get authClientId(): string;
19
+ get tunnelServerUrl(): string;
20
+ get logLevel(): "debug" | "info" | "warn" | "error";
21
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AppConfigService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const config_1 = require("./config");
18
+ const mcpb_workarounds_1 = require("./mcp/utils/mcpb-workarounds");
19
+ let AppConfigService = class AppConfigService {
20
+ config;
21
+ constructor(config) {
22
+ this.config = config;
23
+ }
24
+ get port() {
25
+ return this.config.port;
26
+ }
27
+ get host() {
28
+ return this.config.host;
29
+ }
30
+ get nodeEnv() {
31
+ return this.config.nodeEnv;
32
+ }
33
+ get isDevelopment() {
34
+ return this.nodeEnv === "development";
35
+ }
36
+ get isProduction() {
37
+ return this.nodeEnv === "production";
38
+ }
39
+ get isTest() {
40
+ return this.nodeEnv === "test";
41
+ }
42
+ get ankiConnectUrl() {
43
+ return this.config.ankiConnect.url;
44
+ }
45
+ get ankiConnectApiVersion() {
46
+ return this.config.ankiConnect.apiVersion;
47
+ }
48
+ get ankiConnectApiKey() {
49
+ return (0, mcpb_workarounds_1.sanitizeMcpbConfigValue)(this.config.ankiConnect.apiKey);
50
+ }
51
+ get ankiConnectTimeout() {
52
+ return this.config.ankiConnect.timeout;
53
+ }
54
+ get authUrl() {
55
+ return this.config.auth.url;
56
+ }
57
+ get authRealm() {
58
+ return this.config.auth.realm;
59
+ }
60
+ get authClientId() {
61
+ return this.config.auth.clientId;
62
+ }
63
+ get tunnelServerUrl() {
64
+ return this.config.tunnel.serverUrl;
65
+ }
66
+ get logLevel() {
67
+ return this.config.logLevel;
68
+ }
69
+ };
70
+ exports.AppConfigService = AppConfigService;
71
+ exports.AppConfigService = AppConfigService = __decorate([
72
+ (0, common_1.Injectable)(),
73
+ __param(0, (0, common_1.Inject)(config_1.APP_CONFIG)),
74
+ __metadata("design:paramtypes", [Object])
75
+ ], AppConfigService);
76
+ //# sourceMappingURL=app-config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-config.service.js","sourceRoot":"","sources":["../src/app-config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AAEpD,qCAAsC;AAEtC,mEAAuE;AAOhE,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACsB;IAAjD,YAAiD,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAItE,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC;IACxC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC;IACvC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC;IACjC,CAAC;IAID,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IAC5C,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAA,0CAAuB,EAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;IACzC,CAAC;IAID,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnC,CAAC;IAID,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;IACtC,CAAC;IAID,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;CACF,CAAA;AAxEY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,eAAM,EAAC,mBAAU,CAAC,CAAA;;GADpB,gBAAgB,CAwE5B"}
@@ -1,5 +1,7 @@
1
1
  import { DynamicModule } from "@nestjs/common";
2
+ import { ConfigInput, CliOverrides } from "@/config";
2
3
  export declare class AppModule {
3
- static forStdio(): DynamicModule;
4
- static forHttp(): DynamicModule;
4
+ static forStdio(configInput: ConfigInput): DynamicModule;
5
+ static forHttp(configInput: ConfigInput): DynamicModule;
6
+ static forTunnel(cliOverrides?: CliOverrides): DynamicModule;
5
7
  }
@@ -13,16 +13,19 @@ const config_1 = require("@nestjs/config");
13
13
  const mcp_nest_1 = require("@rekog/mcp-nest");
14
14
  const essential_1 = require("./mcp/primitives/essential");
15
15
  const gui_1 = require("./mcp/primitives/gui");
16
- const anki_config_service_1 = require("./anki-config.service");
16
+ const app_config_service_1 = require("./app-config.service");
17
+ const config_2 = require("./config");
18
+ const tunnel_mcp_service_1 = require("./tunnel/tunnel-mcp.service");
17
19
  let AppModule = AppModule_1 = class AppModule {
18
- static forStdio() {
20
+ static forStdio(configInput) {
21
+ const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
19
22
  return {
20
23
  module: AppModule_1,
21
24
  imports: [
22
25
  config_1.ConfigModule.forRoot({
23
26
  isGlobal: true,
24
27
  cache: true,
25
- envFilePath: [".env.local", ".env"],
28
+ load: [() => validatedConfig],
26
29
  }),
27
30
  mcp_nest_1.McpModule.forRoot({
28
31
  name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
@@ -32,27 +35,45 @@ let AppModule = AppModule_1 = class AppModule {
32
35
  essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
33
36
  ankiConfigProvider: {
34
37
  provide: essential_1.ANKI_CONFIG,
35
- useClass: anki_config_service_1.AnkiConfigService,
38
+ useClass: app_config_service_1.AppConfigService,
39
+ },
40
+ appConfigProvider: {
41
+ provide: config_2.APP_CONFIG,
42
+ useValue: validatedConfig,
36
43
  },
37
44
  }),
38
45
  gui_1.McpPrimitivesAnkiGuiModule.forRoot({
39
46
  ankiConfigProvider: {
40
47
  provide: essential_1.ANKI_CONFIG,
41
- useClass: anki_config_service_1.AnkiConfigService,
48
+ useClass: app_config_service_1.AppConfigService,
49
+ },
50
+ appConfigProvider: {
51
+ provide: config_2.APP_CONFIG,
52
+ useValue: validatedConfig,
42
53
  },
43
54
  }),
44
55
  ],
45
- providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
56
+ providers: [
57
+ {
58
+ provide: config_2.APP_CONFIG,
59
+ useValue: validatedConfig,
60
+ },
61
+ app_config_service_1.AppConfigService,
62
+ ...essential_1.ESSENTIAL_MCP_TOOLS,
63
+ ...gui_1.GUI_MCP_TOOLS,
64
+ ],
65
+ exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
46
66
  };
47
67
  }
48
- static forHttp() {
68
+ static forHttp(configInput) {
69
+ const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
49
70
  return {
50
71
  module: AppModule_1,
51
72
  imports: [
52
73
  config_1.ConfigModule.forRoot({
53
74
  isGlobal: true,
54
75
  cache: true,
55
- envFilePath: [".env.local", ".env"],
76
+ load: [() => validatedConfig],
56
77
  }),
57
78
  mcp_nest_1.McpModule.forRoot({
58
79
  name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
@@ -63,17 +84,83 @@ let AppModule = AppModule_1 = class AppModule {
63
84
  essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
64
85
  ankiConfigProvider: {
65
86
  provide: essential_1.ANKI_CONFIG,
66
- useClass: anki_config_service_1.AnkiConfigService,
87
+ useClass: app_config_service_1.AppConfigService,
88
+ },
89
+ appConfigProvider: {
90
+ provide: config_2.APP_CONFIG,
91
+ useValue: validatedConfig,
67
92
  },
68
93
  }),
69
94
  gui_1.McpPrimitivesAnkiGuiModule.forRoot({
70
95
  ankiConfigProvider: {
71
96
  provide: essential_1.ANKI_CONFIG,
72
- useClass: anki_config_service_1.AnkiConfigService,
97
+ useClass: app_config_service_1.AppConfigService,
98
+ },
99
+ appConfigProvider: {
100
+ provide: config_2.APP_CONFIG,
101
+ useValue: validatedConfig,
73
102
  },
74
103
  }),
75
104
  ],
76
- providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
105
+ providers: [
106
+ {
107
+ provide: config_2.APP_CONFIG,
108
+ useValue: validatedConfig,
109
+ },
110
+ app_config_service_1.AppConfigService,
111
+ ...essential_1.ESSENTIAL_MCP_TOOLS,
112
+ ...gui_1.GUI_MCP_TOOLS,
113
+ ],
114
+ exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
115
+ };
116
+ }
117
+ static forTunnel(cliOverrides) {
118
+ const validatedConfig = (0, config_2.loadValidatedConfig)(cliOverrides);
119
+ return {
120
+ module: AppModule_1,
121
+ imports: [
122
+ config_1.ConfigModule.forRoot({
123
+ isGlobal: true,
124
+ cache: true,
125
+ load: [() => validatedConfig],
126
+ }),
127
+ mcp_nest_1.McpModule.forRoot({
128
+ name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
129
+ version: process.env.MCP_SERVER_VERSION || "1.0.0",
130
+ transport: [],
131
+ }),
132
+ essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
133
+ ankiConfigProvider: {
134
+ provide: essential_1.ANKI_CONFIG,
135
+ useClass: app_config_service_1.AppConfigService,
136
+ },
137
+ appConfigProvider: {
138
+ provide: config_2.APP_CONFIG,
139
+ useValue: validatedConfig,
140
+ },
141
+ }),
142
+ gui_1.McpPrimitivesAnkiGuiModule.forRoot({
143
+ ankiConfigProvider: {
144
+ provide: essential_1.ANKI_CONFIG,
145
+ useClass: app_config_service_1.AppConfigService,
146
+ },
147
+ appConfigProvider: {
148
+ provide: config_2.APP_CONFIG,
149
+ useValue: validatedConfig,
150
+ },
151
+ }),
152
+ ],
153
+ providers: [
154
+ {
155
+ provide: config_2.APP_CONFIG,
156
+ useValue: validatedConfig,
157
+ },
158
+ app_config_service_1.AppConfigService,
159
+ tunnel_mcp_service_1.TunnelMcpService,
160
+ ...essential_1.ESSENTIAL_MCP_TOOLS,
161
+ ...gui_1.GUI_MCP_TOOLS,
162
+ ],
163
+ exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService, tunnel_mcp_service_1.TunnelMcpService],
77
164
  };
78
165
  }
79
166
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,2CAA8C;AAC9C,8CAA8D;AAC9D,0DAIoC;AACpC,8CAG8B;AAC9B,+DAA0D;AAGnD,IAAM,SAAS,iBAAf,MAAM,SAAS;IAIpB,MAAM,CAAC,QAAQ;QACb,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,OAAO,EAAE;gBAEP,qBAAY,CAAC,OAAO,CAAC;oBACnB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;iBACpC,CAAC;gBAGF,oBAAS,CAAC,OAAO,CAAC;oBAChB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,iBAAiB;oBACtD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO;oBAClD,SAAS,EAAE,2BAAgB,CAAC,KAAK;iBAClC,CAAC;gBAGF,4CAAgC,CAAC,OAAO,CAAC;oBACvC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;gBAGF,gCAA0B,CAAC,OAAO,CAAC;oBACjC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;aACH;YAED,SAAS,EAAE,CAAC,uCAAiB,EAAE,GAAG,+BAAmB,EAAE,GAAG,mBAAa,CAAC;SACzE,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,OAAO,EAAE;gBAEP,qBAAY,CAAC,OAAO,CAAC;oBACnB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;iBACpC,CAAC;gBAGF,oBAAS,CAAC,OAAO,CAAC;oBAChB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,iBAAiB;oBACtD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO;oBAClD,SAAS,EAAE,2BAAgB,CAAC,eAAe;oBAC3C,WAAW,EAAE,GAAG;iBACjB,CAAC;gBAGF,4CAAgC,CAAC,OAAO,CAAC;oBACvC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;gBAGF,gCAA0B,CAAC,OAAO,CAAC;oBACjC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;aACH;YAED,SAAS,EAAE,CAAC,uCAAiB,EAAE,GAAG,+BAAmB,EAAE,GAAG,mBAAa,CAAC;SACzE,CAAC;IACJ,CAAC;CACF,CAAA;AArFY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAqFrB"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
1
  import { LoggerService } from "@nestjs/common";
2
- export declare function createPinoLogger(destination: 1 | 2): import("pino").Logger<never, boolean>;
2
+ export declare const LOG_DESTINATION: {
3
+ readonly STDOUT: 1;
4
+ readonly STDERR: 2;
5
+ };
6
+ export type LogDestination = (typeof LOG_DESTINATION)[keyof typeof LOG_DESTINATION];
7
+ export declare function createPinoLogger(destination: LogDestination, logLevel?: string): import("pino").Logger<never, boolean>;
3
8
  export declare function createLoggerService(pinoLogger: any): LoggerService;
package/dist/bootstrap.js CHANGED
@@ -1,11 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LOG_DESTINATION = void 0;
3
4
  exports.createPinoLogger = createPinoLogger;
4
5
  exports.createLoggerService = createLoggerService;
5
6
  const pino_1 = require("pino");
6
- function createPinoLogger(destination) {
7
+ exports.LOG_DESTINATION = {
8
+ STDOUT: 1,
9
+ STDERR: 2,
10
+ };
11
+ function createPinoLogger(destination, logLevel = "info") {
7
12
  return (0, pino_1.pino)({
8
- level: process.env.LOG_LEVEL || "info",
13
+ level: logLevel,
9
14
  transport: {
10
15
  target: "pino-pretty",
11
16
  options: {
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";;AASA,4CAaC;AAQD,kDAkBC;AA/CD,+BAA4B;AAQ5B,SAAgB,gBAAgB,CAAC,WAAkB;IACjD,OAAO,IAAA,WAAI,EAAC;QACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,SAAS,EAAE;YACT,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,WAAW;gBACX,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,YAAY;gBAC3B,MAAM,EAAE,cAAc;aACvB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAQD,SAAgB,mBAAmB,CAAC,UAAe;IACjD,OAAO;QACL,GAAG,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACtC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,OAAY,EAAE,KAAc,EAAE,OAAgB,EAAE,EAAE;YACxD,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACvC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACxC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YAC1C,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";;;AAuBA,4CAgBC;AAQD,kDAkBC;AAhED,+BAA4B;AAKf,QAAA,eAAe,GAAG;IAE7B,MAAM,EAAE,CAAC;IAET,MAAM,EAAE,CAAC;CACD,CAAC;AAYX,SAAgB,gBAAgB,CAC9B,WAA2B,EAC3B,WAAmB,MAAM;IAEzB,OAAO,IAAA,WAAI,EAAC;QACV,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE;YACT,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,WAAW;gBACX,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,YAAY;gBAC3B,MAAM,EAAE,cAAc;aACvB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAQD,SAAgB,mBAAmB,CAAC,UAAe;IACjD,OAAO;QACL,GAAG,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACtC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,OAAY,EAAE,KAAc,EAAE,OAAgB,EAAE,EAAE;YACxD,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACvC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACxC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YAC1C,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const cli_output_1 = require("../cli-output");
5
+ cli_output_1.cli.success("Successfully connected to Anki");
6
+ cli_output_1.cli.error("Failed to connect to AnkiConnect");
7
+ cli_output_1.cli.warn("AnkiConnect is not running");
8
+ cli_output_1.cli.info("Server listening on http://localhost:3000");
9
+ cli_output_1.cli.blank();
10
+ cli_output_1.cli.dim("(Use Ctrl+C to stop)");
11
+ cli_output_1.cli.blank();
12
+ cli_output_1.cli.box("Ngrok Tunnel Active", "https://abc123.ngrok.io");
13
+ //# sourceMappingURL=cli-output.manual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.manual.js","sourceRoot":"","sources":["../../../src/cli/__tests__/cli-output.manual.ts"],"names":[],"mappings":";;;AAOA,8CAAoC;AAGpC,gBAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;AAC9C,gBAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAC9C,gBAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AACvC,gBAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;AACtD,gBAAG,CAAC,KAAK,EAAE,CAAC;AACZ,gBAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAChC,gBAAG,CAAC,KAAK,EAAE,CAAC;AACZ,gBAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ export declare function setDebugMode(enabled: boolean): void;
2
+ export declare function isDebugMode(): boolean;
3
+ export declare function success(message: string): void;
4
+ export declare function error(message: string, err?: Error): void;
5
+ export declare function warn(message: string): void;
6
+ export declare function info(message: string): void;
7
+ export declare function blank(): void;
8
+ export declare function box(title: string, content: string): void;
9
+ export declare function dim(message: string): void;
10
+ export declare const cli: {
11
+ success: typeof success;
12
+ error: typeof error;
13
+ warn: typeof warn;
14
+ info: typeof info;
15
+ blank: typeof blank;
16
+ box: typeof box;
17
+ dim: typeof dim;
18
+ setDebugMode: typeof setDebugMode;
19
+ isDebugMode: typeof isDebugMode;
20
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cli = void 0;
4
+ exports.setDebugMode = setDebugMode;
5
+ exports.isDebugMode = isDebugMode;
6
+ exports.success = success;
7
+ exports.error = error;
8
+ exports.warn = warn;
9
+ exports.info = info;
10
+ exports.blank = blank;
11
+ exports.box = box;
12
+ exports.dim = dim;
13
+ let debugMode = false;
14
+ function setDebugMode(enabled) {
15
+ debugMode = enabled;
16
+ }
17
+ function isDebugMode() {
18
+ return debugMode;
19
+ }
20
+ const colors = {
21
+ reset: "\x1b[0m",
22
+ green: "\x1b[32m",
23
+ red: "\x1b[31m",
24
+ yellow: "\x1b[33m",
25
+ cyan: "\x1b[36m",
26
+ dim: "\x1b[2m",
27
+ };
28
+ function success(message) {
29
+ console.log(`${colors.green}✓${colors.reset} ${message}`);
30
+ }
31
+ function error(message, err) {
32
+ console.error(`${colors.red}✗${colors.reset} ${message}`);
33
+ if (err && debugMode && err.stack) {
34
+ console.error(`${colors.dim}${err.stack}${colors.reset}`);
35
+ }
36
+ }
37
+ function warn(message) {
38
+ console.warn(`${colors.yellow}!${colors.reset} ${message}`);
39
+ }
40
+ function info(message) {
41
+ console.log(message);
42
+ }
43
+ function blank() {
44
+ console.log();
45
+ }
46
+ function box(title, content) {
47
+ const width = Math.max(title.length, content.length) + 4;
48
+ const border = "─".repeat(width);
49
+ console.log(`┌${border}┐`);
50
+ console.log(`│ ${title.padEnd(width - 2)} │`);
51
+ console.log(`├${border}┤`);
52
+ console.log(`│ ${content.padEnd(width - 2)} │`);
53
+ console.log(`└${border}┘`);
54
+ }
55
+ function dim(message) {
56
+ console.log(`${colors.dim}${message}${colors.reset}`);
57
+ }
58
+ exports.cli = {
59
+ success,
60
+ error,
61
+ warn,
62
+ info,
63
+ blank,
64
+ box,
65
+ dim,
66
+ setDebugMode,
67
+ isDebugMode,
68
+ };
69
+ //# sourceMappingURL=cli-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/cli/cli-output.ts"],"names":[],"mappings":";;;AAcA,oCAEC;AAKD,kCAEC;AAeD,0BAEC;AAMD,sBAKC;AAKD,oBAEC;AAKD,oBAEC;AAKD,sBAEC;AAKD,kBASC;AAKD,kBAEC;AArFD,IAAI,SAAS,GAAG,KAAK,CAAC;AAMtB,SAAgB,YAAY,CAAC,OAAgB;IAC3C,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAKD,SAAgB,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;CACf,CAAC;AAKF,SAAgB,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAMD,SAAgB,KAAK,CAAC,OAAe,EAAE,GAAW;IAChD,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAKD,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;AAC9D,CAAC;AAKD,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAKD,SAAgB,KAAK;IACnB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAKD,SAAgB,GAAG,CAAC,KAAa,EAAE,OAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAC7B,CAAC;AAKD,SAAgB,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC;AAGY,QAAA,GAAG,GAAG;IACjB,OAAO;IACP,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,GAAG;IACH,GAAG;IACH,YAAY;IACZ,WAAW;CACZ,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "./cli-output";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cli-output"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B"}
package/dist/cli.d.ts CHANGED
@@ -3,6 +3,10 @@ export interface CliOptions {
3
3
  host: string;
4
4
  ankiConnect: string;
5
5
  ngrok: boolean;
6
+ login: string | boolean;
7
+ logout: boolean;
8
+ tunnel: string | boolean;
9
+ debug: boolean;
6
10
  }
7
11
  export declare function checkForUpdates(): void;
8
12
  export declare function parseCliArgs(): CliOptions;
package/dist/cli.js CHANGED
@@ -10,6 +10,8 @@ const commander_1 = require("commander");
10
10
  const fs_1 = require("fs");
11
11
  const path_1 = require("path");
12
12
  const update_notifier_1 = __importDefault(require("update-notifier"));
13
+ const cli_output_1 = require("./cli/cli-output");
14
+ const version_1 = require("./version");
13
15
  function getPackageJson() {
14
16
  try {
15
17
  return JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../package.json"), "utf-8"));
@@ -18,9 +20,6 @@ function getPackageJson() {
18
20
  return { version: "0.0.0", name: "ankimcp" };
19
21
  }
20
22
  }
21
- function getVersion() {
22
- return getPackageJson().version;
23
- }
24
23
  function checkForUpdates() {
25
24
  (0, update_notifier_1.default)({ pkg: getPackageJson() }).notify();
26
25
  }
@@ -29,12 +28,16 @@ function parseCliArgs() {
29
28
  program
30
29
  .name("ankimcp")
31
30
  .description("AnkiMCP Server - Model Context Protocol server for Anki")
32
- .version(getVersion())
31
+ .version((0, version_1.getVersion)())
33
32
  .option("--stdio", "Run in STDIO mode (for MCP clients like Cursor, Cline, Zed)")
34
33
  .option("-p, --port <number>", "Port to listen on (HTTP mode)", "3000")
35
34
  .option("-h, --host <address>", "Host to bind to (HTTP mode)", "127.0.0.1")
36
35
  .option("-a, --anki-connect <url>", "AnkiConnect URL", "http://localhost:8765")
37
36
  .option("--ngrok", "Start ngrok tunnel (requires global ngrok installation)")
37
+ .option("--login [url]", "Authenticate with tunnel service")
38
+ .option("--logout", "Clear tunnel credentials")
39
+ .option("--tunnel [url]", "Connect to tunnel server (default: ws://localhost:3004/tunnel)")
40
+ .option("-d, --debug", "Enable debug logging (shows stack traces)")
38
41
  .addHelpText("after", `
39
42
  Transport Modes:
40
43
  HTTP Mode (default): For web-based AI assistants (ChatGPT, Claude.ai)
@@ -69,6 +72,13 @@ Ngrok Setup (one-time):
69
72
  2. Get auth token from: https://dashboard.ngrok.com/get-started/your-authtoken
70
73
  3. Setup: ngrok config add-authtoken <your-token>
71
74
  4. Run: ankimcp --ngrok
75
+
76
+ Tunnel Mode:
77
+ $ ankimcp --login # Login to default tunnel service
78
+ $ ankimcp --login wss://custom.server.com/tunnel # Login to custom server
79
+ $ ankimcp --logout # Clear saved credentials
80
+ $ ankimcp --tunnel # Connect to localhost:3004
81
+ $ ankimcp --tunnel wss://tunnel.ankimcp.ai/tunnel # Production tunnel
72
82
  `);
73
83
  program.parse();
74
84
  const options = program.opts();
@@ -77,14 +87,18 @@ Ngrok Setup (one-time):
77
87
  host: options.host,
78
88
  ankiConnect: options.ankiConnect,
79
89
  ngrok: options.ngrok || false,
90
+ login: options.login ?? false,
91
+ logout: options.logout || false,
92
+ tunnel: options.tunnel ?? false,
93
+ debug: options.debug || false,
80
94
  };
81
95
  }
82
96
  function displayStartupBanner(options, ngrokUrl) {
83
- const version = getVersion();
97
+ const version = (0, version_1.getVersion)();
84
98
  const title = `AnkiMCP HTTP Server v${version}`;
85
99
  const padding = Math.floor((64 - title.length) / 2);
86
100
  const paddedTitle = " ".repeat(padding) + title + " ".repeat(64 - padding - title.length);
87
- console.log(`
101
+ cli_output_1.cli.info(`
88
102
  ╔════════════════════════════════════════════════════════════════╗
89
103
  ║${paddedTitle}║
90
104
  ╚════════════════════════════════════════════════════════════════╝
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AA0BA,0CAEC;AAED,oCAuEC;AAED,oDAsCC;AA7ID,yCAAoC;AACpC,2BAAkC;AAClC,+BAA4B;AAC5B,sEAA6C;AAS7C,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CACf,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,cAAc,EAAE,CAAC,OAAO,CAAC;AAClC,CAAC;AAED,SAAgB,eAAe;IAC7B,IAAA,yBAAc,EAAC,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,OAAO,CAAC,UAAU,EAAE,CAAC;SACrB,MAAM,CACL,SAAS,EACT,6DAA6D,CAC9D;SACA,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,CAAC;SACtE,MAAM,CAAC,sBAAsB,EAAE,6BAA6B,EAAE,WAAW,CAAC;SAC1E,MAAM,CACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,CACxB;SACA,MAAM,CACL,SAAS,EACT,yDAAyD,CAC1D;SACA,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCL,CACI,CAAC;IAEJ,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAc,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC3C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;KAC9B,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAClC,OAAmB,EACnB,QAAiB;IAEjB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,wBAAwB,OAAO,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,WAAW,GACf,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAExE,OAAO,CAAC,GAAG,CAAC;;GAEX,WAAW;;;+BAGiB,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;wBACnC,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;;;0BAGzE,OAAO,CAAC,IAAI;0BACZ,OAAO,CAAC,IAAI;0BACZ,OAAO,CAAC,WAAW;0EAC6B,QAAQ,CAAC,CAAC,CAAC,6BAA6B,QAAQ,iDAAiD,CAAC,CAAC,CAAC,EAAE;EAE9K,CAAC,QAAQ;QACP,CAAC,CAAC;;;;;CAKL;QACG,CAAC,CAAC;;IAEF,QAAQ;CAEZ;;CAEC,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { AppConfig } from "./config.schema";
2
+ export type ConfigInput = Record<string, string | undefined>;
3
+ export interface CliOverrides {
4
+ port?: number;
5
+ host?: string;
6
+ ankiConnect?: string;
7
+ tunnel?: string | boolean;
8
+ ngrok?: boolean;
9
+ debug?: boolean;
10
+ }
11
+ export declare function buildConfigInput(cliOverrides?: CliOverrides): ConfigInput;
12
+ export declare function loadValidatedConfig(cliOverrides?: CliOverrides): AppConfig;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildConfigInput = buildConfigInput;
4
+ exports.loadValidatedConfig = loadValidatedConfig;
5
+ const config_schema_1 = require("./config.schema");
6
+ function buildConfigInput(cliOverrides = {}) {
7
+ const input = { ...process.env };
8
+ if (cliOverrides.port !== undefined) {
9
+ input.PORT = String(cliOverrides.port);
10
+ }
11
+ if (cliOverrides.host !== undefined) {
12
+ input.HOST = cliOverrides.host;
13
+ }
14
+ if (cliOverrides.ankiConnect !== undefined) {
15
+ input.ANKI_CONNECT_URL = cliOverrides.ankiConnect;
16
+ }
17
+ if (typeof cliOverrides.tunnel === "string") {
18
+ input.TUNNEL_SERVER_URL = cliOverrides.tunnel;
19
+ }
20
+ if (cliOverrides.debug) {
21
+ input.LOG_LEVEL = "debug";
22
+ }
23
+ return input;
24
+ }
25
+ function loadValidatedConfig(cliOverrides = {}) {
26
+ const input = buildConfigInput(cliOverrides);
27
+ return config_schema_1.configSchema.parse((0, config_schema_1.transformEnvToConfig)(input));
28
+ }
29
+ //# sourceMappingURL=config.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.factory.js","sourceRoot":"","sources":["../../src/config/config.factory.ts"],"names":[],"mappings":";;AA6BA,4CAqBC;AAMD,kDAKC;AA7DD,mDAAgF;AA6BhF,SAAgB,gBAAgB,CAAC,eAA6B,EAAE;IAE9D,MAAM,KAAK,GAAgB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9C,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IACjC,CAAC;IACD,IAAI,YAAY,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC3C,KAAK,CAAC,gBAAgB,GAAG,YAAY,CAAC,WAAW,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5C,KAAK,CAAC,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC;IAChD,CAAC;IACD,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAMD,SAAgB,mBAAmB,CACjC,eAA6B,EAAE;IAE/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC7C,OAAO,4BAAY,CAAC,KAAK,CAAC,IAAA,oCAAoB,EAAC,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC"}