apcore-toolkit 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +185 -0
  3. package/README.md +91 -39
  4. package/dist/ai-enhancer.d.ts +18 -1
  5. package/dist/ai-enhancer.d.ts.map +1 -1
  6. package/dist/ai-enhancer.js +100 -23
  7. package/dist/ai-enhancer.js.map +1 -1
  8. package/dist/binding-loader.d.ts +55 -0
  9. package/dist/binding-loader.d.ts.map +1 -0
  10. package/dist/binding-loader.js +175 -0
  11. package/dist/binding-loader.js.map +1 -0
  12. package/dist/binding-parser.d.ts +80 -0
  13. package/dist/binding-parser.d.ts.map +1 -0
  14. package/dist/binding-parser.js +257 -0
  15. package/dist/binding-parser.js.map +1 -0
  16. package/dist/browser/index.d.ts +17 -0
  17. package/dist/browser/index.d.ts.map +1 -0
  18. package/dist/browser/index.js +46 -0
  19. package/dist/browser/index.js.map +1 -0
  20. package/dist/{display-resolver.d.ts → display/resolver.d.ts} +14 -2
  21. package/dist/display/resolver.d.ts.map +1 -0
  22. package/dist/{display-resolver.js → display/resolver.js} +79 -25
  23. package/dist/display/resolver.js.map +1 -0
  24. package/dist/formatting/markdown.d.ts.map +1 -1
  25. package/dist/formatting/markdown.js +25 -22
  26. package/dist/formatting/markdown.js.map +1 -1
  27. package/dist/http-verb-map.d.ts +79 -0
  28. package/dist/http-verb-map.d.ts.map +1 -0
  29. package/dist/http-verb-map.js +179 -0
  30. package/dist/http-verb-map.js.map +1 -0
  31. package/dist/index.d.ts +8 -5
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +12 -4
  34. package/dist/index.js.map +1 -1
  35. package/dist/openapi.d.ts.map +1 -1
  36. package/dist/openapi.js +37 -10
  37. package/dist/openapi.js.map +1 -1
  38. package/dist/output/base-writer.d.ts +17 -0
  39. package/dist/output/base-writer.d.ts.map +1 -0
  40. package/dist/output/base-writer.js +34 -0
  41. package/dist/output/base-writer.js.map +1 -0
  42. package/dist/output/errors.d.ts +7 -2
  43. package/dist/output/errors.d.ts.map +1 -1
  44. package/dist/output/errors.js +8 -3
  45. package/dist/output/errors.js.map +1 -1
  46. package/dist/output/factory.d.ts +13 -1
  47. package/dist/output/factory.d.ts.map +1 -1
  48. package/dist/output/factory.js +21 -2
  49. package/dist/output/factory.js.map +1 -1
  50. package/dist/output/http-proxy-writer.d.ts +82 -0
  51. package/dist/output/http-proxy-writer.d.ts.map +1 -0
  52. package/dist/output/http-proxy-writer.js +222 -0
  53. package/dist/output/http-proxy-writer.js.map +1 -0
  54. package/dist/output/index.d.ts +1 -1
  55. package/dist/output/index.d.ts.map +1 -1
  56. package/dist/output/index.js +1 -1
  57. package/dist/output/index.js.map +1 -1
  58. package/dist/output/registry-writer.d.ts +23 -5
  59. package/dist/output/registry-writer.d.ts.map +1 -1
  60. package/dist/output/registry-writer.js +52 -14
  61. package/dist/output/registry-writer.js.map +1 -1
  62. package/dist/output/types.d.ts +1 -0
  63. package/dist/output/types.d.ts.map +1 -1
  64. package/dist/output/types.js.map +1 -1
  65. package/dist/output/typescript-writer.d.ts +14 -6
  66. package/dist/output/typescript-writer.d.ts.map +1 -1
  67. package/dist/output/typescript-writer.js +100 -32
  68. package/dist/output/typescript-writer.js.map +1 -1
  69. package/dist/output/verifiers.d.ts +1 -9
  70. package/dist/output/verifiers.d.ts.map +1 -1
  71. package/dist/output/verifiers.js +92 -42
  72. package/dist/output/verifiers.js.map +1 -1
  73. package/dist/output/verify-core.d.ts +20 -0
  74. package/dist/output/verify-core.d.ts.map +1 -0
  75. package/dist/output/verify-core.js +59 -0
  76. package/dist/output/verify-core.js.map +1 -0
  77. package/dist/output/yaml-writer.d.ts +18 -6
  78. package/dist/output/yaml-writer.d.ts.map +1 -1
  79. package/dist/output/yaml-writer.js +99 -42
  80. package/dist/output/yaml-writer.js.map +1 -1
  81. package/dist/resolve-target.d.ts.map +1 -1
  82. package/dist/resolve-target.js +34 -5
  83. package/dist/resolve-target.js.map +1 -1
  84. package/dist/safe-keys.d.ts +2 -0
  85. package/dist/safe-keys.d.ts.map +1 -0
  86. package/dist/safe-keys.js +19 -0
  87. package/dist/safe-keys.js.map +1 -0
  88. package/dist/scanner.d.ts +22 -0
  89. package/dist/scanner.d.ts.map +1 -1
  90. package/dist/scanner.js +40 -16
  91. package/dist/scanner.js.map +1 -1
  92. package/dist/schema-utils.d.ts.map +1 -1
  93. package/dist/schema-utils.js +13 -2
  94. package/dist/schema-utils.js.map +1 -1
  95. package/dist/serializers.d.ts.map +1 -1
  96. package/dist/serializers.js +2 -0
  97. package/dist/serializers.js.map +1 -1
  98. package/dist/types.d.ts +16 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/dist/types.js +3 -0
  101. package/dist/types.js.map +1 -1
  102. package/package.json +10 -2
  103. package/dist/display-resolver.d.ts.map +0 -1
  104. package/dist/display-resolver.js.map +0 -1
  105. package/dist/flatten-params.d.ts +0 -16
  106. package/dist/flatten-params.d.ts.map +0 -1
  107. package/dist/flatten-params.js +0 -18
  108. package/dist/flatten-params.js.map +0 -1
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Runtime-neutral binding document parser.
3
+ *
4
+ * Contains the pure parsing logic shared by {@link BindingLoader} — it takes
5
+ * a pre-loaded `bindings` document (e.g. the result of `yaml.load()` or a
6
+ * JSON fetch response) and returns `ScannedModule[]`. No filesystem access.
7
+ *
8
+ * `BindingLoader` (in `binding-loader.ts`) extends {@link BindingParser} to
9
+ * add the `load(filePath)` entry point that reads from disk with `node:fs`.
10
+ * Consumers that only need in-memory parsing — browsers, edge runtimes,
11
+ * workers — import {@link BindingParser} or {@link parseBindingDocument}
12
+ * from here (or via `apcore-toolkit/browser`).
13
+ */
14
+ import { annotationsFromJSON } from 'apcore-js';
15
+ import { createScannedModule } from './types.js';
16
+ import { PROTO_DENY } from './safe-keys.js';
17
+ const SUPPORTED_SPEC_VERSIONS = new Set(['1.0']);
18
+ const LOOSE_REQUIRED = ['module_id', 'target'];
19
+ const STRICT_EXTRA = ['input_schema', 'output_schema'];
20
+ /** Thrown when a binding YAML entry cannot be parsed. */
21
+ export class BindingLoadError extends Error {
22
+ filePath;
23
+ moduleId;
24
+ missingFields;
25
+ reason;
26
+ constructor(params) {
27
+ const parts = [params.reason];
28
+ if (params.filePath)
29
+ parts.push(`file=${params.filePath}`);
30
+ if (params.moduleId)
31
+ parts.push(`module_id=${params.moduleId}`);
32
+ if (params.missingFields && params.missingFields.length > 0) {
33
+ parts.push(`missing=[${params.missingFields.join(', ')}]`);
34
+ }
35
+ super(parts.join(' | '));
36
+ this.name = 'BindingLoadError';
37
+ this.reason = params.reason;
38
+ this.filePath = params.filePath ?? null;
39
+ this.moduleId = params.moduleId ?? null;
40
+ this.missingFields = params.missingFields ?? [];
41
+ }
42
+ }
43
+ /**
44
+ * Parse a binding document (already-loaded data, no filesystem access) into
45
+ * `ScannedModule[]`.
46
+ *
47
+ * Equivalent to {@link BindingParser.loadData} but lets callers supply an
48
+ * explicit `filePath` string that will be embedded in any
49
+ * {@link BindingLoadError} thrown for malformed entries — useful when you
50
+ * know the document came from a specific file (e.g. a server endpoint
51
+ * identifies it by path). Pass `null` when no file context applies.
52
+ */
53
+ export function parseBindingDocument(raw, options, filePath = null) {
54
+ const strict = options?.strict ?? false;
55
+ if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {
56
+ throw new BindingLoadError({
57
+ reason: 'top-level binding document must be a mapping',
58
+ filePath,
59
+ });
60
+ }
61
+ const data = raw;
62
+ checkSpecVersion(data['spec_version'], filePath);
63
+ const bindings = data['bindings'];
64
+ if (!Array.isArray(bindings)) {
65
+ throw new BindingLoadError({
66
+ reason: "'bindings' key missing or not a list",
67
+ filePath,
68
+ });
69
+ }
70
+ return bindings.map((entry) => {
71
+ if (entry == null || typeof entry !== 'object' || Array.isArray(entry)) {
72
+ throw new BindingLoadError({
73
+ reason: 'binding entry must be a mapping',
74
+ filePath,
75
+ });
76
+ }
77
+ return parseEntry(entry, filePath, strict);
78
+ });
79
+ }
80
+ /**
81
+ * Runtime-neutral binding parser.
82
+ *
83
+ * Parses pre-loaded `bindings` data (e.g. from `yaml.load()`, `fetch()` +
84
+ * `JSON.parse()`, etc.) into `ScannedModule[]`. Does not touch the
85
+ * filesystem — safe for browsers, edge runtimes, and workers.
86
+ *
87
+ * For filesystem-based loading, use {@link BindingLoader} (subclass,
88
+ * Node-only) which adds the `load(filePath)` entry point.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { BindingParser } from 'apcore-toolkit/browser';
93
+ *
94
+ * const resp = await fetch('/api/bindings.yaml');
95
+ * const doc = yaml.load(await resp.text());
96
+ * const mods = new BindingParser().loadData(doc);
97
+ * ```
98
+ */
99
+ export class BindingParser {
100
+ /** Parse a pre-loaded binding dict (`{ bindings: [...] }`). */
101
+ loadData(data, options) {
102
+ return parseBindingDocument(data, options, null);
103
+ }
104
+ }
105
+ // ---------------------------------------------------------------------------
106
+ // Internal helpers — module-private parsing primitives.
107
+ // ---------------------------------------------------------------------------
108
+ function checkSpecVersion(specVersion, filePath) {
109
+ const where = filePath ?? '<inline>';
110
+ if (specVersion == null) {
111
+ console.warn(`BindingLoader: ${where} missing 'spec_version'; defaulting to '1.0'.`);
112
+ return;
113
+ }
114
+ if (typeof specVersion !== 'string' || !SUPPORTED_SPEC_VERSIONS.has(specVersion)) {
115
+ console.warn(`BindingLoader: ${where} has spec_version=${JSON.stringify(specVersion)} ` +
116
+ `newer than supported [${[...SUPPORTED_SPEC_VERSIONS].sort().join(', ')}]; proceeding best-effort.`);
117
+ }
118
+ }
119
+ function parseEntry(entry, filePath, strict) {
120
+ const required = strict
121
+ ? [...LOOSE_REQUIRED, ...STRICT_EXTRA]
122
+ : LOOSE_REQUIRED;
123
+ // A required field is "missing or invalid" when absent, null, or of the
124
+ // wrong type. Previously only null/absent was rejected, so
125
+ // ``module_id: 42`` or ``target: true`` silently coerced to
126
+ // ``String(42) = "42"`` downstream and corrupted the registered module.
127
+ // This now matches the Rust loader's strict behaviour.
128
+ const missing = required.filter((f) => isRequiredFieldInvalid(f, entry));
129
+ if (missing.length > 0) {
130
+ throw new BindingLoadError({
131
+ reason: 'missing or invalid required fields',
132
+ filePath,
133
+ moduleId: typeof entry['module_id'] === 'string' ? entry['module_id'] : null,
134
+ missingFields: missing,
135
+ });
136
+ }
137
+ const moduleId = String(entry['module_id']);
138
+ return createScannedModule({
139
+ moduleId,
140
+ description: entry['description'] ?? '',
141
+ inputSchema: asRecord(entry['input_schema'], 'input_schema', moduleId),
142
+ outputSchema: asRecord(entry['output_schema'], 'output_schema', moduleId),
143
+ tags: asStringArray(entry['tags']),
144
+ target: String(entry['target']),
145
+ version: entry['version'] ?? '1.0.0',
146
+ annotations: parseAnnotations(entry['annotations'], moduleId),
147
+ documentation: entry['documentation'] ?? null,
148
+ suggestedAlias: entry['suggested_alias'] ?? null,
149
+ examples: parseExamples(entry['examples'], moduleId),
150
+ metadata: asRecord(entry['metadata'], 'metadata', moduleId),
151
+ display: asRecordOrNull(entry['display'], 'display', moduleId),
152
+ warnings: asStringArray(entry['warnings']),
153
+ });
154
+ }
155
+ /**
156
+ * Return ``true`` when a required field is absent, null, or of the wrong
157
+ * type. Schema fields (``input_schema``, ``output_schema``) must be plain
158
+ * objects; other required fields (``module_id``, ``target``) must be
159
+ * non-empty strings.
160
+ */
161
+ function isRequiredFieldInvalid(field, entry) {
162
+ if (!(field in entry))
163
+ return true;
164
+ const value = entry[field];
165
+ if (value == null)
166
+ return true;
167
+ if (field === 'input_schema' || field === 'output_schema') {
168
+ return typeof value !== 'object' || Array.isArray(value);
169
+ }
170
+ // module_id, target — must be non-empty strings
171
+ return typeof value !== 'string' || value.length === 0;
172
+ }
173
+ /**
174
+ * Parse a field expected to be a mapping. When the value is present but is
175
+ * not a mapping (e.g. a string or array from user-edited YAML), emit a
176
+ * warning and fall back to an empty record so the malformed data does not
177
+ * silently persist through round-trip.
178
+ *
179
+ * Returned values are deep-cloned via ``structuredClone`` so later caller
180
+ * mutation of a ``ScannedModule.inputSchema/outputSchema/metadata`` cannot
181
+ * leak back into the parsed YAML source graph. Matches the Rust loader
182
+ * (``serde_json::Value.clone`` is deep) and the Python loader
183
+ * (``copy.deepcopy``).
184
+ */
185
+ function asRecord(value, fieldName, moduleId) {
186
+ if (value == null)
187
+ return {};
188
+ if (typeof value === 'object' && !Array.isArray(value)) {
189
+ const safe = {};
190
+ for (const [k, v] of Object.entries(value)) {
191
+ if (!PROTO_DENY.has(k))
192
+ safe[k] = v;
193
+ }
194
+ return structuredClone(safe);
195
+ }
196
+ console.warn(`BindingLoader: ${fieldName} for module ${moduleId} is not a dict (${typeof value}); using empty {}`);
197
+ return {};
198
+ }
199
+ /**
200
+ * Same as {@link asRecord}, but returns `null` for absent values
201
+ * (used for optional fields like `display`).
202
+ */
203
+ function asRecordOrNull(value, fieldName, moduleId) {
204
+ if (value == null)
205
+ return null;
206
+ if (typeof value === 'object' && !Array.isArray(value)) {
207
+ const src = value;
208
+ const filtered = {};
209
+ for (const [k, v] of Object.entries(src)) {
210
+ if (!PROTO_DENY.has(k))
211
+ filtered[k] = v;
212
+ }
213
+ return structuredClone(filtered);
214
+ }
215
+ console.warn(`BindingLoader: ${fieldName} for module ${moduleId} is not a dict (${typeof value}); treating as null`);
216
+ return null;
217
+ }
218
+ function asStringArray(value) {
219
+ if (!Array.isArray(value))
220
+ return [];
221
+ return value.filter((v) => typeof v === 'string');
222
+ }
223
+ function parseAnnotations(value, moduleId) {
224
+ if (value == null)
225
+ return null;
226
+ if (typeof value !== 'object' || Array.isArray(value)) {
227
+ console.warn(`BindingLoader: annotations for module ${moduleId} is not a dict; treating as null`);
228
+ return null;
229
+ }
230
+ try {
231
+ return annotationsFromJSON(value);
232
+ }
233
+ catch (exc) {
234
+ console.warn(`BindingLoader: failed to parse annotations for module ${moduleId}: ${exc.message}; treating as null`);
235
+ return null;
236
+ }
237
+ }
238
+ function parseExamples(value, moduleId) {
239
+ if (value == null)
240
+ return [];
241
+ if (!Array.isArray(value)) {
242
+ console.warn(`BindingLoader: examples for module ${moduleId} is not a list; ignoring`);
243
+ return [];
244
+ }
245
+ const result = [];
246
+ value.forEach((ex, i) => {
247
+ if (ex == null || typeof ex !== 'object' || Array.isArray(ex)) {
248
+ console.warn(`BindingLoader: examples[${i}] of module ${moduleId} is not a dict; ignoring`);
249
+ return;
250
+ }
251
+ // Deep clone so caller mutation of the returned ScannedModule's
252
+ // examples cannot leak back into the parsed YAML source graph.
253
+ result.push(structuredClone(ex));
254
+ });
255
+ return result;
256
+ }
257
+ //# sourceMappingURL=binding-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-parser.js","sourceRoot":"","sources":["../src/binding-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type { ScannedModule } from '../types.js';
2
+ export { createScannedModule, cloneModule } from '../types.js';
3
+ export { BaseScanner } from '../scanner.js';
4
+ export { SCANNER_VERB_MAP, hasPathParams, resolveHttpVerb, generateSuggestedAlias, extractPathParamNames, substitutePathParams, } from '../http-verb-map.js';
5
+ export { enrichSchemaDescriptions } from '../schema-utils.js';
6
+ export { resolveRef, resolveSchema, deepResolveRefs, extractInputSchema, extractOutputSchema, } from '../openapi.js';
7
+ export { annotationsToDict, moduleToDict, modulesToDicts, } from '../serializers.js';
8
+ export { toMarkdown } from '../formatting/index.js';
9
+ export { BindingParser, BindingLoadError, parseBindingDocument, } from '../binding-parser.js';
10
+ export type { BindingLoadOptions } from '../binding-parser.js';
11
+ export type { WriteResult, VerifyResult, Verifier } from '../output/types.js';
12
+ export { createWriteResult } from '../output/types.js';
13
+ export { WriteError, InvalidFormatError } from '../output/errors.js';
14
+ export { RegistryVerifier, runVerifierChain } from '../output/verify-core.js';
15
+ export { HTTPProxyRegistryWriter, HTTPProxyWriterError, } from '../output/http-proxy-writer.js';
16
+ export type { HTTPProxyRegistryWriterOptions, ProxyRegistry, } from '../output/http-proxy-writer.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAkBA,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOpD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK/D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAMrE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAO9E,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,8BAA8B,EAC9B,aAAa,GACd,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,46 @@
1
+ // Browser-safe subset of apcore-toolkit.
2
+ //
3
+ // This entry point exposes only the symbols whose module load and runtime
4
+ // behavior do not depend on any Node.js built-in (`node:fs`, `node:path`,
5
+ // `node:module`, `process.*`). It is intended for consumers that bundle
6
+ // apcore-toolkit into a browser, edge runtime, or worker environment —
7
+ // e.g. tiptap-apcore.
8
+ //
9
+ // The default entry point (`apcore-toolkit`) continues to re-export the full
10
+ // Node-capable surface (file writers / readers, binding loader, display
11
+ // resolver, file verifiers, AI enhancer, VERSION) for tri-SDK parity with
12
+ // the Python and Rust toolkits. Do not add Node-only symbols here without
13
+ // an environment guard; doing so defeats the purpose of this subpath. A
14
+ // static check in `tests/browser-entry.test.ts` walks the transitive
15
+ // import graph from this file and fails if any Node-only reference leaks
16
+ // in.
17
+ export { createScannedModule, cloneModule } from '../types.js';
18
+ export { BaseScanner } from '../scanner.js';
19
+ // ---- HTTP verb mapping (pure) --------------------------------------------
20
+ export { SCANNER_VERB_MAP, hasPathParams, resolveHttpVerb, generateSuggestedAlias, extractPathParamNames, substitutePathParams, } from '../http-verb-map.js';
21
+ // ---- Schema / OpenAPI utilities (pure) -----------------------------------
22
+ export { enrichSchemaDescriptions } from '../schema-utils.js';
23
+ export { resolveRef, resolveSchema, deepResolveRefs, extractInputSchema, extractOutputSchema, } from '../openapi.js';
24
+ // ---- Serializers & formatting (pure) -------------------------------------
25
+ export { annotationsToDict, moduleToDict, modulesToDicts, } from '../serializers.js';
26
+ export { toMarkdown } from '../formatting/index.js';
27
+ // ---- Binding parsing (runtime-neutral half of BindingLoader) -------------
28
+ // `BindingLoader` itself stays Node-only (reads from disk). `BindingParser`
29
+ // is the superclass that owns the pure parsing logic; `parseBindingDocument`
30
+ // is the equivalent standalone function. Browser callers typically fetch a
31
+ // binding document then hand it off to one of these.
32
+ export { BindingParser, BindingLoadError, parseBindingDocument, } from '../binding-parser.js';
33
+ export { createWriteResult } from '../output/types.js';
34
+ export { WriteError, InvalidFormatError } from '../output/errors.js';
35
+ // ---- Runtime-neutral verifier primitives (pure) --------------------------
36
+ // File-based verifiers (`YAMLVerifier`, `SyntaxVerifier`, `MagicBytesVerifier`,
37
+ // `JSONVerifier`) live in `output/verifiers.ts` and stay Node-only because
38
+ // they read files off disk.
39
+ export { RegistryVerifier, runVerifierChain } from '../output/verify-core.js';
40
+ // ---- HTTP proxy writer (uses global fetch / AbortController, no Node APIs)
41
+ // Registers `ScannedModule[]` as HTTP-proxied modules in an in-memory
42
+ // registry — each module's `execute()` forwards inputs to a backend URL.
43
+ // Works in any environment where `fetch` is available (Node 20+, browsers,
44
+ // Deno, workers).
45
+ export { HTTPProxyRegistryWriter, HTTPProxyWriterError, } from '../output/http-proxy-writer.js';
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,wEAAwE;AACxE,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,0EAA0E;AAC1E,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AACrE,yEAAyE;AACzE,MAAM;AAIN,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,6EAA6E;AAC7E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,6EAA6E;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,6EAA6E;AAC7E,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,2EAA2E;AAC3E,qDAAqD;AACrD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAErE,6EAA6E;AAC7E,gFAAgF;AAChF,2EAA2E;AAC3E,4BAA4B;AAC5B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,6EAA6E;AAC7E,sEAAsE;AACtE,yEAAyE;AACzE,2EAA2E;AAC3E,kBAAkB;AAClB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC"}
@@ -9,7 +9,7 @@
9
9
  * travel through RegistryWriter into FunctionModule.metadata["display"],
