@convertcom/mcp-server 0.0.1-beta.17 → 0.0.1-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/executor.js +271 -17
- package/build/executor.js.map +1 -1
- package/build/failure-attribution.d.ts +55 -0
- package/build/failure-attribution.js +326 -0
- package/build/failure-attribution.js.map +1 -0
- package/build/image-dimensions.d.ts +5 -0
- package/build/image-dimensions.js +203 -0
- package/build/image-dimensions.js.map +1 -0
- package/build/kb-search.js +16 -1
- package/build/kb-search.js.map +1 -1
- package/build/namespaced.d.ts +5 -0
- package/build/namespaced.js +199 -11
- package/build/namespaced.js.map +1 -1
- package/build/operator.d.ts +14 -0
- package/build/operator.js +128 -19
- package/build/operator.js.map +1 -1
- package/build/prompts.js +10 -3
- package/build/prompts.js.map +1 -1
- package/build/runtime.d.ts +15 -2
- package/build/runtime.js +186 -20
- package/build/runtime.js.map +1 -1
- package/build/whats-new.d.ts +24 -0
- package/build/whats-new.js +150 -0
- package/build/whats-new.js.map +1 -0
- package/data/convert-kb-legacy-map.json +24956 -9527
- package/data/convert-kb-manifest.json +26 -27
- package/data/convert-kb.json +44625 -64753
- package/data/kb-vectors/0/embedding.index.3.proxima +0 -0
- package/data/kb-vectors/0/scalar.0.ipc +0 -0
- package/data/kb-vectors/corpus.json +2 -2
- package/data/kb-vectors/del.0 +0 -0
- package/data/kb-vectors/idmap.0/000008.sst +0 -0
- package/data/kb-vectors/idmap.0/IDENTITY +1 -1
- package/data/kb-vectors/idmap.0/MANIFEST-000005 +0 -0
- package/data/kb-vectors/manifest.3 +0 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closed, identifier-free failure provenance shared by the generated executor,
|
|
3
|
+
* namespace dispatcher, operator workflows, and hosted telemetry.
|
|
4
|
+
*
|
|
5
|
+
* Keep these values small and stable. They may be returned to MCP clients and
|
|
6
|
+
* persisted as aggregate Analytics Engine dimensions, so raw error text, URLs,
|
|
7
|
+
* request values, and customer identifiers must never be added here.
|
|
8
|
+
*/
|
|
9
|
+
export const FAILURE_CATEGORIES = [
|
|
10
|
+
'input',
|
|
11
|
+
'permission',
|
|
12
|
+
'not_found',
|
|
13
|
+
'upstream',
|
|
14
|
+
'timeout',
|
|
15
|
+
'network',
|
|
16
|
+
'cancellation',
|
|
17
|
+
'internal',
|
|
18
|
+
'unknown',
|
|
19
|
+
];
|
|
20
|
+
export const FAILURE_SOURCES = ['executor', 'namespace', 'operator'];
|
|
21
|
+
export const FAILURE_STAGES = [
|
|
22
|
+
'input_validation',
|
|
23
|
+
'authorization',
|
|
24
|
+
'upstream_request',
|
|
25
|
+
'upstream_response',
|
|
26
|
+
'operator_workflow',
|
|
27
|
+
'internal',
|
|
28
|
+
'unknown',
|
|
29
|
+
];
|
|
30
|
+
export const DISPATCH_STATES = ['not_dispatched', 'dispatched', 'unknown'];
|
|
31
|
+
export const VALIDATION_RULES = [
|
|
32
|
+
'required',
|
|
33
|
+
'type',
|
|
34
|
+
'enum',
|
|
35
|
+
'format',
|
|
36
|
+
'bounds',
|
|
37
|
+
'additional_properties',
|
|
38
|
+
'wrapper',
|
|
39
|
+
'guardrail',
|
|
40
|
+
'unknown',
|
|
41
|
+
];
|
|
42
|
+
export const VALIDATION_PATHS = [
|
|
43
|
+
'root',
|
|
44
|
+
'path',
|
|
45
|
+
'query',
|
|
46
|
+
'body',
|
|
47
|
+
'request_body',
|
|
48
|
+
'confirmation',
|
|
49
|
+
'unknown',
|
|
50
|
+
];
|
|
51
|
+
const CATEGORY_SET = new Set(FAILURE_CATEGORIES);
|
|
52
|
+
const SOURCE_SET = new Set(FAILURE_SOURCES);
|
|
53
|
+
const STAGE_SET = new Set(FAILURE_STAGES);
|
|
54
|
+
const DISPATCH_SET = new Set(DISPATCH_STATES);
|
|
55
|
+
const RULE_SET = new Set(VALIDATION_RULES);
|
|
56
|
+
const PATH_SET = new Set(VALIDATION_PATHS);
|
|
57
|
+
export function isFailureCategory(value) {
|
|
58
|
+
return typeof value === 'string' && CATEGORY_SET.has(value);
|
|
59
|
+
}
|
|
60
|
+
export function isFailureSource(value) {
|
|
61
|
+
return typeof value === 'string' && SOURCE_SET.has(value);
|
|
62
|
+
}
|
|
63
|
+
export function isFailureStage(value) {
|
|
64
|
+
return typeof value === 'string' && STAGE_SET.has(value);
|
|
65
|
+
}
|
|
66
|
+
export function isDispatchState(value) {
|
|
67
|
+
return typeof value === 'string' && DISPATCH_SET.has(value);
|
|
68
|
+
}
|
|
69
|
+
export function isValidationRule(value) {
|
|
70
|
+
return typeof value === 'string' && RULE_SET.has(value);
|
|
71
|
+
}
|
|
72
|
+
export function isValidationPath(value) {
|
|
73
|
+
return typeof value === 'string' && PATH_SET.has(value);
|
|
74
|
+
}
|
|
75
|
+
export function failureAttribution(input) {
|
|
76
|
+
return {
|
|
77
|
+
category: input.category,
|
|
78
|
+
source: input.source,
|
|
79
|
+
stage: input.stage,
|
|
80
|
+
dispatch_state: input.dispatchState,
|
|
81
|
+
code: stableFailureCode(input.code),
|
|
82
|
+
...(knownHttpStatus(input.upstreamStatus) ? { upstream_status: Math.trunc(input.upstreamStatus) } : {}),
|
|
83
|
+
...(input.validationRule ? { validation_rule: input.validationRule } : {}),
|
|
84
|
+
...(input.validationPath ? { validation_path: input.validationPath } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function inputFailure(code, source, validationRule = 'unknown', validationPath = 'unknown') {
|
|
88
|
+
return failureAttribution({
|
|
89
|
+
category: 'input',
|
|
90
|
+
source,
|
|
91
|
+
stage: 'input_validation',
|
|
92
|
+
dispatchState: 'not_dispatched',
|
|
93
|
+
code,
|
|
94
|
+
validationRule,
|
|
95
|
+
validationPath,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
export function permissionFailure(code, source) {
|
|
99
|
+
return failureAttribution({
|
|
100
|
+
category: 'permission',
|
|
101
|
+
source,
|
|
102
|
+
stage: 'authorization',
|
|
103
|
+
dispatchState: 'not_dispatched',
|
|
104
|
+
code,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
export function classifyExecutorFailure(error, upstreamStatus, dispatchState) {
|
|
108
|
+
const errorName = safeErrorName(error);
|
|
109
|
+
const normalizedName = errorName.toLowerCase();
|
|
110
|
+
const errorMessage = safeErrorMessage(error);
|
|
111
|
+
const axiosCode = axiosStyleCode(error);
|
|
112
|
+
if (normalizedName === 'timeouterror'
|
|
113
|
+
|| (normalizedName === 'aborterror' && /timeout/i.test(errorMessage))
|
|
114
|
+
|| axiosCode === 'ETIMEDOUT'
|
|
115
|
+
|| (axiosCode === 'ECONNABORTED' && /timeout|timed out/i.test(errorMessage))) {
|
|
116
|
+
return failureAttribution({
|
|
117
|
+
category: 'timeout',
|
|
118
|
+
source: 'executor',
|
|
119
|
+
stage: 'upstream_request',
|
|
120
|
+
dispatchState,
|
|
121
|
+
code: 'TimeoutError',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (normalizedName === 'aborterror' || normalizedName === 'cancelederror' || axiosCode === 'ERR_CANCELED') {
|
|
125
|
+
return failureAttribution({
|
|
126
|
+
category: 'cancellation',
|
|
127
|
+
source: 'executor',
|
|
128
|
+
stage: 'upstream_request',
|
|
129
|
+
dispatchState,
|
|
130
|
+
code: 'AbortError',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (knownHttpStatus(upstreamStatus)) {
|
|
134
|
+
const status = Math.trunc(upstreamStatus);
|
|
135
|
+
return failureAttribution({
|
|
136
|
+
category: status === 401
|
|
137
|
+
? 'permission'
|
|
138
|
+
: status === 404
|
|
139
|
+
? 'not_found'
|
|
140
|
+
: 'upstream',
|
|
141
|
+
source: 'executor',
|
|
142
|
+
stage: 'upstream_response',
|
|
143
|
+
dispatchState: 'dispatched',
|
|
144
|
+
code: `UpstreamHttp${status}`,
|
|
145
|
+
upstreamStatus: status,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
const looksNetworkRelated = normalizedName === 'typeerror'
|
|
149
|
+
|| normalizedName.includes('network')
|
|
150
|
+
|| normalizedName.includes('fetch')
|
|
151
|
+
|| Boolean(axiosCode && /^(ECONN|ENET|EAI_|ETIMEDOUT|ERR_NETWORK)/i.test(axiosCode));
|
|
152
|
+
if (looksNetworkRelated) {
|
|
153
|
+
return failureAttribution({
|
|
154
|
+
category: /TIMEOUT|TIMEDOUT/i.test(axiosCode ?? '') ? 'timeout' : 'network',
|
|
155
|
+
source: 'executor',
|
|
156
|
+
stage: 'upstream_request',
|
|
157
|
+
dispatchState,
|
|
158
|
+
code: /TIMEOUT|TIMEDOUT/i.test(axiosCode ?? '') ? 'TimeoutError' : 'NetworkError',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return failureAttribution({
|
|
162
|
+
category: 'unknown',
|
|
163
|
+
source: 'executor',
|
|
164
|
+
stage: dispatchState === 'not_dispatched' ? 'internal' : 'upstream_request',
|
|
165
|
+
dispatchState,
|
|
166
|
+
code: errorName,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
export function failureFromStructured(structured, fallbackSource) {
|
|
170
|
+
const existing = safeFailureAttribution(structured.failure);
|
|
171
|
+
if (existing)
|
|
172
|
+
return existing;
|
|
173
|
+
const code = typeof structured.error === 'string' ? structured.error : 'UnknownFailure';
|
|
174
|
+
const status = knownHttpStatus(structured.status) ? Math.trunc(structured.status) : undefined;
|
|
175
|
+
const normalizedCode = code.toLowerCase();
|
|
176
|
+
if (normalizedCode.includes('timeout')) {
|
|
177
|
+
return failureAttribution({ category: 'timeout', source: fallbackSource, stage: fallbackStage(fallbackSource), dispatchState: 'unknown', code });
|
|
178
|
+
}
|
|
179
|
+
if (normalizedCode.includes('abort') || normalizedCode.includes('cancel')) {
|
|
180
|
+
return failureAttribution({ category: 'cancellation', source: fallbackSource, stage: fallbackStage(fallbackSource), dispatchState: 'unknown', code });
|
|
181
|
+
}
|
|
182
|
+
if (normalizedCode.includes('network') || normalizedCode.includes('fetch')) {
|
|
183
|
+
return failureAttribution({ category: 'network', source: fallbackSource, stage: fallbackStage(fallbackSource), dispatchState: 'unknown', code });
|
|
184
|
+
}
|
|
185
|
+
if (status === 401 || status === 403) {
|
|
186
|
+
return failureAttribution({
|
|
187
|
+
category: status === 401 || code === 'ProjectCreationPermissionRequired' || code === 'ApprovalRequired'
|
|
188
|
+
? 'permission' : 'upstream',
|
|
189
|
+
source: fallbackSource,
|
|
190
|
+
stage: 'upstream_response',
|
|
191
|
+
dispatchState: 'dispatched',
|
|
192
|
+
code,
|
|
193
|
+
upstreamStatus: status,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
if (/(permission|authori[sz]|authenticat|approval|required)/i.test(code)) {
|
|
197
|
+
return permissionFailure(code, fallbackSource);
|
|
198
|
+
}
|
|
199
|
+
if (status === 404 || /not.?found/i.test(code)) {
|
|
200
|
+
return failureAttribution({
|
|
201
|
+
category: 'not_found',
|
|
202
|
+
source: fallbackSource,
|
|
203
|
+
stage: status === 404 ? 'upstream_response' : fallbackStage(fallbackSource),
|
|
204
|
+
dispatchState: status === 404 ? 'dispatched' : 'unknown',
|
|
205
|
+
code,
|
|
206
|
+
upstreamStatus: status,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (/^(invalid|missing|unknown|unsupported|wrong)/i.test(code)) {
|
|
210
|
+
return inputFailure(code, fallbackSource);
|
|
211
|
+
}
|
|
212
|
+
if (typeof status === 'number') {
|
|
213
|
+
return failureAttribution({
|
|
214
|
+
category: 'upstream',
|
|
215
|
+
source: fallbackSource,
|
|
216
|
+
stage: 'upstream_response',
|
|
217
|
+
dispatchState: 'dispatched',
|
|
218
|
+
code,
|
|
219
|
+
upstreamStatus: status,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (code === 'AllUpstreamCallsFailed') {
|
|
223
|
+
return failureAttribution({
|
|
224
|
+
category: 'upstream',
|
|
225
|
+
source: fallbackSource,
|
|
226
|
+
stage: fallbackStage(fallbackSource),
|
|
227
|
+
dispatchState: 'unknown',
|
|
228
|
+
code,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
return failureAttribution({
|
|
232
|
+
category: code === 'OperatorExecutionFailed' ? 'internal' : 'unknown',
|
|
233
|
+
source: fallbackSource,
|
|
234
|
+
stage: fallbackStage(fallbackSource),
|
|
235
|
+
dispatchState: 'unknown',
|
|
236
|
+
code,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
export function safeFailureAttribution(value) {
|
|
240
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
241
|
+
return null;
|
|
242
|
+
const candidate = value;
|
|
243
|
+
if (!isFailureCategory(candidate.category)
|
|
244
|
+
|| !isFailureSource(candidate.source)
|
|
245
|
+
|| !isFailureStage(candidate.stage)
|
|
246
|
+
|| !isDispatchState(candidate.dispatch_state)
|
|
247
|
+
|| typeof candidate.code !== 'string')
|
|
248
|
+
return null;
|
|
249
|
+
const upstreamStatus = knownHttpStatus(candidate.upstream_status)
|
|
250
|
+
? Math.trunc(candidate.upstream_status)
|
|
251
|
+
: undefined;
|
|
252
|
+
return {
|
|
253
|
+
category: candidate.category,
|
|
254
|
+
source: candidate.source,
|
|
255
|
+
stage: candidate.stage,
|
|
256
|
+
dispatch_state: candidate.dispatch_state,
|
|
257
|
+
code: stableFailureCode(candidate.code),
|
|
258
|
+
...(typeof upstreamStatus === 'number' ? { upstream_status: upstreamStatus } : {}),
|
|
259
|
+
...(isValidationRule(candidate.validation_rule) ? { validation_rule: candidate.validation_rule } : {}),
|
|
260
|
+
...(isValidationPath(candidate.validation_path) ? { validation_path: candidate.validation_path } : {}),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
export function validationLabels(issues) {
|
|
264
|
+
const first = Array.isArray(issues) && issues.length > 0 && issues[0] && typeof issues[0] === 'object'
|
|
265
|
+
? issues[0]
|
|
266
|
+
: {};
|
|
267
|
+
return {
|
|
268
|
+
rule: validationRuleFrom(first.keyword),
|
|
269
|
+
path: validationPathFrom(typeof first.instancePath === 'string' ? first.instancePath : first.path),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function validationRuleFrom(value) {
|
|
273
|
+
if (value === 'required' || value === 'type' || value === 'enum' || value === 'format')
|
|
274
|
+
return value;
|
|
275
|
+
if (value === 'additionalProperties')
|
|
276
|
+
return 'additional_properties';
|
|
277
|
+
if (value === 'minimum' || value === 'maximum' || value === 'minItems' || value === 'maxItems'
|
|
278
|
+
|| value === 'minLength' || value === 'maxLength' || value === 'pattern')
|
|
279
|
+
return 'bounds';
|
|
280
|
+
return 'unknown';
|
|
281
|
+
}
|
|
282
|
+
function validationPathFrom(value) {
|
|
283
|
+
if (typeof value !== 'string' || value.length === 0 || value === '/')
|
|
284
|
+
return 'root';
|
|
285
|
+
const normalized = value.replace(/^\//, '').replace(/^\./, '').toLowerCase();
|
|
286
|
+
if (normalized.startsWith('path'))
|
|
287
|
+
return 'path';
|
|
288
|
+
if (normalized.startsWith('query'))
|
|
289
|
+
return 'query';
|
|
290
|
+
if (normalized.startsWith('requestbody') || normalized.startsWith('request_body'))
|
|
291
|
+
return 'request_body';
|
|
292
|
+
if (normalized.startsWith('body'))
|
|
293
|
+
return 'body';
|
|
294
|
+
if (normalized.startsWith('confirmation'))
|
|
295
|
+
return 'confirmation';
|
|
296
|
+
return 'unknown';
|
|
297
|
+
}
|
|
298
|
+
function fallbackStage(source) {
|
|
299
|
+
return source === 'operator' ? 'operator_workflow' : source === 'namespace' ? 'input_validation' : 'internal';
|
|
300
|
+
}
|
|
301
|
+
function stableFailureCode(value) {
|
|
302
|
+
const normalized = value.trim();
|
|
303
|
+
return /^[A-Za-z][A-Za-z0-9]{0,63}$/.test(normalized) ? normalized : 'UnknownFailure';
|
|
304
|
+
}
|
|
305
|
+
function knownHttpStatus(value) {
|
|
306
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 100 && value <= 599;
|
|
307
|
+
}
|
|
308
|
+
function axiosStyleCode(error) {
|
|
309
|
+
if (!error || typeof error !== 'object' || Array.isArray(error))
|
|
310
|
+
return null;
|
|
311
|
+
const code = error.code;
|
|
312
|
+
return typeof code === 'string' ? code : null;
|
|
313
|
+
}
|
|
314
|
+
function safeErrorName(error) {
|
|
315
|
+
if (!error || typeof error !== 'object' || Array.isArray(error))
|
|
316
|
+
return 'UnknownFailure';
|
|
317
|
+
const name = error.name;
|
|
318
|
+
return typeof name === 'string' && name.length > 0 ? name : 'UnknownFailure';
|
|
319
|
+
}
|
|
320
|
+
function safeErrorMessage(error) {
|
|
321
|
+
if (!error || typeof error !== 'object' || Array.isArray(error))
|
|
322
|
+
return '';
|
|
323
|
+
const message = error.message;
|
|
324
|
+
return typeof message === 'string' ? message : '';
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=failure-attribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-attribution.js","sourceRoot":"","sources":["../src/failure-attribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
function uint16be(bytes, at) {
|
|
2
|
+
return (bytes[at] << 8) | bytes[at + 1];
|
|
3
|
+
}
|
|
4
|
+
function uint16le(bytes, at) {
|
|
5
|
+
return bytes[at] | (bytes[at + 1] << 8);
|
|
6
|
+
}
|
|
7
|
+
function uint32be(bytes, at) {
|
|
8
|
+
return ((bytes[at] * 0x1000000) + (bytes[at + 1] << 16)
|
|
9
|
+
+ (bytes[at + 2] << 8) + bytes[at + 3]) >>> 0;
|
|
10
|
+
}
|
|
11
|
+
function ascii(bytes, at, length) {
|
|
12
|
+
return String.fromCharCode(...bytes.subarray(at, at + length));
|
|
13
|
+
}
|
|
14
|
+
function positive(width, height) {
|
|
15
|
+
return Number.isSafeInteger(width) && Number.isSafeInteger(height) && width > 0 && height > 0
|
|
16
|
+
? { width, height } : null;
|
|
17
|
+
}
|
|
18
|
+
function pngDimensions(bytes) {
|
|
19
|
+
if (bytes.length < 45 || ascii(bytes, 0, 8) !== '\x89PNG\r\n\x1a\n'
|
|
20
|
+
|| uint32be(bytes, 8) !== 13 || ascii(bytes, 12, 4) !== 'IHDR')
|
|
21
|
+
return null;
|
|
22
|
+
const dimensions = positive(uint32be(bytes, 16), uint32be(bytes, 20));
|
|
23
|
+
if (!dimensions)
|
|
24
|
+
return null;
|
|
25
|
+
let at = 8;
|
|
26
|
+
let sawIdat = false;
|
|
27
|
+
while (at + 12 <= bytes.length) {
|
|
28
|
+
const length = uint32be(bytes, at);
|
|
29
|
+
if (length > bytes.length - at - 12)
|
|
30
|
+
return null;
|
|
31
|
+
const kind = ascii(bytes, at + 4, 4);
|
|
32
|
+
if (kind === 'acTL')
|
|
33
|
+
return null; // APNG can contain multiple frames.
|
|
34
|
+
if (kind === 'IDAT' && length > 0)
|
|
35
|
+
sawIdat = true;
|
|
36
|
+
if (kind === 'IEND' && length !== 0)
|
|
37
|
+
return null;
|
|
38
|
+
at += length + 12;
|
|
39
|
+
if (kind === 'IEND')
|
|
40
|
+
return sawIdat && at === bytes.length ? dimensions : null;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function jpegDimensions(bytes) {
|
|
45
|
+
if (bytes.length < 6 || bytes[0] !== 0xff || bytes[1] !== 0xd8
|
|
46
|
+
|| bytes[bytes.length - 2] !== 0xff || bytes[bytes.length - 1] !== 0xd9)
|
|
47
|
+
return null;
|
|
48
|
+
let at = 2;
|
|
49
|
+
let dimensions = null;
|
|
50
|
+
while (at + 4 <= bytes.length) {
|
|
51
|
+
if (bytes[at] !== 0xff)
|
|
52
|
+
return null;
|
|
53
|
+
while (bytes[at] === 0xff)
|
|
54
|
+
at++;
|
|
55
|
+
const marker = bytes[at++];
|
|
56
|
+
if (marker === 0xd9 || marker === undefined)
|
|
57
|
+
return null;
|
|
58
|
+
if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7))
|
|
59
|
+
continue;
|
|
60
|
+
if (at + 2 > bytes.length)
|
|
61
|
+
return null;
|
|
62
|
+
const length = uint16be(bytes, at);
|
|
63
|
+
if (length < 2 || at + length > bytes.length)
|
|
64
|
+
return null;
|
|
65
|
+
if (marker === 0xda) {
|
|
66
|
+
// SOS must follow a frame header and leave entropy bytes before EOI.
|
|
67
|
+
return dimensions && length >= 6 && at + length < bytes.length - 2 ? dimensions : null;
|
|
68
|
+
}
|
|
69
|
+
if ((marker >= 0xc0 && marker <= 0xc3)
|
|
70
|
+
|| (marker >= 0xc5 && marker <= 0xc7)
|
|
71
|
+
|| (marker >= 0xc9 && marker <= 0xcb)
|
|
72
|
+
|| (marker >= 0xcd && marker <= 0xcf)) {
|
|
73
|
+
if (length < 8 || bytes[at + 7] === 0 || length < 8 + 3 * bytes[at + 7])
|
|
74
|
+
return null;
|
|
75
|
+
const frame = positive(uint16be(bytes, at + 5), uint16be(bytes, at + 3));
|
|
76
|
+
if (!frame || dimensions)
|
|
77
|
+
return null;
|
|
78
|
+
dimensions = frame;
|
|
79
|
+
}
|
|
80
|
+
at += length;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
function skipGifSubBlocks(bytes, start) {
|
|
85
|
+
let at = start;
|
|
86
|
+
while (at < bytes.length) {
|
|
87
|
+
const size = bytes[at++];
|
|
88
|
+
if (size === 0)
|
|
89
|
+
return at;
|
|
90
|
+
if (size > bytes.length - at)
|
|
91
|
+
return null;
|
|
92
|
+
at += size;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
function gifDimensions(bytes) {
|
|
97
|
+
if (bytes.length < 14 || !['GIF87a', 'GIF89a'].includes(ascii(bytes, 0, 6)))
|
|
98
|
+
return null;
|
|
99
|
+
const dimensions = positive(uint16le(bytes, 6), uint16le(bytes, 8));
|
|
100
|
+
if (!dimensions)
|
|
101
|
+
return null;
|
|
102
|
+
const tableBytes = bytes[10] & 0x80 ? 3 * (1 << ((bytes[10] & 7) + 1)) : 0;
|
|
103
|
+
let at = 13 + tableBytes;
|
|
104
|
+
let frames = 0;
|
|
105
|
+
while (at < bytes.length) {
|
|
106
|
+
const marker = bytes[at++];
|
|
107
|
+
if (marker === 0x3b)
|
|
108
|
+
return at === bytes.length && frames === 1 ? dimensions : null;
|
|
109
|
+
if (marker === 0x21) {
|
|
110
|
+
if (at >= bytes.length)
|
|
111
|
+
return null;
|
|
112
|
+
at = skipGifSubBlocks(bytes, at + 1) ?? bytes.length;
|
|
113
|
+
}
|
|
114
|
+
else if (marker === 0x2c) {
|
|
115
|
+
if (at + 9 > bytes.length)
|
|
116
|
+
return null;
|
|
117
|
+
const left = uint16le(bytes, at);
|
|
118
|
+
const top = uint16le(bytes, at + 2);
|
|
119
|
+
const frame = positive(uint16le(bytes, at + 4), uint16le(bytes, at + 6));
|
|
120
|
+
if (!frame || left + frame.width > dimensions.width || top + frame.height > dimensions.height)
|
|
121
|
+
return null;
|
|
122
|
+
const localTableBytes = bytes[at + 8] & 0x80 ? 3 * (1 << ((bytes[at + 8] & 7) + 1)) : 0;
|
|
123
|
+
at += 9 + localTableBytes;
|
|
124
|
+
if (at >= bytes.length)
|
|
125
|
+
return null;
|
|
126
|
+
at = skipGifSubBlocks(bytes, at + 1) ?? bytes.length;
|
|
127
|
+
frames++;
|
|
128
|
+
if (frames > 1)
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
else
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
function webpDimensions(bytes) {
|
|
137
|
+
if (bytes.length < 30 || ascii(bytes, 0, 4) !== 'RIFF' || ascii(bytes, 8, 4) !== 'WEBP')
|
|
138
|
+
return null;
|
|
139
|
+
const riffLength = (bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] * 0x1000000)) >>> 0;
|
|
140
|
+
if (riffLength + 8 !== bytes.length)
|
|
141
|
+
return null;
|
|
142
|
+
let at = 12;
|
|
143
|
+
let dimensions = null;
|
|
144
|
+
let imageChunks = 0;
|
|
145
|
+
while (at + 8 <= bytes.length) {
|
|
146
|
+
const kind = ascii(bytes, at, 4);
|
|
147
|
+
const length = (bytes[at + 4] | (bytes[at + 5] << 8)
|
|
148
|
+
| (bytes[at + 6] << 16) | (bytes[at + 7] * 0x1000000)) >>> 0;
|
|
149
|
+
const payload = at + 8;
|
|
150
|
+
if (length > bytes.length - payload)
|
|
151
|
+
return null;
|
|
152
|
+
if (kind === 'ANIM' || kind === 'ANMF')
|
|
153
|
+
return null;
|
|
154
|
+
if (kind === 'VP8X') {
|
|
155
|
+
if (at !== 12 || length < 10 || (bytes[payload] & 0x02))
|
|
156
|
+
return null;
|
|
157
|
+
dimensions = positive(1 + bytes[payload + 4] + (bytes[payload + 5] << 8) + (bytes[payload + 6] << 16), 1 + bytes[payload + 7] + (bytes[payload + 8] << 8) + (bytes[payload + 9] << 16));
|
|
158
|
+
if (!dimensions)
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
else if (kind === 'VP8 ') {
|
|
162
|
+
if (length < 10 || bytes[payload + 3] !== 0x9d
|
|
163
|
+
|| bytes[payload + 4] !== 0x01 || bytes[payload + 5] !== 0x2a)
|
|
164
|
+
return null;
|
|
165
|
+
imageChunks++;
|
|
166
|
+
const frame = positive(uint16le(bytes, payload + 6) & 0x3fff, uint16le(bytes, payload + 8) & 0x3fff);
|
|
167
|
+
if (!frame || (dimensions && (dimensions.width !== frame.width || dimensions.height !== frame.height)))
|
|
168
|
+
return null;
|
|
169
|
+
dimensions = frame;
|
|
170
|
+
}
|
|
171
|
+
else if (kind === 'VP8L') {
|
|
172
|
+
if (length < 5 || bytes[payload] !== 0x2f)
|
|
173
|
+
return null;
|
|
174
|
+
imageChunks++;
|
|
175
|
+
const frame = positive(1 + bytes[payload + 1] + ((bytes[payload + 2] & 0x3f) << 8), 1 + (bytes[payload + 2] >> 6) + (bytes[payload + 3] << 2)
|
|
176
|
+
+ ((bytes[payload + 4] & 0x0f) << 10));
|
|
177
|
+
if (!frame || (dimensions && (dimensions.width !== frame.width || dimensions.height !== frame.height)))
|
|
178
|
+
return null;
|
|
179
|
+
dimensions = frame;
|
|
180
|
+
}
|
|
181
|
+
at = payload + length + (length % 2);
|
|
182
|
+
}
|
|
183
|
+
return at === bytes.length && imageChunks === 1 ? dimensions : null;
|
|
184
|
+
}
|
|
185
|
+
export function imageDimensionsFromBase64(data, mimeType) {
|
|
186
|
+
let bytes;
|
|
187
|
+
try {
|
|
188
|
+
const normalized = data.replace(/-/g, '+').replace(/_/g, '/');
|
|
189
|
+
const decoded = atob(normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '='));
|
|
190
|
+
bytes = Uint8Array.from(decoded, char => char.charCodeAt(0));
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
switch (mimeType) {
|
|
196
|
+
case 'image/png': return pngDimensions(bytes);
|
|
197
|
+
case 'image/jpeg': return jpegDimensions(bytes);
|
|
198
|
+
case 'image/gif': return gifDimensions(bytes);
|
|
199
|
+
case 'image/webp': return webpDimensions(bytes);
|
|
200
|
+
default: return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=image-dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-dimensions.js","sourceRoot":"","sources":["../src/image-dimensions.ts"],"names":[],"mappings":"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"}
|
package/build/kb-search.js
CHANGED
|
@@ -238,7 +238,16 @@ function boundedLevenshtein(left, right, maximum) {
|
|
|
238
238
|
export function normalizeSearchQuery(query) {
|
|
239
239
|
const tokens = query.match(/[\p{L}\p{N}_./:+-]+/gu) ?? [];
|
|
240
240
|
const meaningful = tokens.filter((token) => !QUERY_STOP_WORDS.has(token.toLowerCase()));
|
|
241
|
-
|
|
241
|
+
// API reference titles use imperative verbs; conversational conjugations must
|
|
242
|
+
// retrieve the same contract in both the local and Worker lexical engines.
|
|
243
|
+
const verbForms = {
|
|
244
|
+
creates: 'create', creating: 'create', created: 'create',
|
|
245
|
+
updates: 'update', updating: 'update', updated: 'update',
|
|
246
|
+
deletes: 'delete', deleting: 'delete', deleted: 'delete',
|
|
247
|
+
authenticates: 'authentication', authenticate: 'authentication', authenticating: 'authentication',
|
|
248
|
+
};
|
|
249
|
+
const normalized = (meaningful.length > 0 ? meaningful : tokens)
|
|
250
|
+
.map((token) => verbForms[token.toLowerCase()] ?? token);
|
|
242
251
|
if (/\brevenue\b/i.test(query)
|
|
243
252
|
&& /\b(?:do not|don't|doesn't|without|no)\b[^.?!]{0,80}\b(?:ga4|google analytics)\b/i.test(query)) {
|
|
244
253
|
normalized.push('manual', 'revenue', 'tracking', 'pushRevenue', 'goal_id', 'add', 'site');
|
|
@@ -257,6 +266,12 @@ export function semanticSearchQuery(query) {
|
|
|
257
266
|
&& /\b(?:do not|don't|doesn't|without|no)\b[^.?!]{0,80}\b(?:ga4|google analytics)\b/i.test(query)) {
|
|
258
267
|
return `${query} Relevant Convert concept: manual revenue tracking with pushRevenue and goal_id, without a Google Analytics integration.`;
|
|
259
268
|
}
|
|
269
|
+
if (/\b(?:convert\s+)?(?:management\s+)?api\b/i.test(query)
|
|
270
|
+
&& /\bheaders?\b/i.test(query)
|
|
271
|
+
&& /\b(?:auth|authenticate|authentication|hmac|request signing)\b/i.test(query)
|
|
272
|
+
&& !/\b(?:oauth\w*|bearer)\b/i.test(query)) {
|
|
273
|
+
return `${query} Relevant Convert concept: API key request signing with HMAC using Convert-Application-ID, Expires, and Authorization headers.`;
|
|
274
|
+
}
|
|
260
275
|
return query;
|
|
261
276
|
}
|
|
262
277
|
const DEVELOPER_INTENT = /\b(api|sdk|webhook|endpoint|request|response|payload|header|hmac|oauth|javascript|typescript|android|ios|fullstack|tracking event|curl|http status)\b/i;
|