@omnicoreos/planka-mcp 0.2.0 → 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 (195) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +26 -0
  3. package/.claude-plugin/plugin.json +45 -0
  4. package/.codex-plugin/mcp.json +16 -0
  5. package/.codex-plugin/plugin.json +27 -0
  6. package/.mcp.json +17 -0
  7. package/CHANGELOG.md +510 -0
  8. package/README.es.md +294 -55
  9. package/README.md +293 -55
  10. package/dist/cli/init.d.ts +101 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +481 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/client.d.ts +32 -4
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +106 -32
  17. package/dist/client.js.map +1 -1
  18. package/dist/config/policy.d.ts +82 -0
  19. package/dist/config/policy.d.ts.map +1 -0
  20. package/dist/config/policy.js +226 -0
  21. package/dist/config/policy.js.map +1 -0
  22. package/dist/errors.d.ts +5 -1
  23. package/dist/errors.d.ts.map +1 -1
  24. package/dist/errors.js +62 -5
  25. package/dist/errors.js.map +1 -1
  26. package/dist/identity.generated.d.ts +2 -1
  27. package/dist/identity.generated.d.ts.map +1 -1
  28. package/dist/identity.generated.js +2 -1
  29. package/dist/identity.generated.js.map +1 -1
  30. package/dist/index.js +85 -10
  31. package/dist/index.js.map +1 -1
  32. package/dist/instructions.d.ts +21 -0
  33. package/dist/instructions.d.ts.map +1 -0
  34. package/dist/instructions.js +37 -0
  35. package/dist/instructions.js.map +1 -0
  36. package/dist/operations/actions.d.ts +654 -0
  37. package/dist/operations/actions.d.ts.map +1 -0
  38. package/dist/operations/actions.js +154 -0
  39. package/dist/operations/actions.js.map +1 -0
  40. package/dist/operations/archive.d.ts +28 -0
  41. package/dist/operations/archive.d.ts.map +1 -0
  42. package/dist/operations/archive.js +74 -0
  43. package/dist/operations/archive.js.map +1 -0
  44. package/dist/operations/attachments.d.ts +1 -1
  45. package/dist/operations/attachments.d.ts.map +1 -1
  46. package/dist/operations/attachments.js +3 -1
  47. package/dist/operations/attachments.js.map +1 -1
  48. package/dist/operations/board-id.d.ts +1 -1
  49. package/dist/operations/board-id.d.ts.map +1 -1
  50. package/dist/operations/board-id.js +13 -7
  51. package/dist/operations/board-id.js.map +1 -1
  52. package/dist/operations/boards.d.ts +96 -19
  53. package/dist/operations/boards.d.ts.map +1 -1
  54. package/dist/operations/boards.js +377 -93
  55. package/dist/operations/boards.js.map +1 -1
  56. package/dist/operations/card-brief.d.ts +91 -0
  57. package/dist/operations/card-brief.d.ts.map +1 -0
  58. package/dist/operations/card-brief.js +79 -0
  59. package/dist/operations/card-brief.js.map +1 -0
  60. package/dist/operations/cards.d.ts +34 -9
  61. package/dist/operations/cards.d.ts.map +1 -1
  62. package/dist/operations/cards.js +60 -14
  63. package/dist/operations/cards.js.map +1 -1
  64. package/dist/operations/comments.d.ts +61 -4
  65. package/dist/operations/comments.d.ts.map +1 -1
  66. package/dist/operations/comments.js +91 -8
  67. package/dist/operations/comments.js.map +1 -1
  68. package/dist/operations/duplicate.d.ts +16 -0
  69. package/dist/operations/duplicate.d.ts.map +1 -0
  70. package/dist/operations/duplicate.js +43 -0
  71. package/dist/operations/duplicate.js.map +1 -0
  72. package/dist/operations/labels.d.ts +1 -1
  73. package/dist/operations/labels.d.ts.map +1 -1
  74. package/dist/operations/labels.js +7 -4
  75. package/dist/operations/labels.js.map +1 -1
  76. package/dist/operations/lists.d.ts +63 -1
  77. package/dist/operations/lists.d.ts.map +1 -1
  78. package/dist/operations/lists.js +97 -2
  79. package/dist/operations/lists.js.map +1 -1
  80. package/dist/operations/members.d.ts +39 -0
  81. package/dist/operations/members.d.ts.map +1 -0
  82. package/dist/operations/members.js +107 -0
  83. package/dist/operations/members.js.map +1 -0
  84. package/dist/operations/projects.d.ts +16 -0
  85. package/dist/operations/projects.d.ts.map +1 -1
  86. package/dist/operations/projects.js +54 -9
  87. package/dist/operations/projects.js.map +1 -1
  88. package/dist/operations/tasks.d.ts +1 -1
  89. package/dist/operations/tasks.d.ts.map +1 -1
  90. package/dist/operations/tasks.js +5 -3
  91. package/dist/operations/tasks.js.map +1 -1
  92. package/dist/operations/users.d.ts +123 -0
  93. package/dist/operations/users.d.ts.map +1 -0
  94. package/dist/operations/users.js +180 -0
  95. package/dist/operations/users.js.map +1 -0
  96. package/dist/operations/verify.d.ts +84 -0
  97. package/dist/operations/verify.d.ts.map +1 -0
  98. package/dist/operations/verify.js +124 -0
  99. package/dist/operations/verify.js.map +1 -0
  100. package/dist/prompts.d.ts +48 -0
  101. package/dist/prompts.d.ts.map +1 -0
  102. package/dist/prompts.js +155 -0
  103. package/dist/prompts.js.map +1 -0
  104. package/dist/resources.d.ts +38 -0
  105. package/dist/resources.d.ts.map +1 -0
  106. package/dist/resources.js +127 -0
  107. package/dist/resources.js.map +1 -0
  108. package/dist/schemas/entities.d.ts +115 -24
  109. package/dist/schemas/entities.d.ts.map +1 -1
  110. package/dist/schemas/entities.js +48 -0
  111. package/dist/schemas/entities.js.map +1 -1
  112. package/dist/schemas/requests.d.ts +121 -46
  113. package/dist/schemas/requests.d.ts.map +1 -1
  114. package/dist/schemas/requests.js +57 -12
  115. package/dist/schemas/requests.js.map +1 -1
  116. package/dist/schemas/responses.d.ts +541 -186
  117. package/dist/schemas/responses.d.ts.map +1 -1
  118. package/dist/schemas/responses.js +13 -2
  119. package/dist/schemas/responses.js.map +1 -1
  120. package/dist/tools/activity.d.ts +150 -0
  121. package/dist/tools/activity.d.ts.map +1 -0
  122. package/dist/tools/activity.js +198 -0
  123. package/dist/tools/activity.js.map +1 -0
  124. package/dist/tools/annotations.d.ts +52 -0
  125. package/dist/tools/annotations.d.ts.map +1 -0
  126. package/dist/tools/annotations.js +214 -0
  127. package/dist/tools/annotations.js.map +1 -0
  128. package/dist/tools/attachments.d.ts +28 -4
  129. package/dist/tools/attachments.d.ts.map +1 -1
  130. package/dist/tools/attachments.js +53 -34
  131. package/dist/tools/attachments.js.map +1 -1
  132. package/dist/tools/card-ops.d.ts +232 -0
  133. package/dist/tools/card-ops.d.ts.map +1 -0
  134. package/dist/tools/card-ops.js +333 -0
  135. package/dist/tools/card-ops.js.map +1 -0
  136. package/dist/tools/cards.d.ts +90 -8
  137. package/dist/tools/cards.d.ts.map +1 -1
  138. package/dist/tools/cards.js +411 -128
  139. package/dist/tools/cards.js.map +1 -1
  140. package/dist/tools/comments.d.ts +226 -22
  141. package/dist/tools/comments.d.ts.map +1 -1
  142. package/dist/tools/comments.js +163 -134
  143. package/dist/tools/comments.js.map +1 -1
  144. package/dist/tools/dispatch.d.ts +47 -0
  145. package/dist/tools/dispatch.d.ts.map +1 -0
  146. package/dist/tools/dispatch.js +63 -0
  147. package/dist/tools/dispatch.js.map +1 -0
  148. package/dist/tools/guard.d.ts +9 -0
  149. package/dist/tools/guard.d.ts.map +1 -0
  150. package/dist/tools/guard.js +20 -0
  151. package/dist/tools/guard.js.map +1 -0
  152. package/dist/tools/index.d.ts +748 -450
  153. package/dist/tools/index.d.ts.map +1 -1
  154. package/dist/tools/index.js +136 -17
  155. package/dist/tools/index.js.map +1 -1
  156. package/dist/tools/labels.d.ts +213 -18
  157. package/dist/tools/labels.d.ts.map +1 -1
  158. package/dist/tools/labels.js +218 -203
  159. package/dist/tools/labels.js.map +1 -1
  160. package/dist/tools/lists.d.ts +222 -15
  161. package/dist/tools/lists.d.ts.map +1 -1
  162. package/dist/tools/lists.js +175 -156
  163. package/dist/tools/lists.js.map +1 -1
  164. package/dist/tools/members.d.ts +128 -0
  165. package/dist/tools/members.d.ts.map +1 -0
  166. package/dist/tools/members.js +150 -0
  167. package/dist/tools/members.js.map +1 -0
  168. package/dist/tools/navigation.d.ts +22 -2
  169. package/dist/tools/navigation.d.ts.map +1 -1
  170. package/dist/tools/navigation.js +60 -15
  171. package/dist/tools/navigation.js.map +1 -1
  172. package/dist/tools/queries.d.ts +196 -166
  173. package/dist/tools/queries.d.ts.map +1 -1
  174. package/dist/tools/queries.js +125 -155
  175. package/dist/tools/queries.js.map +1 -1
  176. package/dist/tools/tasks.d.ts +26 -6
  177. package/dist/tools/tasks.d.ts.map +1 -1
  178. package/dist/tools/tasks.js +110 -55
  179. package/dist/tools/tasks.js.map +1 -1
  180. package/dist/tools/users.d.ts +130 -0
  181. package/dist/tools/users.d.ts.map +1 -0
  182. package/dist/tools/users.js +165 -0
  183. package/dist/tools/users.js.map +1 -0
  184. package/docs/planka-2x-gotchas.md +121 -5
  185. package/docs/tools.md +771 -187
  186. package/docs/troubleshooting.md +137 -5
  187. package/hooks/hooks.json +15 -0
  188. package/hooks/preflight.mjs +100 -0
  189. package/package.json +6 -1
  190. package/scripts/setup.sh +8 -26
  191. package/scripts/sync-identity.mjs +55 -1
  192. package/server.json +87 -6
  193. package/tests/smoke/planka-smoke.mjs +512 -72
  194. package/workflow/skills/planka-close-card/SKILL.md +18 -5
  195. package/workflow/skills/planka-orchestrator/SKILL.md +36 -7
