@ankimcp/anki-mcp-server 0.18.5 → 0.19.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 (231) hide show
  1. package/README.md +204 -139
  2. package/bin/ankimcp.js +10 -1
  3. package/dist/app-config.service.d.ts +20 -0
  4. package/dist/app-config.service.js +73 -0
  5. package/dist/app-config.service.js.map +1 -0
  6. package/dist/app.module.d.ts +4 -2
  7. package/dist/app.module.js +99 -11
  8. package/dist/app.module.js.map +1 -1
  9. package/dist/bootstrap.d.ts +6 -1
  10. package/dist/bootstrap.js +7 -2
  11. package/dist/bootstrap.js.map +1 -1
  12. package/dist/cli/__tests__/cli-output.manual.d.ts +2 -0
  13. package/dist/cli/__tests__/cli-output.manual.js +14 -0
  14. package/dist/cli/__tests__/cli-output.manual.js.map +1 -0
  15. package/dist/cli/args.d.ts +16 -0
  16. package/dist/{cli.js → cli/args.js} +42 -9
  17. package/dist/cli/args.js.map +1 -0
  18. package/dist/cli/cli-output.d.ts +17 -0
  19. package/dist/cli/cli-output.js +60 -0
  20. package/dist/cli/cli-output.js.map +1 -0
  21. package/dist/cli/index.d.ts +3 -0
  22. package/dist/cli/index.js +20 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/spinner.d.ts +1 -0
  25. package/dist/cli/spinner.js +16 -0
  26. package/dist/cli/spinner.js.map +1 -0
  27. package/dist/config/config.factory.d.ts +13 -0
  28. package/dist/config/config.factory.js +32 -0
  29. package/dist/config/config.factory.js.map +1 -0
  30. package/dist/config/config.schema.d.ts +31 -0
  31. package/dist/config/config.schema.js +54 -0
  32. package/dist/config/config.schema.js.map +1 -0
  33. package/dist/config/index.d.ts +3 -0
  34. package/dist/config/index.js +11 -0
  35. package/dist/config/index.js.map +1 -0
  36. package/dist/http/guards/origin-validation.guard.d.ts +1 -0
  37. package/dist/http/guards/origin-validation.guard.js +5 -3
  38. package/dist/http/guards/origin-validation.guard.js.map +1 -1
  39. package/dist/main-http.js +23 -11
  40. package/dist/main-http.js.map +1 -1
  41. package/dist/main-stdio.js +10 -9
  42. package/dist/main-stdio.js.map +1 -1
  43. package/dist/main-tunnel.d.ts +1 -0
  44. package/dist/main-tunnel.js +27 -0
  45. package/dist/main-tunnel.js.map +1 -0
  46. package/dist/mcp/clients/anki-connect.client.js +3 -3
  47. package/dist/mcp/clients/anki-connect.client.js.map +1 -1
  48. package/dist/mcp/primitives/essential/index.d.ts +1 -0
  49. package/dist/mcp/primitives/essential/index.js +8 -1
  50. package/dist/mcp/primitives/essential/index.js.map +1 -1
  51. package/dist/mcp/primitives/essential/tools/add-note.tool.d.ts +2 -3
  52. package/dist/mcp/primitives/essential/tools/add-note.tool.js +2 -9
  53. package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -1
  54. package/dist/mcp/primitives/essential/tools/add-notes.tool.d.ts +1 -2
  55. package/dist/mcp/primitives/essential/tools/add-notes.tool.js +2 -23
  56. package/dist/mcp/primitives/essential/tools/add-notes.tool.js.map +1 -1
  57. package/dist/mcp/primitives/essential/tools/add-tags.tool.d.ts +1 -2
  58. package/dist/mcp/primitives/essential/tools/add-tags.tool.js +2 -4
  59. package/dist/mcp/primitives/essential/tools/add-tags.tool.js.map +1 -1
  60. package/dist/mcp/primitives/essential/tools/change-deck.tool.d.ts +1 -2
  61. package/dist/mcp/primitives/essential/tools/change-deck.tool.js +2 -4
  62. package/dist/mcp/primitives/essential/tools/change-deck.tool.js.map +1 -1
  63. package/dist/mcp/primitives/essential/tools/clear-unused-tags.tool.d.ts +1 -2
  64. package/dist/mcp/primitives/essential/tools/clear-unused-tags.tool.js +2 -4
  65. package/dist/mcp/primitives/essential/tools/clear-unused-tags.tool.js.map +1 -1
  66. package/dist/mcp/primitives/essential/tools/collection-stats/collection-stats.tool.d.ts +1 -2
  67. package/dist/mcp/primitives/essential/tools/collection-stats/collection-stats.tool.js +2 -12
  68. package/dist/mcp/primitives/essential/tools/collection-stats/collection-stats.tool.js.map +1 -1
  69. package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +1 -2
  70. package/dist/mcp/primitives/essential/tools/create-deck.tool.js +2 -4
  71. package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +1 -1
  72. package/dist/mcp/primitives/essential/tools/create-model.tool.d.ts +1 -2
  73. package/dist/mcp/primitives/essential/tools/create-model.tool.js +2 -6
  74. package/dist/mcp/primitives/essential/tools/create-model.tool.js.map +1 -1
  75. package/dist/mcp/primitives/essential/tools/deck-stats.tool.d.ts +1 -2
  76. package/dist/mcp/primitives/essential/tools/deck-stats.tool.js +3 -7
  77. package/dist/mcp/primitives/essential/tools/deck-stats.tool.js.map +1 -1
  78. package/dist/mcp/primitives/essential/tools/delete-media-file.tool.d.ts +1 -2
  79. package/dist/mcp/primitives/essential/tools/delete-media-file.tool.js +2 -4
  80. package/dist/mcp/primitives/essential/tools/delete-media-file.tool.js.map +1 -1
  81. package/dist/mcp/primitives/essential/tools/delete-notes.tool.d.ts +2 -3
  82. package/dist/mcp/primitives/essential/tools/delete-notes.tool.js +2 -6
  83. package/dist/mcp/primitives/essential/tools/delete-notes.tool.js.map +1 -1
  84. package/dist/mcp/primitives/essential/tools/find-notes.tool.d.ts +1 -2
  85. package/dist/mcp/primitives/essential/tools/find-notes.tool.js +2 -6
  86. package/dist/mcp/primitives/essential/tools/find-notes.tool.js.map +1 -1
  87. package/dist/mcp/primitives/essential/tools/get-cards.tool.d.ts +1 -2
  88. package/dist/mcp/primitives/essential/tools/get-cards.tool.js +2 -6
  89. package/dist/mcp/primitives/essential/tools/get-cards.tool.js.map +1 -1
  90. package/dist/mcp/primitives/essential/tools/get-due-cards.tool.d.ts +1 -2
  91. package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js +2 -6
  92. package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js.map +1 -1
  93. package/dist/mcp/primitives/essential/tools/get-media-files-names.tool.d.ts +1 -2
  94. package/dist/mcp/primitives/essential/tools/get-media-files-names.tool.js +2 -4
  95. package/dist/mcp/primitives/essential/tools/get-media-files-names.tool.js.map +1 -1
  96. package/dist/mcp/primitives/essential/tools/get-tags.tool.d.ts +1 -2
  97. package/dist/mcp/primitives/essential/tools/get-tags.tool.js +2 -6
  98. package/dist/mcp/primitives/essential/tools/get-tags.tool.js.map +1 -1
  99. package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +1 -2
  100. package/dist/mcp/primitives/essential/tools/list-decks.tool.js +2 -4
  101. package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +1 -1
  102. package/dist/mcp/primitives/essential/tools/model-field-names.tool.d.ts +1 -2
  103. package/dist/mcp/primitives/essential/tools/model-field-names.tool.js +2 -7
  104. package/dist/mcp/primitives/essential/tools/model-field-names.tool.js.map +1 -1
  105. package/dist/mcp/primitives/essential/tools/model-names.tool.d.ts +1 -2
  106. package/dist/mcp/primitives/essential/tools/model-names.tool.js +2 -6
  107. package/dist/mcp/primitives/essential/tools/model-names.tool.js.map +1 -1
  108. package/dist/mcp/primitives/essential/tools/model-styling.tool.d.ts +1 -2
  109. package/dist/mcp/primitives/essential/tools/model-styling.tool.js +2 -6
  110. package/dist/mcp/primitives/essential/tools/model-styling.tool.js.map +1 -1
  111. package/dist/mcp/primitives/essential/tools/notes-info.tool.d.ts +1 -2
  112. package/dist/mcp/primitives/essential/tools/notes-info.tool.js +2 -6
  113. package/dist/mcp/primitives/essential/tools/notes-info.tool.js.map +1 -1
  114. package/dist/mcp/primitives/essential/tools/present-card.tool.d.ts +2 -3
  115. package/dist/mcp/primitives/essential/tools/present-card.tool.js +2 -5
  116. package/dist/mcp/primitives/essential/tools/present-card.tool.js.map +1 -1
  117. package/dist/mcp/primitives/essential/tools/rate-card.tool.d.ts +1 -2
  118. package/dist/mcp/primitives/essential/tools/rate-card.tool.js +2 -5
  119. package/dist/mcp/primitives/essential/tools/rate-card.tool.js.map +1 -1
  120. package/dist/mcp/primitives/essential/tools/remove-tags.tool.d.ts +1 -2
  121. package/dist/mcp/primitives/essential/tools/remove-tags.tool.js +2 -4
  122. package/dist/mcp/primitives/essential/tools/remove-tags.tool.js.map +1 -1
  123. package/dist/mcp/primitives/essential/tools/replace-tags.tool.d.ts +1 -2
  124. package/dist/mcp/primitives/essential/tools/replace-tags.tool.js +2 -4
  125. package/dist/mcp/primitives/essential/tools/replace-tags.tool.js.map +1 -1
  126. package/dist/mcp/primitives/essential/tools/retrieve-media-file.tool.d.ts +1 -2
  127. package/dist/mcp/primitives/essential/tools/retrieve-media-file.tool.js +2 -4
  128. package/dist/mcp/primitives/essential/tools/retrieve-media-file.tool.js.map +1 -1
  129. package/dist/mcp/primitives/essential/tools/review-stats/review-stats.tool.d.ts +1 -2
  130. package/dist/mcp/primitives/essential/tools/review-stats/review-stats.tool.js +2 -8
  131. package/dist/mcp/primitives/essential/tools/review-stats/review-stats.tool.js.map +1 -1
  132. package/dist/mcp/primitives/essential/tools/store-media-file.tool.d.ts +1 -2
  133. package/dist/mcp/primitives/essential/tools/store-media-file.tool.js +2 -4
  134. package/dist/mcp/primitives/essential/tools/store-media-file.tool.js.map +1 -1
  135. package/dist/mcp/primitives/essential/tools/sync.tool.d.ts +1 -2
  136. package/dist/mcp/primitives/essential/tools/sync.tool.js +2 -4
  137. package/dist/mcp/primitives/essential/tools/sync.tool.js.map +1 -1
  138. package/dist/mcp/primitives/essential/tools/update-model-styling.tool.d.ts +2 -3
  139. package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js +2 -6
  140. package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js.map +1 -1
  141. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.d.ts +1 -2
  142. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js +2 -5
  143. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js.map +1 -1
  144. package/dist/mcp/primitives/gui/index.d.ts +1 -0
  145. package/dist/mcp/primitives/gui/index.js +8 -1
  146. package/dist/mcp/primitives/gui/index.js.map +1 -1
  147. package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.d.ts +1 -2
  148. package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js +2 -5
  149. package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js.map +1 -1
  150. package/dist/mcp/primitives/gui/tools/gui-browse.tool.d.ts +1 -2
  151. package/dist/mcp/primitives/gui/tools/gui-browse.tool.js +2 -4
  152. package/dist/mcp/primitives/gui/tools/gui-browse.tool.js.map +1 -1
  153. package/dist/mcp/primitives/gui/tools/gui-current-card.tool.d.ts +1 -2
  154. package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js +2 -4
  155. package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js.map +1 -1
  156. package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.d.ts +1 -2
  157. package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js +2 -4
  158. package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js.map +1 -1
  159. package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.d.ts +1 -2
  160. package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js +2 -4
  161. package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js.map +1 -1
  162. package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.d.ts +1 -2
  163. package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js +2 -4
  164. package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js.map +1 -1
  165. package/dist/mcp/primitives/gui/tools/gui-select-card.tool.d.ts +1 -2
  166. package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js +2 -4
  167. package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js.map +1 -1
  168. package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.d.ts +1 -2
  169. package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js +2 -4
  170. package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js.map +1 -1
  171. package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.d.ts +1 -2
  172. package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js +2 -4
  173. package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js.map +1 -1
  174. package/dist/mcp/primitives/gui/tools/gui-show-question.tool.d.ts +1 -2
  175. package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js +2 -4
  176. package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js.map +1 -1
  177. package/dist/mcp/primitives/gui/tools/gui-undo.tool.d.ts +1 -2
  178. package/dist/mcp/primitives/gui/tools/gui-undo.tool.js +2 -4
  179. package/dist/mcp/primitives/gui/tools/gui-undo.tool.js.map +1 -1
  180. package/dist/services/ngrok.service.d.ts +1 -0
  181. package/dist/services/ngrok.service.js +5 -3
  182. package/dist/services/ngrok.service.js.map +1 -1
  183. package/dist/test-fixtures/mock-data.d.ts +8 -0
  184. package/dist/test-fixtures/mock-data.js +8 -0
  185. package/dist/test-fixtures/mock-data.js.map +1 -1
  186. package/dist/tunnel/commands/index.d.ts +3 -0
  187. package/dist/tunnel/commands/index.js +10 -0
  188. package/dist/tunnel/commands/index.js.map +1 -0
  189. package/dist/tunnel/commands/login.command.d.ts +2 -0
  190. package/dist/tunnel/commands/login.command.js +29 -0
  191. package/dist/tunnel/commands/login.command.js.map +1 -0
  192. package/dist/tunnel/commands/logout.command.d.ts +2 -0
  193. package/dist/tunnel/commands/logout.command.js +25 -0
  194. package/dist/tunnel/commands/logout.command.js.map +1 -0
  195. package/dist/tunnel/commands/perform-login.d.ts +9 -0
  196. package/dist/tunnel/commands/perform-login.js +72 -0
  197. package/dist/tunnel/commands/perform-login.js.map +1 -0
  198. package/dist/tunnel/commands/tunnel.command.d.ts +3 -0
  199. package/dist/tunnel/commands/tunnel.command.js +225 -0
  200. package/dist/tunnel/commands/tunnel.command.js.map +1 -0
  201. package/dist/tunnel/credentials.service.d.ts +23 -0
  202. package/dist/tunnel/credentials.service.js +152 -0
  203. package/dist/tunnel/credentials.service.js.map +1 -0
  204. package/dist/tunnel/device-flow.service.d.ts +46 -0
  205. package/dist/tunnel/device-flow.service.js +230 -0
  206. package/dist/tunnel/device-flow.service.js.map +1 -0
  207. package/dist/tunnel/in-memory.transport.d.ts +14 -0
  208. package/dist/tunnel/in-memory.transport.js +63 -0
  209. package/dist/tunnel/in-memory.transport.js.map +1 -0
  210. package/dist/tunnel/index.d.ts +6 -0
  211. package/dist/tunnel/index.js +31 -0
  212. package/dist/tunnel/index.js.map +1 -0
  213. package/dist/tunnel/tunnel-mcp.service.d.ts +15 -0
  214. package/dist/tunnel/tunnel-mcp.service.js +100 -0
  215. package/dist/tunnel/tunnel-mcp.service.js.map +1 -0
  216. package/dist/tunnel/tunnel.client.d.ts +60 -0
  217. package/dist/tunnel/tunnel.client.js +386 -0
  218. package/dist/tunnel/tunnel.client.js.map +1 -0
  219. package/dist/tunnel/tunnel.protocol.d.ts +67 -0
  220. package/dist/tunnel/tunnel.protocol.js +25 -0
  221. package/dist/tunnel/tunnel.protocol.js.map +1 -0
  222. package/dist/version.d.ts +2 -0
  223. package/dist/version.js +21 -0
  224. package/dist/version.js.map +1 -0
  225. package/package.json +31 -22
  226. package/dist/anki-config.service.d.ts +0 -11
  227. package/dist/anki-config.service.js +0 -46
  228. package/dist/anki-config.service.js.map +0 -1
  229. package/dist/cli.d.ts +0 -10
  230. package/dist/cli.js.map +0 -1
  231. package/dist/tsconfig.build.tsbuildinfo +0 -1
