@wootsup/mcp 0.1.0-rc.9 → 0.3.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 (240) hide show
  1. package/CHANGELOG.md +148 -83
  2. package/README.md +36 -32
  3. package/SECURITY.md +15 -6
  4. package/dist/auth/keychain.d.ts +27 -1
  5. package/dist/auth/keychain.js +48 -2
  6. package/dist/auth/keychain.js.map +1 -1
  7. package/dist/cli-hint.d.ts +22 -0
  8. package/dist/cli-hint.js +55 -0
  9. package/dist/cli-hint.js.map +1 -0
  10. package/dist/index.d.ts +19 -0
  11. package/dist/index.js +163 -22
  12. package/dist/index.js.map +1 -1
  13. package/dist/install-skill.js +1 -1
  14. package/dist/modules/apimapper/cache.d.ts +2 -2
  15. package/dist/modules/apimapper/cache.js +119 -29
  16. package/dist/modules/apimapper/cache.js.map +1 -1
  17. package/dist/modules/apimapper/client.d.ts +102 -1
  18. package/dist/modules/apimapper/client.js +631 -297
  19. package/dist/modules/apimapper/client.js.map +1 -1
  20. package/dist/modules/apimapper/connections-format.d.ts +51 -0
  21. package/dist/modules/apimapper/connections-format.js +261 -0
  22. package/dist/modules/apimapper/connections-format.js.map +1 -0
  23. package/dist/modules/apimapper/connections-trim.d.ts +82 -0
  24. package/dist/modules/apimapper/connections-trim.js +224 -0
  25. package/dist/modules/apimapper/connections-trim.js.map +1 -0
  26. package/dist/modules/apimapper/connections.d.ts +14 -2
  27. package/dist/modules/apimapper/connections.js +612 -153
  28. package/dist/modules/apimapper/connections.js.map +1 -1
  29. package/dist/modules/apimapper/credential-sanitizer.d.ts +5 -0
  30. package/dist/modules/apimapper/credential-sanitizer.js +60 -1
  31. package/dist/modules/apimapper/credential-sanitizer.js.map +1 -1
  32. package/dist/modules/apimapper/credentials-format.d.ts +21 -0
  33. package/dist/modules/apimapper/credentials-format.js +145 -0
  34. package/dist/modules/apimapper/credentials-format.js.map +1 -0
  35. package/dist/modules/apimapper/credentials.d.ts +12 -2
  36. package/dist/modules/apimapper/credentials.js +226 -73
  37. package/dist/modules/apimapper/credentials.js.map +1 -1
  38. package/dist/modules/apimapper/diagnose.d.ts +54 -2
  39. package/dist/modules/apimapper/diagnose.js +213 -12
  40. package/dist/modules/apimapper/diagnose.js.map +1 -1
  41. package/dist/modules/apimapper/elicitation.d.ts +54 -0
  42. package/dist/modules/apimapper/elicitation.js +90 -0
  43. package/dist/modules/apimapper/elicitation.js.map +1 -0
  44. package/dist/modules/apimapper/flows-format.d.ts +50 -0
  45. package/dist/modules/apimapper/flows-format.js +318 -0
  46. package/dist/modules/apimapper/flows-format.js.map +1 -0
  47. package/dist/modules/apimapper/flows.d.ts +13 -2
  48. package/dist/modules/apimapper/flows.js +312 -122
  49. package/dist/modules/apimapper/flows.js.map +1 -1
  50. package/dist/modules/apimapper/gateway/advanced-tool.d.ts +9 -0
  51. package/dist/modules/apimapper/gateway/advanced-tool.js +265 -0
  52. package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -0
  53. package/dist/modules/apimapper/gateway/capturing-server.d.ts +81 -0
  54. package/dist/modules/apimapper/gateway/capturing-server.js +87 -0
  55. package/dist/modules/apimapper/gateway/capturing-server.js.map +1 -0
  56. package/dist/modules/apimapper/gateway/essentials.d.ts +4 -0
  57. package/dist/modules/apimapper/gateway/essentials.js +35 -0
  58. package/dist/modules/apimapper/gateway/essentials.js.map +1 -0
  59. package/dist/modules/apimapper/gateway/test-support.d.ts +17 -0
  60. package/dist/modules/apimapper/gateway/test-support.js +43 -0
  61. package/dist/modules/apimapper/gateway/test-support.js.map +1 -0
  62. package/dist/modules/apimapper/get-skill.d.ts +3 -3
  63. package/dist/modules/apimapper/get-skill.js +47 -7
  64. package/dist/modules/apimapper/get-skill.js.map +1 -1
  65. package/dist/modules/apimapper/graph-builder.js +1 -1
  66. package/dist/modules/apimapper/graph-builder.js.map +1 -1
  67. package/dist/modules/apimapper/graph.d.ts +2 -2
  68. package/dist/modules/apimapper/graph.js +170 -35
  69. package/dist/modules/apimapper/graph.js.map +1 -1
  70. package/dist/modules/apimapper/index.d.ts +17 -1
  71. package/dist/modules/apimapper/index.js +68 -17
  72. package/dist/modules/apimapper/index.js.map +1 -1
  73. package/dist/modules/apimapper/inspect.d.ts +3 -2
  74. package/dist/modules/apimapper/inspect.js +97 -13
  75. package/dist/modules/apimapper/inspect.js.map +1 -1
  76. package/dist/modules/apimapper/library.d.ts +2 -2
  77. package/dist/modules/apimapper/library.js +665 -80
  78. package/dist/modules/apimapper/library.js.map +1 -1
  79. package/dist/modules/apimapper/license-format.d.ts +22 -0
  80. package/dist/modules/apimapper/license-format.js +149 -0
  81. package/dist/modules/apimapper/license-format.js.map +1 -0
  82. package/dist/modules/apimapper/license.d.ts +16 -2
  83. package/dist/modules/apimapper/license.js +62 -38
  84. package/dist/modules/apimapper/license.js.map +1 -1
  85. package/dist/modules/apimapper/local-sources.d.ts +2 -2
  86. package/dist/modules/apimapper/local-sources.js +44 -30
  87. package/dist/modules/apimapper/local-sources.js.map +1 -1
  88. package/dist/modules/apimapper/misc.d.ts +30 -2
  89. package/dist/modules/apimapper/misc.js +114 -49
  90. package/dist/modules/apimapper/misc.js.map +1 -1
  91. package/dist/modules/apimapper/node-schema.d.ts +52 -0
  92. package/dist/modules/apimapper/node-schema.js +70 -2
  93. package/dist/modules/apimapper/node-schema.js.map +1 -1
  94. package/dist/modules/apimapper/normalizers.d.ts +1 -0
  95. package/dist/modules/apimapper/normalizers.js +51 -0
  96. package/dist/modules/apimapper/normalizers.js.map +1 -1
  97. package/dist/modules/apimapper/onboarding.d.ts +78 -3
  98. package/dist/modules/apimapper/onboarding.js +428 -26
  99. package/dist/modules/apimapper/onboarding.js.map +1 -1
  100. package/dist/modules/apimapper/read-cache.d.ts +31 -2
  101. package/dist/modules/apimapper/read-cache.js +20 -6
  102. package/dist/modules/apimapper/read-cache.js.map +1 -1
  103. package/dist/modules/apimapper/render/_shared.d.ts +24 -0
  104. package/dist/modules/apimapper/render/_shared.js +84 -0
  105. package/dist/modules/apimapper/render/_shared.js.map +1 -0
  106. package/dist/modules/apimapper/render/dag.d.ts +18 -0
  107. package/dist/modules/apimapper/render/dag.js +70 -0
  108. package/dist/modules/apimapper/render/dag.js.map +1 -0
  109. package/dist/modules/apimapper/render/index.d.ts +2 -0
  110. package/dist/modules/apimapper/render/index.js +112 -0
  111. package/dist/modules/apimapper/render/index.js.map +1 -0
  112. package/dist/modules/apimapper/render/renderers/chart-bar.d.ts +2 -0
  113. package/dist/modules/apimapper/render/renderers/chart-bar.js +70 -0
  114. package/dist/modules/apimapper/render/renderers/chart-bar.js.map +1 -0
  115. package/dist/modules/apimapper/render/renderers/chart-line.d.ts +2 -0
  116. package/dist/modules/apimapper/render/renderers/chart-line.js +71 -0
  117. package/dist/modules/apimapper/render/renderers/chart-line.js.map +1 -0
  118. package/dist/modules/apimapper/render/renderers/diff.d.ts +2 -0
  119. package/dist/modules/apimapper/render/renderers/diff.js +154 -0
  120. package/dist/modules/apimapper/render/renderers/diff.js.map +1 -0
  121. package/dist/modules/apimapper/render/renderers/flow-diagram.d.ts +1 -0
  122. package/dist/modules/apimapper/render/renderers/flow-diagram.js +180 -0
  123. package/dist/modules/apimapper/render/renderers/flow-diagram.js.map +1 -0
  124. package/dist/modules/apimapper/render/renderers/json-tree.d.ts +2 -0
  125. package/dist/modules/apimapper/render/renderers/json-tree.js +87 -0
  126. package/dist/modules/apimapper/render/renderers/json-tree.js.map +1 -0
  127. package/dist/modules/apimapper/render/renderers/schema-diagram.d.ts +2 -0
  128. package/dist/modules/apimapper/render/renderers/schema-diagram.js +83 -0
  129. package/dist/modules/apimapper/render/renderers/schema-diagram.js.map +1 -0
  130. package/dist/modules/apimapper/render/renderers/table.d.ts +2 -0
  131. package/dist/modules/apimapper/render/renderers/table.js +75 -0
  132. package/dist/modules/apimapper/render/renderers/table.js.map +1 -0
  133. package/dist/modules/apimapper/render/schemas.d.ts +23 -0
  134. package/dist/modules/apimapper/render/schemas.js +56 -0
  135. package/dist/modules/apimapper/render/schemas.js.map +1 -0
  136. package/dist/modules/apimapper/render/secret-masking.d.ts +5 -0
  137. package/dist/modules/apimapper/render/secret-masking.js +51 -0
  138. package/dist/modules/apimapper/render/secret-masking.js.map +1 -0
  139. package/dist/modules/apimapper/render/sidecar.d.ts +21 -0
  140. package/dist/modules/apimapper/render/sidecar.js +66 -0
  141. package/dist/modules/apimapper/render/sidecar.js.map +1 -0
  142. package/dist/modules/apimapper/render/token-cap.d.ts +21 -0
  143. package/dist/modules/apimapper/render/token-cap.js +57 -0
  144. package/dist/modules/apimapper/render/token-cap.js.map +1 -0
  145. package/dist/modules/apimapper/schema.d.ts +2 -2
  146. package/dist/modules/apimapper/schema.js +92 -33
  147. package/dist/modules/apimapper/schema.js.map +1 -1
  148. package/dist/modules/apimapper/settings-format.d.ts +23 -0
  149. package/dist/modules/apimapper/settings-format.js +135 -0
  150. package/dist/modules/apimapper/settings-format.js.map +1 -0
  151. package/dist/modules/apimapper/settings.d.ts +2 -2
  152. package/dist/modules/apimapper/settings.js +100 -42
  153. package/dist/modules/apimapper/settings.js.map +1 -1
  154. package/dist/modules/apimapper/sites-tools.d.ts +29 -0
  155. package/dist/modules/apimapper/sites-tools.js +165 -0
  156. package/dist/modules/apimapper/sites-tools.js.map +1 -0
  157. package/dist/modules/apimapper/skill-resources.d.ts +2 -2
  158. package/dist/modules/apimapper/skill-resources.js.map +1 -1
  159. package/dist/modules/apimapper/token-baseline.harness.d.ts +91 -0
  160. package/dist/modules/apimapper/token-baseline.harness.js +291 -0
  161. package/dist/modules/apimapper/token-baseline.harness.js.map +1 -0
  162. package/dist/modules/apimapper/tool-result.d.ts +46 -0
  163. package/dist/modules/apimapper/tool-result.js +63 -0
  164. package/dist/modules/apimapper/tool-result.js.map +1 -0
  165. package/dist/modules/apimapper/toolslist-size.d.ts +56 -0
  166. package/dist/modules/apimapper/toolslist-size.js +192 -0
  167. package/dist/modules/apimapper/toolslist-size.js.map +1 -0
  168. package/dist/modules/apimapper/types.d.ts +44 -8
  169. package/dist/modules/apimapper/types.js +26 -1
  170. package/dist/modules/apimapper/types.js.map +1 -1
  171. package/dist/modules/apimapper/use-profile.d.ts +21 -0
  172. package/dist/modules/apimapper/use-profile.js +56 -2
  173. package/dist/modules/apimapper/use-profile.js.map +1 -1
  174. package/dist/modules/apimapper/whitelist-drift.d.ts +85 -0
  175. package/dist/modules/apimapper/whitelist-drift.js +360 -0
  176. package/dist/modules/apimapper/whitelist-drift.js.map +1 -0
  177. package/dist/modules/apimapper/workflows.d.ts +2 -2
  178. package/dist/modules/apimapper/workflows.js +202 -20
  179. package/dist/modules/apimapper/workflows.js.map +1 -1
  180. package/dist/modules/apimapper/yootheme-binding.d.ts +35 -0
  181. package/dist/modules/apimapper/yootheme-binding.js +186 -0
  182. package/dist/modules/apimapper/yootheme-binding.js.map +1 -0
  183. package/dist/platform/index.d.ts +56 -0
  184. package/dist/platform/index.js +195 -7
  185. package/dist/platform/index.js.map +1 -1
  186. package/dist/setup/detect-clients.d.ts +40 -1
  187. package/dist/setup/detect-clients.js +148 -1
  188. package/dist/setup/detect-clients.js.map +1 -1
  189. package/dist/setup/probe-handshake.js +40 -7
  190. package/dist/setup/probe-handshake.js.map +1 -1
  191. package/dist/setup/remove-config.d.ts +8 -0
  192. package/dist/setup/remove-config.js +145 -0
  193. package/dist/setup/remove-config.js.map +1 -0
  194. package/dist/setup/uninstall.d.ts +34 -0
  195. package/dist/setup/uninstall.js +147 -0
  196. package/dist/setup/uninstall.js.map +1 -0
  197. package/dist/setup-cli.d.ts +60 -0
  198. package/dist/setup-cli.js +155 -5
  199. package/dist/setup-cli.js.map +1 -1
  200. package/dist/sites/loader.d.ts +41 -0
  201. package/dist/sites/loader.js +119 -0
  202. package/dist/sites/loader.js.map +1 -0
  203. package/dist/sites/schema.d.ts +69 -0
  204. package/dist/sites/schema.js +71 -0
  205. package/dist/sites/schema.js.map +1 -0
  206. package/dist/sites/secret-resolver.d.ts +47 -0
  207. package/dist/sites/secret-resolver.js +150 -0
  208. package/dist/sites/secret-resolver.js.map +1 -0
  209. package/dist/skill-instructions.d.ts +1 -1
  210. package/dist/skill-instructions.js +5 -0
  211. package/dist/skill-instructions.js.map +1 -1
  212. package/dist/transports/stdio.js +4 -4
  213. package/dist/transports/stdio.js.map +1 -1
  214. package/dist/uninstall-skill.d.ts +27 -0
  215. package/dist/uninstall-skill.js +89 -0
  216. package/dist/uninstall-skill.js.map +1 -0
  217. package/docs/architecture.md +22 -22
  218. package/docs/customgraph-internal-migration.md +4 -4
  219. package/docs/security.md +2 -21
  220. package/docs/tools.md +40 -12
  221. package/manifest.json +77 -70
  222. package/package.json +68 -60
  223. package/skills/apimapper/SKILL.md +53 -7
  224. package/skills/apimapper/reference/conditional-style-multi-items.md +114 -0
  225. package/skills/apimapper/reference/jmespath-pitfalls.md +108 -0
  226. package/skills/apimapper/reference/joomla.md +1 -1
  227. package/skills/apimapper/reference/library-template-discovery.md +65 -0
  228. package/skills/apimapper/reference/merge-two-sources-on-key.md +99 -0
  229. package/skills/apimapper/reference/render.md +132 -0
  230. package/skills/apimapper/reference/troubleshooting.md +21 -1
  231. package/skills/apimapper/reference/yootheme.md +1 -1
  232. package/dist/auth/oauth-provider.d.ts +0 -68
  233. package/dist/auth/oauth-provider.js +0 -232
  234. package/dist/auth/oauth-provider.js.map +0 -1
  235. package/dist/server-http.d.ts +0 -22
  236. package/dist/server-http.js +0 -159
  237. package/dist/server-http.js.map +0 -1
  238. package/dist/transports/http.d.ts +0 -29
  239. package/dist/transports/http.js +0 -267
  240. package/dist/transports/http.js.map +0 -1