package/dist/client.js CHANGED
@@ -5,10 +5,15 @@ import { PlankaAuthError, PlankaConfigError, PlankaNetworkError, createPlankaErr
5
5
  import { AuthResponse } from "./schemas/responses.js";
6
6
  export function createRequestInit(method, options = {}) {
7
7
  const headers = {};
8
- if (options.token)
8
+ if (options.apiKey) {
9
+ // Never together with Authorization: Planka would ignore the key.
10
+ headers["X-Api-Key"] = options.apiKey;
11
+ }
12
+ else if (options.token) {
9
13
  headers.Authorization = `Bearer ${options.token}`;
10
- if (options.token && options.cookieToken) {
11
- headers.Cookie = `accessToken=${options.token}`;
14
+ if (options.cookieToken) {
15
+ headers.Cookie = `accessToken=${options.token}`;
16
+ }
12
17
  }
13
18
  if (options.form === undefined && options.body !== undefined) {
14
19
  headers["Content-Type"] = "application/json";
@@ -26,17 +31,30 @@ export function createRequestInit(method, options = {}) {
26
31
  */
27
32
  export function getConfig(env = process.env) {
28
33
  const baseUrl = env.PLANKA_BASE_URL;
29
- const email = env.PLANKA_AGENT_EMAIL;
34
+ const apiKey = env.PLANKA_API_KEY?.trim() || undefined;
35
+ const email = env.PLANKA_AGENT_EMAIL?.trim() || undefined;
30
36
  const password = env.PLANKA_AGENT_PASSWORD;
31
- const missing = [];
32
- if (!baseUrl)
33
- missing.push("PLANKA_BASE_URL");
34
- if (!email)
35
- missing.push("PLANKA_AGENT_EMAIL");
36
- if (!password)
37
- missing.push("PLANKA_AGENT_PASSWORD");
38
- if (missing.length > 0) {
39
- throw new PlankaConfigError(`Missing required environment variables: ${missing.join(", ")}`);
37
+ if (!baseUrl) {
38
+ throw new PlankaConfigError("Missing required environment variables: PLANKA_BASE_URL");
39
+ }
40
+ // API key XOR password login. Sending both is a configuration mistake worth
41
+ // naming: Planka would silently use only one of them.
42
+ if (apiKey && (email || password)) {
43
+ throw new PlankaConfigError("Conflicting Planka credentials: PLANKA_API_KEY is set together with " +
44
+ "PLANKA_AGENT_EMAIL, PLANKA_AGENT_PASSWORD. Choose one: keep PLANKA_API_KEY " +
45
+ "(recommended) and unset the email/password pair, or unset PLANKA_API_KEY.");
46
+ }
47
+ if (!apiKey) {
48
+ const missing = [];
49
+ if (!email)
50
+ missing.push("PLANKA_AGENT_EMAIL");
51
+ if (!password)
52
+ missing.push("PLANKA_AGENT_PASSWORD");
53
+ if (missing.length > 0) {
54
+ throw new PlankaConfigError(`Missing Planka credentials (${missing.join(", ")}). Authenticate with EITHER ` +
55
+ "PLANKA_API_KEY (recommended: no login, no token refresh, no sign-in rate limit) " +
56
+ "OR the pair PLANKA_AGENT_EMAIL, PLANKA_AGENT_PASSWORD.");
57
+ }
40
58
  }
41
59
  // Validate URL format
42
60
  try {
@@ -45,11 +63,9 @@ export function getConfig(env = process.env) {
45
63
  catch {
46
64
  throw new PlankaConfigError(`Invalid PLANKA_BASE_URL: ${baseUrl}`);
47
65
  }
48
- // TypeScript narrowing: after the check above, these are guaranteed to be defined
49
66
  return {
50
67
  baseUrl: baseUrl.replace(/\/+$/, ""), // Remove trailing slashes
51
- email: email,
52
- password: password,
68
+ ...(apiKey ? { apiKey } : { email: email, password: password }),
53
69
  };
54
70
  }
55
71
  /**
@@ -111,9 +127,11 @@ export class PlankaClient {
111
127
  }
112
128
  const data = await this.safeParseJson(response);
113
129
  if (data === null) {
114
- const redirectHint = config.baseUrl.startsWith("http://") || response.redirected
115
- ? " Your HTTP URL probably redirects to HTTPS; a 301/302 can drop the POST body. Configure the final https:// URL directly."
116
- : " Check that PLANKA_BASE_URL points to the Planka API origin, not a proxy error page.";
130
+ const redirectHint = response.redirected
131
+ ? " The request was redirected: a 301/302 can drop the POST body. Configure the final URL directly."
132
+ : config.baseUrl.startsWith("http://")
133
+ ? " PLANKA_BASE_URL is http://: if the server redirects to HTTPS the POST body is dropped. Configure the final https:// URL directly."
134
+ : " Check that PLANKA_BASE_URL points to the Planka API origin, not a proxy error page.";
117
135
  throw new PlankaAuthError(`Authentication returned HTML or another non-JSON response.${redirectHint}`);
118
136
  }
119
137
  const parsed = AuthResponse.safeParse(data);
@@ -136,6 +154,46 @@ export class PlankaClient {
136
154
  }
137
155
  return this.token;
138
156
  }
157
+ /**
158
+ * The auth material for one request: an API key when configured (no login,
159
+ * no refresh), a bearer token otherwise. Never both — Planka ignores
160
+ * `x-api-key` whenever `Authorization` is present.
161
+ */
162
+ async authOptions() {
163
+ const config = this.getConfig();
164
+ if (config.apiKey)
165
+ return { apiKey: config.apiKey };
166
+ return { token: await this.getToken() };
167
+ }
168
+ /**
169
+ * A 200 carrying the SPA's HTML instead of JSON — Planka answers every
170
+ * unknown GET that way, and an http:// base URL redirected to https:// ends
171
+ * up here too. Indistinguishable from success if only the status is read.
172
+ */
173
+ assertNotHtml(response, data, what, method) {
174
+ if (data !== null)
175
+ return;
176
+ const contentType = response.headers.get("content-type") ?? "";
177
+ if (!contentType.includes("text/html"))
178
+ return;
179
+ const config = this.getConfig();
180
+ // The HTTP→HTTPS redirect is the most common cause, not the only one: an
181
+ // https:// base URL that was never redirected cannot be it, and neither can
182
+ // a plain http:// origin that answered directly.
183
+ const redirectHint = response.redirected
184
+ ? " The request was redirected: configure the final URL directly, a 301/302 can drop the body."
185
+ : config.baseUrl.startsWith("http://")
186
+ ? " PLANKA_BASE_URL is http://: if the server redirects to HTTPS, configure the final https:// URL directly. Otherwise check that it points at the Planka API origin, not a proxy error page."
187
+ : " Check that PLANKA_BASE_URL points to the Planka API origin, not a proxy error page.";
188
+ // A non-GET reaching here went somewhere: the SPA catch-all is GET-only, so
189
+ // HTML on a write means a redirect or a proxy, and the write may have run.
190
+ const writeHint = method === "GET"
191
+ ? ""
192
+ : " This was a WRITE: it MAY have landed even though the answer is unusable — re-read the entity before retrying.";
193
+ throw new PlankaNetworkError(`${what} returned HTML instead of JSON: this route does not exist in Planka 2.x — ` +
194
+ "every unknown GET under /api falls through to the single-page app, which answers 200 with HTML." +
195
+ `${redirectHint}${writeHint}`);
196
+ }
139
197
  /**
140
198
  * Safely parses JSON from a response, returning null on failure.
141
199
  */
@@ -153,21 +211,22 @@ export class PlankaClient {
153
211
  */
154
212
  async request(method, path, body, isRetry = false) {
155
213
  const config = this.getConfig();
156
- const token = await this.getToken();
214
+ const auth = await this.authOptions();
157
215
  const url = `${config.baseUrl}${path}`;
158
216
  let response;
159
217
  try {
160
218
  response = await this.fetchImpl(url, createRequestInit(method, {
161
- token,
219
+ ...auth,
162
220
  body,
163
221
  signal: this.createTimeoutSignal(),
164
222
  }));
165
223
  }
166
224
  catch (error) {
167
225
  if (error instanceof Error && error.name === "AbortError") {
168
- throw new PlankaNetworkError(`Request timeout: ${method} ${path}`, error);
226
+ throw new PlankaNetworkError(`Request timeout: ${method} ${path} (Planka at ${config.baseUrl})`, error);
169
227
  }
170
- throw new PlankaNetworkError(`Network error: ${method} ${path}`, error);
228
+ throw new PlankaNetworkError(`Network error: ${method} ${path} — could not reach Planka at ${config.baseUrl}. ` +
229
+ "Check PLANKA_BASE_URL, DNS and that the instance is up.", error);
171
230
  }
172
231
  // Handle 204 No Content
173
232
  if (response.status === 204) {
@@ -183,6 +242,7 @@ export class PlankaClient {
183
242
  }
184
243
  throw createPlankaError(response.status, data, `${method} ${path}`);
185
244
  }
245
+ this.assertNotHtml(response, data, `${method} ${path}`, method);
186
246
  return data;
187
247
  }
188
248
  /**
@@ -191,21 +251,22 @@ export class PlankaClient {
191
251
  */
192
252
  async postMultipart(path, form, isRetry = false) {
193
253
  const config = this.getConfig();
194
- const token = await this.getToken();
254
+ const auth = await this.authOptions();
195
255
  const url = `${config.baseUrl}${path}`;
196
256
  let response;
197
257
  try {
198
258
  response = await this.fetchImpl(url, createRequestInit("POST", {
199
- token,
259
+ ...auth,
200
260
  form,
201
261
  signal: this.createTimeoutSignal(),
202
262
  }));
203
263
  }
204
264
  catch (error) {
205
265
  if (error instanceof Error && error.name === "AbortError") {
206
- throw new PlankaNetworkError(`Request timeout: POST ${path}`, error);
266
+ throw new PlankaNetworkError(`Request timeout: POST ${path} (Planka at ${config.baseUrl})`, error);
207
267
  }
208
- throw new PlankaNetworkError(`Network error: POST ${path}`, error);
268
+ throw new PlankaNetworkError(`Network error: POST ${path} — could not reach Planka at ${config.baseUrl}. ` +
269
+ "The upload MAY have started; re-read the card's attachments before retrying.", error);
209
270
  }
210
271
  const data = await this.safeParseJson(response);
211
272
  if (!response.ok) {
@@ -222,27 +283,35 @@ export class PlankaClient {
222
283
  * Authenticated binary download (attachment contents).
223
284
  * Accepts an absolute URL on the same host, or a relative path.
224
285
  */
225
- async getBinary(urlOrPath) {
286
+ async getBinary(urlOrPath, isRetry = false) {
226
287
  const config = this.getConfig();
227
- const token = await this.getToken();
288
+ const auth = await this.authOptions();
228
289
  const url = urlOrPath.startsWith("http")
229
290
  ? urlOrPath
230
291
  : `${config.baseUrl}${urlOrPath}`;
231
292
  let response;
232
293
  try {
233
294
  response = await this.fetchImpl(url, createRequestInit("GET", {
234
- token,
295
+ ...auth,
296
+ // Planka serves downloads with the cookie or the API key, and some
297
+ // deployments disagree on which one they honour.
235
298
  cookieToken: true,
236
299
  signal: this.createTimeoutSignal(),
237
300
  }));
238
301
  }
239
302
  catch (error) {
240
303
  if (error instanceof Error && error.name === "AbortError") {
241
- throw new PlankaNetworkError(`Request timeout: GET ${url}`, error);
304
+ throw new PlankaNetworkError(`Request timeout: GET ${url} (Planka at ${config.baseUrl})`, error);
242
305
  }
243
- throw new PlankaNetworkError(`Network error: GET ${url}`, error);
306
+ throw new PlankaNetworkError(`Network error: GET ${url} — could not reach Planka at ${config.baseUrl}.`, error);
244
307
  }
245
308
  if (!response.ok) {
309
+ // Same expired-token retry the JSON path has always had.
310
+ if (response.status === 401 && this.token && !isRetry) {
311
+ this.token = null;
312
+ this.tokenExpiresAt = 0;
313
+ return this.getBinary(urlOrPath, true);
314
+ }
246
315
  throw createPlankaError(response.status, null, `GET ${url}`);
247
316
  }
248
317
  const buffer = await response.arrayBuffer();
@@ -271,6 +340,11 @@ export class PlankaClient {
271
340
  }
272
341
  /**
273
342
  * DELETE request.
343
+ *
344
+ * Returns the response body: Planka 2.x answers a delete with `{item}` of
345
+ * what it removed, and that item carries the parent id (cardId, boardId…)
346
+ * the caller needs to re-read the parent and prove the delete landed.
347
+ * Discarding it made every delete a blind `success: true`.
274
348
  */
275
349
  async delete(path) {
276
350
  return this.request("DELETE", path);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ export interface AccessPolicy {
2
+ /** Board used when a tool call omits `boardId`. `null` = no default. */
3
+ defaultBoardId: string | null;
4
+ /** Allowlist of board ids. `null` = no allowlist (everything visible). */
5
+ allowedBoardIds: string[] | null;
6
+ /** Allowlist of project ids. `null` = no allowlist. */
7
+ allowedProjectIds: string[] | null;
8
+ /** Hide (and refuse) every write tool. */
9
+ readOnly: boolean;
10
+ /** Tool names switched off by configuration. */
11
+ disabledTools: string[];
12
+ /** Drop deprecated tools (old names kept as aliases) from `tools/list`. */
13
+ hideDeprecated: boolean;
14
+ /**
15
+ * Lists that must not receive cards, be edited or deleted — and whose cards
16
+ * may not be moved, archived or deleted out of them either.
17
+ */
18
+ protectedListIds: string[];
19
+ /**
20
+ * Label that `planka_board_summary` flags as "unblocked". `null` = none: the
21
+ * server ships no board-specific vocabulary of its own.
22
+ */
23
+ summaryHighlightLabel: string | null;
24
+ /**
25
+ * Columns `planka_board_summary` returns cards from when the call does not
26
+ * say. `null` = none: the summary answers columns and labels only.
27
+ */
28
+ summaryDecisionLists: string[] | null;
29
+ }
30
+ /**
31
+ * The tools that write to Planka, by name and on purpose.
32
+ *
33
+ * A heuristic over the name ("does it start with get_?") would silently
34
+ * misclassify the next tool someone adds. This set is the contract:
35
+ * `tests/unit/policy.test.ts` asserts, tool by tool, that membership here
36
+ * matches the `readOnlyHint` each tool advertises in `toolPresentation` — so a
37
+ * write tool that nobody listed here fails the suite instead of staying
38
+ * visible under `PLANKA_READ_ONLY=true`.
39
+ */
40
+ export declare const WRITE_TOOL_NAMES: ReadonlySet<string>;
41
+ /** Tool names are always prefixed; accept the bare name as a convenience. */
42
+ export declare function normalizeToolName(name: string): string;
43
+ /**
44
+ * Builds the policy from an environment. Pure: no caching, no process.env.
45
+ */
46
+ export declare function parsePolicy(env: NodeJS.ProcessEnv): AccessPolicy;
47
+ /**
48
+ * The active policy. Memoized per environment object so a tool call does not
49
+ * re-parse on every request, and so tests can hand in their own env.
50
+ */
51
+ export declare function getPolicy(env?: NodeJS.ProcessEnv): AccessPolicy;
52
+ /** Drops the memoized policy. For tests, and for anything that mutates env. */
53
+ export declare function resetPolicyCache(): void;
54
+ /**
55
+ * Rejects a board that is outside the allowlist, before any request goes out.
56
+ */
57
+ export declare function assertBoardAllowed(boardId: string, policy?: AccessPolicy): string;
58
+ /** Same check for projects. */
59
+ export declare function assertProjectAllowed(projectId: string, policy?: AccessPolicy): string;
60
+ /** True when the id survives the board allowlist. */
61
+ export declare function isBoardAllowed(boardId: string, policy?: AccessPolicy): boolean;
62
+ /** True when the id survives the project allowlist. */
63
+ export declare function isProjectAllowed(projectId: string, policy?: AccessPolicy): boolean;
64
+ /**
65
+ * Fills in `PLANKA_DEFAULT_BOARD_ID` for a missing `boardId` and checks the
66
+ * result against the allowlist. Throws when there is neither an argument nor
67
+ * a default.
68
+ */
69
+ export declare function resolveBoardId(boardId: string | undefined | null, policy?: AccessPolicy): string;
70
+ /** Whether a tool is exposed at all under the current policy. */
71
+ export declare function isToolVisible(name: string, policy?: AccessPolicy): boolean;
72
+ /**
73
+ * Why a tool is not available — the text the model gets back when it calls one
74
+ * anyway. Returns null when the tool is available.
75
+ */
76
+ export declare function toolBlockedReason(name: string, policy?: AccessPolicy): string | null;
77
+ /**
78
+ * Guard-rail (not security — Planka has no per-list permissions) that keeps
79
+ * cards out of protected columns and protected columns intact.
80
+ */
81
+ export declare function assertListWritable(listId: string | undefined | null, policy?: AccessPolicy, action?: string): void;
82
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/config/policy.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,0EAA0E;IAC1E,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2EAA2E;IAC3E,cAAc,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;OAGG;IACH,oBAAoB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CA4B/C,CAAC;AAEH,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AA8CD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,CAyDhE;AAKD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAM5E;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,YAA0B,GACjC,MAAM,CAQR;AAED,+BAA+B;AAC/B,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,YAA0B,GACjC,MAAM,CAQR;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,YAA0B,GACjC,OAAO,CAET;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,YAA0B,GACjC,OAAO,CAKT;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAClC,MAAM,GAAE,YAA0B,GACjC,MAAM,CAcR;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,YAA0B,GACjC,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,YAA0B,GACjC,MAAM,GAAG,IAAI,CAcf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACjC,MAAM,GAAE,YAA0B,EAClC,MAAM,SAAa,GAClB,IAAI,CASN"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Access policy: what this MCP server is allowed to see and touch.
3
+ *
4
+ * Layer 2 of the three-layer defence documented in the README. Layer 1 is
5
+ * Planka itself (a `boardUser` with board memberships — the only layer an
6
+ * agent cannot talk its way around); layer 3 is the client's own allow/deny
7
+ * list. This module is the middle one: it travels with the package, so it
8
+ * reaches every runtime (Claude Code, Codex, Cursor…) with the same rules.
9
+ *
10
+ * Everything here is driven by environment variables and every helper is
11
+ * pure, so the whole surface is testable without a Planka.
12
+ */
13
+ import { PlankaConfigError, PlankaError } from "../errors.js";
14
+ /**
15
+ * The tools that write to Planka, by name and on purpose.
16
+ *
17
+ * A heuristic over the name ("does it start with get_?") would silently
18
+ * misclassify the next tool someone adds. This set is the contract:
19
+ * `tests/unit/policy.test.ts` asserts, tool by tool, that membership here
20
+ * matches the `readOnlyHint` each tool advertises in `toolPresentation` — so a
21
+ * write tool that nobody listed here fails the suite instead of staying
22
+ * visible under `PLANKA_READ_ONLY=true`.
23
+ */
24
+ export const WRITE_TOOL_NAMES = new Set([
25
+ "planka_create_card",
26
+ "planka_update_card",
27
+ "planka_move_card",
28
+ "planka_delete_card",
29
+ "planka_create_tasks",
30
+ "planka_update_task",
31
+ "planka_delete_task",
32
+ "planka_create_label",
33
+ "planka_update_label",
34
+ "planka_delete_label",
35
+ "planka_manage_labels",
36
+ "planka_set_card_labels",
37
+ "planka_create_comment",
38
+ "planka_update_comment",
39
+ "planka_delete_comment",
40
+ "planka_add_comment",
41
+ "planka_manage_comment",
42
+ "planka_create_list",
43
+ "planka_update_list",
44
+ "planka_delete_list",
45
+ "planka_manage_lists",
46
+ "planka_add_attachment",
47
+ "planka_delete_attachment",
48
+ "planka_set_card_members",
49
+ "planka_duplicate_card",
50
+ "planka_archive_card",
51
+ "planka_move_list_cards",
52
+ ]);
53
+ /** Tool names are always prefixed; accept the bare name as a convenience. */
54
+ export function normalizeToolName(name) {
55
+ const trimmed = name.trim();
56
+ return trimmed.startsWith("planka_") ? trimmed : `planka_${trimmed}`;
57
+ }
58
+ /** Splits a CSV env var into trimmed, non-empty entries. */
59
+ function parseCsv(raw) {
60
+ if (raw === undefined)
61
+ return null;
62
+ const entries = raw
63
+ .split(",")
64
+ .map((entry) => entry.trim())
65
+ .filter((entry) => entry.length > 0);
66
+ return entries;
67
+ }
68
+ /** A trimmed string env var, or null when unset/blank. */
69
+ function parseOptionalString(raw) {
70
+ const value = raw?.trim();
71
+ return value ? value : null;
72
+ }
73
+ /** A CSV env var that, when present, must list at least one entry. */
74
+ function parseNonEmptyCsv(name, raw) {
75
+ const entries = parseCsv(raw);
76
+ if (entries === null)
77
+ return null;
78
+ if (entries.length === 0) {
79
+ throw new PlankaConfigError(`${name} is set but lists no value. Remove it, or list the entries (comma-separated).`);
80
+ }
81
+ return entries;
82
+ }
83
+ const TRUTHY = new Set(["true", "1"]);
84
+ const FALSY = new Set(["false", "0", ""]);
85
+ function parseBoolean(name, raw) {
86
+ if (raw === undefined)
87
+ return false;
88
+ const value = raw.trim().toLowerCase();
89
+ if (TRUTHY.has(value))
90
+ return true;
91
+ if (FALSY.has(value))
92
+ return false;
93
+ throw new PlankaConfigError(`Invalid ${name}: "${raw}". Use "true" or "1" to enable it, "false" or "0" to disable it.`);
94
+ }
95
+ /**
96
+ * Builds the policy from an environment. Pure: no caching, no process.env.
97
+ */
98
+ export function parsePolicy(env) {
99
+ const defaultBoardIdRaw = env.PLANKA_DEFAULT_BOARD_ID?.trim();
100
+ if (defaultBoardIdRaw !== undefined && defaultBoardIdRaw.length === 0) {
101
+ throw new PlankaConfigError("PLANKA_DEFAULT_BOARD_ID is set but empty. Remove it, or give it a board id.");
102
+ }
103
+ const allowedBoardIds = parseCsv(env.PLANKA_ALLOWED_BOARD_IDS);
104
+ const allowedProjectIds = parseCsv(env.PLANKA_ALLOWED_PROJECT_IDS);
105
+ if (allowedBoardIds !== null && allowedBoardIds.length === 0) {
106
+ throw new PlankaConfigError("PLANKA_ALLOWED_BOARD_IDS is set but lists no id. That would hide every board. " +
107
+ "Remove the variable, or list the board ids (comma-separated).");
108
+ }
109
+ if (allowedProjectIds !== null && allowedProjectIds.length === 0) {
110
+ throw new PlankaConfigError("PLANKA_ALLOWED_PROJECT_IDS is set but lists no id. That would hide every project. " +
111
+ "Remove the variable, or list the project ids (comma-separated).");
112
+ }
113
+ const defaultBoardId = defaultBoardIdRaw ?? null;
114
+ if (defaultBoardId !== null &&
115
+ allowedBoardIds !== null &&
116
+ !allowedBoardIds.includes(defaultBoardId)) {
117
+ throw new PlankaConfigError(`PLANKA_DEFAULT_BOARD_ID (${defaultBoardId}) is not listed in PLANKA_ALLOWED_BOARD_IDS ` +
118
+ `(${allowedBoardIds.join(", ")}). Add it to the allowlist, or point the default at an allowed board.`);
119
+ }
120
+ return {
121
+ defaultBoardId,
122
+ allowedBoardIds,
123
+ allowedProjectIds,
124
+ readOnly: parseBoolean("PLANKA_READ_ONLY", env.PLANKA_READ_ONLY),
125
+ disabledTools: (parseCsv(env.PLANKA_DISABLED_TOOLS) ?? []).map(normalizeToolName),
126
+ hideDeprecated: parseBoolean("PLANKA_HIDE_DEPRECATED", env.PLANKA_HIDE_DEPRECATED),
127
+ protectedListIds: parseCsv(env.PLANKA_PROTECTED_LIST_IDS) ?? [],
128
+ summaryHighlightLabel: parseOptionalString(env.PLANKA_SUMMARY_HIGHLIGHT_LABEL),
129
+ summaryDecisionLists: parseNonEmptyCsv("PLANKA_SUMMARY_DECISION_LISTS", env.PLANKA_SUMMARY_DECISION_LISTS),
130
+ };
131
+ }
132
+ let cachedPolicy = null;
133
+ let cachedEnv = null;
134
+ /**
135
+ * The active policy. Memoized per environment object so a tool call does not
136
+ * re-parse on every request, and so tests can hand in their own env.
137
+ */
138
+ export function getPolicy(env = process.env) {
139
+ if (cachedPolicy && cachedEnv === env)
140
+ return cachedPolicy;
141
+ const policy = parsePolicy(env);
142
+ cachedPolicy = policy;
143
+ cachedEnv = env;
144
+ return policy;
145
+ }
146
+ /** Drops the memoized policy. For tests, and for anything that mutates env. */
147
+ export function resetPolicyCache() {
148
+ cachedPolicy = null;
149
+ cachedEnv = null;
150
+ }
151
+ /**
152
+ * Rejects a board that is outside the allowlist, before any request goes out.
153
+ */
154
+ export function assertBoardAllowed(boardId, policy = getPolicy()) {
155
+ const allowed = policy.allowedBoardIds;
156
+ if (allowed === null || allowed.includes(boardId))
157
+ return boardId;
158
+ throw new PlankaError(`boardId ${boardId} is not in PLANKA_ALLOWED_BOARD_IDS (allowed: ${allowed.join(", ")})`, "BOARD_NOT_ALLOWED", 403);
159
+ }
160
+ /** Same check for projects. */
161
+ export function assertProjectAllowed(projectId, policy = getPolicy()) {
162
+ const allowed = policy.allowedProjectIds;
163
+ if (allowed === null || allowed.includes(projectId))
164
+ return projectId;
165
+ throw new PlankaError(`projectId ${projectId} is not in PLANKA_ALLOWED_PROJECT_IDS (allowed: ${allowed.join(", ")})`, "PROJECT_NOT_ALLOWED", 403);
166
+ }
167
+ /** True when the id survives the board allowlist. */
168
+ export function isBoardAllowed(boardId, policy = getPolicy()) {
169
+ return policy.allowedBoardIds === null || policy.allowedBoardIds.includes(boardId);
170
+ }
171
+ /** True when the id survives the project allowlist. */
172
+ export function isProjectAllowed(projectId, policy = getPolicy()) {
173
+ return (policy.allowedProjectIds === null ||
174
+ policy.allowedProjectIds.includes(projectId));
175
+ }
176
+ /**
177
+ * Fills in `PLANKA_DEFAULT_BOARD_ID` for a missing `boardId` and checks the
178
+ * result against the allowlist. Throws when there is neither an argument nor
179
+ * a default.
180
+ */
181
+ export function resolveBoardId(boardId, policy = getPolicy()) {
182
+ const explicit = typeof boardId === "string" ? boardId.trim() : "";
183
+ if (explicit.length > 0)
184
+ return assertBoardAllowed(explicit, policy);
185
+ if (policy.defaultBoardId) {
186
+ return assertBoardAllowed(policy.defaultBoardId, policy);
187
+ }
188
+ throw new PlankaError("boardId is required: no boardId was given and PLANKA_DEFAULT_BOARD_ID is not set. " +
189
+ "Pass boardId explicitly, or call planka_get_structure to find one.", "MISSING_BOARD_ID", 400);
190
+ }
191
+ /** Whether a tool is exposed at all under the current policy. */
192
+ export function isToolVisible(name, policy = getPolicy()) {
193
+ if (policy.disabledTools.includes(name))
194
+ return false;
195
+ if (policy.readOnly && WRITE_TOOL_NAMES.has(name))
196
+ return false;
197
+ return true;
198
+ }
199
+ /**
200
+ * Why a tool is not available — the text the model gets back when it calls one
201
+ * anyway. Returns null when the tool is available.
202
+ */
203
+ export function toolBlockedReason(name, policy = getPolicy()) {
204
+ if (policy.disabledTools.includes(name)) {
205
+ return (`Tool ${name} is disabled by this server's configuration (PLANKA_DISABLED_TOOLS). ` +
206
+ `Do not retry it; use another tool or ask the operator to re-enable it.`);
207
+ }
208
+ if (policy.readOnly && WRITE_TOOL_NAMES.has(name)) {
209
+ return (`Tool ${name} writes to Planka and this server runs in read-only mode (PLANKA_READ_ONLY=true). ` +
210
+ `Do not retry it; report the change you wanted to make instead of attempting it.`);
211
+ }
212
+ return null;
213
+ }
214
+ /**
215
+ * Guard-rail (not security — Planka has no per-list permissions) that keeps
216
+ * cards out of protected columns and protected columns intact.
217
+ */
218
+ export function assertListWritable(listId, policy = getPolicy(), action = "write to") {
219
+ if (!listId)
220
+ return;
221
+ if (!policy.protectedListIds.includes(listId))
222
+ return;
223
+ throw new PlankaError(`list ${listId} is protected by PLANKA_PROTECTED_LIST_IDS: this server may not ${action} it ` +
224
+ `(protected: ${policy.protectedListIds.join(", ")}). Ask a human to do it.`, "LIST_PROTECTED", 403);
225
+ }
226
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/config/policy.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -12,7 +12,7 @@ export declare class PlankaAuthError extends PlankaError {
12
12
  constructor(message?: string);
13
13
  }
14
14
  export declare class PlankaNotFoundError extends PlankaError {
15
- constructor(resource: string, id: string);
15
+ constructor(resource: string, id: string, hint?: string);
16
16
  }
17
17
  export declare class PlankaValidationError extends PlankaError {
18
18
  constructor(message: string, details?: unknown);
@@ -26,8 +26,12 @@ export declare class PlankaConfigError extends PlankaError {
26
26
  export declare class PlankaNetworkError extends PlankaError {
27
27
  constructor(message: string, details?: unknown);
28
28
  }
29
+ /** The ID kind a context like "PATCH /api/labels/123" was addressing. */
30
+ export declare function idKindFromContext(context?: string): string | undefined;
29
31
  /**
30
32
  * Factory function to create typed errors from API responses.
33
+ *
34
+ * Every branch answers "what should the agent do now?", not just "what broke".
31
35
  * @param status HTTP status code
32
36
  * @param body Response body (parsed JSON or null)
33
37
  * @param context Optional context (e.g., "GET /api/cards/123")
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,qBAAa,WAAY,SAAQ,KAAK;aAGlB,IAAI,EAAE,MAAM;aACZ,MAAM,EAAE,MAAM;aACd,OAAO,CAAC,EAAE,OAAO;gBAHjC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,OAAO,SAA0B;CAI9C;AAED,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;CAIzC;AAED,qBAAa,qBAAsB,SAAQ,WAAW;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,qBAAsB,SAAQ,WAAW;gBACxC,OAAO,SAA6B;CAIjD;AAED,qBAAa,iBAAkB,SAAQ,WAAW;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAoBb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAMD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aACpB,QAAQ,EAAE,OAAO;gBADjB,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EACpB,QAAQ,EAAE,OAAO;CASpC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAC/C,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,OAAO,GACb,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAMb;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,QAAQ,CAE9D;AAwDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,EACvB,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACrE,MAAM,CAuBR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACrE,MAAM,CAaR;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,CAAC,QAAQ,GAChB,MAAM,CAYR"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,qBAAa,WAAY,SAAQ,KAAK;aAGlB,IAAI,EAAE,MAAM;aACZ,MAAM,EAAE,MAAM;aACd,OAAO,CAAC,EAAE,OAAO;gBAHjC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,OAAO,SAA0B;CAI9C;AAED,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAIxD;AAED,qBAAa,qBAAsB,SAAQ,WAAW;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,qBAAsB,SAAQ,WAAW;gBACxC,OAAO,SAA6B;CAIjD;AAED,qBAAa,iBAAkB,SAAQ,WAAW;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AA2BD,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUtE;AAcD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAmCb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAMD;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aACpB,QAAQ,EAAE,OAAO;gBADjB,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EACpB,QAAQ,EAAE,OAAO;CASpC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAC/C,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,OAAO,GACb,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAMb;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,QAAQ,CAE9D;AAwDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,EACvB,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACrE,MAAM,CAuBR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACrE,MAAM,CAaR;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,CAAC,QAAQ,GAChB,MAAM,CAYR"}