apcore-mcp 0.13.0 → 0.15.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/LICENSE +190 -0
- package/README.md +246 -19
- package/dist/acl-builder.d.ts +43 -0
- package/dist/acl-builder.d.ts.map +1 -0
- package/dist/acl-builder.js +115 -0
- package/dist/acl-builder.js.map +1 -0
- package/dist/adapters/annotations.d.ts.map +1 -1
- package/dist/adapters/annotations.js +23 -2
- package/dist/adapters/annotations.js.map +1 -1
- package/dist/adapters/errors.d.ts +37 -0
- package/dist/adapters/errors.d.ts.map +1 -1
- package/dist/adapters/errors.js +213 -17
- package/dist/adapters/errors.js.map +1 -1
- package/dist/adapters/id-normalizer.d.ts +41 -0
- package/dist/adapters/id-normalizer.d.ts.map +1 -0
- package/dist/adapters/id-normalizer.js +56 -0
- package/dist/adapters/id-normalizer.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +2 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/{mcpErrorFormatter.d.ts → mcp-error-formatter.d.ts} +1 -1
- package/dist/adapters/mcp-error-formatter.d.ts.map +1 -0
- package/dist/adapters/{mcpErrorFormatter.js → mcp-error-formatter.js} +1 -1
- package/dist/adapters/mcp-error-formatter.js.map +1 -0
- package/dist/adapters/schema.d.ts +32 -4
- package/dist/adapters/schema.d.ts.map +1 -1
- package/dist/adapters/schema.js +190 -14
- package/dist/adapters/schema.js.map +1 -1
- package/dist/apcore-mcp.d.ts +25 -3
- package/dist/apcore-mcp.d.ts.map +1 -1
- package/dist/apcore-mcp.js +8 -0
- package/dist/apcore-mcp.js.map +1 -1
- package/dist/auth/hooks.d.ts +1 -1
- package/dist/auth/hooks.d.ts.map +1 -1
- package/dist/auth/hooks.js +10 -3
- package/dist/auth/hooks.js.map +1 -1
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/jwt.d.ts +1 -2
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +22 -11
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/types.d.ts +6 -3
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +37 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/converters/openai.d.ts +22 -0
- package/dist/converters/openai.d.ts.map +1 -1
- package/dist/converters/openai.js +128 -8
- package/dist/converters/openai.js.map +1 -1
- package/dist/index.d.ts +62 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +329 -108
- package/dist/index.js.map +1 -1
- package/dist/markdown.d.ts +54 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +125 -0
- package/dist/markdown.js.map +1 -0
- package/dist/middleware-builder.d.ts +41 -0
- package/dist/middleware-builder.d.ts.map +1 -0
- package/dist/middleware-builder.js +129 -0
- package/dist/middleware-builder.js.map +1 -0
- package/dist/server/async-task-bridge.d.ts +228 -0
- package/dist/server/async-task-bridge.d.ts.map +1 -0
- package/dist/server/async-task-bridge.js +579 -0
- package/dist/server/async-task-bridge.js.map +1 -0
- package/dist/server/context.d.ts +17 -2
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +29 -6
- package/dist/server/context.js.map +1 -1
- package/dist/server/factory.d.ts +57 -3
- package/dist/server/factory.d.ts.map +1 -1
- package/dist/server/factory.js +179 -9
- package/dist/server/factory.js.map +1 -1
- package/dist/server/listener.d.ts +3 -0
- package/dist/server/listener.d.ts.map +1 -1
- package/dist/server/listener.js +13 -2
- package/dist/server/listener.js.map +1 -1
- package/dist/server/observability.d.ts +51 -0
- package/dist/server/observability.d.ts.map +1 -0
- package/dist/server/observability.js +96 -0
- package/dist/server/observability.js.map +1 -0
- package/dist/server/router.d.ts +103 -3
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +289 -25
- package/dist/server/router.js.map +1 -1
- package/dist/server/trace-context.d.ts +40 -0
- package/dist/server/trace-context.d.ts.map +1 -0
- package/dist/server/trace-context.js +67 -0
- package/dist/server/trace-context.js.map +1 -0
- package/dist/server/transport.d.ts +47 -1
- package/dist/server/transport.d.ts.map +1 -1
- package/dist/server/transport.js +147 -4
- package/dist/server/transport.js.map +1 -1
- package/dist/types.d.ts +16 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/package.json +11 -8
- package/dist/adapters/idNormalizer.d.ts +0 -22
- package/dist/adapters/idNormalizer.d.ts.map +0 -1
- package/dist/adapters/idNormalizer.js +0 -30
- package/dist/adapters/idNormalizer.js.map +0 -1
- package/dist/adapters/mcpErrorFormatter.d.ts.map +0 -1
- package/dist/adapters/mcpErrorFormatter.js.map +0 -1
- package/dist/server/index.d.ts +0 -11
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -8
- package/dist/server/index.js.map +0 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build an apcore `ACL` instance from a Config Bus `mcp.acl` section.
|
|
3
|
+
*
|
|
4
|
+
* Config Bus schema (YAML, shared across Python/TS/Rust bridges):
|
|
5
|
+
*
|
|
6
|
+
* ```yaml
|
|
7
|
+
* mcp:
|
|
8
|
+
* acl:
|
|
9
|
+
* default_effect: deny # or "allow" — default "deny" (fail-secure)
|
|
10
|
+
* rules:
|
|
11
|
+
* - callers: ["role:admin"]
|
|
12
|
+
* targets: ["sys.*"]
|
|
13
|
+
* effect: allow
|
|
14
|
+
* description: "Admins can reach system modules"
|
|
15
|
+
* - callers: ["*"]
|
|
16
|
+
* targets: ["sys.reload", "sys.toggle"]
|
|
17
|
+
* effect: deny
|
|
18
|
+
* conditions:
|
|
19
|
+
* identity_types: ["human", "system"]
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Mirrors the Python `acl_builder.build_acl_from_config` contract. Invalid
|
|
23
|
+
* entries throw so misconfiguration fails loudly at startup.
|
|
24
|
+
*/
|
|
25
|
+
const ALLOWED_EFFECTS = new Set(["allow", "deny"]);
|
|
26
|
+
const ALLOWED_RULE_KEYS = new Set([
|
|
27
|
+
"callers",
|
|
28
|
+
"targets",
|
|
29
|
+
"effect",
|
|
30
|
+
"description",
|
|
31
|
+
"conditions",
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Construct an apcore `ACL` from a Config Bus `mcp.acl` mapping.
|
|
35
|
+
*
|
|
36
|
+
* Returns `null` when `aclConfig` is falsy (no ACL section configured).
|
|
37
|
+
* Throws on malformed entries.
|
|
38
|
+
*/
|
|
39
|
+
export async function buildAclFromConfig(aclConfig) {
|
|
40
|
+
if (aclConfig === null || aclConfig === undefined)
|
|
41
|
+
return null;
|
|
42
|
+
if (typeof aclConfig !== "object" || Array.isArray(aclConfig)) {
|
|
43
|
+
throw new Error(`mcp.acl must be a mapping with 'rules' and optional 'default_effect', ` +
|
|
44
|
+
`got ${Array.isArray(aclConfig) ? "array" : typeof aclConfig}`);
|
|
45
|
+
}
|
|
46
|
+
const cfg = aclConfig;
|
|
47
|
+
const rulesRaw = cfg.rules;
|
|
48
|
+
// Validate rules type up-front — even for empty configs — to keep errors
|
|
49
|
+
// visible at startup rather than silently returning null.
|
|
50
|
+
if (rulesRaw !== undefined && !Array.isArray(rulesRaw)) {
|
|
51
|
+
throw new Error(`mcp.acl.rules must be a list, got ${typeof rulesRaw}`);
|
|
52
|
+
}
|
|
53
|
+
const hasRules = Array.isArray(rulesRaw) && rulesRaw.length > 0;
|
|
54
|
+
const hasDefault = cfg.default_effect !== undefined;
|
|
55
|
+
if (!hasRules && !hasDefault) {
|
|
56
|
+
return null; // Empty config section — treat as no ACL
|
|
57
|
+
}
|
|
58
|
+
let apcore;
|
|
59
|
+
try {
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
apcore = (await import("apcore-js"));
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
throw new Error(`Config Bus 'mcp.acl' requires apcore-js>=0.18 with ACL support: ${err.message}`);
|
|
65
|
+
}
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
const ACL = (apcore.ACL ?? apcore.default?.ACL);
|
|
68
|
+
if (!ACL) {
|
|
69
|
+
throw new Error("apcore-js does not export ACL");
|
|
70
|
+
}
|
|
71
|
+
const defaultEffect = (cfg.default_effect ?? "deny");
|
|
72
|
+
if (!ALLOWED_EFFECTS.has(defaultEffect)) {
|
|
73
|
+
throw new Error(`mcp.acl.default_effect must be 'allow' or 'deny', got '${defaultEffect}'`);
|
|
74
|
+
}
|
|
75
|
+
const rawRules = (rulesRaw ?? []);
|
|
76
|
+
const rules = [];
|
|
77
|
+
for (let idx = 0; idx < rawRules.length; idx += 1) {
|
|
78
|
+
const entry = rawRules[idx];
|
|
79
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
80
|
+
throw new Error(`mcp.acl.rules[${idx}] must be an object, got ${Array.isArray(entry) ? "array" : typeof entry}`);
|
|
81
|
+
}
|
|
82
|
+
const rec = entry;
|
|
83
|
+
const extra = Object.keys(rec).filter((k) => !ALLOWED_RULE_KEYS.has(k));
|
|
84
|
+
if (extra.length) {
|
|
85
|
+
throw new Error(`mcp.acl.rules[${idx}] got unexpected keys: ${extra.sort().join(", ")}`);
|
|
86
|
+
}
|
|
87
|
+
const callers = rec.callers;
|
|
88
|
+
const targets = rec.targets;
|
|
89
|
+
const effect = rec.effect;
|
|
90
|
+
if (!Array.isArray(callers) || callers.length === 0) {
|
|
91
|
+
throw new Error(`mcp.acl.rules[${idx}] 'callers' must be a non-empty list`);
|
|
92
|
+
}
|
|
93
|
+
if (!Array.isArray(targets) || targets.length === 0) {
|
|
94
|
+
throw new Error(`mcp.acl.rules[${idx}] 'targets' must be a non-empty list`);
|
|
95
|
+
}
|
|
96
|
+
if (typeof effect !== "string" || !ALLOWED_EFFECTS.has(effect)) {
|
|
97
|
+
throw new Error(`mcp.acl.rules[${idx}] 'effect' must be 'allow' or 'deny', got '${effect}'`);
|
|
98
|
+
}
|
|
99
|
+
const rule = {
|
|
100
|
+
callers: [...callers],
|
|
101
|
+
targets: [...targets],
|
|
102
|
+
effect: effect,
|
|
103
|
+
description: typeof rec.description === "string" ? rec.description : "",
|
|
104
|
+
};
|
|
105
|
+
if (rec.conditions !== undefined && rec.conditions !== null) {
|
|
106
|
+
if (typeof rec.conditions !== "object" || Array.isArray(rec.conditions)) {
|
|
107
|
+
throw new Error(`mcp.acl.rules[${idx}] 'conditions' must be an object or null`);
|
|
108
|
+
}
|
|
109
|
+
rule.conditions = rec.conditions;
|
|
110
|
+
}
|
|
111
|
+
rules.push(rule);
|
|
112
|
+
}
|
|
113
|
+
return new ACL(rules, defaultEffect);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=acl-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acl-builder.js","sourceRoot":"","sources":["../src/acl-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/adapters/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/adapters/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAkBzE,qBAAa,gBAAgB;IAC3B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,GAAG,kBAAkB;IAoB3E;;;;;;OAMG;IACH,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,GAAG,MAAM;IAyFlE;;;;OAIG;IACH,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO;CAOpE"}
|
|
@@ -15,6 +15,10 @@ const DEFAULT_ANNOTATIONS = {
|
|
|
15
15
|
streaming: false,
|
|
16
16
|
cacheable: false,
|
|
17
17
|
paginated: false,
|
|
18
|
+
// [AM-2] Numeric/string defaults for cache_ttl and pagination_style.
|
|
19
|
+
// Spec: default values omitted from suffix.
|
|
20
|
+
cacheTtl: 0,
|
|
21
|
+
paginationStyle: "cursor",
|
|
18
22
|
};
|
|
19
23
|
export class AnnotationMapper {
|
|
20
24
|
/**
|
|
@@ -79,12 +83,29 @@ export class AnnotationMapper {
|
|
|
79
83
|
parts.push(`streaming=${annotations.streaming}`);
|
|
80
84
|
if ((annotations.cacheable ?? false) !== DEFAULT_ANNOTATIONS.cacheable)
|
|
81
85
|
parts.push(`cacheable=${annotations.cacheable}`);
|
|
86
|
+
// [AM-2] Skip cache_ttl when equal to default (0). Spec: "Default
|
|
87
|
+
// values omitted from suffix". Pre-fix TS emitted any non-null
|
|
88
|
+
// value including the default, diverging from Python+Rust.
|
|
89
|
+
if (annotations.cacheTtl !== undefined &&
|
|
90
|
+
annotations.cacheTtl !== null &&
|
|
91
|
+
annotations.cacheTtl !== DEFAULT_ANNOTATIONS.cacheTtl)
|
|
92
|
+
parts.push(`cache_ttl=${annotations.cacheTtl}`);
|
|
93
|
+
if (annotations.cacheKeyFields !== undefined &&
|
|
94
|
+
annotations.cacheKeyFields !== null &&
|
|
95
|
+
annotations.cacheKeyFields.length > 0)
|
|
96
|
+
parts.push(`cache_key_fields=[${annotations.cacheKeyFields.join(",")}]`);
|
|
82
97
|
if ((annotations.paginated ?? false) !== DEFAULT_ANNOTATIONS.paginated)
|
|
83
98
|
parts.push(`paginated=${annotations.paginated}`);
|
|
84
|
-
//
|
|
99
|
+
// [AM-2] Skip pagination_style when equal to default ("cursor").
|
|
100
|
+
if (annotations.paginationStyle !== undefined &&
|
|
101
|
+
annotations.paginationStyle !== null &&
|
|
102
|
+
annotations.paginationStyle !== DEFAULT_ANNOTATIONS.paginationStyle)
|
|
103
|
+
parts.push(`pagination_style=${annotations.paginationStyle}`);
|
|
104
|
+
// Append mcp_-prefixed extra fields (sorted alphabetically for deterministic output,
|
|
105
|
+
// matching Python+Rust sort behavior). [D11-022]
|
|
85
106
|
const extraLines = [];
|
|
86
107
|
if (annotations.extra && typeof annotations.extra === "object") {
|
|
87
|
-
for (const [key, value] of Object.entries(annotations.extra)) {
|
|
108
|
+
for (const [key, value] of Object.entries(annotations.extra).sort(([a], [b]) => a.localeCompare(b))) {
|
|
88
109
|
if (key.startsWith("mcp_") && typeof value === "string") {
|
|
89
110
|
const strippedKey = key.slice(4); // remove "mcp_" prefix
|
|
90
111
|
extraLines.push(`${strippedKey}: ${value}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/adapters/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,8EAA8E;AAC9E,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/adapters/annotations.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,23 @@
|
|
|
4
4
|
* Handles ModuleError instances with specific error codes, sanitizes
|
|
5
5
|
* internal error details, formats schema validation errors with
|
|
6
6
|
* field-level detail, and extracts AI guidance fields.
|
|
7
|
+
*
|
|
8
|
+
* Cross-language contract: apcore-js exposes concrete error classes
|
|
9
|
+
* (e.g. `TaskLimitExceededError`). We prefer `instanceof` dispatch when
|
|
10
|
+
* those classes are importable so structured fields flow through
|
|
11
|
+
* losslessly; we fall back to duck-typing (`error.code` inspection)
|
|
12
|
+
* when apcore-js is unavailable or the caller constructs a bare
|
|
13
|
+
* `ModuleError`.
|
|
7
14
|
*/
|
|
8
15
|
import type { McpErrorResponse } from "../types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Canonical GENERAL_INTERNAL_ERROR envelope for non-ModuleError fallback.
|
|
18
|
+
*
|
|
19
|
+
* All three SDKs (Python, TypeScript, Rust) emit byte-identical envelopes so
|
|
20
|
+
* MCP clients can branch on `errorType === "GENERAL_INTERNAL_ERROR"` portably.
|
|
21
|
+
* See `apcore-mcp/docs/features/error-mapper.md` (EM-6).
|
|
22
|
+
*/
|
|
23
|
+
export declare function internalErrorResponse(): McpErrorResponse;
|
|
9
24
|
export declare class ErrorMapper {
|
|
10
25
|
/**
|
|
11
26
|
* Convert an error to an MCP error response.
|
|
@@ -14,6 +29,28 @@ export declare class ErrorMapper {
|
|
|
14
29
|
* Applies sanitization and formatting rules based on the error code.
|
|
15
30
|
*/
|
|
16
31
|
toMcpError(error: unknown): McpErrorResponse;
|
|
32
|
+
/**
|
|
33
|
+
* Generic-error fallback for arbitrary inputs.
|
|
34
|
+
*
|
|
35
|
+
* Ports Rust's `to_mcp_error_any` downcast pattern: if the input is a
|
|
36
|
+
* `ModuleError` subclass, delegate to {@link toMcpError} so structured
|
|
37
|
+
* fields (code, details, AI guidance) survive. Otherwise — plain `Error`,
|
|
38
|
+
* unrelated subclass, or non-error object — return the canonical
|
|
39
|
+
* GENERAL_INTERNAL_ERROR envelope. The original class, message, stack,
|
|
40
|
+
* and details are deliberately discarded in that branch (security: avoid
|
|
41
|
+
* leaking server-side state). [D9-004]
|
|
42
|
+
*/
|
|
43
|
+
toMcpErrorAny(error: unknown): McpErrorResponse;
|
|
44
|
+
/**
|
|
45
|
+
* Preferred `instanceof` dispatch for concrete apcore-js error classes.
|
|
46
|
+
*
|
|
47
|
+
* When the cache hasn't been populated yet (first call before the lazy
|
|
48
|
+
* load settles), returns null and the caller falls back to duck-typing.
|
|
49
|
+
* Once the cache is warm, subsequent calls produce identical output
|
|
50
|
+
* whether the error was thrown as a concrete class or a duck-typed
|
|
51
|
+
* plain object — the duck-typed branch below handles the latter.
|
|
52
|
+
*/
|
|
53
|
+
private _matchApcoreErrorInstance;
|
|
17
54
|
/**
|
|
18
55
|
* Extract AI guidance fields from error and attach non-undefined values to result.
|
|
19
56
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/adapters/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/adapters/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAOxD;AA0DD,qBAAa,WAAW;IACtB;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB;IA+O5C;;;;;;;;;;OAUG;IACH,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAQ/C;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAyDjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;CA4B/B"}
|
package/dist/adapters/errors.js
CHANGED
|
@@ -4,8 +4,64 @@
|
|
|
4
4
|
* Handles ModuleError instances with specific error codes, sanitizes
|
|
5
5
|
* internal error details, formats schema validation errors with
|
|
6
6
|
* field-level detail, and extracts AI guidance fields.
|
|
7
|
+
*
|
|
8
|
+
* Cross-language contract: apcore-js exposes concrete error classes
|
|
9
|
+
* (e.g. `TaskLimitExceededError`). We prefer `instanceof` dispatch when
|
|
10
|
+
* those classes are importable so structured fields flow through
|
|
11
|
+
* losslessly; we fall back to duck-typing (`error.code` inspection)
|
|
12
|
+
* when apcore-js is unavailable or the caller constructs a bare
|
|
13
|
+
* `ModuleError`.
|
|
7
14
|
*/
|
|
8
15
|
import { ErrorCodes } from "../types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Canonical GENERAL_INTERNAL_ERROR envelope for non-ModuleError fallback.
|
|
18
|
+
*
|
|
19
|
+
* All three SDKs (Python, TypeScript, Rust) emit byte-identical envelopes so
|
|
20
|
+
* MCP clients can branch on `errorType === "GENERAL_INTERNAL_ERROR"` portably.
|
|
21
|
+
* See `apcore-mcp/docs/features/error-mapper.md` (EM-6).
|
|
22
|
+
*/
|
|
23
|
+
export function internalErrorResponse() {
|
|
24
|
+
return {
|
|
25
|
+
isError: true,
|
|
26
|
+
errorType: ErrorCodes.GENERAL_INTERNAL_ERROR,
|
|
27
|
+
message: "Internal error occurred",
|
|
28
|
+
details: null,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Lazy snapshot of apcore-js error classes used for `instanceof` dispatch.
|
|
33
|
+
* Populated on first use; falls back to duck-typing when apcore-js is
|
|
34
|
+
* unavailable. Cached across calls for perf.
|
|
35
|
+
*
|
|
36
|
+
* `ModuleError` is the documented base class for all structured apcore errors.
|
|
37
|
+
* `toMcpErrorAny` uses it as a downcast pivot, mirroring Rust's
|
|
38
|
+
* `to_mcp_error_any` which checks `err.downcast_ref::<ModuleError>()` before
|
|
39
|
+
* collapsing to the canonical envelope.
|
|
40
|
+
*/
|
|
41
|
+
let _apcoreErrorClasses = null;
|
|
42
|
+
async function _loadApcoreErrorClasses() {
|
|
43
|
+
if (_apcoreErrorClasses)
|
|
44
|
+
return _apcoreErrorClasses;
|
|
45
|
+
try {
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
const apcore = (await import("apcore-js"));
|
|
48
|
+
_apcoreErrorClasses = {
|
|
49
|
+
ModuleError: apcore.ModuleError,
|
|
50
|
+
TaskLimitExceededError: apcore.TaskLimitExceededError,
|
|
51
|
+
VersionConstraintError: apcore.VersionConstraintError,
|
|
52
|
+
DependencyNotFoundError: apcore.DependencyNotFoundError,
|
|
53
|
+
DependencyVersionMismatchError: apcore.DependencyVersionMismatchError,
|
|
54
|
+
loaded: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
_apcoreErrorClasses = { loaded: true };
|
|
59
|
+
}
|
|
60
|
+
return _apcoreErrorClasses;
|
|
61
|
+
}
|
|
62
|
+
// Kick off the load eagerly but don't await; toMcpError is sync and will
|
|
63
|
+
// observe the populated cache on subsequent invocations.
|
|
64
|
+
void _loadApcoreErrorClasses();
|
|
9
65
|
/** Internal error codes that should be sanitized to a generic message. */
|
|
10
66
|
const INTERNAL_ERROR_CODES = new Set([
|
|
11
67
|
ErrorCodes.CALL_DEPTH_EXCEEDED,
|
|
@@ -36,6 +92,13 @@ export class ErrorMapper {
|
|
|
36
92
|
retryable: true,
|
|
37
93
|
};
|
|
38
94
|
}
|
|
95
|
+
// Preferred: instanceof dispatch against apcore-js's concrete error
|
|
96
|
+
// classes so cross-language contracts stay tight. Falls back to the
|
|
97
|
+
// duck-typed code-based dispatch below when apcore-js was unavailable
|
|
98
|
+
// at load time.
|
|
99
|
+
const instanceMatch = this._matchApcoreErrorInstance(error);
|
|
100
|
+
if (instanceMatch)
|
|
101
|
+
return instanceMatch;
|
|
39
102
|
// Duck-type check for ModuleError-like objects
|
|
40
103
|
if (this._isModuleError(error)) {
|
|
41
104
|
const code = error.code;
|
|
@@ -70,17 +133,15 @@ export class ErrorMapper {
|
|
|
70
133
|
this._attachAiGuidance(error, result);
|
|
71
134
|
return result;
|
|
72
135
|
}
|
|
73
|
-
// Approval pending -> narrow details to approvalId only
|
|
74
|
-
//
|
|
75
|
-
//
|
|
136
|
+
// Approval pending -> narrow details to approvalId only.
|
|
137
|
+
// [D10-003] Cross-language parity: upstream apcore SDKs emit
|
|
138
|
+
// snake_case (`approval_id`) exclusively, so the previous dual-key
|
|
139
|
+
// branch for camelCase `approvalId` was dormant and diverged from
|
|
140
|
+
// Python/Rust contracts (which accept snake_case only). Drop the
|
|
141
|
+
// camelCase source key; the output stays camelCase per MCP convention.
|
|
76
142
|
if (code === ErrorCodes.APPROVAL_PENDING) {
|
|
77
|
-
const
|
|
78
|
-
?
|
|
79
|
-
: details && "approval_id" in details
|
|
80
|
-
? "approval_id"
|
|
81
|
-
: null;
|
|
82
|
-
const narrowed = idKey
|
|
83
|
-
? { approvalId: details[idKey] }
|
|
143
|
+
const narrowed = details && "approval_id" in details
|
|
144
|
+
? { approvalId: details["approval_id"] }
|
|
84
145
|
: null;
|
|
85
146
|
const result = {
|
|
86
147
|
isError: true,
|
|
@@ -161,6 +222,67 @@ export class ErrorMapper {
|
|
|
161
222
|
this._attachAiGuidance(error, result);
|
|
162
223
|
return result;
|
|
163
224
|
}
|
|
225
|
+
// Dependency resolution errors (apcore 0.19) -> pass through with user-fixable hint
|
|
226
|
+
if (code === ErrorCodes.DEPENDENCY_NOT_FOUND ||
|
|
227
|
+
code === ErrorCodes.DEPENDENCY_VERSION_MISMATCH) {
|
|
228
|
+
const result = {
|
|
229
|
+
isError: true,
|
|
230
|
+
errorType: code,
|
|
231
|
+
message: error.message,
|
|
232
|
+
details,
|
|
233
|
+
userFixable: true,
|
|
234
|
+
};
|
|
235
|
+
this._attachAiGuidance(error, result);
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
// Task limit exceeded -> retryable
|
|
239
|
+
if (code === ErrorCodes.TASK_LIMIT_EXCEEDED) {
|
|
240
|
+
const result = {
|
|
241
|
+
isError: true,
|
|
242
|
+
errorType: code,
|
|
243
|
+
message: error.message,
|
|
244
|
+
details,
|
|
245
|
+
retryable: true,
|
|
246
|
+
};
|
|
247
|
+
this._attachAiGuidance(error, result);
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
// apcore 0.20.0 sync alignment A-001: CircuitBreakerOpenError ->
|
|
251
|
+
// retryable=true with the per-module recovery hint already attached
|
|
252
|
+
// by apcore-js's error class (mirrored via _attachAiGuidance).
|
|
253
|
+
if (code === ErrorCodes.CIRCUIT_BREAKER_OPEN) {
|
|
254
|
+
const result = {
|
|
255
|
+
isError: true,
|
|
256
|
+
errorType: code,
|
|
257
|
+
message: error.message,
|
|
258
|
+
details,
|
|
259
|
+
retryable: true,
|
|
260
|
+
};
|
|
261
|
+
this._attachAiGuidance(error, result);
|
|
262
|
+
if (!result.aiGuidance) {
|
|
263
|
+
result.aiGuidance =
|
|
264
|
+
"Module's circuit breaker is OPEN — repeated failures have tripped " +
|
|
265
|
+
"the breaker. Wait until the recovery window elapses, then retry; " +
|
|
266
|
+
"the breaker will move to HALF_OPEN and accept a trial call.";
|
|
267
|
+
}
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
// Binding / version-constraint validation errors (apcore 0.19) -> pass through
|
|
271
|
+
if (code === ErrorCodes.VERSION_CONSTRAINT_INVALID ||
|
|
272
|
+
code === ErrorCodes.BINDING_SCHEMA_INFERENCE_FAILED ||
|
|
273
|
+
code === ErrorCodes.BINDING_SCHEMA_MODE_CONFLICT ||
|
|
274
|
+
code === ErrorCodes.BINDING_STRICT_SCHEMA_INCOMPATIBLE ||
|
|
275
|
+
code === ErrorCodes.BINDING_POLICY_VIOLATION) {
|
|
276
|
+
const result = {
|
|
277
|
+
isError: true,
|
|
278
|
+
errorType: code,
|
|
279
|
+
message: error.message,
|
|
280
|
+
details,
|
|
281
|
+
userFixable: true,
|
|
282
|
+
};
|
|
283
|
+
this._attachAiGuidance(error, result);
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
164
286
|
// Other known ModuleError codes -> pass through
|
|
165
287
|
const result = {
|
|
166
288
|
isError: true,
|
|
@@ -171,13 +293,87 @@ export class ErrorMapper {
|
|
|
171
293
|
this._attachAiGuidance(error, result);
|
|
172
294
|
return result;
|
|
173
295
|
}
|
|
174
|
-
// Unknown/unexpected exceptions ->
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
296
|
+
// Unknown/unexpected exceptions -> canonical GENERAL_INTERNAL_ERROR envelope (EM-6).
|
|
297
|
+
// Mirrors Python `internal_error_response()` and Rust `to_mcp_error_any()`.
|
|
298
|
+
return internalErrorResponse();
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Generic-error fallback for arbitrary inputs.
|
|
302
|
+
*
|
|
303
|
+
* Ports Rust's `to_mcp_error_any` downcast pattern: if the input is a
|
|
304
|
+
* `ModuleError` subclass, delegate to {@link toMcpError} so structured
|
|
305
|
+
* fields (code, details, AI guidance) survive. Otherwise — plain `Error`,
|
|
306
|
+
* unrelated subclass, or non-error object — return the canonical
|
|
307
|
+
* GENERAL_INTERNAL_ERROR envelope. The original class, message, stack,
|
|
308
|
+
* and details are deliberately discarded in that branch (security: avoid
|
|
309
|
+
* leaking server-side state). [D9-004]
|
|
310
|
+
*/
|
|
311
|
+
toMcpErrorAny(error) {
|
|
312
|
+
const ModuleError = _apcoreErrorClasses?.ModuleError;
|
|
313
|
+
if (ModuleError && error instanceof ModuleError) {
|
|
314
|
+
return this.toMcpError(error);
|
|
315
|
+
}
|
|
316
|
+
return internalErrorResponse();
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Preferred `instanceof` dispatch for concrete apcore-js error classes.
|
|
320
|
+
*
|
|
321
|
+
* When the cache hasn't been populated yet (first call before the lazy
|
|
322
|
+
* load settles), returns null and the caller falls back to duck-typing.
|
|
323
|
+
* Once the cache is warm, subsequent calls produce identical output
|
|
324
|
+
* whether the error was thrown as a concrete class or a duck-typed
|
|
325
|
+
* plain object — the duck-typed branch below handles the latter.
|
|
326
|
+
*/
|
|
327
|
+
_matchApcoreErrorInstance(error) {
|
|
328
|
+
if (!(error instanceof Error) || !_apcoreErrorClasses?.loaded)
|
|
329
|
+
return null;
|
|
330
|
+
const classes = _apcoreErrorClasses;
|
|
331
|
+
const asModErr = error;
|
|
332
|
+
if (classes.TaskLimitExceededError && error instanceof classes.TaskLimitExceededError) {
|
|
333
|
+
const result = {
|
|
334
|
+
isError: true,
|
|
335
|
+
errorType: ErrorCodes.TASK_LIMIT_EXCEEDED,
|
|
336
|
+
message: error.message,
|
|
337
|
+
details: asModErr.details ?? null,
|
|
338
|
+
retryable: true,
|
|
339
|
+
};
|
|
340
|
+
this._attachAiGuidance(error, result);
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
if (classes.DependencyNotFoundError && error instanceof classes.DependencyNotFoundError) {
|
|
344
|
+
const result = {
|
|
345
|
+
isError: true,
|
|
346
|
+
errorType: ErrorCodes.DEPENDENCY_NOT_FOUND,
|
|
347
|
+
message: error.message,
|
|
348
|
+
details: asModErr.details ?? null,
|
|
349
|
+
userFixable: true,
|
|
350
|
+
};
|
|
351
|
+
this._attachAiGuidance(error, result);
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
if (classes.DependencyVersionMismatchError && error instanceof classes.DependencyVersionMismatchError) {
|
|
355
|
+
const result = {
|
|
356
|
+
isError: true,
|
|
357
|
+
errorType: ErrorCodes.DEPENDENCY_VERSION_MISMATCH,
|
|
358
|
+
message: error.message,
|
|
359
|
+
details: asModErr.details ?? null,
|
|
360
|
+
userFixable: true,
|
|
361
|
+
};
|
|
362
|
+
this._attachAiGuidance(error, result);
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
if (classes.VersionConstraintError && error instanceof classes.VersionConstraintError) {
|
|
366
|
+
const result = {
|
|
367
|
+
isError: true,
|
|
368
|
+
errorType: ErrorCodes.VERSION_CONSTRAINT_INVALID,
|
|
369
|
+
message: error.message,
|
|
370
|
+
details: asModErr.details ?? null,
|
|
371
|
+
userFixable: true,
|
|
372
|
+
};
|
|
373
|
+
this._attachAiGuidance(error, result);
|
|
374
|
+
return result;
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
181
377
|
}
|
|
182
378
|
/**
|
|
183
379
|
* Extract AI guidance fields from error and attach non-undefined values to result.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/adapters/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,0EAA0E;AAC1E,MAAM,oBAAoB,GAAgB,IAAI,GAAG,CAAC;IAChD,UAAU,CAAC,mBAAmB;IAC9B,UAAU,CAAC,aAAa;IACxB,UAAU,CAAC,uBAAuB;CACnC,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAU,CAAC;AAE9F,MAAM,OAAO,WAAW;IACtB;;;;;OAKG;IACH,UAAU,CAAC,KAAc;QACvB,6EAA6E;QAC7E,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,UAAU,CAAC,mBAAmB;gBACzC,OAAO,EAAE,yBAAyB;gBAClC,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAE9B,0CAA0C;YAC1C,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,yBAAyB;oBAClC,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,wCAAwC;YACxC,IAAI,IAAI,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,UAAU,CAAC,UAAU;oBAChC,OAAO,EAAE,eAAe;oBACxB,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,gEAAgE;YAChE,IAAI,IAAI,KAAK,UAAU,CAAC,uBAAuB,EAAE,CAAC;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBACrD,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,UAAU,CAAC,uBAAuB;oBAC7C,OAAO;oBACP,OAAO;iBACR,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,wDAAwD;YACxD,8EAA8E;YAC9E,wDAAwD;YACxD,IAAI,IAAI,KAAK,UAAU,CAAC,gBAAgB,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,OAAO,IAAI,YAAY,IAAI,OAAO;oBAC9C,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,OAAO,IAAI,aAAa,IAAI,OAAO;wBACnC,CAAC,CAAC,aAAa;wBACf,CAAC,CAAC,IAAI,CAAC;gBACX,MAAM,QAAQ,GAAG,KAAK;oBACpB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAQ,CAAC,KAAK,CAAC,EAAE;oBACjC,CAAC,CAAC,IAAI,CAAC;gBACT,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,QAAQ;iBAClB,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,wCAAwC;YACxC,IAAI,IAAI,KAAK,UAAU,CAAC,gBAAgB,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO;oBACP,SAAS,EAAE,IAAI;iBAChB,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,iDAAiD;YACjD,IAAI,IAAI,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,OAAO,CAAC,MAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5E,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO;iBACvC,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,4DAA4D;YAC5D,IAAI,IAAI,KAAK,UAAU,CAAC,uBAAuB,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC;gBAC7C,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,4BAA4B,MAAM,CAAC,MAAM,CAAC,EAAE;oBACrD,OAAO;iBACR,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,gDAAgD;YAChD,IAAI,IAAI,KAAK,UAAU,CAAC,cAAc,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;gBACxC,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,6BAA6B,MAAM,CAAC,IAAI,CAAC,EAAE;oBACpD,OAAO;iBACR,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,sCAAsC;YACtC,IAAI,IAAI,KAAK,UAAU,CAAC,cAAc,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,4BAA4B,KAAK,CAAC,OAAO,EAAE;oBACpD,OAAO;iBACR,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,4CAA4C;YAC5C,IAAI,IAAI,KAAK,UAAU,CAAC,oBAAoB,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE;oBACjD,OAAO;iBACR,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,gDAAgD;YAChD,MAAM,MAAM,GAAqB;gBAC/B,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO;aACR,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,iDAAiD;QACjD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,UAAU,CAAC,cAAc;YACpC,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,KAA8B,EAC9B,MAAwB;QAExB,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;YACxC,MAAM,KAAK,GAAI,KAAiC,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzE,8DAA8D;gBAC7D,MAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,KAAc;QAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC9D,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,IAAI,GAAG,CAAC,WAAW,EAAE,IAAI,KAAK,yBAAyB;YAAE,OAAO,IAAI,CAAC;QACrE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACK,cAAc,CACpB,KAAc;QAEd,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,OAAO,CACL,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ;YAC/B,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ;YAClC,SAAS,IAAI,GAAG,CACjB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAC5B,OAAuC;QAEvC,MAAM,WAAW,GAAG,0BAA0B,CAAC;QAE/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM;aACvB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACX,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,GAA8B,CAAC;gBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;gBAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC;gBACvD,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,CAAC;YACD,OAAO,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,GAAG,WAAW,MAAM,WAAW,EAAE,CAAC;IAC3C,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/adapters/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModuleIDNormalizer - Converts between apcore module IDs and OpenAI tool names.
|
|
3
|
+
*
|
|
4
|
+
* apcore uses dot-separated module IDs (e.g. "myorg.tools.search").
|
|
5
|
+
*
|
|
6
|
+
* [MID-6] MCP tool names accept dots and hyphens (and dot-notation is the
|
|
7
|
+
* apcore convention), so this normalizer is intended ONLY for the OpenAI
|
|
8
|
+
* function-calling format, which restricts function names to `[a-zA-Z0-9_-]`.
|
|
9
|
+
* Pre-fix doc here claimed "MCP tool names use hyphens" — that is incorrect
|
|
10
|
+
* and contradicts the spec at `docs/features/openai-converter.md`. This
|
|
11
|
+
* normalizer must NOT be applied on the MCP path.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ModuleIDNormalizer {
|
|
14
|
+
/**
|
|
15
|
+
* Normalize an apcore module ID to an MCP-compatible tool name.
|
|
16
|
+
*
|
|
17
|
+
* Validates the module ID against MODULE_ID_PATTERN before converting.
|
|
18
|
+
* Replaces dots (`.`) with hyphens (`-`).
|
|
19
|
+
*/
|
|
20
|
+
normalize(moduleId: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Denormalize an MCP tool name back to an apcore module ID.
|
|
23
|
+
*
|
|
24
|
+
* Replaces hyphens (`-`) with dots (`.`).
|
|
25
|
+
*/
|
|
26
|
+
denormalize(toolName: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Bijection-guarded variant of denormalize. [MID-5]
|
|
29
|
+
*
|
|
30
|
+
* Returns the denormalized module ID if `toolName` is a valid pre-image of
|
|
31
|
+
* `normalize()` (i.e. the dash→dot replacement yields a string matching
|
|
32
|
+
* MODULE_ID_PATTERN). Returns `null` for inputs that could not have been
|
|
33
|
+
* produced by `normalize()`.
|
|
34
|
+
*
|
|
35
|
+
* Cross-language parity [D11-3]: validates the denormalized result against
|
|
36
|
+
* the shared MODULE_ID_PATTERN so underscores within segments (e.g.
|
|
37
|
+
* `"my_mod-v2"` → `"my_mod.v2"`) round-trip identically to Python/Rust.
|
|
38
|
+
*/
|
|
39
|
+
tryDenormalize(toolName: string): string | null;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=id-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-normalizer.d.ts","sourceRoot":"","sources":["../../src/adapters/id-normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,qBAAa,kBAAkB;IAC7B;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IASnC;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIrC;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAMhD"}
|