package/dist/setup-cli.js CHANGED
@@ -19,21 +19,140 @@ import { decodeToken } from "./auth/token.js";
19
19
  import { detectClients as defaultDetectClients, } from "./setup/detect-clients.js";
20
20
  import { writeJsonConfig as defaultWriteJsonConfig, writeTomlConfig as defaultWriteTomlConfig, } from "./setup/write-config.js";
21
21
  import { probeHandshake as defaultProbeHandshake, rollbackAll, } from "./setup/probe-handshake.js";
22
+ import { runUninstall as defaultRunUninstall, } from "./setup/uninstall.js";
22
23
  const HELP_TEXT = `Usage: apimapper-mcp <command>
23
24
 
24
25
  Commands:
25
26
  setup Interactive first-run wizard (default if no command)
26
27
  install-skill Copy the bundled apimapper skill to ~/.claude/skills/
27
28
  and register it in ~/AGENTS.md.
29
+ uninstall Interactive removal (reverse of setup): pick which AI
30
+ clients to remove the API Mapper MCP entry from, plus the
31
+ installed skill. Aliases: remove.
32
+ Flags: --all (remove from every detected client + skill,
33
+ no prompts), --yes/-y (skip the final confirm).
28
34
  help Show this message.
29
35
  `;
36
+ /**
37
+ * Token-prefix → npm-dist-tag mapping table.
38
+ *
39
+ * To add a new channel (e.g. `amk_beta_*` → `"beta"`), append one entry here
40
+ * — no changes to `inferDistTag` required. Order matters only if prefixes
41
+ * could overlap; today they are mutually exclusive.
42
+ *
43
+ * The second tuple element is typed `KnownDistTag` (not `string`) so a typo
44
+ * like `[/^amk_canary_/, "cnary"]` would fail compile.
45
+ */
46
+ const PREFIX_TAG_MAP = [
47
+ [/^amk_test_/, "rc"],
48
+ [/^amk_live_/, "latest"],
49
+ ];
50
+ /**
51
+ * Infer the npm dist-tag for the AI-client config entry.
52
+ *
53
+ * Order of resolution:
54
+ * 1. Explicit `override` argument (driven via `APIMAPPER_DIST_TAG` env var
55
+ * in production — lets release-engineering pin a dist-tag without
56
+ * patching the CLI).
57
+ * 2. Token prefix lookup via `PREFIX_TAG_MAP` (e.g. `amk_test_*` → `rc`,
58
+ * `amk_live_*` → `latest`).
59
+ * 3. Fallback `latest` (safe default — stable channel).
60
+ *
61
+ * @param token Token whose prefix steers routing to a {@link KnownDistTag}.
62
+ * @param options Optional override (raw `string`, NOT narrowed to
63
+ * `KnownDistTag` — release-eng may pin to channels outside the known set
64
+ * like `"beta"` or `"canary"` without a CLI patch).
65
+ * @returns A {@link KnownDistTag} value (`"latest"` | `"rc"`) for prefix/
66
+ * fallback paths, or the raw override string when a non-empty override is
67
+ * provided. The return type is widened to `string` to reflect this
68
+ * asymmetry at the public boundary.
69
+ */
70
+ /**
71
+ * Charset whitelist for the `APIMAPPER_DIST_TAG` override (A5-P3 polish).
72
+ *
73
+ * Every legitimate npm dist-tag a release pipeline would set fits within
74
+ * `[a-z0-9._-]+`: "latest", "rc", "beta", "next", "beta-1", "v2.0.7-rc.1".
75
+ * Anything outside this charset (spaces, shell metacharacters, command
76
+ * substitution syntax, path separators, uppercase) is rejected at the
77
+ * boundary so a malformed env var produces a clear, diagnosable error
78
+ * instead of a downstream `404 Not Found - GET .../mcp/%24(pwd)` from
79
+ * npm. There is no shell-injection risk because we use `spawn` argv (not
80
+ * a shell), but a wide-open input makes triage painful.
81
+ */
82
+ const DIST_TAG_OVERRIDE_RE = /^[a-z0-9._-]+$/;
83
+ export function inferDistTag(token, options) {
84
+ if (options?.override && options.override.length > 0) {
85
+ if (!DIST_TAG_OVERRIDE_RE.test(options.override)) {
86
+ throw new Error(`Invalid APIMAPPER_DIST_TAG override: "${options.override}". ` +
87
+ `Must match /^[a-z0-9._-]+$/.`);
88
+ }
89
+ return options.override;
90
+ }
91
+ for (const [pattern, tag] of PREFIX_TAG_MAP) {
92
+ if (pattern.test(token))
93
+ return tag;
94
+ }
95
+ return "latest";
96
+ }
30
97
  // ── identity probe (default impl) ───────────────────────────────────────
