@wootsup/yt-builder-mcp 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -12
- package/dist/catalog/build-catalog.d.ts +63 -0
- package/dist/catalog/build-catalog.d.ts.map +1 -0
- package/dist/catalog/build-catalog.js +166 -0
- package/dist/catalog/build-catalog.js.map +1 -0
- package/dist/cli/doctor-command.d.ts +21 -0
- package/dist/cli/doctor-command.d.ts.map +1 -0
- package/dist/cli/doctor-command.js +111 -0
- package/dist/cli/doctor-command.js.map +1 -0
- package/dist/cli/invocation-decision.d.ts.map +1 -1
- package/dist/cli/invocation-decision.js +2 -0
- package/dist/cli/invocation-decision.js.map +1 -1
- package/dist/client.d.ts +14 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -0
- package/dist/client.js.map +1 -1
- package/dist/diagnostics/ca-trust.d.ts +16 -0
- package/dist/diagnostics/ca-trust.d.ts.map +1 -0
- package/dist/diagnostics/ca-trust.js +54 -0
- package/dist/diagnostics/ca-trust.js.map +1 -0
- package/dist/diagnostics/diagnose-network-error.d.ts +37 -0
- package/dist/diagnostics/diagnose-network-error.d.ts.map +1 -0
- package/dist/diagnostics/diagnose-network-error.js +158 -0
- package/dist/diagnostics/diagnose-network-error.js.map +1 -0
- package/dist/diagnostics/doctor.d.ts +62 -0
- package/dist/diagnostics/doctor.d.ts.map +1 -0
- package/dist/diagnostics/doctor.js +165 -0
- package/dist/diagnostics/doctor.js.map +1 -0
- package/dist/gateway/advanced-read-tool.d.ts +37 -0
- package/dist/gateway/advanced-read-tool.d.ts.map +1 -0
- package/dist/gateway/advanced-read-tool.js +156 -0
- package/dist/gateway/advanced-read-tool.js.map +1 -0
- package/dist/gateway/advanced-tool/domains.d.ts +18 -3
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/domains.js +28 -9
- package/dist/gateway/advanced-tool/domains.js.map +1 -1
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -1
- package/dist/gateway/advanced-tool/register.js +43 -11
- package/dist/gateway/advanced-tool/register.js.map +1 -1
- package/dist/gateway/essentials.d.ts +14 -4
- package/dist/gateway/essentials.d.ts.map +1 -1
- package/dist/gateway/essentials.js +46 -5
- package/dist/gateway/essentials.js.map +1 -1
- package/dist/gateway/test-support.d.ts +2 -2
- package/dist/gateway/test-support.js +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skill.d.ts +1 -1
- package/dist/install-skill.js +2 -2
- package/dist/net/extra-headers.d.ts +66 -0
- package/dist/net/extra-headers.d.ts.map +1 -0
- package/dist/net/extra-headers.js +164 -0
- package/dist/net/extra-headers.js.map +1 -0
- package/dist/net/internal-host.d.ts +45 -0
- package/dist/net/internal-host.d.ts.map +1 -0
- package/dist/net/internal-host.js +164 -0
- package/dist/net/internal-host.js.map +1 -0
- package/dist/net/proxy-dispatcher.d.ts +40 -0
- package/dist/net/proxy-dispatcher.d.ts.map +1 -0
- package/dist/net/proxy-dispatcher.js +65 -0
- package/dist/net/proxy-dispatcher.js.map +1 -0
- package/dist/proxy/bridge.d.ts +43 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +155 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/mode.d.ts +10 -0
- package/dist/proxy/mode.d.ts.map +1 -0
- package/dist/proxy/mode.js +20 -0
- package/dist/proxy/mode.js.map +1 -0
- package/dist/server.d.ts +5 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -3
- package/dist/server.js.map +1 -1
- package/dist/setup-ca-env.d.ts +40 -0
- package/dist/setup-ca-env.d.ts.map +1 -0
- package/dist/setup-ca-env.js +58 -0
- package/dist/setup-ca-env.js.map +1 -0
- package/dist/setup-ca-reprobe.d.ts +38 -0
- package/dist/setup-ca-reprobe.d.ts.map +1 -0
- package/dist/setup-ca-reprobe.js +68 -0
- package/dist/setup-ca-reprobe.js.map +1 -0
- package/dist/setup-cli.d.ts +37 -2
- package/dist/setup-cli.d.ts.map +1 -1
- package/dist/setup-cli.js +178 -4
- package/dist/setup-cli.js.map +1 -1
- package/dist/setup-npx-spec.d.ts +44 -0
- package/dist/setup-npx-spec.d.ts.map +1 -0
- package/dist/setup-npx-spec.js +66 -0
- package/dist/setup-npx-spec.js.map +1 -0
- package/dist/setup-prompts.d.ts +14 -1
- package/dist/setup-prompts.d.ts.map +1 -1
- package/dist/setup-prompts.js +53 -1
- package/dist/setup-prompts.js.map +1 -1
- package/dist/setup-wizard-defaults.d.ts.map +1 -1
- package/dist/setup-wizard-defaults.js +29 -5
- package/dist/setup-wizard-defaults.js.map +1 -1
- package/dist/setup-wizard-handshake.d.ts +4 -4
- package/dist/setup-wizard-handshake.d.ts.map +1 -1
- package/dist/setup-wizard-handshake.js +46 -12
- package/dist/setup-wizard-handshake.js.map +1 -1
- package/dist/setup-wizard-types.d.ts +81 -0
- package/dist/setup-wizard-types.d.ts.map +1 -1
- package/dist/setup-wizard.d.ts +2 -2
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +140 -18
- package/dist/setup-wizard.js.map +1 -1
- package/dist/sites/client-pool.d.ts +8 -1
- package/dist/sites/client-pool.d.ts.map +1 -1
- package/dist/sites/client-pool.js +34 -4
- package/dist/sites/client-pool.js.map +1 -1
- package/dist/sites/registry.d.ts +30 -0
- package/dist/sites/registry.d.ts.map +1 -1
- package/dist/sites/registry.js.map +1 -1
- package/dist/sites/store.d.ts +8 -1
- package/dist/sites/store.d.ts.map +1 -1
- package/dist/sites/store.js +17 -2
- package/dist/sites/store.js.map +1 -1
- package/dist/sites/tools/use-site.d.ts.map +1 -1
- package/dist/sites/tools/use-site.js +26 -6
- package/dist/sites/tools/use-site.js.map +1 -1
- package/dist/tools/bind-guidance.d.ts +80 -0
- package/dist/tools/bind-guidance.d.ts.map +1 -0
- package/dist/tools/bind-guidance.js +95 -0
- package/dist/tools/bind-guidance.js.map +1 -0
- package/dist/tools/elements/builders.d.ts.map +1 -1
- package/dist/tools/elements/builders.js +63 -13
- package/dist/tools/elements/builders.js.map +1 -1
- package/dist/tools/elements/handlers-write.d.ts +19 -2
- package/dist/tools/elements/handlers-write.d.ts.map +1 -1
- package/dist/tools/elements/handlers-write.js +179 -10
- package/dist/tools/elements/handlers-write.js.map +1 -1
- package/dist/tools/elements/handlers.d.ts +8 -2
- package/dist/tools/elements/handlers.d.ts.map +1 -1
- package/dist/tools/elements/handlers.js +76 -28
- package/dist/tools/elements/handlers.js.map +1 -1
- package/dist/tools/elements/layout-hierarchy-rules.d.ts +62 -0
- package/dist/tools/elements/layout-hierarchy-rules.d.ts.map +1 -0
- package/dist/tools/elements/layout-hierarchy-rules.js +154 -0
- package/dist/tools/elements/layout-hierarchy-rules.js.map +1 -0
- package/dist/tools/format/elements-format.d.ts +35 -0
- package/dist/tools/format/elements-format.d.ts.map +1 -1
- package/dist/tools/format/elements-format.js +124 -1
- package/dist/tools/format/elements-format.js.map +1 -1
- package/dist/tools/format/health-format.d.ts +3 -0
- package/dist/tools/format/health-format.d.ts.map +1 -1
- package/dist/tools/format/health-format.js +21 -4
- package/dist/tools/format/health-format.js.map +1 -1
- package/dist/tools/format/inspection-format.d.ts +18 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -1
- package/dist/tools/format/inspection-format.js +22 -1
- package/dist/tools/format/inspection-format.js.map +1 -1
- package/dist/tools/format/pages-format.d.ts.map +1 -1
- package/dist/tools/format/pages-format.js +7 -0
- package/dist/tools/format/pages-format.js.map +1 -1
- package/dist/tools/format/sources-format.d.ts +8 -0
- package/dist/tools/format/sources-format.d.ts.map +1 -1
- package/dist/tools/format/sources-format.js +10 -0
- package/dist/tools/format/sources-format.js.map +1 -1
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +56 -0
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspection.d.ts +24 -0
- package/dist/tools/inspection.d.ts.map +1 -1
- package/dist/tools/inspection.js +140 -41
- package/dist/tools/inspection.js.map +1 -1
- package/dist/tools/layout-flatten.d.ts +11 -8
- package/dist/tools/layout-flatten.d.ts.map +1 -1
- package/dist/tools/layout-flatten.js +17 -6
- package/dist/tools/layout-flatten.js.map +1 -1
- package/dist/tools/multi-items/builders.d.ts.map +1 -1
- package/dist/tools/multi-items/builders.js +11 -2
- package/dist/tools/multi-items/builders.js.map +1 -1
- package/dist/tools/multi-items/inspect-handler.d.ts +13 -0
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -1
- package/dist/tools/multi-items/inspect-handler.js +147 -3
- package/dist/tools/multi-items/inspect-handler.js.map +1 -1
- package/dist/tools/pages/builders.d.ts.map +1 -1
- package/dist/tools/pages/builders.js +153 -39
- package/dist/tools/pages/builders.js.map +1 -1
- package/dist/tools/pages/handlers-read.d.ts +40 -5
- package/dist/tools/pages/handlers-read.d.ts.map +1 -1
- package/dist/tools/pages/handlers-read.js +404 -76
- package/dist/tools/pages/handlers-read.js.map +1 -1
- package/dist/tools/pages/handlers-write.d.ts +95 -1
- package/dist/tools/pages/handlers-write.d.ts.map +1 -1
- package/dist/tools/pages/handlers-write.js +137 -8
- package/dist/tools/pages/handlers-write.js.map +1 -1
- package/dist/tools/pages/index.d.ts +1 -1
- package/dist/tools/pages/index.d.ts.map +1 -1
- package/dist/tools/pages/index.js +1 -1
- package/dist/tools/pages/index.js.map +1 -1
- package/dist/tools/pages/schemas.d.ts +74 -5
- package/dist/tools/pages/schemas.d.ts.map +1 -1
- package/dist/tools/pages/schemas.js +243 -8
- package/dist/tools/pages/schemas.js.map +1 -1
- package/dist/tools/shared-schemas.d.ts +3 -0
- package/dist/tools/shared-schemas.d.ts.map +1 -1
- package/dist/tools/shared-schemas.js +43 -13
- package/dist/tools/shared-schemas.js.map +1 -1
- package/dist/tools/sources/builders.d.ts.map +1 -1
- package/dist/tools/sources/builders.js +93 -10
- package/dist/tools/sources/builders.js.map +1 -1
- package/dist/tools/sources/handlers-bind.d.ts +13 -1
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -1
- package/dist/tools/sources/handlers-bind.js +163 -1
- package/dist/tools/sources/handlers-bind.js.map +1 -1
- package/dist/tools/sources/handlers.d.ts +12 -1
- package/dist/tools/sources/handlers.d.ts.map +1 -1
- package/dist/tools/sources/handlers.js +103 -16
- package/dist/tools/sources/handlers.js.map +1 -1
- package/dist/tools/sparse-fields.d.ts +73 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -1
- package/dist/tools/sparse-fields.js +136 -0
- package/dist/tools/sparse-fields.js.map +1 -1
- package/dist/tools/sublayout/builders.d.ts +23 -0
- package/dist/tools/sublayout/builders.d.ts.map +1 -0
- package/dist/tools/sublayout/builders.js +54 -0
- package/dist/tools/sublayout/builders.js.map +1 -0
- package/dist/tools/sublayout/index.d.ts +13 -0
- package/dist/tools/sublayout/index.d.ts.map +1 -0
- package/dist/tools/sublayout/index.js +13 -0
- package/dist/tools/sublayout/index.js.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts +95 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.d.ts.map +1 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js +181 -0
- package/dist/tools/sublayout/inspect-sublayout-handler.js.map +1 -0
- package/dist/tools/tool-builder/results.d.ts +31 -0
- package/dist/tools/tool-builder/results.d.ts.map +1 -1
- package/dist/tools/tool-builder/results.js +95 -4
- package/dist/tools/tool-builder/results.js.map +1 -1
- package/dist/update/update-check.d.ts +56 -0
- package/dist/update/update-check.d.ts.map +1 -0
- package/dist/update/update-check.js +155 -0
- package/dist/update/update-check.js.map +1 -0
- package/manifest.json +1 -1
- package/package.json +5 -2
- package/skills/yt-builder-mcp/SKILL.md +148 -82
|
@@ -21,6 +21,52 @@ function stringify(value) {
|
|
|
21
21
|
return String(value);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* F80 (2026-06-10): the size at/above which a JSON-document text body is
|
|
26
|
+
* split off into its own content block instead of carrying the in-band
|
|
27
|
+
* `[label @ host] ` site-prefix.
|
|
28
|
+
*
|
|
29
|
+
* Why a threshold rather than "all JSON": a tool host (Claude Code, …)
|
|
30
|
+
* spills only OVERSIZED tool results to a temp file. That file is read
|
|
31
|
+
* back with `jq`, so the bytes must be pure JSON — an in-band prefix
|
|
32
|
+
* corrupts the first line and breaks the parse (the observed F80
|
|
33
|
+
* friction on `page_get_layout`, a multi-kB layout dump). Small JSON
|
|
34
|
+
* envelopes (error results, single-element confirms, short lists) are
|
|
35
|
+
* NEVER dumped, so they keep the in-band prefix — which preserves the
|
|
36
|
+
* long-standing contract that `content[0].text` is the directly-parseable
|
|
37
|
+
* JSON for those results (141 error-matrix / handler tests depend on it).
|
|
38
|
+
*
|
|
39
|
+
* 8 kB is comfortably below any host's spill threshold yet above every
|
|
40
|
+
* small structured envelope this surface emits.
|
|
41
|
+
*/
|
|
42
|
+
export const SITE_PREFIX_JSON_SPLIT_THRESHOLD = 8 * 1024;
|
|
43
|
+
/**
|
|
44
|
+
* Detect whether a text body is a PURE JSON DOCUMENT (object or array)
|
|
45
|
+
* LARGE enough that a host might spill it to a `jq`-read temp file.
|
|
46
|
+
* Tools like `page_get_layout` emit `jsonResult(data)` whose
|
|
47
|
+
* `content[0].text` IS the JSON payload; for a large layout that text
|
|
48
|
+
* lands in the dump verbatim, so an in-band `[label @ host] ` prefix
|
|
49
|
+
* would corrupt the first bytes.
|
|
50
|
+
*
|
|
51
|
+
* Only OBJECT / ARRAY documents qualify (a bare scalar like `"hello"`
|
|
52
|
+
* stays in-band). The cheap length + first-glyph pre-checks avoid a
|
|
53
|
+
* JSON.parse on every human-readable table on the hot path.
|
|
54
|
+
*/
|
|
55
|
+
function isLargeJsonDocumentText(text) {
|
|
56
|
+
if (text.length < SITE_PREFIX_JSON_SPLIT_THRESHOLD)
|
|
57
|
+
return false;
|
|
58
|
+
const trimmed = text.trimStart();
|
|
59
|
+
const first = trimmed.charAt(0);
|
|
60
|
+
if (first !== '{' && first !== '[')
|
|
61
|
+
return false;
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(trimmed);
|
|
64
|
+
return parsed !== null && typeof parsed === 'object';
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
24
70
|
/**
|
|
25
71
|
* Convert any JSON-serializable value into the MCP content envelope
|
|
26
72
|
* (2-space JSON). Wave G.6.4b: every payload is deep-walked through
|
|
@@ -66,15 +112,29 @@ export function errorResult(opts) {
|
|
|
66
112
|
* Confirm-guard preview helper for destructive tools. Returns the
|
|
67
113
|
* preview `ToolResult` when `confirm` is false; callers `return` it
|
|
68
114
|
* before executing the destructive REST call.
|
|
115
|
+
*
|
|
116
|
+
* F131 (Wave 4a): the blocked-state result is now STRUCTURALLY distinct
|
|
117
|
+
* from a successful mutation. Previously the preview was a plain
|
|
118
|
+
* `jsonResult` with no `isError` — envelope-identical to a success — so a
|
|
119
|
+
* model that did not parse `preview:true` read "delete succeeded" and
|
|
120
|
+
* silently left the element in place (the dry-run / silent-no-op footgun
|
|
121
|
+
* class). Three redundant signals now make the block unmistakable:
|
|
122
|
+
* 1. result-level `isError: true` (hosts that only read the error flag),
|
|
123
|
+
* 2. body `applied: false` + `requires_confirmation: true` (structured
|
|
124
|
+
* consumers),
|
|
125
|
+
* 3. a leading "NOT EXECUTED" line in the human-readable warning text
|
|
126
|
+
* (models that skim prose).
|
|
69
127
|
*/
|
|
70
128
|
export function confirmGuard(opts) {
|
|
71
129
|
return jsonResult({
|
|
72
130
|
preview: true,
|
|
73
|
-
|
|
131
|
+
applied: false,
|
|
132
|
+
requires_confirmation: true,
|
|
133
|
+
warning: `NOT EXECUTED — DESTRUCTIVE operation requires confirmation. The "${opts.operation}" call was BLOCKED and nothing was changed.`,
|
|
74
134
|
operation: opts.operation,
|
|
75
135
|
details: opts.details,
|
|
76
136
|
instruction: 'Ask the user to confirm, then call again with `confirm: true`.',
|
|
77
|
-
});
|
|
137
|
+
}, { isError: true });
|
|
78
138
|
}
|
|
79
139
|
/**
|
|
80
140
|
* Sanitise a single content item from a toolkit builder. Text items
|
|
@@ -158,11 +218,28 @@ export function withSiteMeta(result, site) {
|
|
|
158
218
|
catch {
|
|
159
219
|
host = site.url;
|
|
160
220
|
}
|
|
161
|
-
|
|
221
|
+
// F178 (2026-06-12): when a call was routed via the PROCESS-WIDE
|
|
222
|
+
// default/override (i.e. the caller omitted `site_id`), append a
|
|
223
|
+
// ` · default` marker INSIDE the visible prefix so the human SEES the
|
|
224
|
+
// call was not isolated from concurrent `use_site` switches. An
|
|
225
|
+
// explicit `site_id` (or a legacy fixture without `resolvedVia`) gets
|
|
226
|
+
// the plain prefix.
|
|
227
|
+
const routedViaSharedDefault = site.resolvedVia === 'registry_default'
|
|
228
|
+
|| site.resolvedVia === 'active_override';
|
|
229
|
+
const marker = routedViaSharedDefault ? ' · default' : '';
|
|
230
|
+
const prefix = `[${displayLabel} @ ${host}${marker}] `;
|
|
231
|
+
// `resolved_site_id` is stamped LÜCKENLOS on every site-bound result
|
|
232
|
+
// (it mirrors `site_id` but names the concept the agent reasons about
|
|
233
|
+
// — "which site did this call actually land on"). `resolved_via` is
|
|
234
|
+
// only stamped when known, so legacy fixtures add no noise.
|
|
162
235
|
const meta = {
|
|
163
236
|
site_id: site.id,
|
|
164
237
|
site_url: site.url,
|
|
165
238
|
platform: site.platform.kind,
|
|
239
|
+
resolved_site_id: site.id,
|
|
240
|
+
...(site.resolvedVia !== undefined
|
|
241
|
+
? { resolved_via: site.resolvedVia }
|
|
242
|
+
: {}),
|
|
166
243
|
};
|
|
167
244
|
// W12-R1.2 (A4-F2): site-awareness is the LOAD-BEARING surface for
|
|
168
245
|
// Claude-Desktop users. When the wrapped result has no text content
|
|
@@ -172,10 +249,24 @@ export function withSiteMeta(result, site) {
|
|
|
172
249
|
// text block so the prefix is ALWAYS the first visible glyph.
|
|
173
250
|
// Trim the trailing space — a standalone prefix block reads better
|
|
174
251
|
// without it.
|
|
252
|
+
//
|
|
253
|
+
// F80 (2026-06-10): the SAME synthetic-block path is taken when the
|
|
254
|
+
// first text body is a PURE JSON DOCUMENT (page_get_layout etc.).
|
|
255
|
+
// Concatenating the prefix in-band there yields `[label @ host] {...}`
|
|
256
|
+
// — not valid JSON — which corrupts the harness's file-dump of an
|
|
257
|
+
// oversized result and breaks `jq`. Routing JSON documents through the
|
|
258
|
+
// synthetic block keeps the JSON byte-pure while the human still sees
|
|
259
|
+
// the marker first. Human-readable text (tables / details / prose)
|
|
260
|
+
// keeps the in-band prefix unchanged.
|
|
175
261
|
const firstItem = result.content[0];
|
|
262
|
+
const firstIsLargeJsonDoc = firstItem !== undefined
|
|
263
|
+
&& firstItem.type === 'text'
|
|
264
|
+
&& typeof firstItem.text === 'string'
|
|
265
|
+
&& isLargeJsonDocumentText(firstItem.text);
|
|
176
266
|
const needsSynthetic = result.content.length === 0
|
|
177
267
|
|| firstItem === undefined
|
|
178
|
-
|| firstItem.type !== 'text'
|
|
268
|
+
|| firstItem.type !== 'text'
|
|
269
|
+
|| firstIsLargeJsonDoc;
|
|
179
270
|
const newContent = needsSynthetic
|
|
180
271
|
? [
|
|
181
272
|
{ type: 'text', text: prefix.trimEnd() },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/tools/tool-builder/results.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,SAAS,SAAS,CAAC,KAAc;IAC7B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB,EAAE,UAAiC,EAAE;IAC5E,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACN,CAAC;AAED;sDACsD;AACtD,SAAS,aAAa,CAClB,CAAU;IAEV,IAAI,CAAC,YAAY,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1F,IAAI,CAAC,YAAY,YAAY;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAI3B;IACG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,UAAU,CACb;QACI,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;QAC/B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI;KAClB,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;AACN,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/tools/tool-builder/results.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,SAAS,SAAS,CAAC,KAAc;IAC7B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,GAAG,IAAI,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,SAAS,uBAAuB,CAAC,IAAY;IACzC,IAAI,IAAI,CAAC,MAAM,GAAG,gCAAgC;QAAE,OAAO,KAAK,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC;QACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB,EAAE,UAAiC,EAAE;IAC5E,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACN,CAAC;AAED;sDACsD;AACtD,SAAS,aAAa,CAClB,CAAU;IAEV,IAAI,CAAC,YAAY,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1F,IAAI,CAAC,YAAY,YAAY;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAI3B;IACG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,UAAU,CACb;QACI,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;QAC/B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI;KAClB,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,IAG5B;IACG,OAAO,UAAU,CACb;QACI,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK;QACd,qBAAqB,EAAE,IAAI;QAC3B,OAAO,EAAE,oEAAoE,IAAI,CAAC,SAAS,6CAA6C;QACxI,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,gEAAgE;KAChF,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,IAAiB;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC;QACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,4DAA4D;QAC5D,2DAA2D;QAC3D,uDAAuD;QACvD,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,UAAU,YAAY,CACxB,MAAS,EACT,IAAkB;IAElB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;IAC3C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACL,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;IACpB,CAAC;IAED,iEAAiE;IACjE,iEAAiE;IACjE,sEAAsE;IACtE,gEAAgE;IAChE,sEAAsE;IACtE,oBAAoB;IACpB,MAAM,sBAAsB,GACxB,IAAI,CAAC,WAAW,KAAK,kBAAkB;WACpC,IAAI,CAAC,WAAW,KAAK,iBAAiB,CAAC;IAC9C,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,YAAY,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAEvD,qEAAqE;IACrE,sEAAsE;IACtE,oEAAoE;IACpE,4DAA4D;IAC5D,MAAM,IAAI,GAAG;QACT,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,QAAQ,EAAE,IAAI,CAAC,GAAG;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;QAC5B,gBAAgB,EAAE,IAAI,CAAC,EAAE;QACzB,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;YAC9B,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE;YACpC,CAAC,CAAC,EAAE,CAAC;KACZ,CAAC;IAEF,mEAAmE;IACnE,oEAAoE;IACpE,kEAAkE;IAClE,qEAAqE;IACrE,iEAAiE;IACjE,8DAA8D;IAC9D,mEAAmE;IACnE,cAAc;IACd,EAAE;IACF,oEAAoE;IACpE,kEAAkE;IAClE,uEAAuE;IACvE,kEAAkE;IAClE,uEAAuE;IACvE,sEAAsE;IACtE,mEAAmE;IACnE,sCAAsC;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,mBAAmB,GACrB,SAAS,KAAK,SAAS;WACpB,SAAS,CAAC,IAAI,KAAK,MAAM;WACzB,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;WAClC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,cAAc,GAChB,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;WACxB,SAAS,KAAK,SAAS;WACvB,SAAS,CAAC,IAAI,KAAK,MAAM;WACzB,mBAAmB,CAAC;IAE3B,MAAM,UAAU,GAAkB,cAAc;QAC5C,CAAC,CAAC;YACI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;YACxC,GAAG,MAAM,CAAC,OAAO;SACpB;QACH,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAe,EAAE;YAC1C,IAAI,GAAG,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YACtC,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;IAET,8DAA8D;IAC9D,oEAAoE;IACpE,6DAA6D;IAC7D,mEAAmE;IACnE,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACjC,MAAM,aAAa,GACf,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ;QAChF,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE;QAC7B,CAAC,CAAC,IAAI,CAAC;IAEf,OAAO;QACH,GAAG,MAAM;QACT,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,aAAa;KACvB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC5B,aAIC,EACD,iBAA0C;IAE1C,iEAAiE;IACjE,kEAAkE;IAClE,yBAAyB;IACzB,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAA4B,CAAC;IACrF,MAAM,QAAQ,GACV,aAAa,CAAC,KAAK,KAAK,SAAS;QAC7B,CAAC,CAAE,eAAe,CAAC,aAAa,CAAC,KAAK,CAAgD;QACtF,CAAC,CAAC,SAAS,CAAC;IACpB,OAAO;QACH,OAAO,EAAE,WAAW;QACpB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,aAAa,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,iBAAiB,EAAE,cAAc;KACpC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Persisted throttle record: the latest version + when we last looked. */
|
|
2
|
+
export interface UpdateCacheEntry {
|
|
3
|
+
readonly checkedAt: number;
|
|
4
|
+
readonly latest: string;
|
|
5
|
+
}
|
|
6
|
+
/** Injection seam — production uses a JSON file under ~/.yt-builder-mcp/. */
|
|
7
|
+
export interface UpdateCacheStore {
|
|
8
|
+
read(): UpdateCacheEntry | null;
|
|
9
|
+
write(entry: UpdateCacheEntry): void;
|
|
10
|
+
}
|
|
11
|
+
export interface UpdateStatus {
|
|
12
|
+
readonly updateAvailable: boolean;
|
|
13
|
+
readonly current: string;
|
|
14
|
+
/** The latest version on the registry, or null when it could not be resolved. */
|
|
15
|
+
readonly latest: string | null;
|
|
16
|
+
/** True when the answer came from the throttle cache (no network this call). */
|
|
17
|
+
readonly fromCache: boolean;
|
|
18
|
+
/** Set (fail-silent) when a registry fetch was attempted and failed. */
|
|
19
|
+
readonly error?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CheckForUpdateOptions {
|
|
22
|
+
readonly currentVersion: string;
|
|
23
|
+
readonly packageName: string;
|
|
24
|
+
/** Defaults to {@link fetchLatestFromNpm}. Returns null on any failure. */
|
|
25
|
+
readonly fetchLatest?: (packageName: string) => Promise<string | null>;
|
|
26
|
+
/** Defaults to {@link fileUpdateCache}. */
|
|
27
|
+
readonly cache?: UpdateCacheStore;
|
|
28
|
+
/** Defaults to `Date.now()`. */
|
|
29
|
+
readonly now?: number;
|
|
30
|
+
/** Cache TTL in ms. Default 24h. */
|
|
31
|
+
readonly ttlMs?: number;
|
|
32
|
+
/** Registry fetch timeout in ms. Default 3000. */
|
|
33
|
+
readonly timeoutMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Is `latest` strictly newer than `current`? Fail-closed on unparseable input. */
|
|
36
|
+
export declare function isVersionNewer(latest: string, current: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Default registry fetch: the abbreviated packument's `dist-tags.latest`.
|
|
39
|
+
* (The `/latest` single-version endpoint behaves inconsistently under the
|
|
40
|
+
* abbreviated accept header for scoped packages; the packument + dist-tags is
|
|
41
|
+
* the robust path and the smaller abbreviated response.)
|
|
42
|
+
*/
|
|
43
|
+
export declare function fetchLatestFromNpm(packageName: string, timeoutMs?: number): Promise<string | null>;
|
|
44
|
+
/** Default cache: a JSON file under the user's home dir. Fail-silent on fs errors. */
|
|
45
|
+
export declare const fileUpdateCache: UpdateCacheStore;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve whether a newer version is available, throttled by a cache TTL and
|
|
48
|
+
* fail-silent on every network/fs error. Never throws.
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkForUpdate(options: CheckForUpdateOptions): Promise<UpdateStatus>;
|
|
51
|
+
/**
|
|
52
|
+
* A one-line, actionable update notice for stderr / the diagnose tool, or null
|
|
53
|
+
* when no update is available.
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatUpdateNotice(status: Pick<UpdateStatus, 'updateAvailable' | 'current' | 'latest'>): string | null;
|
|
56
|
+
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/update/update-check.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC7B,IAAI,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,gCAAgC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC/B;AAYD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAcvE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACpC,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAA2B,GACvC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB;AAED,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,gBA2B7B,CAAC;AAMF;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CA+B1F;AAsBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,iBAAiB,GAAG,SAAS,GAAG,QAAQ,CAAC,GAAG,MAAM,GAAG,IAAI,CAOtH"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// packages/mcp/src/update/update-check.ts
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
const DEFAULT_TTL_MS = 24 * 60 * 60 * 1_000;
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 3_000;
|
|
7
|
+
/** Parse `x.y.z` (ignoring any `-prerelease`/`+build`) into a numeric triple. */
|
|
8
|
+
function parseCore(version) {
|
|
9
|
+
const m = /^\s*v?(\d+)\.(\d+)\.(\d+)/.exec(version);
|
|
10
|
+
if (m === null)
|
|
11
|
+
return null;
|
|
12
|
+
return [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
13
|
+
}
|
|
14
|
+
/** Is `latest` strictly newer than `current`? Fail-closed on unparseable input. */
|
|
15
|
+
export function isVersionNewer(latest, current) {
|
|
16
|
+
const a = parseCore(latest);
|
|
17
|
+
const b = parseCore(current);
|
|
18
|
+
if (a === null || b === null)
|
|
19
|
+
return false;
|
|
20
|
+
const [a0, a1, a2] = a;
|
|
21
|
+
const [b0, b1, b2] = b;
|
|
22
|
+
if (a0 !== b0)
|
|
23
|
+
return a0 > b0;
|
|
24
|
+
if (a1 !== b1)
|
|
25
|
+
return a1 > b1;
|
|
26
|
+
if (a2 !== b2)
|
|
27
|
+
return a2 > b2;
|
|
28
|
+
// Equal core → a release (latest, no prerelease) outranks a prerelease
|
|
29
|
+
// current (e.g. latest "1.3.0" vs current "1.3.0-beta.1").
|
|
30
|
+
const latestPre = latest.includes('-');
|
|
31
|
+
const currentPre = current.includes('-');
|
|
32
|
+
return currentPre && !latestPre;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Default registry fetch: the abbreviated packument's `dist-tags.latest`.
|
|
36
|
+
* (The `/latest` single-version endpoint behaves inconsistently under the
|
|
37
|
+
* abbreviated accept header for scoped packages; the packument + dist-tags is
|
|
38
|
+
* the robust path and the smaller abbreviated response.)
|
|
39
|
+
*/
|
|
40
|
+
export async function fetchLatestFromNpm(packageName, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
41
|
+
const url = `https://registry.npmjs.org/${packageName.replace('/', '%2F')}`;
|
|
42
|
+
try {
|
|
43
|
+
const res = await fetch(url, {
|
|
44
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
45
|
+
headers: { accept: 'application/vnd.npm.install-v1+json' },
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok)
|
|
48
|
+
return null;
|
|
49
|
+
const body = await res.json();
|
|
50
|
+
if (body !== null && typeof body === 'object' && 'dist-tags' in body) {
|
|
51
|
+
const tags = body['dist-tags'];
|
|
52
|
+
if (tags !== null && typeof tags === 'object' && 'latest' in tags) {
|
|
53
|
+
const latest = tags.latest;
|
|
54
|
+
if (typeof latest === 'string' && latest !== '')
|
|
55
|
+
return latest;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Offline / proxy / TLS / timeout — fail silent. The notifier is a
|
|
62
|
+
// courtesy, never a hard dependency.
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Default cache: a JSON file under the user's home dir. Fail-silent on fs errors. */
|
|
67
|
+
export const fileUpdateCache = {
|
|
68
|
+
read() {
|
|
69
|
+
try {
|
|
70
|
+
const raw = readFileSync(updateCachePath(), 'utf8');
|
|
71
|
+
const parsed = JSON.parse(raw);
|
|
72
|
+
if (parsed !== null &&
|
|
73
|
+
typeof parsed === 'object' &&
|
|
74
|
+
typeof parsed.checkedAt === 'number' &&
|
|
75
|
+
typeof parsed.latest === 'string') {
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
write(entry) {
|
|
85
|
+
try {
|
|
86
|
+
const path = updateCachePath();
|
|
87
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
88
|
+
writeFileSync(path, JSON.stringify(entry), 'utf8');
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// A non-writable home dir must not break startup.
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
function updateCachePath() {
|
|
96
|
+
return join(homedir(), '.yt-builder-mcp', 'update-check.json');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolve whether a newer version is available, throttled by a cache TTL and
|
|
100
|
+
* fail-silent on every network/fs error. Never throws.
|
|
101
|
+
*/
|
|
102
|
+
export async function checkForUpdate(options) {
|
|
103
|
+
const { currentVersion, packageName, fetchLatest = (pkg) => fetchLatestFromNpm(pkg, options.timeoutMs), cache = fileUpdateCache, now = Date.now(), ttlMs = DEFAULT_TTL_MS, } = options;
|
|
104
|
+
const cached = safeRead(cache);
|
|
105
|
+
if (cached !== null && now - cached.checkedAt < ttlMs) {
|
|
106
|
+
return verdict(currentVersion, cached.latest, true);
|
|
107
|
+
}
|
|
108
|
+
let latest = null;
|
|
109
|
+
let error;
|
|
110
|
+
try {
|
|
111
|
+
latest = await fetchLatest(packageName);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
error = err instanceof Error ? err.message : String(err);
|
|
115
|
+
}
|
|
116
|
+
if (latest === null) {
|
|
117
|
+
// Fall back to a (stale) cached value if we have one, else "unknown".
|
|
118
|
+
if (cached !== null)
|
|
119
|
+
return { ...verdict(currentVersion, cached.latest, true), error };
|
|
120
|
+
return { updateAvailable: false, current: currentVersion, latest: null, fromCache: false, error };
|
|
121
|
+
}
|
|
122
|
+
safeWrite(cache, { checkedAt: now, latest });
|
|
123
|
+
return verdict(currentVersion, latest, false);
|
|
124
|
+
}
|
|
125
|
+
function verdict(current, latest, fromCache) {
|
|
126
|
+
return { updateAvailable: isVersionNewer(latest, current), current, latest, fromCache };
|
|
127
|
+
}
|
|
128
|
+
function safeRead(cache) {
|
|
129
|
+
try {
|
|
130
|
+
return cache.read();
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function safeWrite(cache, entry) {
|
|
137
|
+
try {
|
|
138
|
+
cache.write(entry);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
/* ignore */
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A one-line, actionable update notice for stderr / the diagnose tool, or null
|
|
146
|
+
* when no update is available.
|
|
147
|
+
*/
|
|
148
|
+
export function formatUpdateNotice(status) {
|
|
149
|
+
if (!status.updateAvailable || status.latest === null)
|
|
150
|
+
return null;
|
|
151
|
+
return (`[yt-builder-mcp] update available: ${status.current} → ${status.latest}. ` +
|
|
152
|
+
`Restart your AI client to pick it up (npx pulls @latest), or update a global install: ` +
|
|
153
|
+
`npm i -g @wootsup/yt-builder-mcp@latest.`);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/update/update-check.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"dxt_version": "0.1",
|
|
3
3
|
"name": "@wootsup/yt-builder-mcp",
|
|
4
4
|
"display_name": "YT Builder MCP for YOOtheme Pro (unofficial)",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.4.0",
|
|
6
6
|
"description": "Drive your YOOtheme Pro Page Builder programmatically from Claude, Cursor, Codex, Gemini and 5 other MCP-capable AI assistants — read layouts, edit settings, add elements, bind dynamic sources. Works on WordPress and Joomla 5/6. Built for YOOtheme Pro 4.0+. Independent third-party project, not affiliated with YOOtheme GmbH.",
|
|
7
7
|
"long_description": "YT Builder MCP gives AI assistants a typed, scoped, and idempotent surface for your YOOtheme Pro Page Builder, on either WordPress or Joomla 5/6. Tools cover page discovery, layout inspection, element CRUD, source binding, and diagnostics. Bearer auth, optimistic locking via ETag, scope hierarchy (read < write < admin), and structured-error responses keep the agent safe and the workflow correct on first try. Independent third-party project — YOOtheme® is a registered trademark of YOOtheme GmbH (yootheme.com); YT Builder MCP is built by WootsUp (getimo productions) and is not affiliated with, endorsed by, or sponsored by YOOtheme.",
|
|
8
8
|
"icon": "icon.png",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wootsup/yt-builder-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "YT Builder MCP — drive your page builder from Claude, Cursor, Codex, Gemini and 5 other MCP-capable AI assistants. Built for YOOtheme Pro 4.0+. Independent third-party project, not affiliated with YOOtheme GmbH.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -61,7 +61,9 @@
|
|
|
61
61
|
"setup": "node ./bin/yt-builder-mcp.js setup",
|
|
62
62
|
"install-skill": "node ./bin/yt-builder-mcp.js install-skill",
|
|
63
63
|
"build:dxt": "node ./scripts/build-dxt.js",
|
|
64
|
-
"extract-tools": "node ./scripts/extract-tools.mjs"
|
|
64
|
+
"extract-tools": "node ./scripts/extract-tools.mjs",
|
|
65
|
+
"export:catalog": "node ./scripts/export-catalog.mjs",
|
|
66
|
+
"sync:catalog": "node ./scripts/sync-catalog.mjs"
|
|
65
67
|
},
|
|
66
68
|
"dependencies": {
|
|
67
69
|
"@getimo/mcp-toolkit": "^1.1.1",
|
|
@@ -69,6 +71,7 @@
|
|
|
69
71
|
"@clack/prompts": "^0.7.0",
|
|
70
72
|
"pino": "^10.3.1",
|
|
71
73
|
"proper-lockfile": "^4.1.2",
|
|
74
|
+
"undici": "^6.27.0",
|
|
72
75
|
"zod": "^4.3.6"
|
|
73
76
|
},
|
|
74
77
|
"devDependencies": {
|