@wrongstack/kanban-mcp 0.297.0 → 0.298.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.
package/dist/cli.d.ts CHANGED
@@ -11,6 +11,6 @@ export interface ParsedArgs {
11
11
  help: boolean;
12
12
  }
13
13
  export declare function printHelp(stdout: NodeJS.WriteStream): void;
14
- export declare function parseArgs(argv: readonly string[]): ParsedArgs;
14
+ export declare function parseArgs(argv: readonly string[], env?: NodeJS.ProcessEnv): ParsedArgs;
15
15
  export declare function main(argv?: string[]): Promise<number>;
16
16
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -293,6 +293,8 @@ function printHelp(stdout) {
293
293
  " --port <n> HTTP port (default 0 = ephemeral).",
294
294
  " --host <h> HTTP bind host (default 127.0.0.1).",
295
295
  " --token <t> Bearer token. Required for a non-loopback HTTP bind.",
296
+ " Prefer WRONGSTACK_MCP_TOKEN \u2014 a command line is readable",
297
+ " by other local processes (WS-064).",
296
298
  " --actor <id> Actor id recorded in Kanban activity/events.",
297
299
  " --writable Expose non-destructive board/task management.",
298
300
  " --destructive Also expose delete/merge/transfer; implies --writable.",
@@ -300,7 +302,8 @@ function printHelp(stdout) {
300
302
  ].join("\n") + "\n"
301
303
  );
302
304
  }