31
98
  const PROBE_TIMEOUT_MS = 5_000;
32
99
  /**
33
- * Try WordPress + Joomla identity endpoints in parallel; the first
34
- * successful response wins. Throws if neither responds (or both 404).
100
+ * Heuristic: are ALL given errors "HTTP 404" probe failures?
101
+ *
102
+ * Used by {@link probeIdentity} to distinguish the customer-friendly
103
+ * "plugin not installed" case (every leg of the parallel probe got a 404)
104
+ * from the generic "probe failed" case (mixed statuses, 5xx, network
105
+ * errors, etc.). A 404 from both the WordPress and Joomla identity
106
+ * endpoints is the canonical signature of "plugin not installed at the
107
+ * target site" — every other failure shape should retain the existing
108
+ * generic error path so support gets the full status detail.
109
+ *
110
+ * Guards against the empty-array edge case explicitly: an empty input
111
+ * returns `false`, even though `Array.prototype.every` returns `true`
112
+ * for an empty array by spec. An empty `AggregateError.errors` means
113
+ * "no failures observed" — that is structurally NOT the "all 404"
114
+ * scenario and must not trigger the plugin-not-installed branch.
115
+ *
116
+ * @param errors The error array (typically `AggregateError.errors`).
117
+ * @returns `true` iff `errors` is non-empty AND every entry's message
118
+ * matches `/\bHTTP 404\b/` (word-boundary anchored to avoid
119
+ * false-positives on substrings like `"HTTP 4040"`).
120
+ */
121
+ export function isAllHttp404(errors) {
122
+ if (errors.length === 0)
123
+ return false;
124
+ return errors.every((e) => {
125
+ const msg = e instanceof Error ? e.message : String(e);
126
+ return /\bHTTP 404\b/.test(msg);
127
+ });
128
+ }
129
+ /**
130
+ * Probe both WP and Joomla identity endpoints. Throws on any failure —
131
+ * see error-shape contract below.
132
+ *
133
+ * Error-shape contract (two distinct cases, both surface as `Error`):
134
+ *
135
+ * 1. **Plugin not installed** — when BOTH the WordPress and Joomla
136
+ * identity probes return HTTP 404. The thrown error's message
137
+ * starts with `"API Mapper plugin is not installed at <siteUrl>"`
138
+ * and includes remediation guidance (WP/Joomla install paths).
139
+ * This is the typical customer scenario — they pasted a valid
140
+ * key but haven't installed the plugin yet.
141
+ *
142
+ * 2. **Generic probe failure** — every other failure mode (mixed
143
+ * statuses, 5xx, 401/403, network errors, timeouts). The thrown
144
+ * error's message starts with `"Identity probe failed"` and
145
+ * includes the per-leg failure messages so support can triage.
146
+ *
147
+ * Non-`AggregateError` exceptions thrown during the probe (e.g. an
148
+ * `AbortError` after the {@link PROBE_TIMEOUT_MS} deadline) propagate
149
+ * unchanged.
150
+ *
151
+ * @param siteUrl Customer's site URL (trailing slashes are trimmed).
152
+ * @returns The first successful identity response (WP or Joomla).
153
+ * @throws {Error} See the two error-shape cases above.
35
154
  */
