@wootsup/mcp 0.1.0-rc.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +148 -83
- package/README.md +36 -32
- package/SECURITY.md +15 -6
- package/dist/auth/keychain.d.ts +27 -1
- package/dist/auth/keychain.js +48 -2
- package/dist/auth/keychain.js.map +1 -1
- package/dist/cli-hint.d.ts +22 -0
- package/dist/cli-hint.js +55 -0
- package/dist/cli-hint.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +163 -22
- package/dist/index.js.map +1 -1
- package/dist/install-skill.js +1 -1
- package/dist/modules/apimapper/cache.d.ts +2 -2
- package/dist/modules/apimapper/cache.js +119 -29
- package/dist/modules/apimapper/cache.js.map +1 -1
- package/dist/modules/apimapper/client.d.ts +102 -1
- package/dist/modules/apimapper/client.js +631 -297
- package/dist/modules/apimapper/client.js.map +1 -1
- package/dist/modules/apimapper/connections-format.d.ts +51 -0
- package/dist/modules/apimapper/connections-format.js +261 -0
- package/dist/modules/apimapper/connections-format.js.map +1 -0
- package/dist/modules/apimapper/connections-trim.d.ts +82 -0
- package/dist/modules/apimapper/connections-trim.js +224 -0
- package/dist/modules/apimapper/connections-trim.js.map +1 -0
- package/dist/modules/apimapper/connections.d.ts +14 -2
- package/dist/modules/apimapper/connections.js +612 -153
- package/dist/modules/apimapper/connections.js.map +1 -1
- package/dist/modules/apimapper/credential-sanitizer.d.ts +5 -0
- package/dist/modules/apimapper/credential-sanitizer.js +60 -1
- package/dist/modules/apimapper/credential-sanitizer.js.map +1 -1
- package/dist/modules/apimapper/credentials-format.d.ts +21 -0
- package/dist/modules/apimapper/credentials-format.js +145 -0
- package/dist/modules/apimapper/credentials-format.js.map +1 -0
- package/dist/modules/apimapper/credentials.d.ts +12 -2
- package/dist/modules/apimapper/credentials.js +226 -73
- package/dist/modules/apimapper/credentials.js.map +1 -1
- package/dist/modules/apimapper/diagnose.d.ts +54 -2
- package/dist/modules/apimapper/diagnose.js +213 -12
- package/dist/modules/apimapper/diagnose.js.map +1 -1
- package/dist/modules/apimapper/elicitation.d.ts +54 -0
- package/dist/modules/apimapper/elicitation.js +90 -0
- package/dist/modules/apimapper/elicitation.js.map +1 -0
- package/dist/modules/apimapper/flows-format.d.ts +50 -0
- package/dist/modules/apimapper/flows-format.js +318 -0
- package/dist/modules/apimapper/flows-format.js.map +1 -0
- package/dist/modules/apimapper/flows.d.ts +13 -2
- package/dist/modules/apimapper/flows.js +312 -122
- package/dist/modules/apimapper/flows.js.map +1 -1
- package/dist/modules/apimapper/gateway/advanced-tool.d.ts +9 -0
- package/dist/modules/apimapper/gateway/advanced-tool.js +265 -0
- package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -0
- package/dist/modules/apimapper/gateway/capturing-server.d.ts +81 -0
- package/dist/modules/apimapper/gateway/capturing-server.js +87 -0
- package/dist/modules/apimapper/gateway/capturing-server.js.map +1 -0
- package/dist/modules/apimapper/gateway/essentials.d.ts +4 -0
- package/dist/modules/apimapper/gateway/essentials.js +35 -0
- package/dist/modules/apimapper/gateway/essentials.js.map +1 -0
- package/dist/modules/apimapper/gateway/test-support.d.ts +17 -0
- package/dist/modules/apimapper/gateway/test-support.js +43 -0
- package/dist/modules/apimapper/gateway/test-support.js.map +1 -0
- package/dist/modules/apimapper/get-skill.d.ts +3 -3
- package/dist/modules/apimapper/get-skill.js +47 -7
- package/dist/modules/apimapper/get-skill.js.map +1 -1
- package/dist/modules/apimapper/graph-builder.js +1 -1
- package/dist/modules/apimapper/graph-builder.js.map +1 -1
- package/dist/modules/apimapper/graph.d.ts +2 -2
- package/dist/modules/apimapper/graph.js +170 -35
- package/dist/modules/apimapper/graph.js.map +1 -1
- package/dist/modules/apimapper/index.d.ts +17 -1
- package/dist/modules/apimapper/index.js +68 -17
- package/dist/modules/apimapper/index.js.map +1 -1
- package/dist/modules/apimapper/inspect.d.ts +3 -2
- package/dist/modules/apimapper/inspect.js +97 -13
- package/dist/modules/apimapper/inspect.js.map +1 -1
- package/dist/modules/apimapper/library.d.ts +2 -2
- package/dist/modules/apimapper/library.js +665 -80
- package/dist/modules/apimapper/library.js.map +1 -1
- package/dist/modules/apimapper/license-format.d.ts +22 -0
- package/dist/modules/apimapper/license-format.js +149 -0
- package/dist/modules/apimapper/license-format.js.map +1 -0
- package/dist/modules/apimapper/license.d.ts +16 -2
- package/dist/modules/apimapper/license.js +62 -38
- package/dist/modules/apimapper/license.js.map +1 -1
- package/dist/modules/apimapper/local-sources.d.ts +2 -2
- package/dist/modules/apimapper/local-sources.js +44 -30
- package/dist/modules/apimapper/local-sources.js.map +1 -1
- package/dist/modules/apimapper/misc.d.ts +30 -2
- package/dist/modules/apimapper/misc.js +114 -49
- package/dist/modules/apimapper/misc.js.map +1 -1
- package/dist/modules/apimapper/node-schema.d.ts +52 -0
- package/dist/modules/apimapper/node-schema.js +70 -2
- package/dist/modules/apimapper/node-schema.js.map +1 -1
- package/dist/modules/apimapper/normalizers.d.ts +1 -0
- package/dist/modules/apimapper/normalizers.js +51 -0
- package/dist/modules/apimapper/normalizers.js.map +1 -1
- package/dist/modules/apimapper/onboarding.d.ts +78 -3
- package/dist/modules/apimapper/onboarding.js +428 -26
- package/dist/modules/apimapper/onboarding.js.map +1 -1
- package/dist/modules/apimapper/read-cache.d.ts +31 -2
- package/dist/modules/apimapper/read-cache.js +20 -6
- package/dist/modules/apimapper/read-cache.js.map +1 -1
- package/dist/modules/apimapper/render/_shared.d.ts +24 -0
- package/dist/modules/apimapper/render/_shared.js +84 -0
- package/dist/modules/apimapper/render/_shared.js.map +1 -0
- package/dist/modules/apimapper/render/dag.d.ts +18 -0
- package/dist/modules/apimapper/render/dag.js +70 -0
- package/dist/modules/apimapper/render/dag.js.map +1 -0
- package/dist/modules/apimapper/render/index.d.ts +2 -0
- package/dist/modules/apimapper/render/index.js +112 -0
- package/dist/modules/apimapper/render/index.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/chart-bar.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/chart-bar.js +70 -0
- package/dist/modules/apimapper/render/renderers/chart-bar.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/chart-line.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/chart-line.js +71 -0
- package/dist/modules/apimapper/render/renderers/chart-line.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/diff.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/diff.js +154 -0
- package/dist/modules/apimapper/render/renderers/diff.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/flow-diagram.d.ts +1 -0
- package/dist/modules/apimapper/render/renderers/flow-diagram.js +180 -0
- package/dist/modules/apimapper/render/renderers/flow-diagram.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/json-tree.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/json-tree.js +87 -0
- package/dist/modules/apimapper/render/renderers/json-tree.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/schema-diagram.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/schema-diagram.js +83 -0
- package/dist/modules/apimapper/render/renderers/schema-diagram.js.map +1 -0
- package/dist/modules/apimapper/render/renderers/table.d.ts +2 -0
- package/dist/modules/apimapper/render/renderers/table.js +75 -0
- package/dist/modules/apimapper/render/renderers/table.js.map +1 -0
- package/dist/modules/apimapper/render/schemas.d.ts +23 -0
- package/dist/modules/apimapper/render/schemas.js +56 -0
- package/dist/modules/apimapper/render/schemas.js.map +1 -0
- package/dist/modules/apimapper/render/secret-masking.d.ts +5 -0
- package/dist/modules/apimapper/render/secret-masking.js +51 -0
- package/dist/modules/apimapper/render/secret-masking.js.map +1 -0
- package/dist/modules/apimapper/render/sidecar.d.ts +21 -0
- package/dist/modules/apimapper/render/sidecar.js +66 -0
- package/dist/modules/apimapper/render/sidecar.js.map +1 -0
- package/dist/modules/apimapper/render/token-cap.d.ts +21 -0
- package/dist/modules/apimapper/render/token-cap.js +57 -0
- package/dist/modules/apimapper/render/token-cap.js.map +1 -0
- package/dist/modules/apimapper/schema.d.ts +2 -2
- package/dist/modules/apimapper/schema.js +92 -33
- package/dist/modules/apimapper/schema.js.map +1 -1
- package/dist/modules/apimapper/settings-format.d.ts +23 -0
- package/dist/modules/apimapper/settings-format.js +135 -0
- package/dist/modules/apimapper/settings-format.js.map +1 -0
- package/dist/modules/apimapper/settings.d.ts +2 -2
- package/dist/modules/apimapper/settings.js +100 -42
- package/dist/modules/apimapper/settings.js.map +1 -1
- package/dist/modules/apimapper/sites-tools.d.ts +29 -0
- package/dist/modules/apimapper/sites-tools.js +165 -0
- package/dist/modules/apimapper/sites-tools.js.map +1 -0
- package/dist/modules/apimapper/skill-resources.d.ts +2 -2
- package/dist/modules/apimapper/skill-resources.js.map +1 -1
- package/dist/modules/apimapper/token-baseline.harness.d.ts +91 -0
- package/dist/modules/apimapper/token-baseline.harness.js +291 -0
- package/dist/modules/apimapper/token-baseline.harness.js.map +1 -0
- package/dist/modules/apimapper/tool-result.d.ts +46 -0
- package/dist/modules/apimapper/tool-result.js +63 -0
- package/dist/modules/apimapper/tool-result.js.map +1 -0
- package/dist/modules/apimapper/toolslist-size.d.ts +56 -0
- package/dist/modules/apimapper/toolslist-size.js +192 -0
- package/dist/modules/apimapper/toolslist-size.js.map +1 -0
- package/dist/modules/apimapper/types.d.ts +44 -8
- package/dist/modules/apimapper/types.js +26 -1
- package/dist/modules/apimapper/types.js.map +1 -1
- package/dist/modules/apimapper/use-profile.d.ts +21 -0
- package/dist/modules/apimapper/use-profile.js +56 -2
- package/dist/modules/apimapper/use-profile.js.map +1 -1
- package/dist/modules/apimapper/whitelist-drift.d.ts +85 -0
- package/dist/modules/apimapper/whitelist-drift.js +360 -0
- package/dist/modules/apimapper/whitelist-drift.js.map +1 -0
- package/dist/modules/apimapper/workflows.d.ts +2 -2
- package/dist/modules/apimapper/workflows.js +202 -20
- package/dist/modules/apimapper/workflows.js.map +1 -1
- package/dist/modules/apimapper/yootheme-binding.d.ts +35 -0
- package/dist/modules/apimapper/yootheme-binding.js +186 -0
- package/dist/modules/apimapper/yootheme-binding.js.map +1 -0
- package/dist/platform/index.d.ts +56 -0
- package/dist/platform/index.js +195 -7
- package/dist/platform/index.js.map +1 -1
- package/dist/setup/detect-clients.d.ts +40 -1
- package/dist/setup/detect-clients.js +148 -1
- package/dist/setup/detect-clients.js.map +1 -1
- package/dist/setup/probe-handshake.js +40 -7
- package/dist/setup/probe-handshake.js.map +1 -1
- package/dist/setup/remove-config.d.ts +8 -0
- package/dist/setup/remove-config.js +145 -0
- package/dist/setup/remove-config.js.map +1 -0
- package/dist/setup/uninstall.d.ts +34 -0
- package/dist/setup/uninstall.js +147 -0
- package/dist/setup/uninstall.js.map +1 -0
- package/dist/setup-cli.d.ts +60 -0
- package/dist/setup-cli.js +155 -5
- package/dist/setup-cli.js.map +1 -1
- package/dist/sites/loader.d.ts +41 -0
- package/dist/sites/loader.js +119 -0
- package/dist/sites/loader.js.map +1 -0
- package/dist/sites/schema.d.ts +69 -0
- package/dist/sites/schema.js +71 -0
- package/dist/sites/schema.js.map +1 -0
- package/dist/sites/secret-resolver.d.ts +47 -0
- package/dist/sites/secret-resolver.js +150 -0
- package/dist/sites/secret-resolver.js.map +1 -0
- package/dist/skill-instructions.d.ts +1 -1
- package/dist/skill-instructions.js +5 -0
- package/dist/skill-instructions.js.map +1 -1
- package/dist/transports/stdio.js +4 -4
- package/dist/transports/stdio.js.map +1 -1
- package/dist/uninstall-skill.d.ts +27 -0
- package/dist/uninstall-skill.js +89 -0
- package/dist/uninstall-skill.js.map +1 -0
- package/docs/architecture.md +22 -22
- package/docs/customgraph-internal-migration.md +4 -4
- package/docs/security.md +2 -21
- package/docs/tools.md +40 -12
- package/manifest.json +77 -70
- package/package.json +68 -60
- package/skills/apimapper/SKILL.md +53 -7
- package/skills/apimapper/reference/conditional-style-multi-items.md +114 -0
- package/skills/apimapper/reference/jmespath-pitfalls.md +108 -0
- package/skills/apimapper/reference/joomla.md +1 -1
- package/skills/apimapper/reference/library-template-discovery.md +65 -0
- package/skills/apimapper/reference/merge-two-sources-on-key.md +99 -0
- package/skills/apimapper/reference/render.md +132 -0
- package/skills/apimapper/reference/troubleshooting.md +21 -1
- package/skills/apimapper/reference/yootheme.md +1 -1
- package/dist/auth/oauth-provider.d.ts +0 -68
- package/dist/auth/oauth-provider.js +0 -232
- package/dist/auth/oauth-provider.js.map +0 -1
- package/dist/server-http.d.ts +0 -22
- package/dist/server-http.js +0 -159
- package/dist/server-http.js.map +0 -1
- package/dist/transports/http.d.ts +0 -29
- package/dist/transports/http.js +0 -267
- package/dist/transports/http.js.map +0 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// toolslist-size.ts — W3 Stage-5 token-Δ measurement (Task B)
|
|
2
|
+
//
|
|
3
|
+
// Measures the `tools/list` catalog overhead — the static tool descriptions +
|
|
4
|
+
// JSON schemas an MCP client receives once per session, before any tool is
|
|
5
|
+
// called. This is the DOMINANT token cost center of an API Mapper session.
|
|
6
|
+
//
|
|
7
|
+
// Two figures, both derived from the CURRENT build (canonical counts asserted
|
|
8
|
+
// live in gateway/gateway.test.ts — A2, 2026-06-03):
|
|
9
|
+
//
|
|
10
|
+
// - POST-W3 `tools/list` — the 19 surface tools the server now exposes
|
|
11
|
+
// (15 module essentials + `apimapper_advanced`
|
|
12
|
+
// + the 3 src/index.ts top-level tools).
|
|
13
|
+
// - PRE-W3-equivalent `tools/list` — what `tools/list` WOULD be if all 79
|
|
14
|
+
// tools were exposed flat (the pre-Gateway
|
|
15
|
+
// state): the 19 surface tools minus the
|
|
16
|
+
// gateway tool, plus the 60 advanced-registry
|
|
17
|
+
// tool configs — 78 flat tools. (Pre-W3 the
|
|
18
|
+
// `apimapper_advanced` gateway did not exist.)
|
|
19
|
+
//
|
|
20
|
+
// Per-tool serialization mirrors what the MCP SDK puts on the wire for one
|
|
21
|
+
// `tools/list` entry: `{ name, description, inputSchema, annotations }`, where
|
|
22
|
+
// `inputSchema` is the JSON Schema projected from the tool's Zod raw-shape
|
|
23
|
+
// (the same `z.toJSONSchema` projection `gateway/advanced-tool.ts` uses for
|
|
24
|
+
// discovery mode). `title` and `_meta` are omitted: they are small, present on
|
|
25
|
+
// both sides, and cancel out in the delta — keeping the measurement focused on
|
|
26
|
+
// the description + schema payload that actually scales with the tool count.
|
|
27
|
+
//
|
|
28
|
+
// Determinism: given the same build, every figure is byte-for-byte identical.
|
|
29
|
+
// Pinned by toolslist-size.test.ts.
|
|
30
|
+
import * as os from "node:os";
|
|
31
|
+
import * as path from "node:path";
|
|
32
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
33
|
+
import { loadModules } from "@getimo/mcp-toolkit";
|
|
34
|
+
import { z } from "zod";
|
|
35
|
+
import { apimapperRestModule } from "./index.js";
|
|
36
|
+
import { collectModuleTools } from "./gateway/test-support.js";
|
|
37
|
+
import { registerListProfilesTool, registerUseProfileTool, } from "./use-profile.js";
|
|
38
|
+
import { ProfileStore } from "../../auth/profiles.js";
|
|
39
|
+
/**
|
|
40
|
+
* Reads a tool config's `inputSchema` as a Zod raw-shape. Mirrors `shapeOf`
|
|
41
|
+
* in `gateway/advanced-tool.ts` — a registered `inputSchema` is the raw shape
|
|
42
|
+
* object; a zero-arg tool has none.
|
|
43
|
+
*/
|
|
44
|
+
function shapeOf(inputSchema) {
|
|
45
|
+
if (inputSchema && typeof inputSchema === "object") {
|
|
46
|
+
return inputSchema;
|
|
47
|
+
}
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Projects one tool to its `tools/list` JSON-Schema-bearing catalog entry.
|
|
52
|
+
* The `inputSchema` is JSON-Schema-projected the same way the SDK and the
|
|
53
|
+
* gateway's discovery mode do, so the byte count reflects the real wire shape.
|
|
54
|
+
*/
|
|
55
|
+
export function toCatalogEntry(name, tool) {
|
|
56
|
+
let inputSchema;
|
|
57
|
+
try {
|
|
58
|
+
inputSchema = z.toJSONSchema(z.object(shapeOf(tool.inputSchema)));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// A schema that cannot be JSON-projected still yields a usable entry; the
|
|
62
|
+
// description carries the rest. Matches the gateway discovery-mode guard.
|
|
63
|
+
inputSchema = { type: "object" };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
description: tool.description,
|
|
68
|
+
inputSchema,
|
|
69
|
+
annotations: tool.annotations,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Serializes a list of catalog entries and tallies the UTF-8 byte length of
|
|
74
|
+
* each entry's `JSON.stringify`. The total is the `tools/list` payload size
|
|
75
|
+
* for that surface.
|
|
76
|
+
*/
|
|
77
|
+
function measure(entries) {
|
|
78
|
+
const perTool = entries
|
|
79
|
+
.map((entry) => ({
|
|
80
|
+
name: entry.name,
|
|
81
|
+
bytes: Buffer.byteLength(JSON.stringify(entry), "utf8"),
|
|
82
|
+
}))
|
|
83
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
84
|
+
const totalBytes = perTool.reduce((sum, t) => sum + t.bytes, 0);
|
|
85
|
+
return { toolCount: perTool.length, totalBytes, perTool };
|
|
86
|
+
}
|
|
87
|
+
/** A no-op keychain: registration stores the dep but never invokes it here. */
|
|
88
|
+
const STUB_KEYCHAIN = {
|
|
89
|
+
set: async () => undefined,
|
|
90
|
+
get: async () => null,
|
|
91
|
+
delete: async () => undefined,
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Captures the 3 top-level tools registered in `src/index.ts` —
|
|
95
|
+
* `apimapper_rest_modules_status`, `apimapper_use_profile`,
|
|
96
|
+
* `apimapper_list_profiles` — by replaying their registration against a
|
|
97
|
+
* recording registrar. `src/index.ts` registers these directly on the
|
|
98
|
+
* McpServer (not via the module / CapturingServer), so they must be added to
|
|
99
|
+
* the catalog explicitly for an accurate `tools/list` count.
|
|
100
|
+
*
|
|
101
|
+
* The use-profile registrations only *store* their `{ store, keychain }` deps;
|
|
102
|
+
* they are never invoked at registration time, so a real `ProfileStore` over a
|
|
103
|
+
* throwaway dir + a stub keychain is sufficient to capture the configs.
|
|
104
|
+
*/
|
|
105
|
+
function captureTopLevelTools() {
|
|
106
|
+
const captured = new Map();
|
|
107
|
+
const recorder = {
|
|
108
|
+
registerTool(name, config) {
|
|
109
|
+
const cfg = config;
|
|
110
|
+
captured.set(name, {
|
|
111
|
+
handler: () => ({ content: [] }),
|
|
112
|
+
description: cfg.description,
|
|
113
|
+
inputSchema: cfg.inputSchema,
|
|
114
|
+
annotations: cfg.annotations,
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
// apimapper_rest_modules_status — registered inline in src/index.ts. Its
|
|
119
|
+
// config is replicated here verbatim (zero-arg readOnly status tool). The
|
|
120
|
+
// toolslist-size.test.ts cross-checks the captured name set, so drift
|
|
121
|
+
// between this replica and src/index.ts surfaces as a failing pin.
|
|
122
|
+
recorder.registerTool("apimapper_rest_modules_status", {
|
|
123
|
+
title: "Adapter Modules Status",
|
|
124
|
+
description: "Module-loading status for this MCP adapter (which sub-modules registered cleanly). " +
|
|
125
|
+
"For runtime connectivity + auth checks against the API Mapper REST surface, use apimapper_health.",
|
|
126
|
+
inputSchema: {},
|
|
127
|
+
annotations: { readOnlyHint: true, openWorldHint: false, title: "MCP Modules Status" },
|
|
128
|
+
});
|
|
129
|
+
// apimapper_use_profile + apimapper_list_profiles — registered via the
|
|
130
|
+
// use-profile module functions. Replaying the real registration functions
|
|
131
|
+
// captures their exact live config (description + Zod inputSchema).
|
|
132
|
+
// F-1.1 (Pass-1 consolidation): platform-portable temp path. The store is a
|
|
133
|
+
// throwaway used purely for tool-list shape capture during the measurement.
|
|
134
|
+
const store = new ProfileStore(path.join(os.tmpdir(), "__w3_toolslist_measure__"));
|
|
135
|
+
registerUseProfileTool(recorder, { store, keychain: STUB_KEYCHAIN });
|
|
136
|
+
registerListProfilesTool(recorder, { store, keychain: STUB_KEYCHAIN });
|
|
137
|
+
return captured;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Builds the full 79-tool catalog from the current build and measures the
|
|
141
|
+
* post-W3 vs pre-W3-equivalent `tools/list` payload sizes.
|
|
142
|
+
*
|
|
143
|
+
* Surface composition (verified against `gateway/essentials.ts` + `src/index.ts`,
|
|
144
|
+
* pinned live in `gateway/gateway.test.ts` — A2):
|
|
145
|
+
* - module tools : 15 essentials + `apimapper_advanced` = 16 (on the real
|
|
146
|
+
* McpServer) + 60 advanced (gateway registry) = 76
|
|
147
|
+
* - top-level tools: rest_modules_status + use_profile + list_profiles = 3
|
|
148
|
+
* total = 79
|
|
149
|
+
*
|
|
150
|
+
* POST-W3 `tools/list` = the 16 module-real tools + the 3 top-level tools = 19.
|
|
151
|
+
* PRE-W3 flat `tools/list` = the 18 non-gateway surface tools + the 60 advanced
|
|
152
|
+
* tools = 78 (the `apimapper_advanced` gateway did not exist pre-W3).
|
|
153
|
+
*/
|
|
154
|
+
export async function measureToolsList() {
|
|
155
|
+
const server = new McpServer({
|
|
156
|
+
name: "toolslist-size-measure",
|
|
157
|
+
version: "0.0.0",
|
|
158
|
+
});
|
|
159
|
+
await loadModules(server, [apimapperRestModule]);
|
|
160
|
+
// collectModuleTools unifies the real-server essentials (incl. the gateway
|
|
161
|
+
// tool) with the captured advanced-registry tools.
|
|
162
|
+
const moduleTools = collectModuleTools(server, apimapperRestModule);
|
|
163
|
+
const topLevelTools = captureTopLevelTools();
|
|
164
|
+
const advancedRegistry = apimapperRestModule.getAdvancedRegistry();
|
|
165
|
+
const advancedNames = new Set(advancedRegistry ? advancedRegistry.keys() : []);
|
|
166
|
+
// POST-W3 surface: every tool in `tools/list` today — module-real tools that
|
|
167
|
+
// are NOT in the advanced registry (i.e. essentials + the gateway) plus the
|
|
168
|
+
// 3 top-level tools.
|
|
169
|
+
const postEntries = [];
|
|
170
|
+
for (const [name, tool] of Object.entries(moduleTools)) {
|
|
171
|
+
if (advancedNames.has(name))
|
|
172
|
+
continue; // advanced — gated behind the gateway
|
|
173
|
+
postEntries.push(toCatalogEntry(name, tool));
|
|
174
|
+
}
|
|
175
|
+
for (const [name, tool] of topLevelTools) {
|
|
176
|
+
postEntries.push(toCatalogEntry(name, tool));
|
|
177
|
+
}
|
|
178
|
+
// PRE-W3-equivalent flat surface: the post-W3 surface MINUS the gateway tool
|
|
179
|
+
// (it did not exist pre-W3) PLUS every advanced tool exposed flat.
|
|
180
|
+
const preEntries = postEntries.filter((e) => e.name !== "apimapper_advanced");
|
|
181
|
+
for (const [name, tool] of Object.entries(moduleTools)) {
|
|
182
|
+
if (!advancedNames.has(name))
|
|
183
|
+
continue; // only the advanced tools
|
|
184
|
+
preEntries.push(toCatalogEntry(name, tool));
|
|
185
|
+
}
|
|
186
|
+
const postW3 = measure(postEntries);
|
|
187
|
+
const preW3Flat = measure(preEntries);
|
|
188
|
+
const bytesSaved = preW3Flat.totalBytes - postW3.totalBytes;
|
|
189
|
+
const fractionSaved = preW3Flat.totalBytes > 0 ? bytesSaved / preW3Flat.totalBytes : 0;
|
|
190
|
+
return { postW3, preW3Flat, bytesSaved, fractionSaved };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=toolslist-size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolslist-size.js","sourceRoot":"","sources":["../../../src/modules/apimapper/toolslist-size.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,27 @@ export interface Credential {
|
|
|
39
39
|
auth_type: string;
|
|
40
40
|
oauth_provider?: string | null;
|
|
41
41
|
oauth_token_expires_at?: string | null;
|
|
42
|
+
/**
|
|
43
|
+
* Wave-12 F1 (Cold-AI #6) — canonical token-validity surface emitted by the
|
|
44
|
+
* PHP `/credentials` endpoint (`CredentialRepository::calculateStatus`).
|
|
45
|
+
* Values: 'active' | 'expiring' | 'expired' | 'broken'.
|
|
46
|
+
*
|
|
47
|
+
* - 'active' covers credentials with a refresh-token even if their
|
|
48
|
+
* short-lived access token's `oauth_token_expires_at` is in the past —
|
|
49
|
+
* they auto-renew on next use.
|
|
50
|
+
* - 'expired' is the only state where the customer truly needs to reconnect.
|
|
51
|
+
*
|
|
52
|
+
* The onboarding suggestion engine MUST prefer this field over the raw
|
|
53
|
+
* `oauth_token_expires_at` heuristic to avoid false-positive reconnect
|
|
54
|
+
* prompts for refreshable tokens (Google, GitHub, etc.).
|
|
55
|
+
*/
|
|
56
|
+
status?: "active" | "expiring" | "expired" | "broken" | string | null;
|
|
57
|
+
/**
|
|
58
|
+
* Hard-expiry timestamp emitted ONLY for credentials WITHOUT a refresh-token
|
|
59
|
+
* (e.g. Meta/Instagram 60-day expiry). When this field is null/absent on an
|
|
60
|
+
* OAuth credential, the token is auto-refreshable and not user-visibly expirable.
|
|
61
|
+
*/
|
|
62
|
+
token_hard_expires_at?: string | null;
|
|
42
63
|
provider?: string | null;
|
|
43
64
|
created_at?: string;
|
|
44
65
|
updated_at?: string;
|
|
@@ -53,14 +74,8 @@ export interface FlowNode {
|
|
|
53
74
|
data?: Record<string, unknown>;
|
|
54
75
|
[k: string]: unknown;
|
|
55
76
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
source: string;
|
|
59
|
-
target: string;
|
|
60
|
-
sourceHandle?: string;
|
|
61
|
-
targetHandle?: string;
|
|
62
|
-
[k: string]: unknown;
|
|
63
|
-
}
|
|
77
|
+
import type { FlowEdge } from "./node-schema.js";
|
|
78
|
+
export type { FlowEdge };
|
|
64
79
|
export interface Flow {
|
|
65
80
|
id: string;
|
|
66
81
|
name: string;
|
|
@@ -109,3 +124,24 @@ export interface LicenseStatus {
|
|
|
109
124
|
activation_count?: number;
|
|
110
125
|
max_activations?: number;
|
|
111
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Bridge a typed-domain array to the toolkit's structurally-typed table-row
|
|
129
|
+
* shape.
|
|
130
|
+
*
|
|
131
|
+
* The mcp-core `tableResult()` (and other table builders) accept
|
|
132
|
+
* `Record<string, unknown>[]` for ASCII-table serialization. Our domain
|
|
133
|
+
* interfaces (`Connection`, `Credential`, `Flow`, `LibraryItem`, …) are
|
|
134
|
+
* nominal types without an index signature, so they are not structurally
|
|
135
|
+
* assignable to `Record<string, unknown>` even though every concrete row
|
|
136
|
+
* happens to satisfy it at runtime.
|
|
137
|
+
*
|
|
138
|
+
* Rather than scatter `items as unknown as Record<string, unknown>[]`
|
|
139
|
+
* across call-sites — each one looking like a code smell — this is the
|
|
140
|
+
* single documented interop point. Call-sites stay cast-free and the
|
|
141
|
+
* narrowing decision lives in ONE place that reviewers can audit.
|
|
142
|
+
*
|
|
143
|
+
* This is NOT a license to widen domain types — fields used downstream
|
|
144
|
+
* (column `key`s in the table config) are still type-checked against the
|
|
145
|
+
* domain interface separately.
|
|
146
|
+
*/
|
|
147
|
+
export declare function toRows<T extends object>(items: readonly T[]): Record<string, unknown>[];
|
|
@@ -10,5 +10,30 @@
|
|
|
10
10
|
// - LocalSource wire fmt = camelCase (contentType) with "platform/type" id ("wordpress/posts")
|
|
11
11
|
//
|
|
12
12
|
// These types reflect the actual REST contract verified against the PHP controllers.
|
|
13
|
-
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Domain → toolkit interop bridge (F-1.2 — Pass-1 consolidation)
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Bridge a typed-domain array to the toolkit's structurally-typed table-row
|
|
18
|
+
* shape.
|
|
19
|
+
*
|
|
20
|
+
* The mcp-core `tableResult()` (and other table builders) accept
|
|
21
|
+
* `Record<string, unknown>[]` for ASCII-table serialization. Our domain
|
|
22
|
+
* interfaces (`Connection`, `Credential`, `Flow`, `LibraryItem`, …) are
|
|
23
|
+
* nominal types without an index signature, so they are not structurally
|
|
24
|
+
* assignable to `Record<string, unknown>` even though every concrete row
|
|
25
|
+
* happens to satisfy it at runtime.
|
|
26
|
+
*
|
|
27
|
+
* Rather than scatter `items as unknown as Record<string, unknown>[]`
|
|
28
|
+
* across call-sites — each one looking like a code smell — this is the
|
|
29
|
+
* single documented interop point. Call-sites stay cast-free and the
|
|
30
|
+
* narrowing decision lives in ONE place that reviewers can audit.
|
|
31
|
+
*
|
|
32
|
+
* This is NOT a license to widen domain types — fields used downstream
|
|
33
|
+
* (column `key`s in the table config) are still type-checked against the
|
|
34
|
+
* domain interface separately.
|
|
35
|
+
*/
|
|
36
|
+
export function toRows(items) {
|
|
37
|
+
return items;
|
|
38
|
+
}
|
|
14
39
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/apimapper/types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,yEAAyE;AACzE,iGAAiG;AACjG,oFAAoF;AACpF,wEAAwE;AACxE,iFAAiF;AACjF,sEAAsE;AACtE,6EAA6E;AAC7E,mGAAmG;AACnG,EAAE;AACF,qFAAqF"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/apimapper/types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,yEAAyE;AACzE,iGAAiG;AACjG,oFAAoF;AACpF,wEAAwE;AACxE,iFAAiF;AACjF,sEAAsE;AACtE,6EAA6E;AAC7E,mGAAmG;AACnG,EAAE;AACF,qFAAqF;AAmJrF,gFAAgF;AAChF,iEAAiE;AACjE,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,MAAM,CAAmB,KAAmB;IAC1D,OAAO,KAAwD,CAAC;AAClE,CAAC"}
|
|
@@ -31,4 +31,25 @@ export interface UseProfileDeps {
|
|
|
31
31
|
*/
|
|
32
32
|
export declare function defaultProbeIdentity(profile: Profile, token: string): Promise<IdentityProbeResult>;
|
|
33
33
|
export declare function registerUseProfileTool(server: ToolRegistrar | McpServer, deps: UseProfileDeps): void;
|
|
34
|
+
/**
|
|
35
|
+
* Dependencies for `registerListProfilesTool`. Matches the
|
|
36
|
+
* `UseProfileDeps` shape so callers can pass the same object — `keychain`
|
|
37
|
+
* is currently unused but kept in the signature for symmetry with
|
|
38
|
+
* apimapper_use_profile (so the wiring in src/index.ts is consistent and
|
|
39
|
+
* the contract can evolve without breaking callers).
|
|
40
|
+
*/
|
|
41
|
+
export interface ListProfilesDeps {
|
|
42
|
+
store: ProfileStore;
|
|
43
|
+
keychain: Keychain;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Register the `apimapper_list_profiles` tool. Read-only — returns the
|
|
47
|
+
* configured profile registry with an `is_active` flag derived from the
|
|
48
|
+
* ProfileStore active pointer.
|
|
49
|
+
*
|
|
50
|
+
* Closes the broken xref in `apimapper_use_profile`'s "profile not found"
|
|
51
|
+
* hint, which previously pointed AI clients at this tool when it did not
|
|
52
|
+
* yet exist.
|
|
53
|
+
*/
|
|
54
|
+
export declare function registerListProfilesTool(server: ToolRegistrar | McpServer, deps: ListProfilesDeps): void;
|
|
34
55
|
export {};
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// Dependencies (store/keychain/probe) are injected for testability — the
|
|
13
13
|
// real wire-through happens in src/index.ts where the server is constructed.
|
|
14
14
|
import { z } from "zod";
|
|
15
|
-
import { formatResult, readOnly } from "@getimo/mcp-toolkit";
|
|
15
|
+
import { formatResult, mutating, readOnly } from "@getimo/mcp-toolkit";
|
|
16
16
|
import { createPlatform, } from "../../platform/index.js";
|
|
17
17
|
import { createPlatformClient } from "./client.js";
|
|
18
18
|
// ── Real probe (used in production) ──────────────────────────────────────
|
|
@@ -85,7 +85,16 @@ export function registerUseProfileTool(server, deps) {
|
|
|
85
85
|
.default(false)
|
|
86
86
|
.describe("Skip the live /identity probe. Use for offline activation when the site is unreachable."),
|
|
87
87
|
},
|
|
88
|
-
|
|
88
|
+
// A6-P2 (W1.26 follow-up): handler writes ProfileStore state
|
|
89
|
+
// (`store.setActive` + `store.update(lastVerifiedIdentity)`), so the
|
|
90
|
+
// tool is NOT read-only per MCP spec ("readOnlyHint: does not modify
|
|
91
|
+
// its environment"). `mutating()` correctly carries
|
|
92
|
+
// `idempotentHint: true` — re-activating the same profile is a no-op
|
|
93
|
+
// beyond refreshing the verified-identity timestamp.
|
|
94
|
+
// W1.26.b: closed-world — effects are bounded to the local profile
|
|
95
|
+
// registry; identity probe is an internal Bearer + /identity call,
|
|
96
|
+
// not a third-party service mutation.
|
|
97
|
+
annotations: mutating({ title: "Switch Active Profile", openWorld: false }),
|
|
89
98
|
}, async (args) => {
|
|
90
99
|
const { name, noProbe = false } = args;
|
|
91
100
|
// ── 1. Profile lookup ────────────────────────────────────────────
|
|
@@ -177,4 +186,49 @@ export function registerUseProfileTool(server, deps) {
|
|
|
177
186
|
return formatResult(payload, false, { maxChars: 3000 });
|
|
178
187
|
});
|
|
179
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Register the `apimapper_list_profiles` tool. Read-only — returns the
|
|
191
|
+
* configured profile registry with an `is_active` flag derived from the
|
|
192
|
+
* ProfileStore active pointer.
|
|
193
|
+
*
|
|
194
|
+
* Closes the broken xref in `apimapper_use_profile`'s "profile not found"
|
|
195
|
+
* hint, which previously pointed AI clients at this tool when it did not
|
|
196
|
+
* yet exist.
|
|
197
|
+
*/
|
|
198
|
+
export function registerListProfilesTool(server, deps) {
|
|
199
|
+
const registrar = server;
|
|
200
|
+
registrar.registerTool("apimapper_list_profiles", {
|
|
201
|
+
title: "List Configured Profiles",
|
|
202
|
+
description: "List all configured site profiles (name, siteUrl, platform) with an " +
|
|
203
|
+
"is_active flag indicating which one is currently active. " +
|
|
204
|
+
"Use this to discover available profile names before calling " +
|
|
205
|
+
"apimapper_use_profile to switch the active profile. " +
|
|
206
|
+
"Read-only — does not contact any site." +
|
|
207
|
+
"\n\nResponse shape:\n" +
|
|
208
|
+
" { profile_count, active_profile, profiles: [{ name, siteUrl, platform, is_active, lastVerifiedAt? }] }",
|
|
209
|
+
inputSchema: {},
|
|
210
|
+
annotations: readOnly({ title: "List Configured Profiles", openWorld: false }),
|
|
211
|
+
}, async () => {
|
|
212
|
+
const all = await deps.store.list();
|
|
213
|
+
const active = await deps.store.getActive();
|
|
214
|
+
const activeName = active?.name ?? null;
|
|
215
|
+
const profiles = all.map((p) => {
|
|
216
|
+
const entry = {
|
|
217
|
+
name: p.name,
|
|
218
|
+
siteUrl: p.siteUrl,
|
|
219
|
+
platform: p.platform,
|
|
220
|
+
is_active: p.name === activeName,
|
|
221
|
+
};
|
|
222
|
+
if (p.lastVerifiedIdentity) {
|
|
223
|
+
entry.lastVerifiedAt = "set";
|
|
224
|
+
}
|
|
225
|
+
return entry;
|
|
226
|
+
});
|
|
227
|
+
return formatResult({
|
|
228
|
+
profile_count: profiles.length,
|
|
229
|
+
active_profile: activeName,
|
|
230
|
+
profiles,
|
|
231
|
+
}, false, { maxChars: 3000 });
|
|
232
|
+
});
|
|
233
|
+
}
|
|
180
234
|
//# sourceMappingURL=use-profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-profile.js","sourceRoot":"","sources":["../../../src/modules/apimapper/use-profile.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,iEAAiE;AACjE,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,wEAAwE;AACxE,6EAA6E;AAC7E,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAG7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"use-profile.js","sourceRoot":"","sources":["../../../src/modules/apimapper/use-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** How a tool's request body relates to the PHP route. */
|
|
2
|
+
export type ToolBodyKind = "structured" | "envelope";
|
|
3
|
+
/** One body-sending tool's route binding. */
|
|
4
|
+
export interface ToolWireBinding {
|
|
5
|
+
/** HTTP method + normalised path, e.g. "POST /connections". Joins the manifest. */
|
|
6
|
+
route: string;
|
|
7
|
+
/** The literal wire body keys the tool sends (envelope tools list their wrapper key). */
|
|
8
|
+
bodyKeys: readonly string[];
|
|
9
|
+
kind: ToolBodyKind;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Curated bridge: body-sending tool → route + wire body keys.
|
|
13
|
+
*
|
|
14
|
+
* ONLY tools that send a request body appear here. Read-only (GET) tools and
|
|
15
|
+
* path/query-only tools carry no body-drift surface and are listed in the
|
|
16
|
+
* manifest's `_local_tools` (when they hit no route at all) or are simply
|
|
17
|
+
* absent (when they hit a GET route — GET routes never drift on body keys).
|
|
18
|
+
*
|
|
19
|
+
* `envelope` tools forward a free-form record (`patch` / `pipeline` / a settings
|
|
20
|
+
* map) whose individual keys are validated on the PHP side (e.g.
|
|
21
|
+
* ConnectionAdminController::ALLOWED_PATCH_KEYS). Their wrapper key is recorded
|
|
22
|
+
* so the test confirms the tool is accounted for; per-key validation lives in
|
|
23
|
+
* the PHP layer and is covered by PHP-side tests.
|
|
24
|
+
*/
|
|
25
|
+
export declare const TOOL_WIRE_MAP: Readonly<Record<string, ToolWireBinding>>;
|
|
26
|
+
/** The PHP-accepted-params manifest fixture shape. */
|
|
27
|
+
export interface PhpAcceptedManifest {
|
|
28
|
+
/** "<METHOD> <path>" → accepted request-body keys. */
|
|
29
|
+
routes: Record<string, string[]>;
|
|
30
|
+
/** tool → { wire-key → justification } for keys the PHP route does not read. */
|
|
31
|
+
_allowed_drift: Record<string, Record<string, string>>;
|
|
32
|
+
/** tool → reason: tools with no REST route (purely client-side / aggregate). */
|
|
33
|
+
_local_tools: Record<string, string>;
|
|
34
|
+
/** route → { php-key → reason } for keys PHP accepts that no tool sends. */
|
|
35
|
+
_inverse_ignore?: Record<string, Record<string, string>>;
|
|
36
|
+
_meta?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
/** A single forward-direction drift: a wire key the PHP route does not accept. */
|
|
39
|
+
export interface DriftFinding {
|
|
40
|
+
tool: string;
|
|
41
|
+
route: string;
|
|
42
|
+
key: string;
|
|
43
|
+
}
|
|
44
|
+
/** A single inverse-direction advisory: a PHP-accepted key no tool sends. */
|
|
45
|
+
export interface InverseFinding {
|
|
46
|
+
route: string;
|
|
47
|
+
key: string;
|
|
48
|
+
}
|
|
49
|
+
export interface DriftReport {
|
|
50
|
+
/** Dangerous direction: tool sends a key PHP neither accepts nor allow-lists. */
|
|
51
|
+
drift: DriftFinding[];
|
|
52
|
+
/** Advisory: PHP accepts a key no tool sends (minus `_inverse_ignore`). */
|
|
53
|
+
inverse: InverseFinding[];
|
|
54
|
+
/** Live tools missing from BOTH TOOL_WIRE_MAP and `_local_tools` (coverage gap). */
|
|
55
|
+
uncovered: string[];
|
|
56
|
+
/** Entries in TOOL_WIRE_MAP / `_local_tools` no longer present in the live surface. */
|
|
57
|
+
stale: string[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the committed fixture path. From this module
|
|
61
|
+
* (`<pkg>/{src,dist}/modules/apimapper/whitelist-drift.{ts,js}`) the package
|
|
62
|
+
* root is three directories up; the fixture is `tests/fixtures/...` under it.
|
|
63
|
+
* The depth is identical for the source layout (vitest/tsx) and the built
|
|
64
|
+
* `dist/` layout, so the same relative offset works in both.
|
|
65
|
+
*/
|
|
66
|
+
export declare function manifestPath(): string;
|
|
67
|
+
/** Load + validate the committed PHP-accepted-params manifest. */
|
|
68
|
+
export declare function loadManifest(path?: string): PhpAcceptedManifest;
|
|
69
|
+
/**
|
|
70
|
+
* Enumerate every registered MCP tool name. Mirrors the runtime tool surface:
|
|
71
|
+
* - module essentials forwarded to a real McpServer,
|
|
72
|
+
* - the gateway-captured advanced tools,
|
|
73
|
+
* - the profile / status tools registered in src/index.ts AFTER module load.
|
|
74
|
+
*
|
|
75
|
+
* The src/index.ts trio is appended explicitly: they are registered on the real
|
|
76
|
+
* server outside the module's register(), so a module-only enumeration would
|
|
77
|
+
* miss them. They are pure local/profile tools (no REST body) and live in
|
|
78
|
+
* `_local_tools`; listing them here keeps the coverage check honest.
|
|
79
|
+
*/
|
|
80
|
+
export declare function collectLiveTools(): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Compute the drift report from the live tool surface + the curated wire map +
|
|
83
|
+
* the PHP-accepted manifest. Pure — no I/O.
|
|
84
|
+
*/
|
|
85
|
+
export declare function computeDrift(liveTools: readonly string[], manifest: PhpAcceptedManifest): DriftReport;
|