@@ -13,17 +13,20 @@ 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");
17
18
  const mcp_icons_1 = require("./mcp/mcp-icons");
19
+ const tunnel_mcp_service_1 = require("./tunnel/tunnel-mcp.service");
18
20
  let AppModule = AppModule_1 = class AppModule {
19
- static forStdio() {
21
+ static forStdio(configInput) {
22
+ const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
20
23
  return {
21
24
  module: AppModule_1,
22
25
  imports: [
23
26
  config_1.ConfigModule.forRoot({
24
27
  isGlobal: true,
25
28
  cache: true,
26
- envFilePath: [".env.local", ".env"],
29
+ load: [() => validatedConfig],
27
30
  }),
28
31
  mcp_nest_1.McpModule.forRoot({
29
32
  name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
@@ -34,27 +37,45 @@ let AppModule = AppModule_1 = class AppModule {
34
37
  essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
35
38
  ankiConfigProvider: {
36
39
  provide: essential_1.ANKI_CONFIG,
37
- useClass: anki_config_service_1.AnkiConfigService,
40
+ useClass: app_config_service_1.AppConfigService,
41
+ },
42
+ appConfigProvider: {
43
+ provide: config_2.APP_CONFIG,
44
+ useValue: validatedConfig,
38
45
  },
39
46
  }),
40
47
  gui_1.McpPrimitivesAnkiGuiModule.forRoot({
41
48
  ankiConfigProvider: {
42
49
  provide: essential_1.ANKI_CONFIG,
43
- useClass: anki_config_service_1.AnkiConfigService,
50
+ useClass: app_config_service_1.AppConfigService,
51
+ },
52
+ appConfigProvider: {
53
+ provide: config_2.APP_CONFIG,
54
+ useValue: validatedConfig,
44
55
  },
45
56
  }),
46
57
  ],
47
- providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
58
+ providers: [
59
+ {
60
+ provide: config_2.APP_CONFIG,
61
+ useValue: validatedConfig,
62
+ },
63
+ app_config_service_1.AppConfigService,
64
+ ...essential_1.ESSENTIAL_MCP_TOOLS,
65
+ ...gui_1.GUI_MCP_TOOLS,
66
+ ],
67
+ exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
48
68
  };
49
69
  }
50
- static forHttp() {
70
+ static forHttp(configInput) {
71
+ const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
51
72
  return {
52
73
  module: AppModule_1,
53
74
  imports: [
54
75
  config_1.ConfigModule.forRoot({
55
76
  isGlobal: true,
56
77
  cache: true,
57
- envFilePath: [".env.local", ".env"],
78
+ load: [() => validatedConfig],
58
79
  }),
59
80
  mcp_nest_1.McpModule.forRoot({
60
81
  name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
@@ -66,17 +87,84 @@ let AppModule = AppModule_1 = class AppModule {
66
87
  essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
67
88
  ankiConfigProvider: {
68
89
  provide: essential_1.ANKI_CONFIG,
69
- useClass: anki_config_service_1.AnkiConfigService,
90
+ useClass: app_config_service_1.AppConfigService,
91
+ },
92
+ appConfigProvider: {
93
+ provide: config_2.APP_CONFIG,
94
+ useValue: validatedConfig,
95
+ },
96
+ }),
97
+ gui_1.McpPrimitivesAnkiGuiModule.forRoot({
98
+ ankiConfigProvider: {
99
+ provide: essential_1.ANKI_CONFIG,
100
+ useClass: app_config_service_1.AppConfigService,
101
+ },
102
+ appConfigProvider: {
103
+ provide: config_2.APP_CONFIG,
104
+ useValue: validatedConfig,
105
+ },
106
+ }),
107
+ ],
108
+ providers: [
109
+ {
110
+ provide: config_2.APP_CONFIG,
111
+ useValue: validatedConfig,
112
+ },
113
+ app_config_service_1.AppConfigService,
114
+ ...essential_1.ESSENTIAL_MCP_TOOLS,
115
+ ...gui_1.GUI_MCP_TOOLS,
116
+ ],
117
+ exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
118
+ };
119
+ }
120
+ static forTunnel(cliOverrides) {
121
+ const validatedConfig = (0, config_2.loadValidatedConfig)(cliOverrides);
122
+ return {
123
+ module: AppModule_1,
124
+ imports: [
125
+ config_1.ConfigModule.forRoot({
126
+ isGlobal: true,
127
+ cache: true,
128
+ load: [() => validatedConfig],
129
+ }),
130
+ mcp_nest_1.McpModule.forRoot({
131
+ name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
132
+ version: process.env.MCP_SERVER_VERSION || "1.0.0",
133
+ transport: [],
134
+ icons: mcp_icons_1.MCP_ICONS,
135
+ }),
136
+ essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
137
+ ankiConfigProvider: {
138
+ provide: essential_1.ANKI_CONFIG,
139
+ useClass: app_config_service_1.AppConfigService,
140
+ },
141
+ appConfigProvider: {
142
+ provide: config_2.APP_CONFIG,
143
+ useValue: validatedConfig,
70
144
  },
71
145
  }),
72
146
  gui_1.McpPrimitivesAnkiGuiModule.forRoot({
73
147
  ankiConfigProvider: {
74
148
  provide: essential_1.ANKI_CONFIG,
75
- useClass: anki_config_service_1.AnkiConfigService,
149
+ useClass: app_config_service_1.AppConfigService,
150
+ },
151
+ appConfigProvider: {
152
+ provide: config_2.APP_CONFIG,
153
+ useValue: validatedConfig,
76
154
  },
77
155
  }),
78
156
  ],
79
- providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
157
+ providers: [
158
+ {
159
+ provide: config_2.APP_CONFIG,
160
+ useValue: validatedConfig,
161
+ },
162
+ app_config_service_1.AppConfigService,
163
+ tunnel_mcp_service_1.TunnelMcpService,
164
+ ...essential_1.ESSENTIAL_MCP_TOOLS,
165
+ ...gui_1.GUI_MCP_TOOLS,
166
+ ],
167
+ exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService, tunnel_mcp_service_1.TunnelMcpService],
80
168
  };
81
169
  }
82
170
  };
@@ -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;AAC1D,+CAA4C;AAGrC,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;oBACjC,KAAK,EAAE,qBAAS;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;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;oBAChB,KAAK,EAAE,qBAAS;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;AAvFY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAuFrB"}
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,14 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const cli_output_1 = require("../cli-output");
5
+ const cli = (0, cli_output_1.createCli)(false);
6
+ cli.success("Successfully connected to Anki");
7
+ cli.error("Failed to connect to AnkiConnect");
8
+ cli.warn("AnkiConnect is not running");
9
+ cli.info("Server listening on http://localhost:3000");
10
+ cli.blank();
11
+ cli.dim("(Use Ctrl+C to stop)");
12
+ cli.blank();
13
+ cli.box("Ngrok Tunnel Active", "https://abc123.ngrok.io");
14
+ //# 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,8CAA0C;AAE1C,MAAM,GAAG,GAAG,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC;AAG7B,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;AAC9C,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAC9C,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;AACtD,GAAG,CAAC,KAAK,EAAE,CAAC;AACZ,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAChC,GAAG,CAAC,KAAK,EAAE,CAAC;AACZ,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Cli } from "./cli-output";
2
+ export interface CliOptions {
3
+ port: number;
4
+ host: string;
5
+ ankiConnect: string;
6
+ ngrok: boolean;
7
+ readOnly: boolean;
8
+ login: string | boolean;
9
+ logout: boolean;
10
+ tunnel: string | boolean;
11
+ debug: boolean;
12
+ }
13
+ export declare function checkForUpdates(): void;
14
+ export declare function parseOptionalUrl(raw: string | boolean, flag: string, cli: Cli): string | undefined;
15
+ export declare function parseCliArgs(): CliOptions;
16
+ export declare function displayStartupBanner(cli: Cli, options: CliOptions, ngrokUrl?: string): void;
@@ -4,38 +4,59 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.checkForUpdates = checkForUpdates;
7
+ exports.parseOptionalUrl = parseOptionalUrl;
7
8
  exports.parseCliArgs = parseCliArgs;
8
9
  exports.displayStartupBanner = displayStartupBanner;
9
10
  const commander_1 = require("commander");
10
11
  const fs_1 = require("fs");
11
12
  const path_1 = require("path");
12
13
  const update_notifier_1 = __importDefault(require("update-notifier"));
14
+ const version_1 = require("../version");
13
15
  function getPackageJson() {
14
16
  try {
15
- return JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../package.json"), "utf-8"));
17
+ return JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../../package.json"), "utf-8"));
16
18
  }
17
19
  catch {
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
  }
26
+ function parseOptionalUrl(raw, flag, cli) {
27
+ if (raw === false || raw === true) {
28
+ return undefined;
29
+ }
30
+ let parsed;
31
+ try {
32
+ parsed = new URL(raw);
33
+ }
34
+ catch {
35
+ cli.error(`Invalid ${flag} URL: ${raw === "" ? "(empty string)" : raw}. Expected a ws:// or wss:// URL.`);
36
+ process.exit(1);
37
+ }
38
+ if (parsed.protocol !== "ws:" && parsed.protocol !== "wss:") {
39
+ cli.error(`Invalid ${flag} URL protocol: ${parsed.protocol}. Expected ws:// or wss://.`);
40
+ process.exit(1);
41
+ }
42
+ return raw;
43
+ }
27
44
  function parseCliArgs() {
28
45
  const program = new commander_1.Command();
29
46
  program
30
47
  .name("ankimcp")
31
48
  .description("AnkiMCP Server - Model Context Protocol server for Anki")
32
- .version(getVersion())
49
+ .version((0, version_1.getVersion)())
33
50
  .option("--stdio", "Run in STDIO mode (for MCP clients like Cursor, Cline, Zed)")
34
51
  .option("-p, --port <number>", "Port to listen on (HTTP mode)", "3000")
35
52
  .option("-h, --host <address>", "Host to bind to (HTTP mode)", "127.0.0.1")
36
53
  .option("-a, --anki-connect <url>", "AnkiConnect URL", "http://localhost:8765")
37
54
  .option("--ngrok", "Start ngrok tunnel (requires global ngrok installation)")
38
55
  .option("--read-only", "Run in read-only mode (blocks all write operations)")
56
+ .option("--login [url]", "Authenticate with tunnel service (also triggered automatically by --tunnel when needed)")
57
+ .option("--logout", "Clear tunnel credentials")
58
+ .option("--tunnel [url]", "Connect to tunnel server (auto-launches browser login if not authenticated; default URL: wss://tunnel.ankimcp.ai)")
59
+ .option("-d, --debug", "Enable debug logging (shows stack traces)")
39
60
  .addHelpText("after", `
40
61
  Transport Modes:
41
62
  HTTP Mode (default): For web-based AI assistants (ChatGPT, Claude.ai)
@@ -74,6 +95,14 @@ Ngrok Setup (one-time):
74
95
  2. Get auth token from: https://dashboard.ngrok.com/get-started/your-authtoken
75
96
  3. Setup: ngrok config add-authtoken <your-token>
76
97
  4. Run: ankimcp --ngrok
98
+
99
+ Tunnel Mode:
100
+ $ ankimcp --tunnel # Connect to wss://tunnel.ankimcp.ai
101
+ # (auto-launches browser login if needed)
102
+ $ ankimcp --tunnel wss://tunnel.ankimcp.ai/tunnel # Production tunnel (explicit)
103
+ $ ankimcp --login # Pre-authenticate (optional)
104
+ $ ankimcp --login wss://custom.server.com/tunnel # Login to custom server
105
+ $ ankimcp --logout # Clear saved credentials
77
106
  `);
78
107
  program.parse();
79
108
  const options = program.opts();
@@ -83,17 +112,21 @@ Ngrok Setup (one-time):
83
112
  ankiConnect: options.ankiConnect,
84
113
  ngrok: options.ngrok || false,
85
114
  readOnly: options.readOnly || false,
115
+ login: options.login ?? false,
116
+ logout: options.logout || false,
117
+ tunnel: options.tunnel ?? false,
118
+ debug: options.debug || false,
86
119
  };
87
120
  }
88
- function displayStartupBanner(options, ngrokUrl) {
89
- const version = getVersion();
121
+ function displayStartupBanner(cli, options, ngrokUrl) {
122
+ const version = (0, version_1.getVersion)();
90
123
  const title = `AnkiMCP HTTP Server v${version}`;
91
124
  const padding = Math.floor((64 - title.length) / 2);
92
125
  const paddedTitle = " ".repeat(padding) + title + " ".repeat(64 - padding - title.length);
93
126
  const readOnlyWarning = options.readOnly
94
127
  ? "\n\n** READ-ONLY MODE ENABLED **\nContent modifications (addNote, deleteNotes, createDeck, etc.) are blocked.\nReview operations (sync, answerCards, suspend) remain available."
95
128
  : "";
96
- console.log(`
129
+ cli.info(`
97
130
  ╔════════════════════════════════════════════════════════════════╗
98
131
  ║${paddedTitle}║
99
132
  ╚════════════════════════════════════════════════════════════════╝${readOnlyWarning}
@@ -120,4 +153,4 @@ Share this URL with your AI assistant:
120
153
  Run 'ankimcp --help' for more options.
121
154
  `);
122
155
  }
123
- //# sourceMappingURL=cli.js.map
156
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function success(message: string): void;
2
+ export declare function warn(message: string): void;
3
+ export declare function info(message: string): void;
4
+ export declare function blank(): void;
5
+ export declare function box(title: string, content: string): void;
6
+ export declare function dim(message: string): void;
7
+ export declare function error(message: string, err?: Error, debug?: boolean): void;
8
+ export interface Cli {
9
+ success(message: string): void;
10
+ error(message: string, err?: Error): void;
11
+ warn(message: string): void;
12
+ info(message: string): void;
13
+ blank(): void;
14
+ box(title: string, content: string): void;
15
+ dim(message: string): void;
16
+ }
17
+ export declare function createCli(debug: boolean): Cli;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.success = success;
4
+ exports.warn = warn;
5
+ exports.info = info;
6
+ exports.blank = blank;
7
+ exports.box = box;
8
+ exports.dim = dim;
9
+ exports.error = error;
10
+ exports.createCli = createCli;
11
+ const colors = {
12
+ reset: "\x1b[0m",
13
+ green: "\x1b[32m",
14
+ red: "\x1b[31m",
15
+ yellow: "\x1b[33m",
16
+ cyan: "\x1b[36m",
17
+ dim: "\x1b[2m",
18
+ };
19
+ function success(message) {
20
+ console.log(`${colors.green}✓${colors.reset} ${message}`);
21
+ }
22
+ function warn(message) {
23
+ console.warn(`${colors.yellow}!${colors.reset} ${message}`);
24
+ }
25
+ function info(message) {
26
+ console.log(message);
27
+ }
28
+ function blank() {
29
+ console.log();
30
+ }
31
+ function box(title, content) {
32
+ const width = Math.max(title.length, content.length) + 4;
33
+ const border = "─".repeat(width);
34
+ console.log(`┌${border}┐`);
35
+ console.log(`│ ${title.padEnd(width - 2)} │`);
36
+ console.log(`├${border}┤`);
37
+ console.log(`│ ${content.padEnd(width - 2)} │`);
38
+ console.log(`└${border}┘`);
39
+ }
40
+ function dim(message) {
41
+ console.log(`${colors.dim}${message}${colors.reset}`);
42
+ }
43
+ function error(message, err, debug = false) {
44
+ console.error(`${colors.red}✗${colors.reset} ${message}`);
45
+ if (err && debug && err.stack) {
46
+ console.error(`${colors.dim}${err.stack}${colors.reset}`);
47
+ }
48
+ }
49
+ function createCli(debug) {
50
+ return {
51
+ success,
52
+ warn,
53
+ info,
54
+ blank,
55
+ box,
56
+ dim,
57
+ error: (message, err) => error(message, err, debug),
58
+ };
59
+ }
60
+ //# sourceMappingURL=cli-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/cli/cli-output.ts"],"names":[],"mappings":";;AA0BA,0BAEC;AAKD,oBAEC;AAKD,oBAEC;AAKD,sBAEC;AAKD,kBASC;AAKD,kBAEC;AAWD,sBAKC;AA0BD,8BAUC;AA5GD,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;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;AAWD,SAAgB,KAAK,CAAC,OAAe,EAAE,GAAW,EAAE,KAAK,GAAG,KAAK;IAC/D,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AA0BD,SAAgB,SAAS,CAAC,KAAc;IACtC,OAAO;QACL,OAAO;QACP,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,GAAG;QACH,GAAG;QACH,KAAK,EAAE,CAAC,OAAe,EAAE,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;KACpE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./args";
2
+ export * from "./cli-output";
3
+ export * from "./spinner";
@@ -0,0 +1,20 @@
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("./args"), exports);
18
+ __exportStar(require("./cli-output"), exports);
19
+ __exportStar(require("./spinner"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,4CAA0B"}
@@ -0,0 +1 @@
1
+ export declare function startSpinner(message: string): () => void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startSpinner = startSpinner;
4
+ function startSpinner(message) {
5
+ const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
6
+ let i = 0;
7
+ const interval = setInterval(() => {
8
+ process.stdout.write(`\r${frames[i]} ${message}`);
9
+ i = (i + 1) % frames.length;
10
+ }, 80);
11
+ return () => {
12
+ clearInterval(interval);
13
+ process.stdout.write("\r");
14
+ };
15
+ }
16
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/cli/spinner.ts"],"names":[],"mappings":";;AAmBA,oCAaC;AAbD,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,GAAG,EAAE;QACV,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
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
+ readOnly?: boolean;
8
+ tunnel?: string | boolean;
9
+ ngrok?: boolean;
10
+ debug?: boolean;
11
+ }
12
+ export declare function buildConfigInput(cliOverrides?: CliOverrides): ConfigInput;
13
+ export declare function loadValidatedConfig(cliOverrides?: CliOverrides): AppConfig;
@@ -0,0 +1,32 @@
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 (cliOverrides.readOnly !== undefined) {
18
+ input.READ_ONLY = cliOverrides.readOnly ? "true" : "false";
19
+ }
20
+ if (typeof cliOverrides.tunnel === "string") {
21
+ input.TUNNEL_SERVER_URL = cliOverrides.tunnel;
22
+ }
23
+ if (cliOverrides.debug) {
24
+ input.LOG_LEVEL = "debug";
25
+ }
26
+ return input;
27
+ }
28
+ function loadValidatedConfig(cliOverrides = {}) {
29
+ const input = buildConfigInput(cliOverrides);
30
+ return config_schema_1.configSchema.parse((0, config_schema_1.transformEnvToConfig)(input));
31
+ }
32
+ //# sourceMappingURL=config.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.factory.js","sourceRoot":"","sources":["../../src/config/config.factory.ts"],"names":[],"mappings":";;AA8BA,4CAwBC;AAMD,kDAKC;AAjED,mDAAgF;AA8BhF,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,YAAY,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,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"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export declare const configSchema: z.ZodObject<{
3
+ port: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
4
+ host: z.ZodDefault<z.ZodString>;
5
+ nodeEnv: z.ZodDefault<z.ZodEnum<{
6
+ development: "development";
7
+ production: "production";
8
+ test: "test";
9
+ }>>;
10
+ ankiConnect: z.ZodObject<{
11
+ url: z.ZodDefault<z.ZodString>;
12
+ apiKey: z.ZodOptional<z.ZodString>;
13
+ apiVersion: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
14
+ timeout: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
15
+ }, z.core.$strip>;
16
+ auth: z.ZodObject<{
17
+ clientId: z.ZodDefault<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ tunnel: z.ZodObject<{
20
+ serverUrl: z.ZodDefault<z.ZodString>;
21
+ }, z.core.$strip>;
22
+ readOnly: z.ZodDefault<z.ZodPreprocess<z.ZodBoolean>>;
23
+ logLevel: z.ZodDefault<z.ZodEnum<{
24
+ error: "error";
25
+ debug: "debug";
26
+ info: "info";
27
+ warn: "warn";
28
+ }>>;
29
+ }, z.core.$strip>;
30
+ export type AppConfig = z.infer<typeof configSchema>;
31
+ export declare function transformEnvToConfig(env: Record<string, any>): any;