303
- function parseArgs(argv) {
305
+ var HTTP_TOKEN_ENV = "WRONGSTACK_MCP_TOKEN";
306
+ function parseArgs(argv, env = process.env) {
304
307
  const parsed = {
305
308
  projectRoot: "",
306
309
  transport: "stdio",
@@ -349,6 +352,14 @@ function parseArgs(argv) {
349
352
  break;
350
353
  }
351
354
  }
355
+ if (parsed.httpToken === void 0) {
356
+ const fromEnv = env[HTTP_TOKEN_ENV]?.trim();
357
+ if (fromEnv) parsed.httpToken = fromEnv;
358
+ } else if (parsed.httpToken.length > 0) {
359
+ console.warn(
360
+ `[mcp] --token puts the auth token in this process's command line, which other local processes can read. Prefer ${HTTP_TOKEN_ENV}.`
361
+ );
362
+ }
352
363
  return parsed;
353
364
  }
354
365
  async function main(argv = process.argv.slice(2)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/kanban-mcp",
3
- "version": "0.297.0",
3
+ "version": "0.298.0",
4
4
  "license": "MIT",
5
5
  "description": "WrongStack Kanban as a project-scoped MCP server with read-only, writable, destructive, and live-watch capability tiers.",
6
6
  "repository": {
@@ -28,13 +28,14 @@
28
28
  },
29
29
  "files": [
30
30
  "dist",
31
+ "!dist/**/*.map",
31
32
  "README.md"
32
33
  ],
33
34
  "dependencies": {
34
- "@wrongstack/mcp": "0.297.0",
35
- "@wrongstack/core": "0.297.0",
36
- "@wrongstack/kanban": "0.297.0",
37
- "@wrongstack/tools": "0.297.0"
35
+ "@wrongstack/core": "0.298.0",
36
+ "@wrongstack/kanban": "0.298.0",
37
+ "@wrongstack/mcp": "0.298.0",
38
+ "@wrongstack/tools": "0.298.0"
38
39
  },
39
40
  "devDependencies": {
40
41
  "@types/node": "^26.1.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EACL,SAAS,EAGT,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,KAAK,sBAAsB,EAG5B,MAAM,aAAa,CAAC;AAMrB,UAAU,qBAAqB;IAC7B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpE,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAClD;AAyHD,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,wBAA6B,GAClC,iBAAiB,CA6DnB;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,wBAA6B,GAClC,SAAS,CAgBX"}
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAUA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAqB1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAmD7D;AAED,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DxE"}
package/dist/cli.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli.ts", "../src/adapter.ts", "../src/policy.ts", "../src/version.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\nimport { realpathSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { canonicalProjectRoot } from '@wrongstack/core/utils';\nimport { closeKanbanServerConnections, getKanbanServerConnection } from '@wrongstack/kanban';\nimport { serveHttp, serveStdio } from '@wrongstack/mcp';\nimport { createKanbanMcpServer } from './adapter.js';\nimport { SERVER_INFO } from './version.js';\n\nexport interface ParsedArgs {\n projectRoot: string;\n transport: 'stdio' | 'http';\n httpPort: number;\n httpHost: string;\n httpToken?: string | undefined;\n writable: boolean;\n destructive: boolean;\n actor?: string | undefined;\n help: boolean;\n}\n\nexport function printHelp(stdout: NodeJS.WriteStream): void {\n stdout.write(\n [\n `${SERVER_INFO.name} v${SERVER_INFO.version} \u2014 WrongStack Kanban MCP server`,\n '',\n 'Usage:',\n ` ${SERVER_INFO.name} --project-root <path> [options]`,\n '',\n 'Options:',\n ' --project-root <path> Project whose IPC-backed Kanban should be served (required).',\n ' --stdio Use stdio transport (default).',\n ' --http Use HTTP transport.',\n ' --port <n> HTTP port (default 0 = ephemeral).',\n ' --host <h> HTTP bind host (default 127.0.0.1).',\n ' --token <t> Bearer token. Required for a non-loopback HTTP bind.',\n ' --actor <id> Actor id recorded in Kanban activity/events.',\n ' --writable Expose non-destructive board/task management.',\n ' --destructive Also expose delete/merge/transfer; implies --writable.',\n ' -h, --help Show this message.',\n ].join('\\n') + '\\n',\n );\n}\n\nexport function parseArgs(argv: readonly string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n projectRoot: '',\n transport: 'stdio',\n httpPort: 0,\n httpHost: '127.0.0.1',\n writable: false,\n destructive: false,\n help: false,\n };\n\n for (let index = 0; index < argv.length; index++) {\n const arg = argv[index];\n switch (arg) {\n case '--project-root':\n parsed.projectRoot = path.resolve(argv[++index] ?? '');\n break;\n case '--stdio':\n parsed.transport = 'stdio';\n break;\n case '--http':\n parsed.transport = 'http';\n break;\n case '--port':\n parsed.httpPort = Number(argv[++index] ?? '') || 0;\n break;\n case '--host':\n parsed.httpHost = argv[++index] ?? '127.0.0.1';\n break;\n case '--token':\n parsed.httpToken = argv[++index];\n break;\n case '--actor':\n parsed.actor = argv[++index];\n break;\n case '--writable':\n parsed.writable = true;\n break;\n case '--destructive':\n parsed.destructive = true;\n parsed.writable = true;\n break;\n case '-h':\n case '--help':\n parsed.help = true;\n break;\n default:\n break;\n }\n }\n return parsed;\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<number> {\n const args = parseArgs(argv);\n if (args.help) {\n printHelp(process.stdout);\n return 0;\n }\n if (!args.projectRoot) {\n process.stderr.write(`${SERVER_INFO.name}: --project-root is required\\n`);\n printHelp(process.stderr);\n return 2;\n }\n\n const projectRoot = canonicalProjectRoot(args.projectRoot);\n try {\n const connection = await getKanbanServerConnection(projectRoot);\n if (!connection) throw new Error('Kanban project server is disabled');\n await connection.request('ping', {});\n } catch (error) {\n process.stderr.write(\n `${SERVER_INFO.name}: cannot attach to Kanban project server for ${projectRoot}: ${\n error instanceof Error ? error.message : String(error)\n }\\n`,\n );\n return 3;\n }\n\n const server = createKanbanMcpServer(projectRoot, {\n writable: args.writable,\n destructive: args.destructive,\n ...(args.actor ? { actor: args.actor } : {}),\n });\n const policyText = `writable=${String(args.writable)} destructive=${String(args.destructive)}`;\n\n if (args.transport === 'http') {\n const handle = await serveHttp(server, {\n port: args.httpPort,\n host: args.httpHost,\n ...(args.httpToken ? { token: args.httpToken } : {}),\n logger: { warn: (message) => process.stderr.write(`[kanban-mcp] ${message}\\n`) },\n });\n process.stderr.write(\n `${SERVER_INFO.name}: ready at ${handle.url} \u2014 projectRoot=${projectRoot} transport=http ${policyText}${\n args.httpToken ? ' [token auth]' : ''\n }\\n`,\n );\n await new Promise<void>((resolve) => {\n process.once('SIGINT', resolve);\n process.once('SIGTERM', resolve);\n });\n await handle.close();\n closeKanbanServerConnections();\n return 0;\n }\n\n const handle = serveStdio(server);\n process.stderr.write(\n `${SERVER_INFO.name}: ready on stdio \u2014 projectRoot=${projectRoot} transport=stdio ${policyText}\\n`,\n );\n await handle.done;\n closeKanbanServerConnections();\n return 0;\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n const self = fileURLToPath(import.meta.url);\n if (path.resolve(entry) === self) return true;\n try {\n return realpathSync(entry) === realpathSync(self);\n } catch {\n return false;\n }\n}\n\nif (isMainModule()) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error) => {\n process.stderr.write(`${SERVER_INFO.name}: unexpected error\\n`);\n process.stderr.write(error instanceof Error ? (error.stack ?? error.message) : String(error));\n process.stderr.write('\\n');\n process.exitCode = 1;\n },\n );\n}\n", "import type { Context } from '@wrongstack/core/agent';\nimport { getKanbanServerConnection, type KanbanServerEvent } from '@wrongstack/kanban';\nimport {\n MCPServer,\n type MCPServerCallResult,\n type MCPServerTool,\n type MCPServerToolHost,\n} from '@wrongstack/mcp';\nimport { kanbanTool } from '@wrongstack/tools/kanban';\nimport {\n type KanbanMcpAction,\n type KanbanMcpPolicyOptions,\n type KanbanMcpToolName,\n selectKanbanMcpTools,\n} from './policy.js';\nimport { SERVER_INFO } from './version.js';\n\nconst WATCH_DEFAULT_TIMEOUT_MS = 15_000;\nconst WATCH_MAX_TIMEOUT_MS = 25_000;\n\ninterface KanbanEventConnection {\n subscribe(listener: (event: KanbanServerEvent) => void): () => void;\n onDisconnect(listener: () => void): () => void;\n}\n\nexport interface KanbanMcpDependencies {\n executeKanban?: (\n args: Record<string, unknown>,\n context: Context,\n signal: AbortSignal,\n ) => Promise<unknown>;\n getConnection?: (projectRoot: string) => Promise<KanbanEventConnection | null>;\n}\n\nexport interface KanbanMcpToolHostOptions extends KanbanMcpPolicyOptions {\n actor?: string | undefined;\n dependencies?: KanbanMcpDependencies | undefined;\n}\n\nfunction actionSchema(actions: readonly KanbanMcpAction[]): Record<string, unknown> {\n const schema = structuredClone(kanbanTool.inputSchema) as Record<string, unknown>;\n const properties = schema['properties'];\n if (!properties || typeof properties !== 'object' || Array.isArray(properties)) {\n throw new Error('Kanban MCP: Kanban tool schema has no properties object');\n }\n const action = (properties as Record<string, unknown>)['action'];\n if (!action || typeof action !== 'object' || Array.isArray(action)) {\n throw new Error('Kanban MCP: Kanban tool schema has no action property');\n }\n (action as Record<string, unknown>)['enum'] = [...actions];\n return schema;\n}\n\nconst WATCH_SCHEMA: Record<string, unknown> = {\n type: 'object',\n properties: {\n boardId: {\n type: 'string',\n description: 'Optional full board id. Omit to observe any board.',\n },\n timeoutMs: {\n type: 'number',\n minimum: 100,\n maximum: WATCH_MAX_TIMEOUT_MS,\n description: `Long-poll timeout. Defaults to ${WATCH_DEFAULT_TIMEOUT_MS}.`,\n },\n },\n additionalProperties: false,\n};\n\nconst TOOL_DESCRIPTIONS: Record<KanbanMcpToolName, string> = {\n kanban_read:\n 'Read authoritative WrongStack Kanban boards, tasks, events, queue health, task chains, and exports through the project IPC owner.',\n kanban_manage:\n 'Create and update WrongStack Kanban boards and tasks, assignments, dependencies, evidence, verification, and orchestration state. Requires server --writable.',\n kanban_destructive:\n 'Delete or absorb durable WrongStack Kanban state, including board/task/column deletion, merge, and cross-board transfer. Requires server --destructive.',\n kanban_watch:\n 'Wait for the next project Kanban mutation event. After any event or timeout, reconcile authoritative state with kanban_read.',\n};\n\nfunction toolDescriptor(\n name: KanbanMcpToolName,\n actions?: readonly KanbanMcpAction[],\n): MCPServerTool {\n return {\n name,\n description: TOOL_DESCRIPTIONS[name],\n inputSchema: actions ? actionSchema(actions) : WATCH_SCHEMA,\n };\n}\n\nfunction createContext(projectRoot: string, actor: string): Context {\n return {\n systemPrompt: [],\n cwd: projectRoot,\n projectRoot,\n allowOutsideProjectRoot: false,\n model: 'kanban-mcp',\n tools: [],\n meta: { source: 'kanban-mcp' },\n agentId: actor,\n agentName: actor,\n } as unknown as Context;\n}\n\nfunction normalizeTimeout(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return WATCH_DEFAULT_TIMEOUT_MS;\n return Math.min(WATCH_MAX_TIMEOUT_MS, Math.max(100, Math.trunc(value)));\n}\n\nfunction eventBoardId(event: KanbanServerEvent): string | undefined {\n if (!event.data || typeof event.data !== 'object' || Array.isArray(event.data)) return undefined;\n const boardId = (event.data as Record<string, unknown>)['boardId'];\n return typeof boardId === 'string' ? boardId : undefined;\n}\n\nasync function watchForKanbanMutation(\n projectRoot: string,\n args: Record<string, unknown>,\n getConnection: (projectRoot: string) => Promise<KanbanEventConnection | null>,\n): Promise<unknown> {\n const boardId = typeof args['boardId'] === 'string' ? args['boardId'] : undefined;\n const timeoutMs = normalizeTimeout(args['timeoutMs']);\n const connection = await getConnection(projectRoot);\n if (!connection) {\n throw new Error('Kanban project server is disabled; live watch is unavailable');\n }\n\n return await new Promise((resolve) => {\n let settled = false;\n let unsubscribeEvent = (): void => {};\n let unsubscribeDisconnect = (): void => {};\n let timer: NodeJS.Timeout | undefined;\n\n const finish = (result: unknown): void => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n unsubscribeEvent();\n unsubscribeDisconnect();\n resolve(result);\n };\n\n unsubscribeEvent = connection.subscribe((event) => {\n const changedBoardId = eventBoardId(event);\n if (boardId && changedBoardId !== boardId) return;\n finish({ changed: true, event: event.event, data: event.data });\n });\n unsubscribeDisconnect = connection.onDisconnect(() => {\n finish({ changed: false, disconnected: true, reason: 'Kanban daemon disconnected' });\n });\n timer = setTimeout(() => {\n finish({ changed: false, timedOut: true, timeoutMs });\n }, timeoutMs);\n });\n}\n\nexport function createKanbanMcpToolHost(\n projectRoot: string,\n opts: KanbanMcpToolHostOptions = {},\n): MCPServerToolHost {\n const policy = selectKanbanMcpTools(opts);\n const allowed = new Map(policy.map((entry) => [entry.name, entry.actions]));\n const actor = opts.actor?.trim() || 'external-kanban-mcp';\n const context = createContext(projectRoot, actor);\n const executeKanban =\n opts.dependencies?.executeKanban ??\n (async (args: Record<string, unknown>, ctx: Context, signal: AbortSignal) =>\n await kanbanTool.execute(args as never, ctx, { signal }));\n const getConnection = opts.dependencies?.getConnection ?? getKanbanServerConnection;\n\n return {\n listTools(): MCPServerTool[] {\n return policy.map((entry) => toolDescriptor(entry.name, entry.actions));\n },\n\n async callTool(name: string, args: Record<string, unknown>): Promise<MCPServerCallResult> {\n if (!allowed.has(name as KanbanMcpToolName)) {\n return {\n content: `Tool \"${name}\" is not exposed by this Kanban MCP server`,\n isError: true,\n };\n }\n\n if (name === 'kanban_watch') {\n try {\n const content = await watchForKanbanMutation(projectRoot, args, getConnection);\n return { content, isError: false };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n };\n }\n }\n\n const actions = allowed.get(name as KanbanMcpToolName);\n const action = args['action'];\n if (typeof action !== 'string' || !actions?.includes(action as KanbanMcpAction)) {\n return {\n content: `Action \"${String(action)}\" is not allowed through ${name}`,\n isError: true,\n };\n }\n\n try {\n const result = await executeKanban(args, context, new AbortController().signal);\n const failed =\n !!result &&\n typeof result === 'object' &&\n !Array.isArray(result) &&\n (result as Record<string, unknown>)['ok'] === false;\n return { content: result, isError: failed };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n };\n }\n },\n };\n}\n\nexport function createKanbanMcpServer(\n projectRoot: string,\n opts: KanbanMcpToolHostOptions = {},\n): MCPServer {\n return new MCPServer({\n host: createKanbanMcpToolHost(projectRoot, opts),\n serverInfo: { name: 'wrongstack-kanban-mcp', version: SERVER_INFO.version },\n prompts: [\n {\n name: 'work-kanban-task',\n title: 'Work a WrongStack Kanban task',\n description:\n 'Inspect, claim, execute, verify, and update a task without bypassing board policy.',\n arguments: [{ name: 'boardId', description: 'Board id or unique prefix', required: true }],\n template:\n 'Use the WrongStack Kanban MCP tools on board {{boardId}}. Re-read authoritative board state before mutation, claim an eligible task, keep assignment state current, attach truthful evidence, and satisfy its completion gate.',\n },\n ],\n });\n}\n", "export const KANBAN_READ_ACTIONS = [\n 'list_boards',\n 'get_board',\n 'export_markdown',\n 'export_task_graph',\n 'search_tasks',\n 'ready_tasks',\n 'snapshot',\n 'get_task',\n 'get_chain',\n 'events',\n 'queue_health',\n] as const;\n\nexport const KANBAN_MANAGE_ACTIONS = [\n 'create_board',\n 'duplicate_board',\n 'update_board',\n 'adopt_managed_lifecycle',\n 'generate_board',\n 'sync_task_graph',\n 'create_from_graph',\n 'import_session_tasks',\n 'add_column',\n 'update_column',\n 'add_task',\n 'split_task',\n 'copy_task',\n 'update_task',\n 'transition_task',\n 'repair_managed_projection',\n 'move_task',\n 'set_chain',\n 'claim_task',\n 'release_task',\n 'assign_task',\n 'mark_assignment',\n 'heartbeat_assignment',\n 'recover_stale',\n 'add_dependency',\n 'add_goal_metric',\n 'update_goal_metric',\n 'add_check',\n 'update_check',\n 'add_note',\n 'add_link',\n 'verify_completion',\n 'split_atomic',\n 'assess_atomicity',\n 'propose_decomposition',\n] as const;\n\n/** Operations that remove or absorb durable task/board state. */\nexport const KANBAN_DESTRUCTIVE_ACTIONS = [\n 'delete_board',\n 'delete_column',\n 'delete_task',\n 'merge_tasks',\n 'transfer_task',\n] as const;\n\nexport type KanbanReadAction = (typeof KANBAN_READ_ACTIONS)[number];\nexport type KanbanManageAction = (typeof KANBAN_MANAGE_ACTIONS)[number];\nexport type KanbanDestructiveAction = (typeof KANBAN_DESTRUCTIVE_ACTIONS)[number];\nexport type KanbanMcpAction = KanbanReadAction | KanbanManageAction | KanbanDestructiveAction;\nexport type KanbanMcpToolName =\n | 'kanban_read'\n | 'kanban_manage'\n | 'kanban_destructive'\n | 'kanban_watch';\n\nexport interface KanbanMcpPolicyOptions {\n writable?: boolean;\n destructive?: boolean;\n}\n\nexport interface KanbanMcpToolPolicy {\n name: KanbanMcpToolName;\n actions?: readonly KanbanMcpAction[];\n}\n\nexport function selectKanbanMcpTools(opts: KanbanMcpPolicyOptions = {}): KanbanMcpToolPolicy[] {\n const tools: KanbanMcpToolPolicy[] = [\n { name: 'kanban_read', actions: KANBAN_READ_ACTIONS },\n { name: 'kanban_watch' },\n ];\n if (opts.writable === true || opts.destructive === true) {\n tools.push({ name: 'kanban_manage', actions: KANBAN_MANAGE_ACTIONS });\n }\n if (opts.destructive === true) {\n tools.push({ name: 'kanban_destructive', actions: KANBAN_DESTRUCTIVE_ACTIONS });\n }\n return tools;\n}\n", "import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst packagePath = resolve(here, '..', 'package.json');\n\ninterface MinimalPackage {\n name?: string;\n version?: string;\n}\n\nlet cached: { name: string; version: string } | undefined;\n\nfunction readServerInfo(): { name: string; version: string } {\n if (cached) return cached;\n try {\n const pkg = JSON.parse(readFileSync(packagePath, 'utf8')) as MinimalPackage;\n cached = {\n name: pkg.name ?? '@wrongstack/kanban-mcp',\n version: pkg.version ?? '0.0.0',\n };\n } catch {\n cached = { name: '@wrongstack/kanban-mcp', version: '0.0.0' };\n }\n return cached;\n}\n\nexport const SERVER_INFO = readServerInfo();\n"],
5
- "mappings": "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",
6
- "names": ["fileURLToPath", "getKanbanServerConnection", "resolve", "getKanbanServerConnection", "handle", "resolve", "fileURLToPath"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/adapter.ts", "../src/policy.ts", "../src/version.ts"],
4
- "sourcesContent": ["import type { Context } from '@wrongstack/core/agent';\nimport { getKanbanServerConnection, type KanbanServerEvent } from '@wrongstack/kanban';\nimport {\n MCPServer,\n type MCPServerCallResult,\n type MCPServerTool,\n type MCPServerToolHost,\n} from '@wrongstack/mcp';\nimport { kanbanTool } from '@wrongstack/tools/kanban';\nimport {\n type KanbanMcpAction,\n type KanbanMcpPolicyOptions,\n type KanbanMcpToolName,\n selectKanbanMcpTools,\n} from './policy.js';\nimport { SERVER_INFO } from './version.js';\n\nconst WATCH_DEFAULT_TIMEOUT_MS = 15_000;\nconst WATCH_MAX_TIMEOUT_MS = 25_000;\n\ninterface KanbanEventConnection {\n subscribe(listener: (event: KanbanServerEvent) => void): () => void;\n onDisconnect(listener: () => void): () => void;\n}\n\nexport interface KanbanMcpDependencies {\n executeKanban?: (\n args: Record<string, unknown>,\n context: Context,\n signal: AbortSignal,\n ) => Promise<unknown>;\n getConnection?: (projectRoot: string) => Promise<KanbanEventConnection | null>;\n}\n\nexport interface KanbanMcpToolHostOptions extends KanbanMcpPolicyOptions {\n actor?: string | undefined;\n dependencies?: KanbanMcpDependencies | undefined;\n}\n\nfunction actionSchema(actions: readonly KanbanMcpAction[]): Record<string, unknown> {\n const schema = structuredClone(kanbanTool.inputSchema) as Record<string, unknown>;\n const properties = schema['properties'];\n if (!properties || typeof properties !== 'object' || Array.isArray(properties)) {\n throw new Error('Kanban MCP: Kanban tool schema has no properties object');\n }\n const action = (properties as Record<string, unknown>)['action'];\n if (!action || typeof action !== 'object' || Array.isArray(action)) {\n throw new Error('Kanban MCP: Kanban tool schema has no action property');\n }\n (action as Record<string, unknown>)['enum'] = [...actions];\n return schema;\n}\n\nconst WATCH_SCHEMA: Record<string, unknown> = {\n type: 'object',\n properties: {\n boardId: {\n type: 'string',\n description: 'Optional full board id. Omit to observe any board.',\n },\n timeoutMs: {\n type: 'number',\n minimum: 100,\n maximum: WATCH_MAX_TIMEOUT_MS,\n description: `Long-poll timeout. Defaults to ${WATCH_DEFAULT_TIMEOUT_MS}.`,\n },\n },\n additionalProperties: false,\n};\n\nconst TOOL_DESCRIPTIONS: Record<KanbanMcpToolName, string> = {\n kanban_read:\n 'Read authoritative WrongStack Kanban boards, tasks, events, queue health, task chains, and exports through the project IPC owner.',\n kanban_manage:\n 'Create and update WrongStack Kanban boards and tasks, assignments, dependencies, evidence, verification, and orchestration state. Requires server --writable.',\n kanban_destructive:\n 'Delete or absorb durable WrongStack Kanban state, including board/task/column deletion, merge, and cross-board transfer. Requires server --destructive.',\n kanban_watch:\n 'Wait for the next project Kanban mutation event. After any event or timeout, reconcile authoritative state with kanban_read.',\n};\n\nfunction toolDescriptor(\n name: KanbanMcpToolName,\n actions?: readonly KanbanMcpAction[],\n): MCPServerTool {\n return {\n name,\n description: TOOL_DESCRIPTIONS[name],\n inputSchema: actions ? actionSchema(actions) : WATCH_SCHEMA,\n };\n}\n\nfunction createContext(projectRoot: string, actor: string): Context {\n return {\n systemPrompt: [],\n cwd: projectRoot,\n projectRoot,\n allowOutsideProjectRoot: false,\n model: 'kanban-mcp',\n tools: [],\n meta: { source: 'kanban-mcp' },\n agentId: actor,\n agentName: actor,\n } as unknown as Context;\n}\n\nfunction normalizeTimeout(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return WATCH_DEFAULT_TIMEOUT_MS;\n return Math.min(WATCH_MAX_TIMEOUT_MS, Math.max(100, Math.trunc(value)));\n}\n\nfunction eventBoardId(event: KanbanServerEvent): string | undefined {\n if (!event.data || typeof event.data !== 'object' || Array.isArray(event.data)) return undefined;\n const boardId = (event.data as Record<string, unknown>)['boardId'];\n return typeof boardId === 'string' ? boardId : undefined;\n}\n\nasync function watchForKanbanMutation(\n projectRoot: string,\n args: Record<string, unknown>,\n getConnection: (projectRoot: string) => Promise<KanbanEventConnection | null>,\n): Promise<unknown> {\n const boardId = typeof args['boardId'] === 'string' ? args['boardId'] : undefined;\n const timeoutMs = normalizeTimeout(args['timeoutMs']);\n const connection = await getConnection(projectRoot);\n if (!connection) {\n throw new Error('Kanban project server is disabled; live watch is unavailable');\n }\n\n return await new Promise((resolve) => {\n let settled = false;\n let unsubscribeEvent = (): void => {};\n let unsubscribeDisconnect = (): void => {};\n let timer: NodeJS.Timeout | undefined;\n\n const finish = (result: unknown): void => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n unsubscribeEvent();\n unsubscribeDisconnect();\n resolve(result);\n };\n\n unsubscribeEvent = connection.subscribe((event) => {\n const changedBoardId = eventBoardId(event);\n if (boardId && changedBoardId !== boardId) return;\n finish({ changed: true, event: event.event, data: event.data });\n });\n unsubscribeDisconnect = connection.onDisconnect(() => {\n finish({ changed: false, disconnected: true, reason: 'Kanban daemon disconnected' });\n });\n timer = setTimeout(() => {\n finish({ changed: false, timedOut: true, timeoutMs });\n }, timeoutMs);\n });\n}\n\nexport function createKanbanMcpToolHost(\n projectRoot: string,\n opts: KanbanMcpToolHostOptions = {},\n): MCPServerToolHost {\n const policy = selectKanbanMcpTools(opts);\n const allowed = new Map(policy.map((entry) => [entry.name, entry.actions]));\n const actor = opts.actor?.trim() || 'external-kanban-mcp';\n const context = createContext(projectRoot, actor);\n const executeKanban =\n opts.dependencies?.executeKanban ??\n (async (args: Record<string, unknown>, ctx: Context, signal: AbortSignal) =>\n await kanbanTool.execute(args as never, ctx, { signal }));\n const getConnection = opts.dependencies?.getConnection ?? getKanbanServerConnection;\n\n return {\n listTools(): MCPServerTool[] {\n return policy.map((entry) => toolDescriptor(entry.name, entry.actions));\n },\n\n async callTool(name: string, args: Record<string, unknown>): Promise<MCPServerCallResult> {\n if (!allowed.has(name as KanbanMcpToolName)) {\n return {\n content: `Tool \"${name}\" is not exposed by this Kanban MCP server`,\n isError: true,\n };\n }\n\n if (name === 'kanban_watch') {\n try {\n const content = await watchForKanbanMutation(projectRoot, args, getConnection);\n return { content, isError: false };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n };\n }\n }\n\n const actions = allowed.get(name as KanbanMcpToolName);\n const action = args['action'];\n if (typeof action !== 'string' || !actions?.includes(action as KanbanMcpAction)) {\n return {\n content: `Action \"${String(action)}\" is not allowed through ${name}`,\n isError: true,\n };\n }\n\n try {\n const result = await executeKanban(args, context, new AbortController().signal);\n const failed =\n !!result &&\n typeof result === 'object' &&\n !Array.isArray(result) &&\n (result as Record<string, unknown>)['ok'] === false;\n return { content: result, isError: failed };\n } catch (error) {\n return {\n content: error instanceof Error ? error.message : String(error),\n isError: true,\n };\n }\n },\n };\n}\n\nexport function createKanbanMcpServer(\n projectRoot: string,\n opts: KanbanMcpToolHostOptions = {},\n): MCPServer {\n return new MCPServer({\n host: createKanbanMcpToolHost(projectRoot, opts),\n serverInfo: { name: 'wrongstack-kanban-mcp', version: SERVER_INFO.version },\n prompts: [\n {\n name: 'work-kanban-task',\n title: 'Work a WrongStack Kanban task',\n description:\n 'Inspect, claim, execute, verify, and update a task without bypassing board policy.',\n arguments: [{ name: 'boardId', description: 'Board id or unique prefix', required: true }],\n template:\n 'Use the WrongStack Kanban MCP tools on board {{boardId}}. Re-read authoritative board state before mutation, claim an eligible task, keep assignment state current, attach truthful evidence, and satisfy its completion gate.',\n },\n ],\n });\n}\n", "export const KANBAN_READ_ACTIONS = [\n 'list_boards',\n 'get_board',\n 'export_markdown',\n 'export_task_graph',\n 'search_tasks',\n 'ready_tasks',\n 'snapshot',\n 'get_task',\n 'get_chain',\n 'events',\n 'queue_health',\n] as const;\n\nexport const KANBAN_MANAGE_ACTIONS = [\n 'create_board',\n 'duplicate_board',\n 'update_board',\n 'adopt_managed_lifecycle',\n 'generate_board',\n 'sync_task_graph',\n 'create_from_graph',\n 'import_session_tasks',\n 'add_column',\n 'update_column',\n 'add_task',\n 'split_task',\n 'copy_task',\n 'update_task',\n 'transition_task',\n 'repair_managed_projection',\n 'move_task',\n 'set_chain',\n 'claim_task',\n 'release_task',\n 'assign_task',\n 'mark_assignment',\n 'heartbeat_assignment',\n 'recover_stale',\n 'add_dependency',\n 'add_goal_metric',\n 'update_goal_metric',\n 'add_check',\n 'update_check',\n 'add_note',\n 'add_link',\n 'verify_completion',\n 'split_atomic',\n 'assess_atomicity',\n 'propose_decomposition',\n] as const;\n\n/** Operations that remove or absorb durable task/board state. */\nexport const KANBAN_DESTRUCTIVE_ACTIONS = [\n 'delete_board',\n 'delete_column',\n 'delete_task',\n 'merge_tasks',\n 'transfer_task',\n] as const;\n\nexport type KanbanReadAction = (typeof KANBAN_READ_ACTIONS)[number];\nexport type KanbanManageAction = (typeof KANBAN_MANAGE_ACTIONS)[number];\nexport type KanbanDestructiveAction = (typeof KANBAN_DESTRUCTIVE_ACTIONS)[number];\nexport type KanbanMcpAction = KanbanReadAction | KanbanManageAction | KanbanDestructiveAction;\nexport type KanbanMcpToolName =\n | 'kanban_read'\n | 'kanban_manage'\n | 'kanban_destructive'\n | 'kanban_watch';\n\nexport interface KanbanMcpPolicyOptions {\n writable?: boolean;\n destructive?: boolean;\n}\n\nexport interface KanbanMcpToolPolicy {\n name: KanbanMcpToolName;\n actions?: readonly KanbanMcpAction[];\n}\n\nexport function selectKanbanMcpTools(opts: KanbanMcpPolicyOptions = {}): KanbanMcpToolPolicy[] {\n const tools: KanbanMcpToolPolicy[] = [\n { name: 'kanban_read', actions: KANBAN_READ_ACTIONS },\n { name: 'kanban_watch' },\n ];\n if (opts.writable === true || opts.destructive === true) {\n tools.push({ name: 'kanban_manage', actions: KANBAN_MANAGE_ACTIONS });\n }\n if (opts.destructive === true) {\n tools.push({ name: 'kanban_destructive', actions: KANBAN_DESTRUCTIVE_ACTIONS });\n }\n return tools;\n}\n", "import { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst packagePath = resolve(here, '..', 'package.json');\n\ninterface MinimalPackage {\n name?: string;\n version?: string;\n}\n\nlet cached: { name: string; version: string } | undefined;\n\nfunction readServerInfo(): { name: string; version: string } {\n if (cached) return cached;\n try {\n const pkg = JSON.parse(readFileSync(packagePath, 'utf8')) as MinimalPackage;\n cached = {\n name: pkg.name ?? '@wrongstack/kanban-mcp',\n version: pkg.version ?? '0.0.0',\n };\n } catch {\n cached = { name: '@wrongstack/kanban-mcp', version: '0.0.0' };\n }\n return cached;\n}\n\nexport const SERVER_INFO = readServerInfo();\n"],
5
- "mappings": ";AACA,SAAS,iCAAyD;AAClE;AAAA,EACE;AAAA,OAIK;AACP,SAAS,kBAAkB;;;ACRpB,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAsBO,SAAS,qBAAqB,OAA+B,CAAC,GAA0B;AAC7F,QAAM,QAA+B;AAAA,IACnC,EAAE,MAAM,eAAe,SAAS,oBAAoB;AAAA,IACpD,EAAE,MAAM,eAAe;AAAA,EACzB;AACA,MAAI,KAAK,aAAa,QAAQ,KAAK,gBAAgB,MAAM;AACvD,UAAM,KAAK,EAAE,MAAM,iBAAiB,SAAS,sBAAsB,CAAC;AAAA,EACtE;AACA,MAAI,KAAK,gBAAgB,MAAM;AAC7B,UAAM,KAAK,EAAE,MAAM,sBAAsB,SAAS,2BAA2B,CAAC;AAAA,EAChF;AACA,SAAO;AACT;;;AC7FA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAE9B,IAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AACnD,IAAM,cAAc,QAAQ,MAAM,MAAM,cAAc;AAOtD,IAAI;AAEJ,SAAS,iBAAoD;AAC3D,MAAI,OAAQ,QAAO;AACnB,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,aAAa,aAAa,MAAM,CAAC;AACxD,aAAS;AAAA,MACP,MAAM,IAAI,QAAQ;AAAA,MAClB,SAAS,IAAI,WAAW;AAAA,IAC1B;AAAA,EACF,QAAQ;AACN,aAAS,EAAE,MAAM,0BAA0B,SAAS,QAAQ;AAAA,EAC9D;AACA,SAAO;AACT;AAEO,IAAM,cAAc,eAAe;;;AFX1C,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAqB7B,SAAS,aAAa,SAA8D;AAClF,QAAM,SAAS,gBAAgB,WAAW,WAAW;AACrD,QAAM,aAAa,OAAO,YAAY;AACtC,MAAI,CAAC,cAAc,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU,GAAG;AAC9E,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,QAAM,SAAU,WAAuC,QAAQ;AAC/D,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,EAAC,OAAmC,MAAM,IAAI,CAAC,GAAG,OAAO;AACzD,SAAO;AACT;AAEA,IAAM,eAAwC;AAAA,EAC5C,MAAM;AAAA,EACN,YAAY;AAAA,IACV,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa,kCAAkC,wBAAwB;AAAA,IACzE;AAAA,EACF;AAAA,EACA,sBAAsB;AACxB;AAEA,IAAM,oBAAuD;AAAA,EAC3D,aACE;AAAA,EACF,eACE;AAAA,EACF,oBACE;AAAA,EACF,cACE;AACJ;AAEA,SAAS,eACP,MACA,SACe;AACf,SAAO;AAAA,IACL;AAAA,IACA,aAAa,kBAAkB,IAAI;AAAA,IACnC,aAAa,UAAU,aAAa,OAAO,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,cAAc,aAAqB,OAAwB;AAClE,SAAO;AAAA,IACL,cAAc,CAAC;AAAA,IACf,KAAK;AAAA,IACL;AAAA,IACA,yBAAyB;AAAA,IACzB,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,IACR,MAAM,EAAE,QAAQ,aAAa;AAAA,IAC7B,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACjE,SAAO,KAAK,IAAI,sBAAsB,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACxE;AAEA,SAAS,aAAa,OAA8C;AAClE,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,MAAM,QAAQ,MAAM,IAAI,EAAG,QAAO;AACvF,QAAM,UAAW,MAAM,KAAiC,SAAS;AACjE,SAAO,OAAO,YAAY,WAAW,UAAU;AACjD;AAEA,eAAe,uBACb,aACA,MACA,eACkB;AAClB,QAAM,UAAU,OAAO,KAAK,SAAS,MAAM,WAAW,KAAK,SAAS,IAAI;AACxE,QAAM,YAAY,iBAAiB,KAAK,WAAW,CAAC;AACpD,QAAM,aAAa,MAAM,cAAc,WAAW;AAClD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,SAAO,MAAM,IAAI,QAAQ,CAACA,aAAY;AACpC,QAAI,UAAU;AACd,QAAI,mBAAmB,MAAY;AAAA,IAAC;AACpC,QAAI,wBAAwB,MAAY;AAAA,IAAC;AACzC,QAAI;AAEJ,UAAM,SAAS,CAAC,WAA0B;AACxC,UAAI,QAAS;AACb,gBAAU;AACV,UAAI,MAAO,cAAa,KAAK;AAC7B,uBAAiB;AACjB,4BAAsB;AACtB,MAAAA,SAAQ,MAAM;AAAA,IAChB;AAEA,uBAAmB,WAAW,UAAU,CAAC,UAAU;AACjD,YAAM,iBAAiB,aAAa,KAAK;AACzC,UAAI,WAAW,mBAAmB,QAAS;AAC3C,aAAO,EAAE,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,IAChE,CAAC;AACD,4BAAwB,WAAW,aAAa,MAAM;AACpD,aAAO,EAAE,SAAS,OAAO,cAAc,MAAM,QAAQ,6BAA6B,CAAC;AAAA,IACrF,CAAC;AACD,YAAQ,WAAW,MAAM;AACvB,aAAO,EAAE,SAAS,OAAO,UAAU,MAAM,UAAU,CAAC;AAAA,IACtD,GAAG,SAAS;AAAA,EACd,CAAC;AACH;AAEO,SAAS,wBACd,aACA,OAAiC,CAAC,GACf;AACnB,QAAM,SAAS,qBAAqB,IAAI;AACxC,QAAM,UAAU,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,MAAM,OAAO,CAAC,CAAC;AAC1E,QAAM,QAAQ,KAAK,OAAO,KAAK,KAAK;AACpC,QAAM,UAAU,cAAc,aAAa,KAAK;AAChD,QAAM,gBACJ,KAAK,cAAc,kBAClB,OAAO,MAA+B,KAAc,WACnD,MAAM,WAAW,QAAQ,MAAe,KAAK,EAAE,OAAO,CAAC;AAC3D,QAAM,gBAAgB,KAAK,cAAc,iBAAiB;AAE1D,SAAO;AAAA,IACL,YAA6B;AAC3B,aAAO,OAAO,IAAI,CAAC,UAAU,eAAe,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,IACxE;AAAA,IAEA,MAAM,SAAS,MAAc,MAA6D;AACxF,UAAI,CAAC,QAAQ,IAAI,IAAyB,GAAG;AAC3C,eAAO;AAAA,UACL,SAAS,SAAS,IAAI;AAAA,UACtB,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,SAAS,gBAAgB;AAC3B,YAAI;AACF,gBAAM,UAAU,MAAM,uBAAuB,aAAa,MAAM,aAAa;AAC7E,iBAAO,EAAE,SAAS,SAAS,MAAM;AAAA,QACnC,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC9D,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,IAAI,IAAyB;AACrD,YAAM,SAAS,KAAK,QAAQ;AAC5B,UAAI,OAAO,WAAW,YAAY,CAAC,SAAS,SAAS,MAAyB,GAAG;AAC/E,eAAO;AAAA,UACL,SAAS,WAAW,OAAO,MAAM,CAAC,4BAA4B,IAAI;AAAA,UAClE,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,cAAc,MAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM;AAC9E,cAAM,SACJ,CAAC,CAAC,UACF,OAAO,WAAW,YAClB,CAAC,MAAM,QAAQ,MAAM,KACpB,OAAmC,IAAI,MAAM;AAChD,eAAO,EAAE,SAAS,QAAQ,SAAS,OAAO;AAAA,MAC5C,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBACd,aACA,OAAiC,CAAC,GACvB;AACX,SAAO,IAAI,UAAU;AAAA,IACnB,MAAM,wBAAwB,aAAa,IAAI;AAAA,IAC/C,YAAY,EAAE,MAAM,yBAAyB,SAAS,YAAY,QAAQ;AAAA,IAC1E,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aACE;AAAA,QACF,WAAW,CAAC,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,KAAK,CAAC;AAAA,QACzF,UACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACH;",
6
- "names": ["resolve"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,YAC9B,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,cAAc,CACN,CAAC;AAEX,eAAO,MAAM,qBAAqB,YAChC,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,WAAW,EACX,WAAW,EACX,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,uBAAuB,CACf,CAAC;AAEX,iEAAiE;AACjE,eAAO,MAAM,0BAA0B,YACrC,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,CACP,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AACxE,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAClF,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;AAC9F,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,eAAe,GACf,oBAAoB,GACpB,cAAc,CAAC;AAEnB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CACtC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,sBAA2B,GAAG,mBAAmB,EAAE,CAY7F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,WAAW;UAdW,MAAM;aAAW,MAAM;CAcf,CAAC"}