10
10
  * where CLI/MCP/A2A surfaces read them at render time.
11
11
  */
12
- import type { ScannedModule } from './types.js';
12
+ import type { ScannedModule } from '../types.js';
13
13
  /** Surface-specific resolved display fields. */
14
14
  export interface SurfaceDisplay {
15
15
  alias: string;
@@ -63,7 +63,19 @@ export declare class DisplayResolver {
63
63
  private _buildBindingMap;
64
64
  private _parseBindingData;
65
65
  private _loadBindingFiles;
66
+ /**
67
+ * Resolve display fields for a single ScannedModule.
68
+ *
69
+ * `suggestedAlias` is read from two sources in priority order:
70
+ * 1. `mod.suggestedAlias` (top-level field, preferred)
71
+ * 2. `mod.metadata["suggested_alias"]` (legacy fallback)
72
+ *
73
+ * The top-level field takes precedence when set to a truthy value.
74
+ */
75
+ private static _asStr;
76
+ private static _asObj;
77
+ private static _asStrArray;
66
78
  private _resolveOne;
67
79
  private _validateAliases;
68
80
  }
69
- //# sourceMappingURL=display-resolver.d.ts.map
81
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/display/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,aAAa,EAAE;IA0BnF,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,iBAAiB;IAiDzB;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;IAIrB,OAAO,CAAC,MAAM,CAAC,MAAM;IAMrB,OAAO,CAAC,MAAM,CAAC,WAAW;IAK1B,OAAO,CAAC,WAAW;IAyEnB,OAAO,CAAC,gBAAgB;CAiCzB"}
@@ -12,7 +12,8 @@
12
12
  import * as fs from 'node:fs';
13
13
  import * as path from 'node:path';
14
14
  import * as yaml from 'js-yaml';
15
- import { cloneModule } from './types.js';
15
+ import { cloneModule } from '../types.js';
16
+ import { PROTO_DENY } from '../safe-keys.js';
16
17
  const MCP_ALIAS_MAX = 64;
17
18
  const MCP_ALIAS_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;
18
19
  const CLI_ALIAS_PATTERN = /^[a-z][a-z0-9_-]*$/;
@@ -62,21 +63,30 @@ export class DisplayResolver {
62
63
  return {};
63
64
  }
64
65
  _parseBindingData(data) {
65
- // Accept either { bindings: [...] } or a direct moduleId → entry map
66
+ // Accept either { bindings: [...] } or a direct moduleId → entry map.
67
+ // Use Object.create(null) so that user-controlled keys like '__proto__'
68
+ // cannot pollute Object.prototype.
66
69
  if ('bindings' in data) {
67
- const bindings = data['bindings'] ?? [];
68
- const result = {};
70
+ const rawBindings = data['bindings'];
71
+ if (!Array.isArray(rawBindings)) {
72
+ console.warn('DisplayResolver: bindings must be an array, got', typeof rawBindings);
73
+ return Object.create(null);
74
+ }
75
+ const bindings = rawBindings;
76
+ const result = Object.create(null);
69
77
  for (const entry of bindings) {
70
78
  const id = entry['module_id'];
71
- if (id != null) {
79
+ if (id != null && !PROTO_DENY.has(id)) {
72
80
  result[id] = entry;
73
81
  }
74
82
  }
75
83
  return result;
76
84
  }
77
85
  // Already a map
78
- const result = {};
86
+ const result = Object.create(null);
79
87
  for (const [k, v] of Object.entries(data)) {
88
+ if (PROTO_DENY.has(k))
89
+ continue;
80
90
  if (v != null && typeof v === 'object' && !Array.isArray(v)) {
81
91
  result[k] = v;
82
92
  }
@@ -84,7 +94,7 @@ export class DisplayResolver {
84
94
  return result;
85
95
  }
86
96
  _loadBindingFiles(bindingPath) {
87
- const result = {};
97
+ const result = Object.create(null);
88
98
  let files = [];
89
99
  try {
90
100
  const stat = fs.statSync(bindingPath);
@@ -101,41 +111,85 @@ export class DisplayResolver {
101
111
  }
102
112
  catch {
103
113
  console.warn(`DisplayResolver: binding path not found: ${bindingPath}`);
104
- return {};
114
+ return Object.create(null);
105
115
  }
106
116
  for (const f of files) {
107
117
  try {
108
- const content = fs.readFileSync(f, 'utf-8');
118
+ const lstat = fs.lstatSync(f);
119
+ if (lstat.isSymbolicLink()) {
120
+ console.warn(`DisplayResolver: skipping symlink ${f}`);
121
+ continue;
122
+ }
123
+ }
124
+ catch (exc) {
125
+ console.warn(`DisplayResolver: failed to stat ${f}: ${exc}`);
126
+ continue;
127
+ }
128
+ let content;
129
+ try {
130
+ content = fs.readFileSync(f, 'utf-8');
131
+ }
132
+ catch (exc) {
133
+ console.warn(`DisplayResolver: failed to read ${f}: ${exc}`);
134
+ continue;
135
+ }
136
+ try {
109
137
  const data = yaml.load(content) ?? {};
110
138
  Object.assign(result, this._parseBindingData(data));
111
139
  }
112
140
  catch (exc) {
113
- console.warn(`DisplayResolver: failed to load ${f}: ${exc}`);
141
+ console.warn(`DisplayResolver: failed to parse ${f}: ${exc}`);
114
142
  }
115
143
  }
116
144
  return result;
117
145
  }
146
+ /**
147
+ * Resolve display fields for a single ScannedModule.
148
+ *
149
+ * `suggestedAlias` is read from two sources in priority order:
150
+ * 1. `mod.suggestedAlias` (top-level field, preferred)
151
+ * 2. `mod.metadata["suggested_alias"]` (legacy fallback)
152
+ *
153
+ * The top-level field takes precedence when set to a truthy value.
154
+ */
155
+ static _asStr(val) {
156
+ return typeof val === 'string' ? val : undefined;
157
+ }
158
+ static _asObj(val) {
159
+ return val !== null && typeof val === 'object' && !Array.isArray(val)
160
+ ? val
161
+ : {};
162
+ }
163
+ static _asStrArray(val, fallback) {
164
+ if (Array.isArray(val))
165
+ return val.filter((v) => typeof v === 'string');
166
+ return [...fallback];
167
+ }
118
168
  _resolveOne(mod, bindingMap) {
119
169
  const entry = bindingMap[mod.moduleId] ?? {};
120
- const displayCfg = entry['display'] ?? {};
121
- const bindingDesc = entry['description'];
122
- const bindingDocs = entry['documentation'];
123
- const suggestedAlias = mod.metadata?.['suggested_alias'] ?? null;
170
+ const displayCfg = DisplayResolver._asObj(entry['display']);
171
+ const bindingDesc = DisplayResolver._asStr(entry['description']);
172
+ const bindingDocs = DisplayResolver._asStr(entry['documentation']);
173
+ const fieldAlias = mod.suggestedAlias ?? null;
174
+ const metaAlias = mod.metadata?.['suggested_alias'] ?? null;
175
+ const suggestedAlias = fieldAlias || metaAlias;
124
176
  // -- Resolve cross-surface defaults --
125
- const defaultAlias = displayCfg['alias'] || suggestedAlias || mod.moduleId;
126
- const defaultDescription = displayCfg['description'] || bindingDesc || mod.description;
127
- const defaultDocumentation = displayCfg['documentation'] || bindingDocs || mod.documentation || null;
128
- const defaultGuidance = displayCfg['guidance'] || null;
129
- const resolvedTags = displayCfg['tags'] ?? entry['tags'] ?? [...mod.tags];
177
+ const defaultAlias = DisplayResolver._asStr(displayCfg['alias']) || suggestedAlias || mod.moduleId;
178
+ const defaultDescription = DisplayResolver._asStr(displayCfg['description']) || bindingDesc || mod.description;
179
+ const defaultDocumentation = DisplayResolver._asStr(displayCfg['documentation']) ?? bindingDocs ?? mod.documentation ?? null;
180
+ const defaultGuidance = DisplayResolver._asStr(displayCfg['guidance']) ?? null;
181
+ const resolvedTags = displayCfg['tags'] !== undefined
182
+ ? DisplayResolver._asStrArray(displayCfg['tags'], mod.tags)
183
+ : DisplayResolver._asStrArray(entry['tags'] !== undefined ? entry['tags'] : mod.tags, mod.tags);
130
184
  // -- Resolve per-surface fields --
131
185
  const resolveSurface = (key) => {
132
- const sc = displayCfg[key] ?? {};
133
- const aliasExplicit = Boolean(sc['alias']);
186
+ const sc = DisplayResolver._asObj(displayCfg[key]);
187
+ const aliasExplicit = Boolean(DisplayResolver._asStr(sc['alias']));
134
188
  return {
135
189
  surface: {
136
- alias: sc['alias'] || defaultAlias,
137
- description: sc['description'] || defaultDescription,
138
- guidance: sc['guidance'] || defaultGuidance,
190
+ alias: DisplayResolver._asStr(sc['alias']) || defaultAlias,
191
+ description: DisplayResolver._asStr(sc['description']) || defaultDescription,
192
+ guidance: DisplayResolver._asStr(sc['guidance']) ?? defaultGuidance,
139
193
  },
140
194
  aliasExplicit,
141
195
  };
@@ -192,4 +246,4 @@ export class DisplayResolver {
192
246
  }
193
247
  }
194
248
  }
195
- //# sourceMappingURL=display-resolver.js.map
249
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/display/resolver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatting/markdown.ts"],"names":[],"mappings":"AAoOA,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,MAAM,CA+BR"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatting/markdown.ts"],"names":[],"mappings":"AAsOA,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,MAAM,CA+BR"}