@padua/cli 1.13.0 → 2.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 (272) hide show
  1. package/README.md +164 -11
  2. package/dist/commands/doctor/index.d.ts.map +1 -1
  3. package/dist/commands/doctor/index.js +85 -0
  4. package/dist/commands/doctor/index.js.map +1 -1
  5. package/dist/commands/doctor/mcp-checks.d.ts +36 -0
  6. package/dist/commands/doctor/mcp-checks.d.ts.map +1 -0
  7. package/dist/commands/doctor/mcp-checks.js +235 -0
  8. package/dist/commands/doctor/mcp-checks.js.map +1 -0
  9. package/dist/commands/doctor/mcp-service-checks.d.ts +35 -0
  10. package/dist/commands/doctor/mcp-service-checks.d.ts.map +1 -0
  11. package/dist/commands/doctor/mcp-service-checks.js +146 -0
  12. package/dist/commands/doctor/mcp-service-checks.js.map +1 -0
  13. package/dist/commands/doctor/types.d.ts +4 -1
  14. package/dist/commands/doctor/types.d.ts.map +1 -1
  15. package/dist/commands/doctor/types.js +1 -0
  16. package/dist/commands/doctor/types.js.map +1 -1
  17. package/dist/commands/init/sso-discovery.d.ts.map +1 -1
  18. package/dist/commands/init/sso-discovery.js +1 -0
  19. package/dist/commands/init/sso-discovery.js.map +1 -1
  20. package/dist/commands/login/index.d.ts +1 -1
  21. package/dist/commands/login/index.d.ts.map +1 -1
  22. package/dist/commands/login/index.js +44 -185
  23. package/dist/commands/login/index.js.map +1 -1
  24. package/dist/commands/login/mcp-steps.d.ts +38 -0
  25. package/dist/commands/login/mcp-steps.d.ts.map +1 -0
  26. package/dist/commands/login/mcp-steps.js +176 -0
  27. package/dist/commands/login/mcp-steps.js.map +1 -0
  28. package/dist/commands/login/npmrc.d.ts +10 -0
  29. package/dist/commands/login/npmrc.d.ts.map +1 -1
  30. package/dist/commands/login/npmrc.js +36 -3
  31. package/dist/commands/login/npmrc.js.map +1 -1
  32. package/dist/commands/login/orchestrator.d.ts +9 -0
  33. package/dist/commands/login/orchestrator.d.ts.map +1 -0
  34. package/dist/commands/login/orchestrator.js +251 -0
  35. package/dist/commands/login/orchestrator.js.map +1 -0
  36. package/dist/commands/login/types.d.ts +11 -0
  37. package/dist/commands/login/types.d.ts.map +1 -1
  38. package/dist/commands/login/types.js.map +1 -1
  39. package/dist/commands/status/aws-checks.d.ts +14 -0
  40. package/dist/commands/status/aws-checks.d.ts.map +1 -0
  41. package/dist/commands/status/aws-checks.js +145 -0
  42. package/dist/commands/status/aws-checks.js.map +1 -0
  43. package/dist/commands/status/checks.d.ts +9 -25
  44. package/dist/commands/status/checks.d.ts.map +1 -1
  45. package/dist/commands/status/checks.js +52 -254
  46. package/dist/commands/status/checks.js.map +1 -1
  47. package/dist/commands/status/index.d.ts.map +1 -1
  48. package/dist/commands/status/index.js +53 -1
  49. package/dist/commands/status/index.js.map +1 -1
  50. package/dist/commands/status/mcp-checks.d.ts +35 -0
  51. package/dist/commands/status/mcp-checks.d.ts.map +1 -0
  52. package/dist/commands/status/mcp-checks.js +175 -0
  53. package/dist/commands/status/mcp-checks.js.map +1 -0
  54. package/dist/commands/status/types.d.ts +34 -0
  55. package/dist/commands/status/types.d.ts.map +1 -1
  56. package/dist/mcp/config/index.d.ts +4 -0
  57. package/dist/mcp/config/index.d.ts.map +1 -0
  58. package/dist/mcp/config/index.js +14 -0
  59. package/dist/mcp/config/index.js.map +1 -0
  60. package/dist/mcp/config/loaders.d.ts +45 -0
  61. package/dist/mcp/config/loaders.d.ts.map +1 -0
  62. package/dist/mcp/config/loaders.js +149 -0
  63. package/dist/mcp/config/loaders.js.map +1 -0
  64. package/dist/mcp/config/types.d.ts +234 -0
  65. package/dist/mcp/config/types.d.ts.map +1 -0
  66. package/dist/mcp/config/types.js +45 -0
  67. package/dist/mcp/config/types.js.map +1 -0
  68. package/dist/mcp/daemon/entry-logic.d.ts +28 -0
  69. package/dist/mcp/daemon/entry-logic.d.ts.map +1 -0
  70. package/dist/mcp/daemon/entry-logic.js +82 -0
  71. package/dist/mcp/daemon/entry-logic.js.map +1 -0
  72. package/dist/mcp/daemon/entry.d.ts +8 -0
  73. package/dist/mcp/daemon/entry.d.ts.map +1 -0
  74. package/dist/mcp/daemon/entry.js +34 -0
  75. package/dist/mcp/daemon/entry.js.map +1 -0
  76. package/dist/mcp/daemon/fork.d.ts +21 -0
  77. package/dist/mcp/daemon/fork.d.ts.map +1 -0
  78. package/dist/mcp/daemon/fork.js +188 -0
  79. package/dist/mcp/daemon/fork.js.map +1 -0
  80. package/dist/mcp/daemon/health.d.ts +8 -0
  81. package/dist/mcp/daemon/health.d.ts.map +1 -0
  82. package/dist/mcp/daemon/health.js +50 -0
  83. package/dist/mcp/daemon/health.js.map +1 -0
  84. package/dist/mcp/daemon/index.d.ts +6 -0
  85. package/dist/mcp/daemon/index.d.ts.map +1 -0
  86. package/dist/mcp/daemon/index.js +22 -0
  87. package/dist/mcp/daemon/index.js.map +1 -0
  88. package/dist/mcp/daemon/types.d.ts +63 -0
  89. package/dist/mcp/daemon/types.d.ts.map +1 -0
  90. package/dist/mcp/daemon/types.js +18 -0
  91. package/dist/mcp/daemon/types.js.map +1 -0
  92. package/dist/mcp/errors/index.d.ts +3 -0
  93. package/dist/mcp/errors/index.d.ts.map +1 -0
  94. package/dist/mcp/errors/index.js +13 -0
  95. package/dist/mcp/errors/index.js.map +1 -0
  96. package/dist/mcp/errors/types.d.ts +83 -0
  97. package/dist/mcp/errors/types.d.ts.map +1 -0
  98. package/dist/mcp/errors/types.js +148 -0
  99. package/dist/mcp/errors/types.js.map +1 -0
  100. package/dist/mcp/providers/atlassian/auth.d.ts +34 -0
  101. package/dist/mcp/providers/atlassian/auth.d.ts.map +1 -0
  102. package/dist/mcp/providers/atlassian/auth.js +107 -0
  103. package/dist/mcp/providers/atlassian/auth.js.map +1 -0
  104. package/dist/mcp/providers/atlassian/client.d.ts +15 -0
  105. package/dist/mcp/providers/atlassian/client.d.ts.map +1 -0
  106. package/dist/mcp/providers/atlassian/client.js +38 -0
  107. package/dist/mcp/providers/atlassian/client.js.map +1 -0
  108. package/dist/mcp/providers/atlassian/index.d.ts +6 -0
  109. package/dist/mcp/providers/atlassian/index.d.ts.map +1 -0
  110. package/dist/mcp/providers/atlassian/index.js +11 -0
  111. package/dist/mcp/providers/atlassian/index.js.map +1 -0
  112. package/dist/mcp/providers/atlassian/markdown-to-adf/index.d.ts +17 -0
  113. package/dist/mcp/providers/atlassian/markdown-to-adf/index.d.ts.map +1 -0
  114. package/dist/mcp/providers/atlassian/markdown-to-adf/index.js +29 -0
  115. package/dist/mcp/providers/atlassian/markdown-to-adf/index.js.map +1 -0
  116. package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.d.ts +43 -0
  117. package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.d.ts.map +1 -0
  118. package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.js +101 -0
  119. package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.js.map +1 -0
  120. package/dist/mcp/providers/atlassian/markdown-to-adf/parser.d.ts +14 -0
  121. package/dist/mcp/providers/atlassian/markdown-to-adf/parser.d.ts.map +1 -0
  122. package/dist/mcp/providers/atlassian/markdown-to-adf/parser.js +250 -0
  123. package/dist/mcp/providers/atlassian/markdown-to-adf/parser.js.map +1 -0
  124. package/dist/mcp/providers/atlassian/provider.d.ts +38 -0
  125. package/dist/mcp/providers/atlassian/provider.d.ts.map +1 -0
  126. package/dist/mcp/providers/atlassian/provider.js +101 -0
  127. package/dist/mcp/providers/atlassian/provider.js.map +1 -0
  128. package/dist/mcp/providers/atlassian/resources.d.ts +4 -0
  129. package/dist/mcp/providers/atlassian/resources.d.ts.map +1 -0
  130. package/dist/mcp/providers/atlassian/resources.js +67 -0
  131. package/dist/mcp/providers/atlassian/resources.js.map +1 -0
  132. package/dist/mcp/providers/atlassian/tools/confluence.d.ts +4 -0
  133. package/dist/mcp/providers/atlassian/tools/confluence.d.ts.map +1 -0
  134. package/dist/mcp/providers/atlassian/tools/confluence.js +169 -0
  135. package/dist/mcp/providers/atlassian/tools/confluence.js.map +1 -0
  136. package/dist/mcp/providers/atlassian/tools/jira.d.ts +4 -0
  137. package/dist/mcp/providers/atlassian/tools/jira.d.ts.map +1 -0
  138. package/dist/mcp/providers/atlassian/tools/jira.js +274 -0
  139. package/dist/mcp/providers/atlassian/tools/jira.js.map +1 -0
  140. package/dist/mcp/providers/gitlab/auth.d.ts +10 -0
  141. package/dist/mcp/providers/gitlab/auth.d.ts.map +1 -0
  142. package/dist/mcp/providers/gitlab/auth.js +23 -0
  143. package/dist/mcp/providers/gitlab/auth.js.map +1 -0
  144. package/dist/mcp/providers/gitlab/client.d.ts +23 -0
  145. package/dist/mcp/providers/gitlab/client.d.ts.map +1 -0
  146. package/dist/mcp/providers/gitlab/client.js +17 -0
  147. package/dist/mcp/providers/gitlab/client.js.map +1 -0
  148. package/dist/mcp/providers/gitlab/index.d.ts +5 -0
  149. package/dist/mcp/providers/gitlab/index.d.ts.map +1 -0
  150. package/dist/mcp/providers/gitlab/index.js +10 -0
  151. package/dist/mcp/providers/gitlab/index.js.map +1 -0
  152. package/dist/mcp/providers/gitlab/provider.d.ts +25 -0
  153. package/dist/mcp/providers/gitlab/provider.d.ts.map +1 -0
  154. package/dist/mcp/providers/gitlab/provider.js +48 -0
  155. package/dist/mcp/providers/gitlab/provider.js.map +1 -0
  156. package/dist/mcp/providers/gitlab/resources.d.ts +11 -0
  157. package/dist/mcp/providers/gitlab/resources.d.ts.map +1 -0
  158. package/dist/mcp/providers/gitlab/resources.js +54 -0
  159. package/dist/mcp/providers/gitlab/resources.js.map +1 -0
  160. package/dist/mcp/providers/gitlab/tools/issues.d.ts +4 -0
  161. package/dist/mcp/providers/gitlab/tools/issues.d.ts.map +1 -0
  162. package/dist/mcp/providers/gitlab/tools/issues.js +120 -0
  163. package/dist/mcp/providers/gitlab/tools/issues.js.map +1 -0
  164. package/dist/mcp/providers/gitlab/tools/merge-requests.d.ts +11 -0
  165. package/dist/mcp/providers/gitlab/tools/merge-requests.d.ts.map +1 -0
  166. package/dist/mcp/providers/gitlab/tools/merge-requests.js +282 -0
  167. package/dist/mcp/providers/gitlab/tools/merge-requests.js.map +1 -0
  168. package/dist/mcp/providers/gitlab/tools/pipelines.d.ts +10 -0
  169. package/dist/mcp/providers/gitlab/tools/pipelines.d.ts.map +1 -0
  170. package/dist/mcp/providers/gitlab/tools/pipelines.js +173 -0
  171. package/dist/mcp/providers/gitlab/tools/pipelines.js.map +1 -0
  172. package/dist/mcp/providers/gitlab/tools/repository.d.ts +4 -0
  173. package/dist/mcp/providers/gitlab/tools/repository.d.ts.map +1 -0
  174. package/dist/mcp/providers/gitlab/tools/repository.js +191 -0
  175. package/dist/mcp/providers/gitlab/tools/repository.js.map +1 -0
  176. package/dist/mcp/providers/index.d.ts +4 -0
  177. package/dist/mcp/providers/index.d.ts.map +1 -0
  178. package/dist/mcp/providers/index.js +6 -0
  179. package/dist/mcp/providers/index.js.map +1 -0
  180. package/dist/mcp/providers/registry.d.ts +90 -0
  181. package/dist/mcp/providers/registry.d.ts.map +1 -0
  182. package/dist/mcp/providers/registry.js +128 -0
  183. package/dist/mcp/providers/registry.js.map +1 -0
  184. package/dist/mcp/providers/tool-helpers.d.ts +14 -0
  185. package/dist/mcp/providers/tool-helpers.d.ts.map +1 -0
  186. package/dist/mcp/providers/tool-helpers.js +12 -0
  187. package/dist/mcp/providers/tool-helpers.js.map +1 -0
  188. package/dist/mcp/providers/types.d.ts +80 -0
  189. package/dist/mcp/providers/types.d.ts.map +1 -0
  190. package/dist/mcp/providers/types.js +13 -0
  191. package/dist/mcp/providers/types.js.map +1 -0
  192. package/dist/mcp/server/auth.d.ts +8 -0
  193. package/dist/mcp/server/auth.d.ts.map +1 -0
  194. package/dist/mcp/server/auth.js +36 -0
  195. package/dist/mcp/server/auth.js.map +1 -0
  196. package/dist/mcp/server/health.d.ts +24 -0
  197. package/dist/mcp/server/health.d.ts.map +1 -0
  198. package/dist/mcp/server/health.js +37 -0
  199. package/dist/mcp/server/health.js.map +1 -0
  200. package/dist/mcp/server/index.d.ts +11 -0
  201. package/dist/mcp/server/index.d.ts.map +1 -0
  202. package/dist/mcp/server/index.js +27 -0
  203. package/dist/mcp/server/index.js.map +1 -0
  204. package/dist/mcp/server/logging.d.ts +46 -0
  205. package/dist/mcp/server/logging.d.ts.map +1 -0
  206. package/dist/mcp/server/logging.js +109 -0
  207. package/dist/mcp/server/logging.js.map +1 -0
  208. package/dist/mcp/server/ratelimit.d.ts +3 -0
  209. package/dist/mcp/server/ratelimit.d.ts.map +1 -0
  210. package/dist/mcp/server/ratelimit.js +70 -0
  211. package/dist/mcp/server/ratelimit.js.map +1 -0
  212. package/dist/mcp/server/routes.d.ts +3 -0
  213. package/dist/mcp/server/routes.d.ts.map +1 -0
  214. package/dist/mcp/server/routes.js +8 -0
  215. package/dist/mcp/server/routes.js.map +1 -0
  216. package/dist/mcp/server/server.d.ts +21 -0
  217. package/dist/mcp/server/server.d.ts.map +1 -0
  218. package/dist/mcp/server/server.js +114 -0
  219. package/dist/mcp/server/server.js.map +1 -0
  220. package/dist/mcp/server/validation.d.ts +22 -0
  221. package/dist/mcp/server/validation.d.ts.map +1 -0
  222. package/dist/mcp/server/validation.js +32 -0
  223. package/dist/mcp/server/validation.js.map +1 -0
  224. package/dist/mcp/store/encrypt.d.ts +22 -0
  225. package/dist/mcp/store/encrypt.d.ts.map +1 -0
  226. package/dist/mcp/store/encrypt.js +66 -0
  227. package/dist/mcp/store/encrypt.js.map +1 -0
  228. package/dist/mcp/store/index.d.ts +12 -0
  229. package/dist/mcp/store/index.d.ts.map +1 -0
  230. package/dist/mcp/store/index.js +16 -0
  231. package/dist/mcp/store/index.js.map +1 -0
  232. package/dist/mcp/store/migrate.d.ts +70 -0
  233. package/dist/mcp/store/migrate.d.ts.map +1 -0
  234. package/dist/mcp/store/migrate.js +211 -0
  235. package/dist/mcp/store/migrate.js.map +1 -0
  236. package/dist/mcp/store/null-token-store.d.ts +22 -0
  237. package/dist/mcp/store/null-token-store.d.ts.map +1 -0
  238. package/dist/mcp/store/null-token-store.js +40 -0
  239. package/dist/mcp/store/null-token-store.js.map +1 -0
  240. package/dist/mcp/store/sqlite.d.ts +27 -0
  241. package/dist/mcp/store/sqlite.d.ts.map +1 -0
  242. package/dist/mcp/store/sqlite.js +100 -0
  243. package/dist/mcp/store/sqlite.js.map +1 -0
  244. package/dist/mcp/store/types.d.ts +183 -0
  245. package/dist/mcp/store/types.d.ts.map +1 -0
  246. package/dist/mcp/store/types.js +13 -0
  247. package/dist/mcp/store/types.js.map +1 -0
  248. package/dist/mcp/token/http-client.d.ts +3 -0
  249. package/dist/mcp/token/http-client.d.ts.map +1 -0
  250. package/dist/mcp/token/http-client.js +186 -0
  251. package/dist/mcp/token/http-client.js.map +1 -0
  252. package/dist/mcp/token/index.d.ts +5 -0
  253. package/dist/mcp/token/index.d.ts.map +1 -0
  254. package/dist/mcp/token/index.js +15 -0
  255. package/dist/mcp/token/index.js.map +1 -0
  256. package/dist/mcp/token/manager.d.ts +54 -0
  257. package/dist/mcp/token/manager.d.ts.map +1 -0
  258. package/dist/mcp/token/manager.js +194 -0
  259. package/dist/mcp/token/manager.js.map +1 -0
  260. package/dist/mcp/token/null-token-manager.d.ts +19 -0
  261. package/dist/mcp/token/null-token-manager.d.ts.map +1 -0
  262. package/dist/mcp/token/null-token-manager.js +50 -0
  263. package/dist/mcp/token/null-token-manager.js.map +1 -0
  264. package/dist/mcp/token/oauth.d.ts +44 -0
  265. package/dist/mcp/token/oauth.d.ts.map +1 -0
  266. package/dist/mcp/token/oauth.js +257 -0
  267. package/dist/mcp/token/oauth.js.map +1 -0
  268. package/dist/mcp/token/types.d.ts +81 -0
  269. package/dist/mcp/token/types.d.ts.map +1 -0
  270. package/dist/mcp/token/types.js +6 -0
  271. package/dist/mcp/token/types.js.map +1 -0
  272. package/package.json +10 -3
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * MCP config loader functions.
4
+ *
5
+ * Reads padua.config.json (mcp key) and mcp-providers.json,
6
+ * validates with Zod schemas from types.ts, and returns typed defaults.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getDefaultMcpConfig = getDefaultMcpConfig;
10
+ exports.loadMcpConfig = loadMcpConfig;
11
+ exports.loadProvidersConfig = loadProvidersConfig;
12
+ exports.downloadProvidersConfig = downloadProvidersConfig;
13
+ const child_process_1 = require("child_process");
14
+ const fs_1 = require("fs");
15
+ const os_1 = require("os");
16
+ const path_1 = require("path");
17
+ const types_1 = require("./types");
18
+ const errors_1 = require("../errors");
19
+ // ---------------------------------------------------------------------------
20
+ // Path constants
21
+ // ---------------------------------------------------------------------------
22
+ const PADUA_DIR = (0, path_1.join)((0, os_1.homedir)(), '.padua');
23
+ const LOCAL_CONFIG_PATH = (0, path_1.join)(PADUA_DIR, 'padua.config.json');
24
+ const PROVIDERS_CONFIG_PATH = (0, path_1.join)(PADUA_DIR, 'mcp-providers.json');
25
+ const S3_PROVIDERS_URI = 's3://paduafg-developers/mcp-config.json';
26
+ // ---------------------------------------------------------------------------
27
+ // Defaults
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Returns a fresh McpLocalConfig object containing all default values.
31
+ * All fields are populated so callers can rely on the result being complete.
32
+ */
33
+ function getDefaultMcpConfig() {
34
+ return {
35
+ port: 8919,
36
+ store: {
37
+ path: (0, path_1.join)(PADUA_DIR, 'tokens.db'),
38
+ encryptionKeySource: 'keychain',
39
+ },
40
+ logging: {
41
+ level: 'info',
42
+ },
43
+ };
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // loadMcpConfig
47
+ // ---------------------------------------------------------------------------
48
+ /**
49
+ * Reads the `mcp` key from `~/.padua/padua.config.json` (or `configPath`) and
50
+ * returns a validated McpLocalConfig merged over the defaults.
51
+ *
52
+ * Returns defaults when:
53
+ * - The file does not exist.
54
+ * - The file exists but has no `mcp` key.
55
+ *
56
+ * Throws ValidationError (code INVALID_CONFIG) when:
57
+ * - The `mcp` key is present but fails Zod validation.
58
+ * - The file contains invalid JSON.
59
+ */
60
+ function loadMcpConfig(configPath) {
61
+ const filePath = configPath ?? LOCAL_CONFIG_PATH;
62
+ if (!(0, fs_1.existsSync)(filePath)) {
63
+ return getDefaultMcpConfig();
64
+ }
65
+ const raw = parseJsonFile(filePath);
66
+ const mcpRaw = raw.mcp ?? {};
67
+ const result = types_1.McpLocalConfigSchema.safeParse(mcpRaw);
68
+ if (!result.success) {
69
+ throw new errors_1.ValidationError(`Invalid mcp config: ${result.error.message}`, errors_1.ErrorCodes.INVALID_CONFIG);
70
+ }
71
+ return mergeWithDefaults(result.data);
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // loadProvidersConfig
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Reads `~/.padua/mcp-providers.json` (or `configPath`) and returns a validated
78
+ * McpProvidersConfig.
79
+ *
80
+ * Returns null when the file does not exist (not an error condition — the user
81
+ * simply has not downloaded the provider config yet).
82
+ *
83
+ * Throws ValidationError (code INVALID_CONFIG) when:
84
+ * - The file exists but fails Zod validation.
85
+ * - The file contains invalid JSON.
86
+ */
87
+ function loadProvidersConfig(configPath) {
88
+ const filePath = configPath ?? PROVIDERS_CONFIG_PATH;
89
+ if (!(0, fs_1.existsSync)(filePath)) {
90
+ return null;
91
+ }
92
+ const raw = parseJsonFile(filePath);
93
+ const result = types_1.McpProvidersConfigSchema.safeParse(raw);
94
+ if (!result.success) {
95
+ throw new errors_1.ValidationError(`Invalid mcp-providers.json: ${result.error.message}`, errors_1.ErrorCodes.INVALID_CONFIG);
96
+ }
97
+ return result.data;
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // downloadProvidersConfig
101
+ // ---------------------------------------------------------------------------
102
+ /**
103
+ * Downloads the provider config from S3 using the active SSO profile and writes
104
+ * it to `~/.padua/mcp-providers.json` with permissions 0o600.
105
+ *
106
+ * Throws an Error when the aws CLI exits with a non-zero status code.
107
+ */
108
+ async function downloadProvidersConfig(profile) {
109
+ const result = (0, child_process_1.spawnSync)('aws', ['s3', 'cp', S3_PROVIDERS_URI, PROVIDERS_CONFIG_PATH, '--profile', profile], { stdio: 'pipe' });
110
+ if (result.status !== 0) {
111
+ const stderr = result.stderr?.toString() ?? '';
112
+ throw new Error(`Failed to download mcp-providers.json: ${stderr}`);
113
+ }
114
+ (0, fs_1.chmodSync)(PROVIDERS_CONFIG_PATH, 0o600);
115
+ }
116
+ // ---------------------------------------------------------------------------
117
+ // Internal helpers
118
+ // ---------------------------------------------------------------------------
119
+ /**
120
+ * Reads and parses a JSON file. Throws an Error with a clear message when
121
+ * the file content is not valid JSON (SyntaxError from JSON.parse).
122
+ */
123
+ function parseJsonFile(filePath) {
124
+ const content = (0, fs_1.readFileSync)(filePath, 'utf8');
125
+ try {
126
+ return JSON.parse(content);
127
+ }
128
+ catch (err) {
129
+ throw new errors_1.ValidationError(`Failed to parse JSON at ${filePath}: ${err.message}`, errors_1.ErrorCodes.INVALID_CONFIG);
130
+ }
131
+ }
132
+ /**
133
+ * Merges user-supplied McpLocalConfig values over the defaults.
134
+ * Only top-level keys present in `userConfig` overwrite defaults; nested objects
135
+ * are merged shallowly so the user can override a single sub-field.
136
+ */
137
+ function mergeWithDefaults(userConfig) {
138
+ const defaults = getDefaultMcpConfig();
139
+ return {
140
+ port: userConfig.port ?? defaults.port,
141
+ store: userConfig.store
142
+ ? { ...defaults.store, ...userConfig.store }
143
+ : defaults.store,
144
+ logging: userConfig.logging
145
+ ? { ...defaults.logging, ...userConfig.logging }
146
+ : defaults.logging,
147
+ };
148
+ }
149
+ //# sourceMappingURL=loaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.js","sourceRoot":"","sources":["../../../src/mcp/config/loaders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * MCP daemon local settings read from the `mcp` key in padua.config.json.
4
+ * All fields are optional; callers apply defaults at load time.
5
+ */
6
+ export interface McpLocalConfig {
7
+ /** Listening port for the MCP HTTP server. Default: 8919. */
8
+ port?: number;
9
+ store?: {
10
+ /** Absolute path to the SQLite token database. Default: ~/.padua/tokens.db */
11
+ path?: string;
12
+ /** Source for the AES-256-GCM encryption key. Default: keychain. */
13
+ encryptionKeySource?: 'keychain' | 'env';
14
+ };
15
+ logging?: {
16
+ /** Log verbosity level. Default: info. */
17
+ level?: 'debug' | 'info' | 'warn' | 'error';
18
+ /** Absolute path to the log file. Defaults to stderr when absent. */
19
+ path?: string;
20
+ };
21
+ }
22
+ export declare const McpLocalConfigSchema: z.ZodObject<{
23
+ port: z.ZodOptional<z.ZodNumber>;
24
+ store: z.ZodOptional<z.ZodObject<{
25
+ path: z.ZodOptional<z.ZodString>;
26
+ encryptionKeySource: z.ZodOptional<z.ZodEnum<["keychain", "env"]>>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ path?: string | undefined;
29
+ encryptionKeySource?: "keychain" | "env" | undefined;
30
+ }, {
31
+ path?: string | undefined;
32
+ encryptionKeySource?: "keychain" | "env" | undefined;
33
+ }>>;
34
+ logging: z.ZodOptional<z.ZodObject<{
35
+ level: z.ZodOptional<z.ZodEnum<["debug", "info", "warn", "error"]>>;
36
+ path: z.ZodOptional<z.ZodString>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ path?: string | undefined;
39
+ level?: "debug" | "info" | "warn" | "error" | undefined;
40
+ }, {
41
+ path?: string | undefined;
42
+ level?: "debug" | "info" | "warn" | "error" | undefined;
43
+ }>>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ port?: number | undefined;
46
+ store?: {
47
+ path?: string | undefined;
48
+ encryptionKeySource?: "keychain" | "env" | undefined;
49
+ } | undefined;
50
+ logging?: {
51
+ path?: string | undefined;
52
+ level?: "debug" | "info" | "warn" | "error" | undefined;
53
+ } | undefined;
54
+ }, {
55
+ port?: number | undefined;
56
+ store?: {
57
+ path?: string | undefined;
58
+ encryptionKeySource?: "keychain" | "env" | undefined;
59
+ } | undefined;
60
+ logging?: {
61
+ path?: string | undefined;
62
+ level?: "debug" | "info" | "warn" | "error" | undefined;
63
+ } | undefined;
64
+ }>;
65
+ /**
66
+ * OAuth2 credentials and settings for the GitLab provider.
67
+ * Downloaded from S3 and stored in mcp-providers.json.
68
+ */
69
+ export interface GitLabProviderConfig {
70
+ /** Base URL of the GitLab instance. HTTPS required. */
71
+ baseUrl: string;
72
+ /** OAuth2 application client ID. */
73
+ clientId: string;
74
+ /** OAuth2 scopes to request. At least one scope must be specified. */
75
+ scopes: string[];
76
+ /** Local port for the OAuth2 callback server. Default: 18080. */
77
+ redirectPort?: number;
78
+ }
79
+ export declare const GitLabProviderConfigSchema: z.ZodObject<{
80
+ /** z.string().url() validates URL structure; startsWith enforces HTTPS. */
81
+ baseUrl: z.ZodString;
82
+ clientId: z.ZodString;
83
+ scopes: z.ZodArray<z.ZodString, "many">;
84
+ redirectPort: z.ZodOptional<z.ZodNumber>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ baseUrl: string;
87
+ clientId: string;
88
+ scopes: string[];
89
+ redirectPort?: number | undefined;
90
+ }, {
91
+ baseUrl: string;
92
+ clientId: string;
93
+ scopes: string[];
94
+ redirectPort?: number | undefined;
95
+ }>;
96
+ /**
97
+ * OAuth2 credentials and settings for the Atlassian provider.
98
+ * The clientSecret is required because Atlassian uses a confidential client flow.
99
+ */
100
+ export interface AtlassianProviderConfig {
101
+ /** OAuth2 application client ID. */
102
+ clientId: string;
103
+ /** OAuth2 application client secret. Required for confidential client flow. */
104
+ clientSecret: string;
105
+ /** OAuth2 scopes to request. At least one scope must be specified. */
106
+ scopes: string[];
107
+ /** Local port for the OAuth2 callback server. Default: 18081. */
108
+ redirectPort?: number;
109
+ }
110
+ export declare const AtlassianProviderConfigSchema: z.ZodObject<{
111
+ clientId: z.ZodString;
112
+ clientSecret: z.ZodString;
113
+ scopes: z.ZodArray<z.ZodString, "many">;
114
+ redirectPort: z.ZodOptional<z.ZodNumber>;
115
+ }, "strip", z.ZodTypeAny, {
116
+ clientId: string;
117
+ scopes: string[];
118
+ clientSecret: string;
119
+ redirectPort?: number | undefined;
120
+ }, {
121
+ clientId: string;
122
+ scopes: string[];
123
+ clientSecret: string;
124
+ redirectPort?: number | undefined;
125
+ }>;
126
+ /**
127
+ * Root structure of mcp-providers.json, downloaded from S3.
128
+ * Both provider entries are optional — omit any provider that is not enabled.
129
+ */
130
+ export interface McpProvidersConfig {
131
+ /** Schema version of the providers file (semver string). */
132
+ version: string;
133
+ providers: {
134
+ gitlab?: GitLabProviderConfig;
135
+ atlassian?: AtlassianProviderConfig;
136
+ };
137
+ }
138
+ export declare const McpProvidersConfigSchema: z.ZodObject<{
139
+ version: z.ZodString;
140
+ providers: z.ZodObject<{
141
+ gitlab: z.ZodOptional<z.ZodObject<{
142
+ /** z.string().url() validates URL structure; startsWith enforces HTTPS. */
143
+ baseUrl: z.ZodString;
144
+ clientId: z.ZodString;
145
+ scopes: z.ZodArray<z.ZodString, "many">;
146
+ redirectPort: z.ZodOptional<z.ZodNumber>;
147
+ }, "strip", z.ZodTypeAny, {
148
+ baseUrl: string;
149
+ clientId: string;
150
+ scopes: string[];
151
+ redirectPort?: number | undefined;
152
+ }, {
153
+ baseUrl: string;
154
+ clientId: string;
155
+ scopes: string[];
156
+ redirectPort?: number | undefined;
157
+ }>>;
158
+ atlassian: z.ZodOptional<z.ZodObject<{
159
+ clientId: z.ZodString;
160
+ clientSecret: z.ZodString;
161
+ scopes: z.ZodArray<z.ZodString, "many">;
162
+ redirectPort: z.ZodOptional<z.ZodNumber>;
163
+ }, "strip", z.ZodTypeAny, {
164
+ clientId: string;
165
+ scopes: string[];
166
+ clientSecret: string;
167
+ redirectPort?: number | undefined;
168
+ }, {
169
+ clientId: string;
170
+ scopes: string[];
171
+ clientSecret: string;
172
+ redirectPort?: number | undefined;
173
+ }>>;
174
+ }, "strip", z.ZodTypeAny, {
175
+ gitlab?: {
176
+ baseUrl: string;
177
+ clientId: string;
178
+ scopes: string[];
179
+ redirectPort?: number | undefined;
180
+ } | undefined;
181
+ atlassian?: {
182
+ clientId: string;
183
+ scopes: string[];
184
+ clientSecret: string;
185
+ redirectPort?: number | undefined;
186
+ } | undefined;
187
+ }, {
188
+ gitlab?: {
189
+ baseUrl: string;
190
+ clientId: string;
191
+ scopes: string[];
192
+ redirectPort?: number | undefined;
193
+ } | undefined;
194
+ atlassian?: {
195
+ clientId: string;
196
+ scopes: string[];
197
+ clientSecret: string;
198
+ redirectPort?: number | undefined;
199
+ } | undefined;
200
+ }>;
201
+ }, "strip", z.ZodTypeAny, {
202
+ version: string;
203
+ providers: {
204
+ gitlab?: {
205
+ baseUrl: string;
206
+ clientId: string;
207
+ scopes: string[];
208
+ redirectPort?: number | undefined;
209
+ } | undefined;
210
+ atlassian?: {
211
+ clientId: string;
212
+ scopes: string[];
213
+ clientSecret: string;
214
+ redirectPort?: number | undefined;
215
+ } | undefined;
216
+ };
217
+ }, {
218
+ version: string;
219
+ providers: {
220
+ gitlab?: {
221
+ baseUrl: string;
222
+ clientId: string;
223
+ scopes: string[];
224
+ redirectPort?: number | undefined;
225
+ } | undefined;
226
+ atlassian?: {
227
+ clientId: string;
228
+ scopes: string[];
229
+ clientSecret: string;
230
+ redirectPort?: number | undefined;
231
+ } | undefined;
232
+ };
233
+ }>;
234
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mcp/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE;QACN,8EAA8E;QAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,oEAAoE;QACpE,mBAAmB,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;KAC1C,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,0CAA0C;QAC1C,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAC5C,qEAAqE;QACrE,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc/B,CAAC;AAMH;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,0BAA0B;IACrC,2EAA2E;;;;;;;;;;;;;;;EAK3E,CAAC;AAMH;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;EAKxC,CAAC;AAMH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,MAAM,CAAC,EAAE,oBAAoB,CAAC;QAC9B,SAAS,CAAC,EAAE,uBAAuB,CAAC;KACrC,CAAC;CACH;AAED,eAAO,MAAM,wBAAwB;;;;YAlDnC,2EAA2E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwD3E,CAAC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.McpProvidersConfigSchema = exports.AtlassianProviderConfigSchema = exports.GitLabProviderConfigSchema = exports.McpLocalConfigSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ // ---------------------------------------------------------------------------
6
+ // Shared primitive schemas
7
+ // ---------------------------------------------------------------------------
8
+ /** Non-reserved, non-privileged port range (1025-65535). */
9
+ const portSchema = zod_1.z.number().int().min(1025).max(65535).optional();
10
+ exports.McpLocalConfigSchema = zod_1.z.object({
11
+ port: portSchema,
12
+ store: zod_1.z
13
+ .object({
14
+ path: zod_1.z.string().optional(),
15
+ encryptionKeySource: zod_1.z.enum(['keychain', 'env']).optional(),
16
+ })
17
+ .optional(),
18
+ logging: zod_1.z
19
+ .object({
20
+ level: zod_1.z.enum(['debug', 'info', 'warn', 'error']).optional(),
21
+ path: zod_1.z.string().optional(),
22
+ })
23
+ .optional(),
24
+ });
25
+ exports.GitLabProviderConfigSchema = zod_1.z.object({
26
+ /** z.string().url() validates URL structure; startsWith enforces HTTPS. */
27
+ baseUrl: zod_1.z.string().url().startsWith('https://'),
28
+ clientId: zod_1.z.string().min(1),
29
+ scopes: zod_1.z.array(zod_1.z.string().min(1)).min(1),
30
+ redirectPort: portSchema,
31
+ });
32
+ exports.AtlassianProviderConfigSchema = zod_1.z.object({
33
+ clientId: zod_1.z.string().min(1),
34
+ clientSecret: zod_1.z.string().min(1),
35
+ scopes: zod_1.z.array(zod_1.z.string().min(1)).min(1),
36
+ redirectPort: portSchema,
37
+ });
38
+ exports.McpProvidersConfigSchema = zod_1.z.object({
39
+ version: zod_1.z.string(),
40
+ providers: zod_1.z.object({
41
+ gitlab: exports.GitLabProviderConfigSchema.optional(),
42
+ atlassian: exports.AtlassianProviderConfigSchema.optional(),
43
+ }),
44
+ });
45
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/config/types.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,4DAA4D;AAC5D,MAAM,UAAU,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;AA6BvD,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,OAAC;SACL,MAAM,CAAC;QACN,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,mBAAmB,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;KAC5D,CAAC;SACD,QAAQ,EAAE;IACb,OAAO,EAAE,OAAC;SACP,MAAM,CAAC;QACN,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC5D,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAqBU,QAAA,0BAA0B,GAAG,OAAC,CAAC,MAAM,CAAC;IACjD,2EAA2E;IAC3E,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;IAChD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,YAAY,EAAE,UAAU;CACzB,CAAC,CAAC;AAqBU,QAAA,6BAA6B,GAAG,OAAC,CAAC,MAAM,CAAC;IACpD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,YAAY,EAAE,UAAU;CACzB,CAAC,CAAC;AAmBU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,OAAC,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,kCAA0B,CAAC,QAAQ,EAAE;QAC7C,SAAS,EAAE,qCAA6B,CAAC,QAAQ,EAAE;KACpD,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Daemon entry-point logic extracted for testability.
3
+ *
4
+ * All functions in this module are pure filesystem / process utilities that
5
+ * can be exercised in unit tests without forking a real daemon process.
6
+ */
7
+ /**
8
+ * Write the daemon startup confirmation file to tmpdir.
9
+ *
10
+ * Returns the absolute path of the file written so the caller can log it
11
+ * or pass it to cleanupOnShutdown.
12
+ */
13
+ export declare function writeStartupFile(pid: number, port: number): string;
14
+ /**
15
+ * Remove daemon-owned files during graceful shutdown.
16
+ *
17
+ * Silently ignores ENOENT — any file that is already absent is fine.
18
+ * Any other filesystem error is re-thrown.
19
+ */
20
+ export declare function cleanupOnShutdown(pid: number): void;
21
+ /**
22
+ * Read the package version from package.json in cwd.
23
+ *
24
+ * Falls back to "0.0.0" when the file cannot be found or parsed — this keeps
25
+ * the daemon running even in unusual deploy layouts.
26
+ */
27
+ export declare function getPackageVersion(): string;
28
+ //# sourceMappingURL=entry-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-logic.d.ts","sourceRoot":"","sources":["../../../src/mcp/daemon/entry-logic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASlE;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUnD;AAgBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /**
3
+ * Daemon entry-point logic extracted for testability.
4
+ *
5
+ * All functions in this module are pure filesystem / process utilities that
6
+ * can be exercised in unit tests without forking a real daemon process.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.writeStartupFile = writeStartupFile;
10
+ exports.cleanupOnShutdown = cleanupOnShutdown;
11
+ exports.getPackageVersion = getPackageVersion;
12
+ const node_fs_1 = require("node:fs");
13
+ const node_path_1 = require("node:path");
14
+ const node_os_1 = require("node:os");
15
+ // ---------------------------------------------------------------------------
16
+ // writeStartupFile
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Write the daemon startup confirmation file to tmpdir.
20
+ *
21
+ * Returns the absolute path of the file written so the caller can log it
22
+ * or pass it to cleanupOnShutdown.
23
+ */
24
+ function writeStartupFile(pid, port) {
25
+ const filePath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `padua-mcp-${pid}.ready`);
26
+ const data = {
27
+ pid,
28
+ port,
29
+ readyAt: new Date().toISOString(),
30
+ };
31
+ (0, node_fs_1.writeFileSync)(filePath, JSON.stringify(data));
32
+ return filePath;
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // cleanupOnShutdown
36
+ // ---------------------------------------------------------------------------
37
+ /**
38
+ * Remove daemon-owned files during graceful shutdown.
39
+ *
40
+ * Silently ignores ENOENT — any file that is already absent is fine.
41
+ * Any other filesystem error is re-thrown.
42
+ */
43
+ function cleanupOnShutdown(pid) {
44
+ const files = [
45
+ (0, node_path_1.join)((0, node_os_1.homedir)(), '.padua', 'mcp-server.pid'),
46
+ (0, node_path_1.join)((0, node_os_1.homedir)(), '.padua', 'mcp-auth.json'),
47
+ (0, node_path_1.join)((0, node_os_1.tmpdir)(), `padua-mcp-${pid}.ready`),
48
+ ];
49
+ for (const f of files) {
50
+ removeIfExists(f);
51
+ }
52
+ }
53
+ function removeIfExists(filePath) {
54
+ try {
55
+ (0, node_fs_1.unlinkSync)(filePath);
56
+ }
57
+ catch (err) {
58
+ if (err.code !== 'ENOENT') {
59
+ throw err;
60
+ }
61
+ }
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // getPackageVersion
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * Read the package version from package.json in cwd.
68
+ *
69
+ * Falls back to "0.0.0" when the file cannot be found or parsed — this keeps
70
+ * the daemon running even in unusual deploy layouts.
71
+ */
72
+ function getPackageVersion() {
73
+ try {
74
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
75
+ const pkg = require((0, node_path_1.join)(__dirname, '..', '..', '..', 'package.json'));
76
+ return pkg.version ?? '0.0.0';
77
+ }
78
+ catch {
79
+ return '0.0.0';
80
+ }
81
+ }
82
+ //# sourceMappingURL=entry-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-logic.js","sourceRoot":"","sources":["../../../src/mcp/daemon/entry-logic.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiBH,4CASC;AAYD,8CAUC;AAsBD,8CAQC;AA5ED,qCAAoD;AACpD,yCAAiC;AACjC,qCAA0C;AAG1C,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,GAAW,EAAE,IAAY;IACxD,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,aAAa,GAAG,QAAQ,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAsB;QAC9B,GAAG;QACH,IAAI;QACJ,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAClC,CAAC;IACF,IAAA,uBAAa,EAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,MAAM,KAAK,GAAG;QACZ,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QAC3C,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,QAAQ,EAAE,eAAe,CAAC;QAC1C,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,aAAa,GAAG,QAAQ,CAAC;KACzC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,cAAc,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,IAAA,oBAAU,EAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAyB,CAAC;QAC/F,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Daemon process entry point.
4
+ * Runs in the forked child process via child_process.fork().
5
+ * Not imported by other modules — it is the entryScript passed to forkDaemon().
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../../src/mcp/daemon/entry.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Daemon process entry point.
5
+ * Runs in the forked child process via child_process.fork().
6
+ * Not imported by other modules — it is the entryScript passed to forkDaemon().
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const logging_1 = require("../server/logging");
10
+ const entry_logic_1 = require("./entry-logic");
11
+ const port = parseInt(process.env.PADUA_MCP_PORT ?? '8919', 10);
12
+ const bearerToken = process.env.PADUA_MCP_BEARER_TOKEN ?? '';
13
+ const logger = (0, logging_1.createLogger)();
14
+ // Ignore SIGINT — the daemon must not respond to Ctrl-C from the parent terminal.
15
+ process.on('SIGINT', () => { });
16
+ // Graceful shutdown: clean up files and exit cleanly.
17
+ process.on('SIGTERM', () => {
18
+ logger.info('Shutting down daemon...');
19
+ (0, entry_logic_1.cleanupOnShutdown)(process.pid);
20
+ process.exit(0);
21
+ });
22
+ async function main() {
23
+ logger.info('Daemon starting', { pid: process.pid, port });
24
+ const version = (0, entry_logic_1.getPackageVersion)();
25
+ const startupFilePath = (0, entry_logic_1.writeStartupFile)(process.pid, port);
26
+ logger.info('Daemon ready', { port, startupFile: startupFilePath, version });
27
+ // Keep the process alive; signal handlers above manage lifecycle.
28
+ void bearerToken; // consumed via env by the MCP server (server.ts integration)
29
+ }
30
+ main().catch((err) => {
31
+ logger.error('Daemon failed to start', { error: String(err) });
32
+ process.exit(1);
33
+ });
34
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/mcp/daemon/entry.ts"],"names":[],"mappings":";;AACA;;;;GAIG;;AAEH,+CAAiD;AACjD,+CAAuF;AAEvF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;AAC7D,MAAM,MAAM,GAAG,IAAA,sBAAY,GAAE,CAAC;AAE9B,kFAAkF;AAClF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAE/B,sDAAsD;AACtD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,IAAA,+BAAiB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,IAAA,+BAAiB,GAAE,CAAC;IAEpC,MAAM,eAAe,GAAG,IAAA,8BAAgB,EAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;IAE7E,kEAAkE;IAClE,KAAK,WAAW,CAAC,CAAC,6DAA6D;AACjF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { DaemonInfo } from './types';
2
+ interface PathResolver {
3
+ pidFile: () => string;
4
+ authFile: () => string;
5
+ startupFile: (pid: number) => string;
6
+ paduaDir: () => string;
7
+ }
8
+ /** Override path resolution — intended for tests only. */
9
+ export declare function setPathResolver(r: Partial<PathResolver>): void;
10
+ /** Reset path resolution to production defaults. */
11
+ export declare function resetPathResolver(): void;
12
+ export declare function getPidFilePath(): string;
13
+ export declare function getAuthFilePath(): string;
14
+ export declare function getStartupFilePath(pid: number): string;
15
+ export declare function isProcessAlive(pid: number): boolean;
16
+ export declare function readExistingDaemon(): DaemonInfo | null;
17
+ export declare function forkDaemon(entryScript: string, port: number): Promise<DaemonInfo>;
18
+ export declare function stopDaemon(): boolean;
19
+ export declare function cleanupDaemonFiles(pid?: number): void;
20
+ export {};
21
+ //# sourceMappingURL=fork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../../src/mcp/daemon/fork.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AAOvD,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB;AASD,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAE9D;AAED,oDAAoD;AACpD,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAMD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAMD,wBAAgB,kBAAkB,IAAI,UAAU,GAAG,IAAI,CAyBtD;AAMD,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBvF;AAMD,wBAAgB,UAAU,IAAI,OAAO,CAgBpC;AAMD,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAMrD"}