@tickernelz/paperclip-pro-mcp-server 2026.926.5 → 2026.927.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/README.md +18 -4
- package/dist/catalog.d.ts +2 -9
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +11 -39
- package/dist/catalog.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -2
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +53 -2
- package/dist/config.test.js.map +1 -1
- package/dist/generated/api-tools.json +233 -306
- package/dist/generated/excluded-operations.json +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/pagination.test.js +31 -55
- package/dist/pagination.test.js.map +1 -1
- package/dist/route-contract.test.js +227 -11
- package/dist/route-contract.test.js.map +1 -1
- package/dist/tool-overrides.d.ts.map +1 -1
- package/dist/tool-overrides.js +2 -5
- package/dist/tool-overrides.js.map +1 -1
- package/dist/tools.js +1 -1
- package/dist/tools.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -14,7 +14,8 @@ The server reads its configuration from environment variables:
|
|
|
14
14
|
- `PAPERCLIP_COMPANY_ID` - optional default company for company-scoped tools
|
|
15
15
|
- `PAPERCLIP_AGENT_ID` - optional default agent for checkout helpers
|
|
16
16
|
- `PAPERCLIP_RUN_ID` - optional run id forwarded on mutating requests
|
|
17
|
-
- `PAPERCLIP_MCP_TOOLSETS` - comma-separated toolsets to register: `core` (default)
|
|
17
|
+
- `PAPERCLIP_MCP_TOOLSETS` - comma-separated toolsets to register: `core` (default) or `full`; the deprecated `all` and `extended` still resolve to `full`
|
|
18
|
+
- `PAPERCLIP_MCP_LIST_ANNOTATIONS` - set to `1` to put MCP annotations back into the `tools/list` payload
|
|
18
19
|
- `PAPERCLIP_AGENT_ROLE` - caller role; management roles (`ceo`, `board`) also see board-authority tools
|
|
19
20
|
|
|
20
21
|
Inside an active heartbeat, Paperclip also injects `PAPERCLIP_RUNTIME_TOOLS_*` variables. They enable the run-scoped `connections_search` and `connection_request` tools and expire with the run.
|
|
@@ -23,7 +24,8 @@ Inside an active heartbeat, Paperclip also injects `PAPERCLIP_RUNTIME_TOOLS_*` v
|
|
|
23
24
|
|
|
24
25
|
The tool surface is generated from the server's OpenAPI registry, so it tracks the API. Two independent filters decide what a client sees:
|
|
25
26
|
|
|
26
|
-
- **Toolset.** `core` is the default: the curated hand-written tools plus the everyday generated ones (61 tools, ~
|
|
27
|
+
- **Toolset.** `core` is the default: the curated hand-written tools plus the everyday generated ones (61 tools, ~33 KB of `tools/list` JSON, ~8k tokens). `full` is a **superset of `core`**, not a sibling: selecting it registers `core` plus the rest of the generated surface (441 tools, ~190 KB; an agent carrying company authority also sees the board-authority tools, 716 tools, ~304 KB). Select with `PAPERCLIP_MCP_TOOLSETS=full` or `--toolsets full`; the CLI flag wins, an empty or unknown value falls back to `core`. Requesting `full` alone therefore never drops a core-only tool such as `paperclipCreateChildIssue` or the watchdog pair.
|
|
28
|
+
- `full` is the one canonical name for the whole surface. `all` and `extended` are **deprecated aliases**: both still resolve to the same union, and each warns once per process on stderr so an operator can find and migrate the caller. A caller that keeps passing `?toolsets=extended` keeps working; it never stops resolving.
|
|
27
29
|
- **Names.** Generated tool names are capped at 40 characters (`NAME_LENGTH_LIMIT` in `scripts/generate-mcp-tools.ts`) because a host that truncates an over-long name cannot call the truncated form. An over-long name is shortened by dropping redundant path words, then by a deterministic six-hex path digest, so a name is stable across regenerations.
|
|
28
30
|
- **Parameter names.** A bare `{id}` or `{key}` path placeholder is renamed after the resource segment that precedes it (`/issues/{id}` becomes `issueId`, `/cases/{key}` becomes `caseId`), so a caller never has to guess which `id` a tool wants. The rename is internal: the request path substitution and the wire path are unchanged.
|
|
29
31
|
- **Shared description text.** Statements a route repeats on every one of its operations are lifted out of the per-tool descriptions into `src/generated/shared-tool-notes.json`, surfaced once through `sharedToolNotes()` on the MCP `initialize` result. Each tool description keeps only what is specific to that operation.
|
|
@@ -59,11 +61,21 @@ The Paperclip server hosts the same tool surface at `POST /api/mcp/paperclip`, s
|
|
|
59
61
|
|
|
60
62
|
- Authentication is the REST API's: `Authorization: Bearer <run agent key>` plus `X-Paperclip-Run-Id`. Only agent actors are accepted; a board actor gets `403`, a missing credential `401`.
|
|
61
63
|
- `companyId` and `agentId` come from the authenticated agent, never from a request header, and board-authority tools are exposed only when that agent's `agentAuthorityCapabilities` include company-level authority.
|
|
62
|
-
- Toolsets come from `?toolsets=core,
|
|
64
|
+
- Toolsets come from `?toolsets=core,full`; absent, empty or unknown values fall back to `core`, and `full` implies `core` rather than replacing it. The deprecated `all` and `extended` still resolve, with a one-time warning per process.
|
|
63
65
|
- Each `tools/call` re-enters the REST API over the server's own loopback address with the caller's bearer token, so every route guard, record rule and audit hook runs exactly as it does for a direct API call.
|
|
64
66
|
|
|
65
67
|
Tool definitions are built once per process and per (toolset, authority) variant; the `tools/list` payload is memoized with them.
|
|
66
68
|
|
|
69
|
+
### Pagination
|
|
70
|
+
|
|
71
|
+
`tools/list` is **not** paginated: one response carries every tool the caller may see, and no response ever carries `nextCursor`. The cursor mechanism (encode, decode, page size, invalid-cursor error) was removed rather than left inert.
|
|
72
|
+
|
|
73
|
+
The surface is bounded by the OpenAPI registry - 441 tools for an agent, 716 for company authority - so the whole listing is a bounded ~190-300 KB and splitting it buys nothing. More importantly, a smaller page size is not a free change: a client that sends no cursor and does not follow one would silently lose tools, and this repo's own `paperclip-mcp-routes.test.ts` demonstrated exactly that, seeing 200 of 716 and missing four board tools. A response that is always complete is the contract worth keeping.
|
|
74
|
+
|
|
75
|
+
### Annotations
|
|
76
|
+
|
|
77
|
+
`readOnlyHint`, `destructiveHint` and `idempotentHint` are **not** in the `tools/list` payload by default: they cost 30 KB of a 190 KB listing and the only host of this server (OMP) cannot consume them, because its tool type carries no annotations field and its `tools/list` decoder keeps only `name`, `description` and `inputSchema`. The tool definitions still hold the annotations internally. A caller that needs them can pass `annotations: true` to `paperclipToolCatalog` or set `PAPERCLIP_MCP_LIST_ANNOTATIONS=1`; the two listing shapes are memoized separately, so one caller's choice never changes another's.
|
|
78
|
+
|
|
67
79
|
## Error contract
|
|
68
80
|
|
|
69
81
|
A `tools/call` that fails is still a JSON-RPC success with a `result`, but the result carries the MCP error flag so a host cannot mistake it for data:
|
|
@@ -86,7 +98,9 @@ Curated tools keep their names and behaviour: the run-scoped `connections_search
|
|
|
86
98
|
|
|
87
99
|
`paperclipListIssues` returns at most `limit` issues and defaults to **25**, not the route's 500, so one call cannot pull the whole board into context. It accepts `limit` (max 1000), `offset`, `view: "compact"`, `updatedSince`, `sortField`, `sortDir` and `includeConversations`, alongside the existing filters. Raise `limit` explicitly when a complete listing is genuinely needed.
|
|
88
100
|
|
|
89
|
-
Everything else is generated from the OpenAPI registry into `src/generated/api-tools.json`, one tool per operation, with a zod input schema built from its path parameters, query parameters and JSON body, `companyId` filled from `PAPERCLIP_COMPANY_ID` when the route is company-scoped
|
|
101
|
+
Everything else is generated from the OpenAPI registry into `src/generated/api-tools.json`, one tool per operation, with a zod input schema built from its path parameters, query parameters and JSON body, and `companyId` filled from `PAPERCLIP_COMPANY_ID` when the route is company-scoped. MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`) are derived from the registry and held on each definition, but omitted from the listing unless asked for (see [Annotations](#annotations)).
|
|
102
|
+
|
|
103
|
+
`paperclipListAgents` returns the compact row shape when called with no arguments, which omits `orgChainHealth`, `appearance` and `avatarUrl`; pass `view: "full"` for the complete shape.
|
|
90
104
|
|
|
91
105
|
`paperclipApiRequest` is limited to paths under `/api` and JSON bodies. It is
|
|
92
106
|
meant for endpoints that have no dedicated MCP tool, including the credential
|
package/dist/catalog.d.ts
CHANGED
|
@@ -16,18 +16,11 @@ export type ToolListing = {
|
|
|
16
16
|
inputSchema: JsonSchemaObject;
|
|
17
17
|
annotations?: ToolAnnotations;
|
|
18
18
|
}>;
|
|
19
|
-
nextCursor?: string;
|
|
20
19
|
};
|
|
21
|
-
export declare
|
|
22
|
-
export declare class InvalidCursorError extends Error {
|
|
23
|
-
constructor(cursor: string);
|
|
24
|
-
}
|
|
25
|
-
export declare function resolvePageSize(env?: NodeJS.ProcessEnv): number;
|
|
26
|
-
export declare function paginateListing(listing: ToolListing, cursor: string | null | undefined, pageSize: number): ToolListing;
|
|
20
|
+
export declare function resolveListingAnnotations(env?: NodeJS.ProcessEnv): boolean;
|
|
27
21
|
export type CatalogOptions = {
|
|
22
|
+
annotations?: boolean;
|
|
28
23
|
boardSurface?: BoardSurfaceContext;
|
|
29
|
-
cursor?: string | null;
|
|
30
|
-
pageSize?: number;
|
|
31
24
|
};
|
|
32
25
|
/** Tool definitions bound to one caller, sharing schema and listing work per variant. */
|
|
33
26
|
export declare function paperclipToolCatalog(client: PaperclipApiClient, toolsets: ReadonlyArray<ToolsetName>, management: boolean, options?: CatalogOptions): {
|
package/dist/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAyB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,gBAAgB,CAAC;QAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAyB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,gBAAgB,CAAC;QAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,CAAC,CAAC;CACJ,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAGvF;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,CAAC;AA0BF,yFAAyF;AACzF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,EACpC,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,cAAmB,GAC3B;IAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CA6BzD"}
|
package/dist/catalog.js
CHANGED
|
@@ -7,49 +7,23 @@ import { createToolDefinitions } from "./tools.js";
|
|
|
7
7
|
export { PaperclipApiClient } from "./client.js";
|
|
8
8
|
export { hasManagementAuthority, parseToolsets } from "./config.js";
|
|
9
9
|
export { ACTOR_NEUTRAL_GUARDS, AGENT_ADMITTING_GUARDS, BOARD_ONLY_GUARDS, boardToolAdvertised, classifiedGuards, } from "./board-surface.js";
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
super(`Invalid tools/list cursor: ${cursor}`);
|
|
14
|
-
this.name = "InvalidCursorError";
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export function resolvePageSize(env = process.env) {
|
|
18
|
-
const parsed = Number.parseInt(env.PAPERCLIP_MCP_PAGE_SIZE?.trim() ?? "", 10);
|
|
19
|
-
return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_PAGE_SIZE;
|
|
20
|
-
}
|
|
21
|
-
function encodeCursor(offset) {
|
|
22
|
-
return Buffer.from(String(offset), "utf8").toString("base64url");
|
|
23
|
-
}
|
|
24
|
-
function decodeCursor(cursor) {
|
|
25
|
-
const decoded = Buffer.from(cursor, "base64url").toString("utf8");
|
|
26
|
-
if (!/^\d+$/.test(decoded))
|
|
27
|
-
throw new InvalidCursorError(cursor);
|
|
28
|
-
return Number.parseInt(decoded, 10);
|
|
29
|
-
}
|
|
30
|
-
export function paginateListing(listing, cursor, pageSize) {
|
|
31
|
-
const offset = cursor ? decodeCursor(cursor) : 0;
|
|
32
|
-
if (offset > listing.tools.length)
|
|
33
|
-
throw new InvalidCursorError(cursor ?? "");
|
|
34
|
-
const tools = listing.tools.slice(offset, offset + pageSize);
|
|
35
|
-
const nextOffset = offset + tools.length;
|
|
36
|
-
return nextOffset < listing.tools.length
|
|
37
|
-
? { tools, nextCursor: encodeCursor(nextOffset) }
|
|
38
|
-
: { tools };
|
|
10
|
+
export function resolveListingAnnotations(env = process.env) {
|
|
11
|
+
const configured = env.PAPERCLIP_MCP_LIST_ANNOTATIONS?.trim().toLowerCase() ?? "";
|
|
12
|
+
return configured === "1" || configured === "true" || configured === "yes";
|
|
39
13
|
}
|
|
40
14
|
const listings = new Map();
|
|
41
|
-
function listingKey(toolsets, management, surface) {
|
|
42
|
-
const base = `${[...toolsets].sort().join(",")}|${management ? "management" : "agent"}`;
|
|
15
|
+
function listingKey(toolsets, management, surface, annotations) {
|
|
16
|
+
const base = `${[...toolsets].sort().join(",")}|${management ? "management" : "agent"}|${annotations ? "annotated" : "lean"}`;
|
|
43
17
|
if (!management || !surface)
|
|
44
18
|
return base;
|
|
45
19
|
return `${base}|${[...surface.capabilities].sort().join(",")}|${[...surface.permissionKeys].sort().join(",")}`;
|
|
46
20
|
}
|
|
47
|
-
function toListingEntries(definitions) {
|
|
21
|
+
function toListingEntries(definitions, annotations) {
|
|
48
22
|
return definitions.map((tool) => ({
|
|
49
23
|
name: tool.name,
|
|
50
24
|
description: tool.description,
|
|
51
25
|
inputSchema: leanJsonSchema(z.toJSONSchema(tool.schema, { target: "draft-7", io: "input" })),
|
|
52
|
-
...(tool.annotations ? { annotations: tool.annotations } : {}),
|
|
26
|
+
...(annotations && tool.annotations ? { annotations: tool.annotations } : {}),
|
|
53
27
|
}));
|
|
54
28
|
}
|
|
55
29
|
/** Tool definitions bound to one caller, sharing schema and listing work per variant. */
|
|
@@ -62,7 +36,8 @@ export function paperclipToolCatalog(client, toolsets, management, options = {})
|
|
|
62
36
|
...curated,
|
|
63
37
|
...bindGeneratedTools(prepared, client).filter((tool) => !curatedNames.has(tool.name)),
|
|
64
38
|
];
|
|
65
|
-
const
|
|
39
|
+
const annotations = options.annotations ?? resolveListingAnnotations();
|
|
40
|
+
const key = listingKey(selected, management, options.boardSurface, annotations);
|
|
66
41
|
let listing = listings.get(key);
|
|
67
42
|
if (!listing) {
|
|
68
43
|
const surface = management ? options.boardSurface : undefined;
|
|
@@ -74,12 +49,9 @@ export function paperclipToolCatalog(client, toolsets, management, options = {})
|
|
|
74
49
|
const visible = advertisedNames
|
|
75
50
|
? definitions.filter((tool) => curatedNames.has(tool.name) || advertisedNames.has(tool.name))
|
|
76
51
|
: definitions;
|
|
77
|
-
listing = { tools: toListingEntries(visible) };
|
|
52
|
+
listing = { tools: toListingEntries(visible, annotations) };
|
|
78
53
|
listings.set(key, listing);
|
|
79
54
|
}
|
|
80
|
-
return {
|
|
81
|
-
definitions,
|
|
82
|
-
listing: paginateListing(listing, options.cursor, options.pageSize ?? resolvePageSize()),
|
|
83
|
-
};
|
|
55
|
+
return { definitions, listing };
|
|
84
56
|
}
|
|
85
57
|
//# sourceMappingURL=catalog.js.map
|
package/dist/catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAA4B,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAyB,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAA6C,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface PaperclipMcpConfig {
|
|
|
11
11
|
export declare const MANAGEMENT_ROLES: Record<string, true>;
|
|
12
12
|
export declare function hasManagementAuthority(role: string | null | undefined): boolean;
|
|
13
13
|
export declare const TOOLSET_NAMES: ToolsetName[];
|
|
14
|
+
export declare const FULL_TOOLSET = "full";
|
|
14
15
|
export declare function expandToolsetUnion(selected: ReadonlyArray<ToolsetName>): ToolsetName[];
|
|
15
16
|
export declare function parseToolsets(requested: string | null | undefined): ToolsetName[];
|
|
16
17
|
export declare function resolveToolsets(env?: NodeJS.ProcessEnv, argv?: string[]): ToolsetName[];
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAA8B,CAAC;AAEjF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,EAAyB,CAAC;AAEjE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,WAAW,EAAE,CAEtF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAA8B,CAAC;AAEjF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,EAAyB,CAAC;AAEjE,eAAO,MAAM,YAAY,SAAS,CAAC;AAmBnC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,WAAW,EAAE,CAEtF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,EAAE,CAgBjF;AAED,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,MAAM,EAA0B,GACrC,WAAW,EAAE,CAaf;AAUD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAmB1F"}
|
package/dist/config.js
CHANGED
|
@@ -3,6 +3,19 @@ export function hasManagementAuthority(role) {
|
|
|
3
3
|
return typeof role === "string" && MANAGEMENT_ROLES[role.trim().toLowerCase()] === true;
|
|
4
4
|
}
|
|
5
5
|
export const TOOLSET_NAMES = ["core", "extended"];
|
|
6
|
+
export const FULL_TOOLSET = "full";
|
|
7
|
+
const TOOLSET_SELECTIONS = new Set([...TOOLSET_NAMES, FULL_TOOLSET]);
|
|
8
|
+
const DEPRECATED_TOOLSET_SELECTIONS = {
|
|
9
|
+
all: FULL_TOOLSET,
|
|
10
|
+
extended: FULL_TOOLSET,
|
|
11
|
+
};
|
|
12
|
+
const warnedDeprecatedToolsets = new Set();
|
|
13
|
+
function warnDeprecatedToolset(name, canonical) {
|
|
14
|
+
if (warnedDeprecatedToolsets.has(name))
|
|
15
|
+
return;
|
|
16
|
+
warnedDeprecatedToolsets.add(name);
|
|
17
|
+
console.warn(`Paperclip MCP toolset "${name}" is deprecated and now resolves to "${canonical}". Use "${canonical}".`);
|
|
18
|
+
}
|
|
6
19
|
export function expandToolsetUnion(selected) {
|
|
7
20
|
return selected.includes("extended") ? [...TOOLSET_NAMES] : ["core"];
|
|
8
21
|
}
|
|
@@ -11,7 +24,15 @@ export function parseToolsets(requested) {
|
|
|
11
24
|
.split(",")
|
|
12
25
|
.map((entry) => entry.trim().toLowerCase())
|
|
13
26
|
.filter(Boolean);
|
|
14
|
-
|
|
27
|
+
let full = requestedNames.includes(FULL_TOOLSET);
|
|
28
|
+
for (const name of requestedNames) {
|
|
29
|
+
const canonical = DEPRECATED_TOOLSET_SELECTIONS[name];
|
|
30
|
+
if (!canonical)
|
|
31
|
+
continue;
|
|
32
|
+
warnDeprecatedToolset(name, canonical);
|
|
33
|
+
full = true;
|
|
34
|
+
}
|
|
35
|
+
if (full)
|
|
15
36
|
return [...TOOLSET_NAMES];
|
|
16
37
|
return expandToolsetUnion(TOOLSET_NAMES.filter((name) => requestedNames.includes(name)));
|
|
17
38
|
}
|
|
@@ -22,7 +43,7 @@ export function resolveToolsets(env = process.env, argv = process.argv.slice(2))
|
|
|
22
43
|
inline?.slice("--toolsets=".length) ??
|
|
23
44
|
env.PAPERCLIP_MCP_TOOLSETS;
|
|
24
45
|
for (const name of (requested ?? "").split(",").map((entry) => entry.trim().toLowerCase())) {
|
|
25
|
-
if (name && name
|
|
46
|
+
if (name && !TOOLSET_SELECTIONS.has(name) && !DEPRECATED_TOOLSET_SELECTIONS[name]) {
|
|
26
47
|
console.error(`Ignoring unknown Paperclip MCP toolset "${name}"`);
|
|
27
48
|
}
|
|
28
49
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,gBAAgB,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAEjF,MAAM,UAAU,sBAAsB,CAAC,IAA+B;IACpE,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,IAAI,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjE,MAAM,UAAU,kBAAkB,CAAC,QAAoC;IACrE,OAAO,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAoC;IAChE,MAAM,cAAc,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;SACrC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAC1C,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.test.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
2
|
import { paperclipToolCatalog } from "./catalog.js";
|
|
3
3
|
import { PaperclipApiClient } from "./client.js";
|
|
4
|
-
import { parseToolsets, resolveToolsets, TOOLSET_NAMES } from "./config.js";
|
|
4
|
+
import { parseToolsets, resolveToolsets, FULL_TOOLSET, TOOLSET_NAMES } from "./config.js";
|
|
5
5
|
function makeClient() {
|
|
6
6
|
return new PaperclipApiClient({
|
|
7
7
|
apiUrl: "http://localhost:3100/api",
|
|
@@ -27,6 +27,33 @@ describe("Paperclip MCP toolsets", () => {
|
|
|
27
27
|
expect(parseToolsets(null)).toEqual(["core"]);
|
|
28
28
|
expect(parseToolsets("nonsense")).toEqual(["core"]);
|
|
29
29
|
});
|
|
30
|
+
it("resolves full and its deprecated aliases to one identical union", () => {
|
|
31
|
+
expect(parseToolsets(FULL_TOOLSET)).toEqual([...TOOLSET_NAMES]);
|
|
32
|
+
expect(parseToolsets("all")).toEqual(parseToolsets(FULL_TOOLSET));
|
|
33
|
+
expect(parseToolsets("extended")).toEqual(parseToolsets(FULL_TOOLSET));
|
|
34
|
+
expect(parseToolsets("full,core")).toEqual([...TOOLSET_NAMES]);
|
|
35
|
+
});
|
|
36
|
+
it("warns once per deprecated alias and never for the canonical value", async () => {
|
|
37
|
+
vi.resetModules();
|
|
38
|
+
const fresh = await import("./config.js");
|
|
39
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
40
|
+
try {
|
|
41
|
+
fresh.parseToolsets("all");
|
|
42
|
+
fresh.parseToolsets("all");
|
|
43
|
+
fresh.parseToolsets("extended");
|
|
44
|
+
expect(warn.mock.calls.map((call) => call[0])).toEqual([
|
|
45
|
+
expect.stringContaining('"all" is deprecated'),
|
|
46
|
+
expect.stringContaining('"extended" is deprecated'),
|
|
47
|
+
]);
|
|
48
|
+
warn.mockClear();
|
|
49
|
+
fresh.parseToolsets(fresh.FULL_TOOLSET);
|
|
50
|
+
fresh.parseToolsets("core");
|
|
51
|
+
expect(warn).not.toHaveBeenCalled();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
warn.mockRestore();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
30
57
|
it("never drops core from the selected union", () => {
|
|
31
58
|
for (const requested of ["core", "extended", "all", "extended,core", "nonsense", ""]) {
|
|
32
59
|
expect(parseToolsets(requested)).toContain("core");
|
|
@@ -63,4 +90,28 @@ describe("Paperclip MCP toolsets", () => {
|
|
|
63
90
|
expect(core.filter((name) => !extended.includes(name))).toEqual([]);
|
|
64
91
|
});
|
|
65
92
|
});
|
|
93
|
+
describe("Paperclip MCP listing annotations", () => {
|
|
94
|
+
const client = makeClient();
|
|
95
|
+
const toolsets = parseToolsets(FULL_TOOLSET);
|
|
96
|
+
function annotatedEntries(annotations) {
|
|
97
|
+
return paperclipToolCatalog(client, toolsets, false, { annotations }).listing.tools.filter((tool) => "annotations" in tool);
|
|
98
|
+
}
|
|
99
|
+
it("omits annotations from the default listing", () => {
|
|
100
|
+
const listing = paperclipToolCatalog(client, toolsets, false).listing;
|
|
101
|
+
expect(listing.tools.length).toBeGreaterThan(0);
|
|
102
|
+
expect(listing.tools.filter((tool) => "annotations" in tool)).toEqual([]);
|
|
103
|
+
});
|
|
104
|
+
it("keeps them reachable for a caller that opts in", () => {
|
|
105
|
+
const annotated = annotatedEntries(true);
|
|
106
|
+
expect(annotated.length).toBeGreaterThan(0);
|
|
107
|
+
expect(annotated.every((tool) => "annotations" in tool)).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
it("does not let one caller's choice poison the memoized listing for another", () => {
|
|
110
|
+
const lean = paperclipToolCatalog(client, toolsets, false, { annotations: false }).listing;
|
|
111
|
+
const annotated = paperclipToolCatalog(client, toolsets, false, { annotations: true }).listing;
|
|
112
|
+
expect(lean.tools.filter((tool) => "annotations" in tool)).toEqual([]);
|
|
113
|
+
expect(annotated.tools.filter((tool) => "annotations" in tool).length).toBeGreaterThan(0);
|
|
114
|
+
expect(lean.tools.map((tool) => tool.name)).toEqual(annotated.tools.map((tool) => tool.name));
|
|
115
|
+
});
|
|
116
|
+
});
|
|
66
117
|
//# sourceMappingURL=config.test.js.map
|
package/dist/config.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1F,SAAS,UAAU;IACjB,OAAO,IAAI,kBAAkB,CAAC;QAC5B,MAAM,EAAE,2BAA2B;QACnC,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,sCAAsC;QACjD,OAAO,EAAE,sCAAsC;QAC/C,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,QAAoC,EAAE,UAAU,GAAG,KAAK;IAC5E,OAAO,oBAAoB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAC/E,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CACpB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3B,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3B,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACrD,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;gBAC9C,MAAM,CAAC,gBAAgB,CAAC,0BAA0B,CAAC;aACpD,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,eAAe,CAAC,EAAE,sBAAsB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1E,MAAM;YACN,UAAU;SACX,CAAC,CAAC;QACH,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAErD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QAElD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE7C,SAAS,gBAAgB,CAAC,WAAoB;QAC5C,OAAO,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CACxF,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,IAAI,CAChC,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;QAC3F,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;QAE/F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|