36
- async function probeIdentity(siteUrl) {
155
+ export async function probeIdentity(siteUrl) {
37
156
  const base = siteUrl.replace(/\/+$/, "");
38
157
  const wpUrl = `${base}/wp-json/api-mapper/v1/identity`;
39
158
  const joomlaUrl = `${base}/index.php?option=com_ajax&plugin=apimapper&task=getIdentity&format=json`;
@@ -62,6 +181,12 @@ async function probeIdentity(siteUrl) {
62
181
  }
63
182
  catch (err) {
64
183
  if (err instanceof AggregateError) {
184
+ if (isAllHttp404(err.errors)) {
185
+ throw new Error(`API Mapper plugin is not installed at ${siteUrl}. ` +
186
+ "Install the plugin (WordPress: wp-admin -> Plugins -> Add New, " +
187
+ "or Joomla: Extensions -> Manage -> Install), activate it, " +
188
+ "then retry setup.");
189
+ }
65
190
  const messages = err.errors.map((e) => e instanceof Error ? e.message : String(e));
66
191
  throw new Error(`Identity probe failed (no WP or Joomla endpoint responded): ${messages.join("; ")}`);
67
192
  }
@@ -198,9 +323,12 @@ export async function runWizard(deps = DEFAULT_DEPS) {
198
323
  // tell their configs apart visually.
199
324
  const undos = [];
200
325
  const selectedDef = new Set(answers.selectedClients);
326
+ const distTag = inferDistTag(answers.token, {
327
+ override: process.env.APIMAPPER_DIST_TAG,
328
+ });
201
329
  const entry = {
202
330
  command: "npx",
203
- args: ["-y", "@wootsup/mcp@rc"],
331
+ args: ["-y", `@wootsup/mcp@${distTag}`],
204
332
  env: {
205
333
  APIMAPPER_TOKEN: answers.token,
206
334
  APIMAPPER_SITE_URL: answers.siteUrl,
@@ -257,15 +385,37 @@ export async function runWizard(deps = DEFAULT_DEPS) {
257
385
  return 0;
258
386
  }
259
387
  // ── CLI dispatcher ──────────────────────────────────────────────────────
388
+ /**
389
+ * Parse the `uninstall` flag tail. Recognises `--all`, `--yes`, and `-y`.
390
+ * Unknown flags are ignored (forward-compatible). Order-independent.
391
+ */
392
+ export function parseUninstallFlags(args) {
393
+ return {
394
+ all: args.includes("--all"),
395
+ yes: args.includes("--yes") || args.includes("-y"),
396
+ };
397
+ }
260
398
  export async function runCli(argv, deps) {
261
399
  const installSkill = deps?.installSkill ?? defaultInstallSkill;
262
400
  const wizard = deps?.runWizard ?? (() => runWizard());
263
- const [subcommand] = argv;
401
+ const uninstall = deps?.runUninstall ?? ((o) => defaultRunUninstall(o));
402
+ const [subcommand, ...rest] = argv;
264
403
  // Default subcommand (no args, or `setup`) runs the wizard.
265
404
  if (!subcommand || subcommand === "setup") {
266
405
  return wizard();
267
406
  }
268
407
  switch (subcommand) {
408
+ case "uninstall":
409
+ case "remove": {
410
+ try {
411
+ return await uninstall(parseUninstallFlags(rest));
412
+ }
413
+ catch (err) {
414
+ const msg = err instanceof Error ? err.message : String(err);
415
+ console.error(`apimapper-mcp: uninstall failed: ${msg}`);
416
+ return 2;
417
+ }
418
+ }
269
419
  case "install-skill":
270
420
  case "install": {
271
421
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":";AACA,gCAAgC;AAChC,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,2DAA2D;AAC3D,6BAA6B;AAC7B,EAAE;AACF,oEAAoE;AACpE,sEAAsE;AACtE,wEAAwE;AACxE,mEAAmE;AACnE,kEAAkE;AAElE,OAAO,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EAEX,OAAO,EACP,MAAM,EACN,QAAQ,EACR,IAAI,GACL,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EACL,aAAa,IAAI,oBAAoB,GAEtC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,eAAe,IAAI,sBAAsB,EACzC,eAAe,IAAI,sBAAsB,GAI1C,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,cAAc,IAAI,qBAAqB,EACvC,WAAW,GAGZ,MAAM,4BAA4B,CAAC;AA2DpC,MAAM,SAAS,GAAG;;;;;;;CAOjB,CAAC;AAEF,2EAA2E;AAE3E,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;;GAGG;AACH,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,IAAI,iCAAiC,CAAC;IACvD,MAAM,SAAS,GAAG,GAAG,IAAI,0EAA0E,CAAC;IAEpG,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAW,EACX,cAAsC,EACX,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,cAAc,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;QACxD,oEAAoE;QACpE,MAAM,IAAI,GACR,cAAc,KAAK,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;YAC5E,CAAC,CAAE,GAAG,CAAC,IAAgC;YACvC,CAAC,CAAC,GAAG,CAAC;QACV,OAAO;YACL,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YAC/D,cAAc,EACZ,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;YAC5B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAC7C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC3C,CAAC;YACF,MAAM,IAAI,KAAK,CACb,+DAA+D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,IAAI,CAAI,KAAiB,EAAE,SAAiC;IACnE,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,gDAAgD,CAAC,CAAC;QACzD,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAGlC;IACC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAE5C,WAAW;IACX,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;QAC1B,OAAO,EAAE,oBAAoB;QAC7B,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,wCAAwC;KAC/C,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,6CAA6C,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CACF;QACE,YAAY,OAAO,CAAC,GAAG,EAAE;QACzB,YAAY,OAAO,CAAC,GAAG,EAAE;QACzB,YAAY,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,eAAe,CAChB,CAAC;IAEF,cAAc;IACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;QACzB,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,qBAAqB;QAClC,YAAY,EAAE,OAAO,CAAC,GAAG;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,OAAO,CAAC,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,+BAA+B;KACtC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAElC,kBAAkB;IAClB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;QAC5B,OAAO,EAAE,4CAA4C;QACrD,YAAY,EAAE,SAAS;QACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,OAAO,CAAC,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,kDAAkD;KACzD,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtC,sBAAsB;IACtB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC;QAClC,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE,CAAC,CAAC,EAAE;YACX,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE;SAC3D,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,eAAe,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE1C,sEAAsE;IACtE,sDAAsD;IACtD,OAAO;QACL,KAAK;QACL,OAAO;QACP,WAAW;QACX,eAAe;QACf,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,MAAM,YAAY,GAAe;IAC/B,MAAM,EAAE,mBAAmB;IAC3B,aAAa,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE;IAC3C,aAAa;IACb,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAmB,YAAY;IAC7D,MAAM,GAAG,GACP,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IAEpE,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAE5C,4CAA4C;IAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC,CAAC,sCAAsC;IAEhE,wEAAwE;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gEAAgE;IAChE,IAAI,QAA0B,CAAC;IAC/B,MAAM,IAAI,GACR,IAAI,CAAC,GAAG,KAAK,SAAS;QACpB,CAAC,CAAC,OAAO,EAAE;QACX,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAa,EAAE,EAAE,GAAE,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAClD,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CACP,YAAY,QAAQ,CAAC,QAAQ,aAAa,QAAQ,CAAC,cAAc,GAAG,CACrE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACnC,GAAG,CACD,mBAAmB,OAAO,CAAC,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,wCAAwC;IACxC,yEAAyE;IACzE,uEAAuE;IACvE,uEAAuE;IACvE,uEAAuE;IACvE,iEAAiE;IACjE,oEAAoE;IACpE,2CAA2C;IAC3C,sEAAsE;IACtE,qCAAqC;IACrC,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,KAAK,GAAa;QACtB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC;QAC/B,GAAG,EAAE;YACH,eAAe,EAAE,OAAO,CAAC,KAAK;YAC9B,kBAAkB,EAAE,OAAO,CAAC,OAAO;YACnC,iBAAiB,EAAE,OAAO,CAAC,WAAW;SACvC;KACF,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,MAAM;gBACtB,CAAC,CAAC,IAAI,CAAC,eAAe;gBACtB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;YAC3B,yEAAyE;YACzE,sEAAsE;YACtE,uEAAuE;YACvE,qEAAqE;YACrE,wEAAwE;YACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE;gBACnE,UAAU,EAAE,CAAC,WAAW,EAAE,wBAAwB,CAAC;aACpD,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrB,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,qBAAqB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,GAAG,CACD,KAAK,MAAM,CAAC,KAAK,6IAA6I,MAAM,CAAC,UAAU,oBAAoB,CACpM,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CACD,KAAK,MAAM,CAAC,KAAK,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACvF,CAAC;YACF,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mEAAmE;IACnE,6BAA6B;IAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;QACtC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,GAAG,CAAC,yBAAyB,KAAK,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC/D,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CACH,sBAAsB,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW;QAClF,+DAA+D,CAClE,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2EAA2E;AAE3E,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAc,EACd,IAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,mBAAmB,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAE1B,4DAA4D;IAC5D,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC1C,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,eAAe,CAAC;QACrB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;gBACpC,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;gBAC/E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;gBAC7D,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,mCAAmC,UAAU,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,4BAA4B;AAC5B,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,WAAW;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,0DAA0D;IAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAElD,IAAI,MAAM,EAAE,CAAC;IACX,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAY,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../src/setup-cli.ts"],"names":[],"mappings":";AACA,gCAAgC;AAChC,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,2DAA2D;AAC3D,6BAA6B;AAC7B,EAAE;AACF,oEAAoE;AACpE,sEAAsE;AACtE,wEAAwE;AACxE,mEAAmE;AACnE,kEAAkE;AAElE,OAAO,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EAEX,OAAO,EACP,MAAM,EACN,QAAQ,EACR,IAAI,GACL,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EACL,aAAa,IAAI,oBAAoB,GAEtC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,eAAe,IAAI,sBAAsB,EACzC,eAAe,IAAI,sBAAsB,GAI1C,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,cAAc,IAAI,qBAAqB,EACvC,WAAW,GAGZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,YAAY,IAAI,mBAAmB,GAEpC,MAAM,sBAAsB,CAAC;AA4D9B,MAAM,SAAS,GAAG;;;;;;;;;;;;CAYjB,CAAC;AAcF;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAmD;IACrE,CAAC,YAAY,EAAE,IAAI,CAAC;IACpB,CAAC,YAAY,EAAE,QAAQ,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAE9C,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,OAA+B;IAE/B,IAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CACb,yCAAyC,OAAO,CAAC,QAAQ,KAAK;gBAC5D,8BAA8B,CACjC,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IACD,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2EAA2E;AAE3E,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,IAAI,iCAAiC,CAAC;IACvD,MAAM,SAAS,GAAG,GAAG,IAAI,0EAA0E,CAAC;IAEpG,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,KAAK,EACpB,GAAW,EACX,cAAsC,EACX,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,cAAc,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;QACxD,oEAAoE;QACpE,MAAM,IAAI,GACR,cAAc,KAAK,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;YAC5E,CAAC,CAAE,GAAG,CAAC,IAAgC;YACvC,CAAC,CAAC,GAAG,CAAC;QACV,OAAO;YACL,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YAC/D,cAAc,EACZ,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;YAC5B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,yCAAyC,OAAO,IAAI;oBAClD,iEAAiE;oBACjE,4DAA4D;oBAC5D,mBAAmB,CACtB,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAC7C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC3C,CAAC;YACF,MAAM,IAAI,KAAK,CACb,+DAA+D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,IAAI,CAAI,KAAiB,EAAE,SAAiC;IACnE,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,gDAAgD,CAAC,CAAC;QACzD,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAGlC;IACC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAE5C,WAAW;IACX,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;QAC1B,OAAO,EAAE,oBAAoB;QAC7B,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,wCAAwC;KAC/C,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,6CAA6C,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CACF;QACE,YAAY,OAAO,CAAC,GAAG,EAAE;QACzB,YAAY,OAAO,CAAC,GAAG,EAAE;QACzB,YAAY,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,eAAe,CAChB,CAAC;IAEF,cAAc;IACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;QACzB,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,qBAAqB;QAClC,YAAY,EAAE,OAAO,CAAC,GAAG;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,OAAO,CAAC,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,+BAA+B;KACtC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAElC,kBAAkB;IAClB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;QAC5B,OAAO,EAAE,4CAA4C;QACrD,YAAY,EAAE,SAAS;QACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,OAAO,CAAC,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,kDAAkD;KACzD,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtC,sBAAsB;IACtB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC;QAClC,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE,CAAC,CAAC,EAAE;YACX,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE;SAC3D,CAAC,CAAC;QACH,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,eAAe,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE1C,sEAAsE;IACtE,sDAAsD;IACtD,OAAO;QACL,KAAK;QACL,OAAO;QACP,WAAW;QACX,eAAe;QACf,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,MAAM,YAAY,GAAe;IAC/B,MAAM,EAAE,mBAAmB;IAC3B,aAAa,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE;IAC3C,aAAa;IACb,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAmB,YAAY;IAC7D,MAAM,GAAG,GACP,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IAEpE,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAE5C,4CAA4C;IAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC,CAAC,sCAAsC;IAEhE,wEAAwE;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gEAAgE;IAChE,IAAI,QAA0B,CAAC;IAC/B,MAAM,IAAI,GACR,IAAI,CAAC,GAAG,KAAK,SAAS;QACpB,CAAC,CAAC,OAAO,EAAE;QACX,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAa,EAAE,EAAE,GAAE,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAClD,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CACP,YAAY,QAAQ,CAAC,QAAQ,aAAa,QAAQ,CAAC,cAAc,GAAG,CACrE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACnC,GAAG,CACD,mBAAmB,OAAO,CAAC,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,wCAAwC;IACxC,yEAAyE;IACzE,uEAAuE;IACvE,uEAAuE;IACvE,uEAAuE;IACvE,iEAAiE;IACjE,oEAAoE;IACpE,2CAA2C;IAC3C,sEAAsE;IACtE,qCAAqC;IACrC,MAAM,KAAK,GAA+B,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE;QAC1C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;KACzC,CAAC,CAAC;IACH,MAAM,KAAK,GAAa;QACtB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,OAAO,EAAE,CAAC;QACvC,GAAG,EAAE;YACH,eAAe,EAAE,OAAO,CAAC,KAAK;YAC9B,kBAAkB,EAAE,OAAO,CAAC,OAAO;YACnC,iBAAiB,EAAE,OAAO,CAAC,WAAW;SACvC;KACF,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,MAAM;gBACtB,CAAC,CAAC,IAAI,CAAC,eAAe;gBACtB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;YAC3B,yEAAyE;YACzE,sEAAsE;YACtE,uEAAuE;YACvE,qEAAqE;YACrE,wEAAwE;YACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE;gBACnE,UAAU,EAAE,CAAC,WAAW,EAAE,wBAAwB,CAAC;aACpD,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrB,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,qBAAqB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,GAAG,CACD,KAAK,MAAM,CAAC,KAAK,6IAA6I,MAAM,CAAC,UAAU,oBAAoB,CACpM,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CACD,KAAK,MAAM,CAAC,KAAK,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACvF,CAAC;YACF,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mEAAmE;IACnE,6BAA6B;IAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;QACtC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,GAAG,CAAC,yBAAyB,KAAK,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC/D,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CACH,sBAAsB,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW;QAClF,+DAA+D,CAClE,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,2EAA2E;AAE3E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAc,EACd,IAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,mBAAmB,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,EAAE,YAAY,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEnC,4DAA4D;IAC5D,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC1C,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;gBACzD,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,KAAK,eAAe,CAAC;QACrB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;gBACpC,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;gBAC/E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;gBAC7D,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,mCAAmC,UAAU,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,4BAA4B;AAC5B,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,WAAW;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,0DAA0D;IAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAElD,IAAI,MAAM,EAAE,CAAC;IACX,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAY,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type SiteEntryT, type SitesFileT } from "./schema.js";
2
+ /** Base class for any sites-file IO / parse / validation failure. */
3
+ export declare class SitesFileError extends Error {
4
+ readonly cause?: unknown | undefined;
5
+ constructor(message: string, cause?: unknown | undefined);
6
+ }
7
+ /**
8
+ * Read-only registry around a parsed, non-empty sites file. Provides O(1)-ish
9
+ * lookups for the active-site resolution in client.ts. Never mutates the input.
10
+ */
11
+ export declare class SitesRegistry {
12
+ private readonly file;
13
+ constructor(file: SitesFileT);
14
+ /** Entries in insertion order (stable for list-tool UX). */
15
+ list(): readonly SiteEntryT[];
16
+ /** Site_id list in insertion order. */
17
+ listIds(): readonly string[];
18
+ /** Raw entry for a site_id, or null when unknown. */
19
+ get(siteId: string): SiteEntryT | null;
20
+ /** True when the registry contains the given site_id. */
21
+ has(siteId: string): boolean;
22
+ /**
23
+ * The default site entry. Resolution order:
24
+ * 1. `default_site_id` (when it points at an existing entry).
25
+ * 2. The lone `is_default:true` entry (schema guarantees at most one).
26
+ * 3. The first entry (the file is guaranteed non-empty by the loader).
27
+ */
28
+ getDefault(): SiteEntryT;
29
+ }
30
+ /**
31
+ * Load the sites file at `path` and return a {@link SitesRegistry}, or `null`
32
+ * when there is no usable multi-site config (so the caller falls through to the
33
+ * env / keychain single-site path).
34
+ *
35
+ * - `path` unset / empty / whitespace → null
36
+ * - file does not exist → null
37
+ * - file parses but has zero sites → null
38
+ * - malformed JSON / schema-invalid /
39
+ * unknown schema_version → throws {@link SitesFileError}
40
+ */
41
+ export declare function loadSitesRegistry(path: string | undefined): SitesRegistry | null;
@@ -0,0 +1,119 @@
1
+ // src/sites/loader.ts — Phase 3.
2
+ //
3
+ // Load + validate the on-disk sites file pointed at by APIMAPPER_SITES_FILE and
4
+ // wrap it in a small read-only registry. This is the multi-site "agency / .dxt
5
+ // one-click" path: a plaintext JSON file listing several WordPress/Joomla sites,
6
+ // each with its own URL + token + platform. The keychain ProfileStore path
7
+ // (src/auth/profiles.ts) remains the secure wizard default for single-machine
8
+ // setups — the two mechanisms coexist; the sites-file takes priority in
9
+ // client.ts ONLY when APIMAPPER_SITES_FILE is set and the file is non-empty.
10
+ //
11
+ // Read-only by design: this loader never writes the sites file. Editing is an
12
+ // operator / wizard concern, kept out of the hot request path.
13
+ import { existsSync, readFileSync } from "node:fs";
14
+ import { SitesFile } from "./schema.js";
15
+ /** Base class for any sites-file IO / parse / validation failure. */
16
+ export class SitesFileError extends Error {
17
+ cause;
18
+ constructor(message, cause) {
19
+ super(message);
20
+ this.cause = cause;
21
+ this.name = "SitesFileError";
22
+ Object.setPrototypeOf(this, SitesFileError.prototype);
23
+ }
24
+ }
25
+ /**
26
+ * Read-only registry around a parsed, non-empty sites file. Provides O(1)-ish
27
+ * lookups for the active-site resolution in client.ts. Never mutates the input.
28
+ */
29
+ export class SitesRegistry {
30
+ file;
31
+ constructor(file) {
32
+ this.file = file;
33
+ }
34
+ /** Entries in insertion order (stable for list-tool UX). */
35
+ list() {
36
+ return this.file.sites;
37
+ }
38
+ /** Site_id list in insertion order. */
39
+ listIds() {
40
+ return this.file.sites.map((s) => s.site_id);
41
+ }
42
+ /** Raw entry for a site_id, or null when unknown. */
43
+ get(siteId) {
44
+ return this.file.sites.find((s) => s.site_id === siteId) ?? null;
45
+ }
46
+ /** True when the registry contains the given site_id. */
47
+ has(siteId) {
48
+ return this.file.sites.some((s) => s.site_id === siteId);
49
+ }
50
+ /**
51
+ * The default site entry. Resolution order:
52
+ * 1. `default_site_id` (when it points at an existing entry).
53
+ * 2. The lone `is_default:true` entry (schema guarantees at most one).
54
+ * 3. The first entry (the file is guaranteed non-empty by the loader).
55
+ */
56
+ getDefault() {
57
+ const explicit = this.file.default_site_id;
58
+ if (explicit !== null) {
59
+ const hit = this.get(explicit);
60
+ if (hit)
61
+ return hit;
62
+ }
63
+ const flagged = this.file.sites.find((s) => s.is_default);
64
+ if (flagged)
65
+ return flagged;
66
+ // Loader guarantees sites.length > 0 (empty → null, never a registry).
67
+ return this.file.sites[0];
68
+ }
69
+ }
70
+ /**
71
+ * Load the sites file at `path` and return a {@link SitesRegistry}, or `null`
72
+ * when there is no usable multi-site config (so the caller falls through to the
73
+ * env / keychain single-site path).
74
+ *
75
+ * - `path` unset / empty / whitespace → null
76
+ * - file does not exist → null
77
+ * - file parses but has zero sites → null
78
+ * - malformed JSON / schema-invalid /
79
+ * unknown schema_version → throws {@link SitesFileError}
80
+ */
81
+ export function loadSitesRegistry(path) {
82
+ const trimmed = (path ?? "").trim();
83
+ if (trimmed.length === 0)
84
+ return null;
85
+ if (!existsSync(trimmed))
86
+ return null;
87
+ let raw;
88
+ try {
89
+ raw = readFileSync(trimmed, "utf8");
90
+ }
91
+ catch (e) {
92
+ throw new SitesFileError(`Failed to read sites file at ${trimmed}`, e);
93
+ }
94
+ let parsed;
95
+ try {
96
+ parsed = JSON.parse(raw);
97
+ }
98
+ catch (e) {
99
+ throw new SitesFileError(`Sites file at ${trimmed} is not valid JSON`, e);
100
+ }
101
+ // Explicit schema-version gate: reject a known-unknown version with a clear
102
+ // message rather than letting the Zod literal check surface a cryptic issue.
103
+ if (typeof parsed === "object" &&
104
+ parsed !== null &&
105
+ "schema_version" in parsed &&
106
+ parsed.schema_version !== 1) {
107
+ throw new SitesFileError(`Unsupported sites-file schema_version: ${String(parsed.schema_version)}. This build supports schema_version: 1.`);
108
+ }
109
+ const result = SitesFile.safeParse(parsed);
110
+ if (!result.success) {
111
+ throw new SitesFileError(`Sites file at ${trimmed} failed schema validation: ` +
112
+ result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "));
113
+ }
114
+ // Empty sites list → no usable multi-site config; fall through to env.
115
+ if (result.data.sites.length === 0)
116
+ return null;
117
+ return new SitesRegistry(result.data);
118
+ }
119
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/sites/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Allowed character set for a `site_id`. Letters, digits, underscore, dash —
4
+ * no spaces, no path separators, no shell metacharacters. Filename-safe,
5
+ * URL-path-safe, log-safe.
6
+ */
7
+ export declare const SITE_ID_REGEX: RegExp;
8
+ /**
9
+ * 1Password Secret Reference shape (`op://<vault>/<item>/<field>` and deeper).
10
+ * Letters, digits, underscore, slash, dot, dash only. The negative lookahead
11
+ * `(?!.*\/\.\.\/)` rejects any ref containing a `/../` traversal segment while
12
+ * still allowing legitimate `.` in vault/item names (e.g. `op://team.acme/...`).
13
+ * Re-validated at the secret-resolver call site as defence-in-depth before the
14
+ * ref ever reaches a subprocess argv.
15
+ */
16
+ export declare const OP_REF_REGEX: RegExp;
17
+ /**
18
+ * API Mapper MCP-key shape (canonical — mirrors core `KeyService.php`):
19
+ * `amk_(live|test)_<payloadB64url>.<signatureB64url>` — the payload and the
20
+ * signature are base64url (`A-Za-z0-9_-`) joined by exactly ONE dot. The earlier
21
+ * pattern dropped the `.<sig>` arm, so it rejected every REAL token (which always
22
+ * carries the dot) — a sites.json with a valid key failed schema validation.
23
+ * Re-validated here so a hand-edited sites.json can never inject a token shape the
24
+ * server would reject anyway.
25
+ */
26
+ export declare const BEARER_REGEX: RegExp;
27
+ /**
28
+ * One site entry. Carries identity (`site_id`), reachability (`url` +
29
+ * `platform`), credential (exactly one of `bearer`/`bearer_ref`), and
30
+ * presentation metadata (`is_default`, `label`, `added_at`).
31
+ */
32
+ export declare const SiteEntry: z.ZodObject<{
33
+ site_id: z.ZodString;
34
+ url: z.ZodString;
35
+ platform: z.ZodDefault<z.ZodEnum<{
36
+ wordpress: "wordpress";
37
+ joomla: "joomla";
38
+ auto: "auto";
39
+ }>>;
40
+ bearer: z.ZodOptional<z.ZodString>;
41
+ bearer_ref: z.ZodOptional<z.ZodString>;
42
+ is_default: z.ZodDefault<z.ZodBoolean>;
43
+ label: z.ZodOptional<z.ZodString>;
44
+ added_at: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>;
46
+ /**
47
+ * The on-disk sites-file root. `schema_version` is a literal `1` for now;
48
+ * future schema migrations bump it AND add a migration step in the loader.
49
+ */
50
+ export declare const SitesFile: z.ZodObject<{
51
+ schema_version: z.ZodLiteral<1>;
52
+ default_site_id: z.ZodNullable<z.ZodString>;
53
+ sites: z.ZodArray<z.ZodObject<{
54
+ site_id: z.ZodString;
55
+ url: z.ZodString;
56
+ platform: z.ZodDefault<z.ZodEnum<{
57
+ wordpress: "wordpress";
58
+ joomla: "joomla";
59
+ auto: "auto";
60
+ }>>;
61
+ bearer: z.ZodOptional<z.ZodString>;
62
+ bearer_ref: z.ZodOptional<z.ZodString>;
63
+ is_default: z.ZodDefault<z.ZodBoolean>;
64
+ label: z.ZodOptional<z.ZodString>;
65
+ added_at: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>>;
67
+ }, z.core.$strip>;
68
+ export type SiteEntryT = z.infer<typeof SiteEntry>;
69
+ export type SitesFileT = z.infer<typeof SitesFile>;
@@ -0,0 +1,71 @@
1
+ // src/sites/schema.ts — Zod schemas for the on-disk API Mapper sites file.
2
+ //
3
+ // Phase 3 (2026-06-03): the multi-site sites-file mechanism. Mirrors the YT
4
+ // Builder reference shape (yt-builder-mcp/packages/mcp/src/sites/schema.ts) so
5
+ // both MCP servers expose the SAME multi-site concept, adapted for API Mapper:
6
+ // - token shape is `amk_(live|test)_…` (API Mapper MCP key), not `ytb_…`.
7
+ // - per-site `platform` is 'wordpress' | 'joomla' | 'auto' (default 'auto').
8
+ //
9
+ // The on-disk format is JSON. Each entry is one connected WordPress/Joomla site
10
+ // running API Mapper. A site MUST carry either an inline `bearer` (plain text)
11
+ // OR an `op://` 1Password Secret Reference (`bearer_ref`), never both — enforced
12
+ // via the SiteEntry refine().
13
+ import { z } from "zod";
14
+ /**
15
+ * Allowed character set for a `site_id`. Letters, digits, underscore, dash —
16
+ * no spaces, no path separators, no shell metacharacters. Filename-safe,
17
+ * URL-path-safe, log-safe.
18
+ */
19
+ export const SITE_ID_REGEX = /^[a-zA-Z0-9_-]+$/;
20
+ /**
21
+ * 1Password Secret Reference shape (`op://<vault>/<item>/<field>` and deeper).
22
+ * Letters, digits, underscore, slash, dot, dash only. The negative lookahead
23
+ * `(?!.*\/\.\.\/)` rejects any ref containing a `/../` traversal segment while
24
+ * still allowing legitimate `.` in vault/item names (e.g. `op://team.acme/...`).
25
+ * Re-validated at the secret-resolver call site as defence-in-depth before the
26
+ * ref ever reaches a subprocess argv.
27
+ */
28
+ export const OP_REF_REGEX = /^op:\/\/(?!.*\/\.\.\/)[A-Za-z0-9_/.-]+$/;
29
+ /**
30
+ * API Mapper MCP-key shape (canonical — mirrors core `KeyService.php`):
31
+ * `amk_(live|test)_<payloadB64url>.<signatureB64url>` — the payload and the
32
+ * signature are base64url (`A-Za-z0-9_-`) joined by exactly ONE dot. The earlier
33
+ * pattern dropped the `.<sig>` arm, so it rejected every REAL token (which always
34
+ * carries the dot) — a sites.json with a valid key failed schema validation.
35
+ * Re-validated here so a hand-edited sites.json can never inject a token shape the
36
+ * server would reject anyway.
37
+ */
38
+ export const BEARER_REGEX = /^amk_(live|test)_[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/;
39
+ /**
40
+ * One site entry. Carries identity (`site_id`), reachability (`url` +
41
+ * `platform`), credential (exactly one of `bearer`/`bearer_ref`), and
42
+ * presentation metadata (`is_default`, `label`, `added_at`).
43
+ */
44
+ export const SiteEntry = z
45
+ .object({
46
+ site_id: z.string().min(1).max(64).regex(SITE_ID_REGEX),
47
+ url: z.string().url(),
48
+ platform: z.enum(["wordpress", "joomla", "auto"]).default("auto"),
49
+ bearer: z.string().regex(BEARER_REGEX).optional(),
50
+ bearer_ref: z.string().regex(OP_REF_REGEX).optional(),
51
+ is_default: z.boolean().default(false),
52
+ label: z.string().max(120).optional(),
53
+ added_at: z.string().datetime().optional(),
54
+ })
55
+ .refine((s) => (s.bearer !== undefined) !== (s.bearer_ref !== undefined), {
56
+ message: "Exactly one of bearer or bearer_ref must be set",
57
+ });
58
+ /**
59
+ * The on-disk sites-file root. `schema_version` is a literal `1` for now;
60
+ * future schema migrations bump it AND add a migration step in the loader.
61
+ */
62
+ export const SitesFile = z
63
+ .object({
64
+ schema_version: z.literal(1),
65
+ default_site_id: z.string().regex(SITE_ID_REGEX).nullable(),
66
+ sites: z.array(SiteEntry),
67
+ })
68
+ .refine((f) => f.sites.filter((s) => s.is_default).length <= 1, {
69
+ message: "At most one site can have is_default:true",
70
+ });
71
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/sites/schema.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAC/E,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,8BAA8B;AAE9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,yCAAyC,CAAC;AAEtE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,kDAAkD,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IACvD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;IACjD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;IACrD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC3C,CAAC;KACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,EAAE;IACxE,OAAO,EAAE,iDAAiD;CAC3D,CAAC,CAAC;AAEL;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5B,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAC3D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;CAC1B,CAAC;KACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;IAC9D,OAAO,EAAE,2CAA2C;CACrD,CAAC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type SiteEntryT } from "./schema.js";
2
+ /**
3
+ * Resolve the `op` binary to an absolute path so it works under a stripped-down
4
+ * GUI PATH. Precedence: explicit `APIMAPPER_OP_BINARY` env override → first
5
+ * existing well-known absolute path → bare `op` (PATH).
6
+ */
7
+ export declare function resolveOpBinary(env?: NodeJS.ProcessEnv): string;
8
+ /** Resolved bearer + its provenance for downstream logs (never the token). */
9
+ export interface ResolvedBearer {
10
+ readonly token: string;
11
+ readonly source: "plain" | "op";
12
+ }
13
+ /** Domain-tagged error so callers can branch on `code`. */
14
+ export declare class SecretResolverError extends Error {
15
+ readonly code: string;
16
+ constructor(code: string, message: string);
17
+ }
18
+ /**
19
+ * Signature of `node:child_process.execFile` reduced to the callback we rely
20
+ * on. Injecting this lets tests provide a deterministic substitute without a
21
+ * `vi.mock('node:child_process')` side-effect.
22
+ */
23
+ export type ExecFileLike = (file: string, args: readonly string[], options: {
24
+ timeout?: number;
25
+ maxBuffer?: number;
26
+ }, callback: (error: (Error & {
27
+ code?: string | number;
28
+ signal?: string;
29
+ }) | null, stdout: string, stderr: string) => void) => void;
30
+ export interface ResolveSiteBearerOptions {
31
+ /** Injected execFile for tests. Defaults to Node's real execFile. */
32
+ execFile?: ExecFileLike;
33
+ /** Resolved `op` binary path. Defaults to {@link resolveOpBinary}. */
34
+ opBinary?: string;
35
+ /** Per-call timeout override. Defaults to {@link OP_TIMEOUT_MS}. */
36
+ timeoutMs?: number;
37
+ }
38
+ /**
39
+ * Resolve the bearer token for a site entry.
40
+ *
41
+ * - `bearer` present → returned verbatim (`source:'plain'`).
42
+ * - `bearer_ref` set → `op read <ref>` via execFile (`source:'op'`).
43
+ * - neither → throws SecretResolverError('BEARER_MISSING').
44
+ *
45
+ * Never logs the token; never mutates the input site.
46
+ */
47
+ export declare function resolveSiteBearer(site: SiteEntryT, opts?: ResolveSiteBearerOptions): Promise<ResolvedBearer>;