@wootsup/yt-builder-mcp 1.1.6 → 1.2.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 +7 -7
- package/bin/yt-builder-mcp.js +55 -40
- package/dist/auth.d.ts +137 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +244 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli/invocation-decision.d.ts +57 -0
- package/dist/cli/invocation-decision.d.ts.map +1 -0
- package/dist/cli/invocation-decision.js +86 -0
- package/dist/cli/invocation-decision.js.map +1 -0
- package/dist/client.d.ts +112 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +190 -0
- package/dist/client.js.map +1 -0
- package/dist/clients/claude-code.d.ts +18 -0
- package/dist/clients/claude-code.d.ts.map +1 -0
- package/dist/clients/claude-code.js +55 -0
- package/dist/clients/claude-code.js.map +1 -0
- package/dist/clients/claude-desktop.d.ts +19 -0
- package/dist/clients/claude-desktop.d.ts.map +1 -0
- package/dist/clients/claude-desktop.js +58 -0
- package/dist/clients/claude-desktop.js.map +1 -0
- package/dist/clients/cline.d.ts +26 -0
- package/dist/clients/cline.d.ts.map +1 -0
- package/dist/clients/cline.js +82 -0
- package/dist/clients/cline.js.map +1 -0
- package/dist/clients/codex-cli.d.ts +42 -0
- package/dist/clients/codex-cli.d.ts.map +1 -0
- package/dist/clients/codex-cli.js +292 -0
- package/dist/clients/codex-cli.js.map +1 -0
- package/dist/clients/continue.d.ts +13 -0
- package/dist/clients/continue.d.ts.map +1 -0
- package/dist/clients/continue.js +121 -0
- package/dist/clients/continue.js.map +1 -0
- package/dist/clients/cursor.d.ts +12 -0
- package/dist/clients/cursor.d.ts.map +1 -0
- package/dist/clients/cursor.js +40 -0
- package/dist/clients/cursor.js.map +1 -0
- package/dist/clients/gemini-cli.d.ts +18 -0
- package/dist/clients/gemini-cli.d.ts.map +1 -0
- package/dist/clients/gemini-cli.js +46 -0
- package/dist/clients/gemini-cli.js.map +1 -0
- package/dist/clients/home.d.ts +14 -0
- package/dist/clients/home.d.ts.map +1 -0
- package/dist/clients/home.js +20 -0
- package/dist/clients/home.js.map +1 -0
- package/dist/clients/index.d.ts +156 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +213 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/roo-code.d.ts +23 -0
- package/dist/clients/roo-code.d.ts.map +1 -0
- package/dist/clients/roo-code.js +71 -0
- package/dist/clients/roo-code.js.map +1 -0
- package/dist/clients/zed.d.ts +12 -0
- package/dist/clients/zed.d.ts.map +1 -0
- package/dist/clients/zed.js +43 -0
- package/dist/clients/zed.js.map +1 -0
- package/dist/errors/hints.d.ts +51 -0
- package/dist/errors/hints.d.ts.map +1 -0
- package/dist/errors/hints.js +95 -0
- package/dist/errors/hints.js.map +1 -0
- package/dist/errors/mask.d.ts +35 -0
- package/dist/errors/mask.d.ts.map +1 -0
- package/dist/errors/mask.js +49 -0
- package/dist/errors/mask.js.map +1 -0
- package/dist/errors/sanitize.d.ts +31 -0
- package/dist/errors/sanitize.d.ts.map +1 -0
- package/dist/errors/sanitize.js +100 -0
- package/dist/errors/sanitize.js.map +1 -0
- package/dist/errors.d.ts +42 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/gateway/advanced-tool/discovery.d.ts +19 -0
- package/dist/gateway/advanced-tool/discovery.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/discovery.js +53 -0
- package/dist/gateway/advanced-tool/discovery.js.map +1 -0
- package/dist/gateway/advanced-tool/domains.d.ts +47 -0
- package/dist/gateway/advanced-tool/domains.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/domains.js +94 -0
- package/dist/gateway/advanced-tool/domains.js.map +1 -0
- package/dist/gateway/advanced-tool/execute.d.ts +29 -0
- package/dist/gateway/advanced-tool/execute.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/execute.js +54 -0
- package/dist/gateway/advanced-tool/execute.js.map +1 -0
- package/dist/gateway/advanced-tool/index.d.ts +36 -0
- package/dist/gateway/advanced-tool/index.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/index.js +39 -0
- package/dist/gateway/advanced-tool/index.js.map +1 -0
- package/dist/gateway/advanced-tool/register.d.ts +18 -0
- package/dist/gateway/advanced-tool/register.d.ts.map +1 -0
- package/dist/gateway/advanced-tool/register.js +69 -0
- package/dist/gateway/advanced-tool/register.js.map +1 -0
- package/dist/gateway/advanced-tool.d.ts +13 -0
- package/dist/gateway/advanced-tool.d.ts.map +1 -0
- package/dist/gateway/advanced-tool.js +13 -0
- package/dist/gateway/advanced-tool.js.map +1 -0
- package/dist/gateway/capturing-server.d.ts +117 -0
- package/dist/gateway/capturing-server.d.ts.map +1 -0
- package/dist/gateway/capturing-server.js +103 -0
- package/dist/gateway/capturing-server.js.map +1 -0
- package/dist/gateway/essentials.d.ts +50 -0
- package/dist/gateway/essentials.d.ts.map +1 -0
- package/dist/gateway/essentials.js +108 -0
- package/dist/gateway/essentials.js.map +1 -0
- package/dist/gateway/test-support.d.ts +41 -0
- package/dist/gateway/test-support.d.ts.map +1 -0
- package/dist/gateway/test-support.js +60 -0
- package/dist/gateway/test-support.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +119 -0
- package/dist/index.js.map +1 -0
- package/dist/install-skill.d.ts +43 -0
- package/dist/install-skill.d.ts.map +1 -0
- package/dist/install-skill.js +118 -0
- package/dist/install-skill.js.map +1 -0
- package/dist/platform/detect.d.ts +64 -0
- package/dist/platform/detect.d.ts.map +1 -0
- package/dist/platform/detect.js +98 -0
- package/dist/platform/detect.js.map +1 -0
- package/dist/platform/index.d.ts +121 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +176 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/joomla.d.ts +44 -0
- package/dist/platform/joomla.d.ts.map +1 -0
- package/dist/platform/joomla.js +46 -0
- package/dist/platform/joomla.js.map +1 -0
- package/dist/server.d.ts +110 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +274 -0
- package/dist/server.js.map +1 -0
- package/dist/setup-cli-confirm.d.ts +36 -0
- package/dist/setup-cli-confirm.d.ts.map +1 -0
- package/dist/setup-cli-confirm.js +59 -0
- package/dist/setup-cli-confirm.js.map +1 -0
- package/dist/setup-cli.d.ts +193 -0
- package/dist/setup-cli.d.ts.map +1 -0
- package/dist/setup-cli.js +1032 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/setup-prompts.d.ts +64 -0
- package/dist/setup-prompts.d.ts.map +1 -0
- package/dist/setup-prompts.js +221 -0
- package/dist/setup-prompts.js.map +1 -0
- package/dist/setup-token.d.ts +38 -0
- package/dist/setup-token.d.ts.map +1 -0
- package/dist/setup-token.js +106 -0
- package/dist/setup-token.js.map +1 -0
- package/dist/setup-wizard-defaults.d.ts +43 -0
- package/dist/setup-wizard-defaults.d.ts.map +1 -0
- package/dist/setup-wizard-defaults.js +160 -0
- package/dist/setup-wizard-defaults.js.map +1 -0
- package/dist/setup-wizard-handshake.d.ts +25 -0
- package/dist/setup-wizard-handshake.d.ts.map +1 -0
- package/dist/setup-wizard-handshake.js +103 -0
- package/dist/setup-wizard-handshake.js.map +1 -0
- package/dist/setup-wizard-types.d.ts +164 -0
- package/dist/setup-wizard-types.d.ts.map +1 -0
- package/dist/setup-wizard-types.js +11 -0
- package/dist/setup-wizard-types.js.map +1 -0
- package/dist/setup-wizard.d.ts +33 -0
- package/dist/setup-wizard.d.ts.map +1 -0
- package/dist/setup-wizard.js +199 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/setup.d.ts +17 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +33 -0
- package/dist/setup.js.map +1 -0
- package/dist/sites/bootstrap.d.ts +41 -0
- package/dist/sites/bootstrap.d.ts.map +1 -0
- package/dist/sites/bootstrap.js +58 -0
- package/dist/sites/bootstrap.js.map +1 -0
- package/dist/sites/cli/add-site.d.ts +106 -0
- package/dist/sites/cli/add-site.d.ts.map +1 -0
- package/dist/sites/cli/add-site.js +185 -0
- package/dist/sites/cli/add-site.js.map +1 -0
- package/dist/sites/cli/list-sites.d.ts +40 -0
- package/dist/sites/cli/list-sites.d.ts.map +1 -0
- package/dist/sites/cli/list-sites.js +116 -0
- package/dist/sites/cli/list-sites.js.map +1 -0
- package/dist/sites/cli/remove-site.d.ts +60 -0
- package/dist/sites/cli/remove-site.d.ts.map +1 -0
- package/dist/sites/cli/remove-site.js +120 -0
- package/dist/sites/cli/remove-site.js.map +1 -0
- package/dist/sites/cli/set-default.d.ts +47 -0
- package/dist/sites/cli/set-default.d.ts.map +1 -0
- package/dist/sites/cli/set-default.js +69 -0
- package/dist/sites/cli/set-default.js.map +1 -0
- package/dist/sites/cli/test-site.d.ts +77 -0
- package/dist/sites/cli/test-site.d.ts.map +1 -0
- package/dist/sites/cli/test-site.js +146 -0
- package/dist/sites/cli/test-site.js.map +1 -0
- package/dist/sites/client-pool.d.ts +157 -0
- package/dist/sites/client-pool.d.ts.map +1 -0
- package/dist/sites/client-pool.js +222 -0
- package/dist/sites/client-pool.js.map +1 -0
- package/dist/sites/env-bridge.d.ts +55 -0
- package/dist/sites/env-bridge.d.ts.map +1 -0
- package/dist/sites/env-bridge.js +94 -0
- package/dist/sites/env-bridge.js.map +1 -0
- package/dist/sites/paths.d.ts +21 -0
- package/dist/sites/paths.d.ts.map +1 -0
- package/dist/sites/paths.js +37 -0
- package/dist/sites/paths.js.map +1 -0
- package/dist/sites/probe.d.ts +60 -0
- package/dist/sites/probe.d.ts.map +1 -0
- package/dist/sites/probe.js +112 -0
- package/dist/sites/probe.js.map +1 -0
- package/dist/sites/registry.d.ts +142 -0
- package/dist/sites/registry.d.ts.map +1 -0
- package/dist/sites/registry.js +163 -0
- package/dist/sites/registry.js.map +1 -0
- package/dist/sites/schema.d.ts +90 -0
- package/dist/sites/schema.d.ts.map +1 -0
- package/dist/sites/schema.js +71 -0
- package/dist/sites/schema.js.map +1 -0
- package/dist/sites/secret-resolver.d.ts +115 -0
- package/dist/sites/secret-resolver.d.ts.map +1 -0
- package/dist/sites/secret-resolver.js +225 -0
- package/dist/sites/secret-resolver.js.map +1 -0
- package/dist/sites/store.d.ts +82 -0
- package/dist/sites/store.d.ts.map +1 -0
- package/dist/sites/store.js +198 -0
- package/dist/sites/store.js.map +1 -0
- package/dist/sites/tools/index.d.ts +28 -0
- package/dist/sites/tools/index.d.ts.map +1 -0
- package/dist/sites/tools/index.js +38 -0
- package/dist/sites/tools/index.js.map +1 -0
- package/dist/sites/tools/sites-list.d.ts +48 -0
- package/dist/sites/tools/sites-list.d.ts.map +1 -0
- package/dist/sites/tools/sites-list.js +137 -0
- package/dist/sites/tools/sites-list.js.map +1 -0
- package/dist/sites/tools/sites-test.d.ts +47 -0
- package/dist/sites/tools/sites-test.d.ts.map +1 -0
- package/dist/sites/tools/sites-test.js +148 -0
- package/dist/sites/tools/sites-test.js.map +1 -0
- package/dist/sites/tools/use-site.d.ts +47 -0
- package/dist/sites/tools/use-site.d.ts.map +1 -0
- package/dist/sites/tools/use-site.js +183 -0
- package/dist/sites/tools/use-site.js.map +1 -0
- package/dist/skill-loader.d.ts +111 -0
- package/dist/skill-loader.d.ts.map +1 -0
- package/dist/skill-loader.js +191 -0
- package/dist/skill-loader.js.map +1 -0
- package/dist/tools/elements/builders.d.ts +24 -0
- package/dist/tools/elements/builders.d.ts.map +1 -0
- package/dist/tools/elements/builders.js +208 -0
- package/dist/tools/elements/builders.js.map +1 -0
- package/dist/tools/elements/handlers-write.d.ts +49 -0
- package/dist/tools/elements/handlers-write.d.ts.map +1 -0
- package/dist/tools/elements/handlers-write.js +341 -0
- package/dist/tools/elements/handlers-write.js.map +1 -0
- package/dist/tools/elements/handlers.d.ts +70 -0
- package/dist/tools/elements/handlers.d.ts.map +1 -0
- package/dist/tools/elements/handlers.js +292 -0
- package/dist/tools/elements/handlers.js.map +1 -0
- package/dist/tools/elements/index.d.ts +28 -0
- package/dist/tools/elements/index.d.ts.map +1 -0
- package/dist/tools/elements/index.js +27 -0
- package/dist/tools/elements/index.js.map +1 -0
- package/dist/tools/elements.d.ts +13 -0
- package/dist/tools/elements.d.ts.map +1 -0
- package/dist/tools/elements.js +13 -0
- package/dist/tools/elements.js.map +1 -0
- package/dist/tools/elicitation.d.ts +87 -0
- package/dist/tools/elicitation.d.ts.map +1 -0
- package/dist/tools/elicitation.js +100 -0
- package/dist/tools/elicitation.js.map +1 -0
- package/dist/tools/format/elements-format.d.ts +40 -0
- package/dist/tools/format/elements-format.d.ts.map +1 -0
- package/dist/tools/format/elements-format.js +193 -0
- package/dist/tools/format/elements-format.js.map +1 -0
- package/dist/tools/format/health-format.d.ts +79 -0
- package/dist/tools/format/health-format.d.ts.map +1 -0
- package/dist/tools/format/health-format.js +181 -0
- package/dist/tools/format/health-format.js.map +1 -0
- package/dist/tools/format/inspection-format.d.ts +70 -0
- package/dist/tools/format/inspection-format.d.ts.map +1 -0
- package/dist/tools/format/inspection-format.js +359 -0
- package/dist/tools/format/inspection-format.js.map +1 -0
- package/dist/tools/format/pages-format.d.ts +57 -0
- package/dist/tools/format/pages-format.d.ts.map +1 -0
- package/dist/tools/format/pages-format.js +157 -0
- package/dist/tools/format/pages-format.js.map +1 -0
- package/dist/tools/format/sources-format.d.ts +44 -0
- package/dist/tools/format/sources-format.d.ts.map +1 -0
- package/dist/tools/format/sources-format.js +242 -0
- package/dist/tools/format/sources-format.js.map +1 -0
- package/dist/tools/health.d.ts +22 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +220 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/index.d.ts +30 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +39 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspection.d.ts +14 -0
- package/dist/tools/inspection.d.ts.map +1 -0
- package/dist/tools/inspection.js +401 -0
- package/dist/tools/inspection.js.map +1 -0
- package/dist/tools/layout-flatten.d.ts +75 -0
- package/dist/tools/layout-flatten.d.ts.map +1 -0
- package/dist/tools/layout-flatten.js +107 -0
- package/dist/tools/layout-flatten.js.map +1 -0
- package/dist/tools/multi-items/builders.d.ts +23 -0
- package/dist/tools/multi-items/builders.d.ts.map +1 -0
- package/dist/tools/multi-items/builders.js +84 -0
- package/dist/tools/multi-items/builders.js.map +1 -0
- package/dist/tools/multi-items/clean-implode-handler.d.ts +36 -0
- package/dist/tools/multi-items/clean-implode-handler.d.ts.map +1 -0
- package/dist/tools/multi-items/clean-implode-handler.js +57 -0
- package/dist/tools/multi-items/clean-implode-handler.js.map +1 -0
- package/dist/tools/multi-items/format/inspection-format.d.ts +41 -0
- package/dist/tools/multi-items/format/inspection-format.d.ts.map +1 -0
- package/dist/tools/multi-items/format/inspection-format.js +64 -0
- package/dist/tools/multi-items/format/inspection-format.js.map +1 -0
- package/dist/tools/multi-items/index.d.ts +18 -0
- package/dist/tools/multi-items/index.d.ts.map +1 -0
- package/dist/tools/multi-items/index.js +18 -0
- package/dist/tools/multi-items/index.js.map +1 -0
- package/dist/tools/multi-items/inspect-handler.d.ts +76 -0
- package/dist/tools/multi-items/inspect-handler.d.ts.map +1 -0
- package/dist/tools/multi-items/inspect-handler.js +133 -0
- package/dist/tools/multi-items/inspect-handler.js.map +1 -0
- package/dist/tools/multi-items/inspection-cache.d.ts +85 -0
- package/dist/tools/multi-items/inspection-cache.d.ts.map +1 -0
- package/dist/tools/multi-items/inspection-cache.js +126 -0
- package/dist/tools/multi-items/inspection-cache.js.map +1 -0
- package/dist/tools/multi-items/item-container-map.d.ts +41 -0
- package/dist/tools/multi-items/item-container-map.d.ts.map +1 -0
- package/dist/tools/multi-items/item-container-map.js +73 -0
- package/dist/tools/multi-items/item-container-map.js.map +1 -0
- package/dist/tools/pages/builders.d.ts +43 -0
- package/dist/tools/pages/builders.d.ts.map +1 -0
- package/dist/tools/pages/builders.js +229 -0
- package/dist/tools/pages/builders.js.map +1 -0
- package/dist/tools/pages/handlers-read.d.ts +33 -0
- package/dist/tools/pages/handlers-read.d.ts.map +1 -0
- package/dist/tools/pages/handlers-read.js +260 -0
- package/dist/tools/pages/handlers-read.js.map +1 -0
- package/dist/tools/pages/handlers-write.d.ts +63 -0
- package/dist/tools/pages/handlers-write.d.ts.map +1 -0
- package/dist/tools/pages/handlers-write.js +127 -0
- package/dist/tools/pages/handlers-write.js.map +1 -0
- package/dist/tools/pages/index.d.ts +17 -0
- package/dist/tools/pages/index.d.ts.map +1 -0
- package/dist/tools/pages/index.js +17 -0
- package/dist/tools/pages/index.js.map +1 -0
- package/dist/tools/pages/schemas.d.ts +157 -0
- package/dist/tools/pages/schemas.d.ts.map +1 -0
- package/dist/tools/pages/schemas.js +232 -0
- package/dist/tools/pages/schemas.js.map +1 -0
- package/dist/tools/pages.d.ts +13 -0
- package/dist/tools/pages.d.ts.map +1 -0
- package/dist/tools/pages.js +13 -0
- package/dist/tools/pages.js.map +1 -0
- package/dist/tools/pool-resolve-helper.d.ts +83 -0
- package/dist/tools/pool-resolve-helper.d.ts.map +1 -0
- package/dist/tools/pool-resolve-helper.js +148 -0
- package/dist/tools/pool-resolve-helper.js.map +1 -0
- package/dist/tools/progress-phases.d.ts +46 -0
- package/dist/tools/progress-phases.d.ts.map +1 -0
- package/dist/tools/progress-phases.js +48 -0
- package/dist/tools/progress-phases.js.map +1 -0
- package/dist/tools/shared-schemas.d.ts +25 -0
- package/dist/tools/shared-schemas.d.ts.map +1 -0
- package/dist/tools/shared-schemas.js +72 -0
- package/dist/tools/shared-schemas.js.map +1 -0
- package/dist/tools/sources/builders.d.ts +13 -0
- package/dist/tools/sources/builders.d.ts.map +1 -0
- package/dist/tools/sources/builders.js +118 -0
- package/dist/tools/sources/builders.js.map +1 -0
- package/dist/tools/sources/handlers-bind.d.ts +28 -0
- package/dist/tools/sources/handlers-bind.d.ts.map +1 -0
- package/dist/tools/sources/handlers-bind.js +181 -0
- package/dist/tools/sources/handlers-bind.js.map +1 -0
- package/dist/tools/sources/handlers.d.ts +47 -0
- package/dist/tools/sources/handlers.d.ts.map +1 -0
- package/dist/tools/sources/handlers.js +108 -0
- package/dist/tools/sources/handlers.js.map +1 -0
- package/dist/tools/sources/index.d.ts +19 -0
- package/dist/tools/sources/index.d.ts.map +1 -0
- package/dist/tools/sources/index.js +18 -0
- package/dist/tools/sources/index.js.map +1 -0
- package/dist/tools/sources.d.ts +14 -0
- package/dist/tools/sources.d.ts.map +1 -0
- package/dist/tools/sources.js +14 -0
- package/dist/tools/sources.js.map +1 -0
- package/dist/tools/sparse-fields.d.ts +106 -0
- package/dist/tools/sparse-fields.d.ts.map +1 -0
- package/dist/tools/sparse-fields.js +165 -0
- package/dist/tools/sparse-fields.js.map +1 -0
- package/dist/tools/tool-builder/annotations.d.ts +55 -0
- package/dist/tools/tool-builder/annotations.d.ts.map +1 -0
- package/dist/tools/tool-builder/annotations.js +86 -0
- package/dist/tools/tool-builder/annotations.js.map +1 -0
- package/dist/tools/tool-builder/define.d.ts +31 -0
- package/dist/tools/tool-builder/define.d.ts.map +1 -0
- package/dist/tools/tool-builder/define.js +31 -0
- package/dist/tools/tool-builder/define.js.map +1 -0
- package/dist/tools/tool-builder/index.d.ts +28 -0
- package/dist/tools/tool-builder/index.d.ts.map +1 -0
- package/dist/tools/tool-builder/index.js +27 -0
- package/dist/tools/tool-builder/index.js.map +1 -0
- package/dist/tools/tool-builder/results.d.ts +104 -0
- package/dist/tools/tool-builder/results.d.ts.map +1 -0
- package/dist/tools/tool-builder/results.js +224 -0
- package/dist/tools/tool-builder/results.js.map +1 -0
- package/dist/tools/tool-builder/types.d.ts +97 -0
- package/dist/tools/tool-builder/types.d.ts.map +1 -0
- package/dist/tools/tool-builder/types.js +9 -0
- package/dist/tools/tool-builder/types.js.map +1 -0
- package/dist/tools/tool-builder.d.ts +16 -0
- package/dist/tools/tool-builder.d.ts.map +1 -0
- package/dist/tools/tool-builder.js +16 -0
- package/dist/tools/tool-builder.js.map +1 -0
- package/dist/uninstall-skill.d.ts +52 -0
- package/dist/uninstall-skill.d.ts.map +1 -0
- package/dist/uninstall-skill.js +146 -0
- package/dist/uninstall-skill.js.map +1 -0
- package/dist/uninstall.d.ts +73 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +82 -0
- package/dist/uninstall.js.map +1 -0
- package/icon.png +0 -0
- package/manifest.json +10 -10
- package/package.json +4 -1
- package/skills/yt-builder-mcp/SKILL.md +30 -26
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W4 — ClientPool: caches one {@link RestClient} per `site_id`.
|
|
3
|
+
*
|
|
4
|
+
* The pool sits between the W3 {@link SiteRegistry} (which maps a
|
|
5
|
+
* `site_id` → entry + memoised {@link Platform}) and the W2
|
|
6
|
+
* {@link SecretResolver} (which produces a bearer token at call time)
|
|
7
|
+
* and emits {@link PoolResolution} bundles ready for tool handlers.
|
|
8
|
+
*
|
|
9
|
+
* Design choices (per plan §W4, Z.562-644):
|
|
10
|
+
*
|
|
11
|
+
* - **One client per site_id.** The first `resolve(id)` runs bearer +
|
|
12
|
+
* platform resolve in parallel via `Promise.all` (saves one
|
|
13
|
+
* round-trip-time per cold site) and stores the constructed
|
|
14
|
+
* `RestClient`. All subsequent calls reuse the same instance —
|
|
15
|
+
* identity-equal across the process lifetime.
|
|
16
|
+
*
|
|
17
|
+
* - **Cold parallel calls are racey-but-safe.** When N callers arrive
|
|
18
|
+
* for the same uncached site_id simultaneously, the plan §W4
|
|
19
|
+
* explicitly accepts N first-time `secretResolver.resolve()` calls
|
|
20
|
+
* (Z.630): `op read` is idempotent + latency dominates so a
|
|
21
|
+
* hard-once Promise-cache would not materially help. The W3
|
|
22
|
+
* registry's Promise-cache handles the platform side. The last
|
|
23
|
+
* setter wins the `cache.set(id, client)` race; subsequent
|
|
24
|
+
* `resolve()` calls see a stable single instance. Identity is
|
|
25
|
+
* eventual, not instantaneous — but stable from call N+1 onwards.
|
|
26
|
+
*
|
|
27
|
+
* - **`invalidate(siteId)` for post-401 force-re-resolve.** When the
|
|
28
|
+
* auth layer detects a `401 invalid_kid`, it can drop the cached
|
|
29
|
+
* client so the next call re-fetches the bearer through `op` and
|
|
30
|
+
* constructs a fresh `RestClient`.
|
|
31
|
+
*
|
|
32
|
+
* - **Structured errors.** `NoDefaultSiteError` and `UnknownSiteError`
|
|
33
|
+
* carry `code` + (for unknown) `siteId` + `available[]` so the
|
|
34
|
+
* auth/tool layer can branch on `error.code` instead of substring
|
|
35
|
+
* matching the message.
|
|
36
|
+
*
|
|
37
|
+
* @license MIT
|
|
38
|
+
*/
|
|
39
|
+
import { RestClient } from '../client.js';
|
|
40
|
+
/**
|
|
41
|
+
* Thrown when `resolve()` is called without a `siteId` AND the
|
|
42
|
+
* registry has no default configured (neither `default_site_id` nor a
|
|
43
|
+
* flagged `is_default:true` entry). The auth layer surfaces this as a
|
|
44
|
+
* `no_default_site` MCP error with a hint to run
|
|
45
|
+
* `npx -y @wootsup/yt-builder-mcp add-site --default`.
|
|
46
|
+
*/
|
|
47
|
+
export class NoDefaultSiteError extends Error {
|
|
48
|
+
code = 'no_default_site';
|
|
49
|
+
constructor(message = 'No site_id supplied and no default site is configured. '
|
|
50
|
+
+ 'Add a site via `npx -y @wootsup/yt-builder-mcp add-site --default --url ... --token ...` '
|
|
51
|
+
+ 'or pass site_id explicitly. Use yootheme_builder_sites_list to discover IDs.') {
|
|
52
|
+
super(message);
|
|
53
|
+
this.name = 'NoDefaultSiteError';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Thrown when `resolve('some-id')` cannot find `some-id` in the
|
|
58
|
+
* registry. Carries the requested `siteId` and the (insertion-order)
|
|
59
|
+
* list of configured ids so the caller can render a friendly
|
|
60
|
+
* "did-you-mean" hint.
|
|
61
|
+
*/
|
|
62
|
+
export class UnknownSiteError extends Error {
|
|
63
|
+
siteId;
|
|
64
|
+
available;
|
|
65
|
+
code = 'unknown_site';
|
|
66
|
+
constructor(siteId, available) {
|
|
67
|
+
super(`Site "${siteId}" not found. Available: `
|
|
68
|
+
+ (available.length > 0 ? available.join(', ') : '(none configured)'));
|
|
69
|
+
this.siteId = siteId;
|
|
70
|
+
this.available = available;
|
|
71
|
+
this.name = 'UnknownSiteError';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Process-local cache of {@link RestClient} instances keyed by
|
|
76
|
+
* `site_id`. Constructed once at server boot (W6) and shared across
|
|
77
|
+
* all tool handlers.
|
|
78
|
+
*
|
|
79
|
+
* The pool is NOT thread-safe in the strict sense (Node is
|
|
80
|
+
* single-threaded but `await` can interleave); the cold-parallel-call
|
|
81
|
+
* behaviour is documented at the top of this file.
|
|
82
|
+
*/
|
|
83
|
+
export class ClientPool {
|
|
84
|
+
_registry;
|
|
85
|
+
secretResolver;
|
|
86
|
+
timeoutMs;
|
|
87
|
+
cache = new Map();
|
|
88
|
+
/**
|
|
89
|
+
* Runtime active-site override (Phase 3 — `yootheme_builder_use_site`).
|
|
90
|
+
*
|
|
91
|
+
* The {@link SiteRegistry} is immutable: its `defaultSiteId()` is
|
|
92
|
+
* fixed for the process lifetime. api-mapper's parallel feature
|
|
93
|
+
* (`apimapper_use_profile`) moves a mutable active-pointer in its
|
|
94
|
+
* on-disk ProfileStore. YT Builder instead keeps the registry
|
|
95
|
+
* read-only and layers a process-local override HERE: when set,
|
|
96
|
+
* `resolve(undefined)` targets this id BEFORE consulting
|
|
97
|
+
* `registry.defaultSiteId()`. An explicit `site_id` argument to
|
|
98
|
+
* `resolve()` always wins over the override.
|
|
99
|
+
*
|
|
100
|
+
* `null` = no override (registry default in effect).
|
|
101
|
+
*/
|
|
102
|
+
activeOverride = null;
|
|
103
|
+
constructor(_registry, secretResolver, timeoutMs = 15_000) {
|
|
104
|
+
this._registry = _registry;
|
|
105
|
+
this.secretResolver = secretResolver;
|
|
106
|
+
this.timeoutMs = timeoutMs;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The current runtime active-site override, or `null` when none is
|
|
110
|
+
* set (the registry default is in effect). Read-only peek — does not
|
|
111
|
+
* resolve a client or hit the network.
|
|
112
|
+
*/
|
|
113
|
+
activeSiteId() {
|
|
114
|
+
return this.activeOverride;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Set (or clear) the runtime active-site override.
|
|
118
|
+
*
|
|
119
|
+
* Passing a `site_id` makes every subsequent `resolve(undefined)`
|
|
120
|
+
* target that site. Passing `null` clears the override so the
|
|
121
|
+
* registry default applies again.
|
|
122
|
+
*
|
|
123
|
+
* @throws {UnknownSiteError} when `siteId` is not in the registry —
|
|
124
|
+
* the pointer is left UNCHANGED on a bad switch so a typo never
|
|
125
|
+
* silently strands the session on a non-existent site.
|
|
126
|
+
*/
|
|
127
|
+
setActiveSite(siteId) {
|
|
128
|
+
if (siteId === null) {
|
|
129
|
+
this.activeOverride = null;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (this.registry.get(siteId) === null) {
|
|
133
|
+
throw new UnknownSiteError(siteId, this.registry.listIds());
|
|
134
|
+
}
|
|
135
|
+
this.activeOverride = siteId;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Read-only accessor for the underlying {@link SiteRegistry}. Used
|
|
139
|
+
* internally by the W7 `buildSitesTools(pool)` aggregator so the
|
|
140
|
+
* `sites_list` tool can render the configured-sites table without
|
|
141
|
+
* requiring callers to thread the registry separately. The registry
|
|
142
|
+
* itself is immutable from the outside (no mutator surface) so
|
|
143
|
+
* exposing it here is safe — `listForDisplay()` / `defaultSiteId()` /
|
|
144
|
+
* `listIds()` are all read-only operations.
|
|
145
|
+
*
|
|
146
|
+
* @internal Internal accessor for buildSitesTools; do not consume
|
|
147
|
+
* from tool handlers. Handlers should call `pool.resolve(siteId)`
|
|
148
|
+
* to get a `{client, site}` bundle instead.
|
|
149
|
+
*/
|
|
150
|
+
get registry() {
|
|
151
|
+
return this._registry;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Resolve a site_id to its cached {@link RestClient} + descriptor.
|
|
155
|
+
*
|
|
156
|
+
* @param siteId Explicit site_id from the tool param. When
|
|
157
|
+
* `undefined`, the registry's `defaultSiteId()` is used.
|
|
158
|
+
* @throws {NoDefaultSiteError} when `siteId` is omitted and no
|
|
159
|
+
* default is configured.
|
|
160
|
+
* @throws {UnknownSiteError} when the resolved id is not in the
|
|
161
|
+
* registry (either the explicit id is wrong, or the registry's
|
|
162
|
+
* `default_site_id` points at a stale entry).
|
|
163
|
+
*/
|
|
164
|
+
async resolve(siteId) {
|
|
165
|
+
// Resolution order (Phase 3):
|
|
166
|
+
// 1. explicit `siteId` arg (always wins)
|
|
167
|
+
// 2. runtime active-site override (`setActiveSite`)
|
|
168
|
+
// 3. registry default (`defaultSiteId()`)
|
|
169
|
+
const id = siteId
|
|
170
|
+
?? this.activeOverride
|
|
171
|
+
?? this.registry.defaultSiteId();
|
|
172
|
+
if (id === null) {
|
|
173
|
+
throw new NoDefaultSiteError();
|
|
174
|
+
}
|
|
175
|
+
const entry = this.registry.get(id);
|
|
176
|
+
if (entry === null) {
|
|
177
|
+
throw new UnknownSiteError(id, this.registry.listIds());
|
|
178
|
+
}
|
|
179
|
+
let client = this.cache.get(id);
|
|
180
|
+
if (client === undefined) {
|
|
181
|
+
// Plan §W4 Z.604-608: parallelise bearer + platform on a
|
|
182
|
+
// cold call. The W3 registry's Promise-cache de-dupes the
|
|
183
|
+
// platform probe across N parallel callers; the bearer
|
|
184
|
+
// side is allowed N first-time calls (op read idempotent).
|
|
185
|
+
const [bearer, platform] = await Promise.all([
|
|
186
|
+
this.secretResolver.resolve(entry),
|
|
187
|
+
this.registry.platformFor(id),
|
|
188
|
+
]);
|
|
189
|
+
client = new RestClient({
|
|
190
|
+
platform,
|
|
191
|
+
bearerToken: bearer.token,
|
|
192
|
+
timeoutMs: this.timeoutMs,
|
|
193
|
+
});
|
|
194
|
+
this.cache.set(id, client);
|
|
195
|
+
}
|
|
196
|
+
// `platformFor` is memoised in the registry; calling it a
|
|
197
|
+
// second time here is a O(1) Promise.resolve from the W3
|
|
198
|
+
// Promise-cache, NOT a fresh probe. Keeps the `ResolvedSite`
|
|
199
|
+
// synthesis self-contained even when the client was warm.
|
|
200
|
+
const platform = await this.registry.platformFor(id);
|
|
201
|
+
const resolved = {
|
|
202
|
+
id,
|
|
203
|
+
url: entry.url,
|
|
204
|
+
platform,
|
|
205
|
+
isDefault: entry.is_default,
|
|
206
|
+
bearerSource: entry.bearer_ref !== undefined ? 'op' : 'plain',
|
|
207
|
+
...(entry.label !== undefined ? { label: entry.label } : {}),
|
|
208
|
+
};
|
|
209
|
+
return { client, site: resolved };
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Drop the cached client for `siteId` — used by the auth layer
|
|
213
|
+
* after a `401 invalid_kid` so the next call re-runs the bearer
|
|
214
|
+
* resolve and builds a fresh {@link RestClient}.
|
|
215
|
+
*
|
|
216
|
+
* No-op when `siteId` is not in the cache.
|
|
217
|
+
*/
|
|
218
|
+
invalidate(siteId) {
|
|
219
|
+
this.cache.delete(siteId);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=client-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-pool.js","sourceRoot":"","sources":["../../src/sites/client-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W3 — Env-Bridge: synthesise a one-site {@link SitesFileT} from the
|
|
3
|
+
* legacy single-site env-vars when no `sites.json` exists on disk.
|
|
4
|
+
*
|
|
5
|
+
* Why: pre-multi-site customers configured the MCP server via
|
|
6
|
+
* `YTB_MCP_SITE_URL` (or the older `YTB_MCP_WP_URL`) + `YTB_MCP_BEARER_TOKEN`.
|
|
7
|
+
* Multi-site infra must NEVER break that experience. When no
|
|
8
|
+
* `sites.json` is found, the boot path consults this bridge; if both
|
|
9
|
+
* required env-vars are present we materialise an in-memory one-site
|
|
10
|
+
* file with `site_id: 'default'` and `is_default: true`. The rest of
|
|
11
|
+
* the system (registry, resolver, tool builder) then operates on
|
|
12
|
+
* `SitesFileT` uniformly — there is no second code path for the
|
|
13
|
+
* legacy single-site case.
|
|
14
|
+
*
|
|
15
|
+
* Returns `null` when either required env-var is missing or empty so
|
|
16
|
+
* the caller can fall through to "no sites configured" UX.
|
|
17
|
+
*
|
|
18
|
+
* W12-R1.1 consolidation:
|
|
19
|
+
* - Env-var names are imported from `../auth.js` (single source of
|
|
20
|
+
* truth) instead of duplicated as string-literals.
|
|
21
|
+
* - Raw URL + bearer are `.trim()`ed; whitespace-only values are
|
|
22
|
+
* treated as missing (return null), matching `loadConfig` behaviour.
|
|
23
|
+
* - Unknown `YTB_MCP_PLATFORM` values throw `ConfigError` so a typo
|
|
24
|
+
* (`woodpress`, `joomlaa`) surfaces immediately instead of silently
|
|
25
|
+
* downgrading to `'auto'` and confusing the runtime probe.
|
|
26
|
+
*
|
|
27
|
+
* @license MIT
|
|
28
|
+
*/
|
|
29
|
+
import type { SitesFileT } from './schema.js';
|
|
30
|
+
/**
|
|
31
|
+
* Trim exactly one trailing `/` from a string. `""` stays `""`. A
|
|
32
|
+
* string with two trailing slashes keeps the inner one (`"a//"` →
|
|
33
|
+
* `"a/"`), preserving the operator's apparent intent — single-slash
|
|
34
|
+
* normalisation is a paste-error fix, not an aggressive cleanup.
|
|
35
|
+
*/
|
|
36
|
+
export declare function stripTrailingSlash(s: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Build a one-site {@link SitesFileT} from `env`, or return `null` if
|
|
39
|
+
* neither URL nor bearer is configured. Order of URL precedence:
|
|
40
|
+
* 1. {@link ENV_SITE_URL} (new, multi-site-aware name)
|
|
41
|
+
* 2. {@link ENV_WP_URL} (legacy single-site name, still honoured)
|
|
42
|
+
*
|
|
43
|
+
* The platform hint comes from {@link ENV_PLATFORM} when set to
|
|
44
|
+
* `wordpress` / `joomla` / `auto`. An empty / unset value falls back to
|
|
45
|
+
* `'auto'` so the runtime probe (see `platformForUrlAsync`) decides.
|
|
46
|
+
* Any OTHER non-empty value throws `ConfigError` — a typo like
|
|
47
|
+
* `woodpress` is loud-failed at boot rather than silently degraded.
|
|
48
|
+
*
|
|
49
|
+
* Note: this function does NOT validate the URL or bearer-token shape
|
|
50
|
+
* beyond non-empty trimming — the W1 {@link SitesFile} schema does that
|
|
51
|
+
* the moment the caller hands the synthesised file to a registry
|
|
52
|
+
* constructor.
|
|
53
|
+
*/
|
|
54
|
+
export declare function synthesiseFromEnv(env: NodeJS.ProcessEnv): SitesFileT | null;
|
|
55
|
+
//# sourceMappingURL=env-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-bridge.d.ts","sourceRoot":"","sources":["../../src/sites/env-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,GACvB,UAAU,GAAG,IAAI,CAqCnB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W3 — Env-Bridge: synthesise a one-site {@link SitesFileT} from the
|
|
3
|
+
* legacy single-site env-vars when no `sites.json` exists on disk.
|
|
4
|
+
*
|
|
5
|
+
* Why: pre-multi-site customers configured the MCP server via
|
|
6
|
+
* `YTB_MCP_SITE_URL` (or the older `YTB_MCP_WP_URL`) + `YTB_MCP_BEARER_TOKEN`.
|
|
7
|
+
* Multi-site infra must NEVER break that experience. When no
|
|
8
|
+
* `sites.json` is found, the boot path consults this bridge; if both
|
|
9
|
+
* required env-vars are present we materialise an in-memory one-site
|
|
10
|
+
* file with `site_id: 'default'` and `is_default: true`. The rest of
|
|
11
|
+
* the system (registry, resolver, tool builder) then operates on
|
|
12
|
+
* `SitesFileT` uniformly — there is no second code path for the
|
|
13
|
+
* legacy single-site case.
|
|
14
|
+
*
|
|
15
|
+
* Returns `null` when either required env-var is missing or empty so
|
|
16
|
+
* the caller can fall through to "no sites configured" UX.
|
|
17
|
+
*
|
|
18
|
+
* W12-R1.1 consolidation:
|
|
19
|
+
* - Env-var names are imported from `../auth.js` (single source of
|
|
20
|
+
* truth) instead of duplicated as string-literals.
|
|
21
|
+
* - Raw URL + bearer are `.trim()`ed; whitespace-only values are
|
|
22
|
+
* treated as missing (return null), matching `loadConfig` behaviour.
|
|
23
|
+
* - Unknown `YTB_MCP_PLATFORM` values throw `ConfigError` so a typo
|
|
24
|
+
* (`woodpress`, `joomlaa`) surfaces immediately instead of silently
|
|
25
|
+
* downgrading to `'auto'` and confusing the runtime probe.
|
|
26
|
+
*
|
|
27
|
+
* @license MIT
|
|
28
|
+
*/
|
|
29
|
+
import { ENV_BEARER, ENV_PLATFORM, ENV_SITE_URL, ENV_WP_URL, } from '../auth.js';
|
|
30
|
+
import { ConfigError } from '../errors.js';
|
|
31
|
+
/**
|
|
32
|
+
* Trim exactly one trailing `/` from a string. `""` stays `""`. A
|
|
33
|
+
* string with two trailing slashes keeps the inner one (`"a//"` →
|
|
34
|
+
* `"a/"`), preserving the operator's apparent intent — single-slash
|
|
35
|
+
* normalisation is a paste-error fix, not an aggressive cleanup.
|
|
36
|
+
*/
|
|
37
|
+
export function stripTrailingSlash(s) {
|
|
38
|
+
if (s.length === 0)
|
|
39
|
+
return s;
|
|
40
|
+
return s.endsWith('/') ? s.slice(0, -1) : s;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a one-site {@link SitesFileT} from `env`, or return `null` if
|
|
44
|
+
* neither URL nor bearer is configured. Order of URL precedence:
|
|
45
|
+
* 1. {@link ENV_SITE_URL} (new, multi-site-aware name)
|
|
46
|
+
* 2. {@link ENV_WP_URL} (legacy single-site name, still honoured)
|
|
47
|
+
*
|
|
48
|
+
* The platform hint comes from {@link ENV_PLATFORM} when set to
|
|
49
|
+
* `wordpress` / `joomla` / `auto`. An empty / unset value falls back to
|
|
50
|
+
* `'auto'` so the runtime probe (see `platformForUrlAsync`) decides.
|
|
51
|
+
* Any OTHER non-empty value throws `ConfigError` — a typo like
|
|
52
|
+
* `woodpress` is loud-failed at boot rather than silently degraded.
|
|
53
|
+
*
|
|
54
|
+
* Note: this function does NOT validate the URL or bearer-token shape
|
|
55
|
+
* beyond non-empty trimming — the W1 {@link SitesFile} schema does that
|
|
56
|
+
* the moment the caller hands the synthesised file to a registry
|
|
57
|
+
* constructor.
|
|
58
|
+
*/
|
|
59
|
+
export function synthesiseFromEnv(env) {
|
|
60
|
+
const rawUrl = (env[ENV_SITE_URL] ?? env[ENV_WP_URL] ?? '').trim();
|
|
61
|
+
const bearer = (env[ENV_BEARER] ?? '').trim();
|
|
62
|
+
if (rawUrl === '' || bearer === '')
|
|
63
|
+
return null;
|
|
64
|
+
const rawPlatform = env[ENV_PLATFORM];
|
|
65
|
+
const platformHint = rawPlatform === undefined ? '' : rawPlatform.trim();
|
|
66
|
+
let platform;
|
|
67
|
+
if (platformHint === '') {
|
|
68
|
+
platform = 'auto';
|
|
69
|
+
}
|
|
70
|
+
else if (platformHint === 'wordpress'
|
|
71
|
+
|| platformHint === 'joomla'
|
|
72
|
+
|| platformHint === 'auto') {
|
|
73
|
+
platform = platformHint;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new ConfigError(`Invalid ${ENV_PLATFORM}: "${platformHint}". `
|
|
77
|
+
+ 'Must be one of: wordpress, joomla, auto (or unset for auto-detect).');
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
schema_version: 1,
|
|
81
|
+
default_site_id: 'default',
|
|
82
|
+
sites: [
|
|
83
|
+
{
|
|
84
|
+
site_id: 'default',
|
|
85
|
+
url: stripTrailingSlash(rawUrl),
|
|
86
|
+
platform,
|
|
87
|
+
bearer,
|
|
88
|
+
is_default: true,
|
|
89
|
+
label: 'Default site (env)',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=env-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-bridge.js","sourceRoot":"","sources":["../../src/sites/env-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACH,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC7B,GAAsB;IAEtB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACzE,IAAI,QAAyC,CAAC;IAC9C,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACtB,QAAQ,GAAG,MAAM,CAAC;IACtB,CAAC;SAAM,IACH,YAAY,KAAK,WAAW;WACzB,YAAY,KAAK,QAAQ;WACzB,YAAY,KAAK,MAAM,EAC5B,CAAC;QACC,QAAQ,GAAG,YAAY,CAAC;IAC5B,CAAC;SAAM,CAAC;QACJ,MAAM,IAAI,WAAW,CACjB,WAAW,YAAY,MAAM,YAAY,KAAK;cAC5C,qEAAqE,CAC1E,CAAC;IACN,CAAC;IAED,OAAO;QACH,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,SAAS;QAC1B,KAAK,EAAE;YACH;gBACI,OAAO,EAAE,SAAS;gBAClB,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC;gBAC/B,QAAQ;gBACR,MAAM;gBACN,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,oBAAoB;aAC9B;SACJ;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W1 — Sites-Storage Foundation: default on-disk path resolver.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order:
|
|
5
|
+
* 1. `$XDG_CONFIG_HOME/yt-builder-mcp/sites.json` (XDG Base-Dir spec)
|
|
6
|
+
* 2. `$HOME/.config/yt-builder-mcp/sites.json` (XDG fallback)
|
|
7
|
+
* 3. `os.tmpdir()/yt-builder-mcp/sites.json` + stderr warning (last
|
|
8
|
+
* resort — used in CI / containers where HOME may be unset).
|
|
9
|
+
*
|
|
10
|
+
* The W2/W3 layer never touches paths directly — callers ask this module
|
|
11
|
+
* for the canonical location and pass the resolved string to the store.
|
|
12
|
+
*
|
|
13
|
+
* @license MIT
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Pure environment lookup so tests can inject a process-env-like object
|
|
17
|
+
* without mutating `process.env`. Returns the path that the load/save
|
|
18
|
+
* layer should target.
|
|
19
|
+
*/
|
|
20
|
+
export declare function defaultSitesFilePath(env?: NodeJS.ProcessEnv, log?: (msg: string) => void): string;
|
|
21
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/sites/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAqD,GAC5E,MAAM,CAgBR"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W1 — Sites-Storage Foundation: default on-disk path resolver.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order:
|
|
5
|
+
* 1. `$XDG_CONFIG_HOME/yt-builder-mcp/sites.json` (XDG Base-Dir spec)
|
|
6
|
+
* 2. `$HOME/.config/yt-builder-mcp/sites.json` (XDG fallback)
|
|
7
|
+
* 3. `os.tmpdir()/yt-builder-mcp/sites.json` + stderr warning (last
|
|
8
|
+
* resort — used in CI / containers where HOME may be unset).
|
|
9
|
+
*
|
|
10
|
+
* The W2/W3 layer never touches paths directly — callers ask this module
|
|
11
|
+
* for the canonical location and pass the resolved string to the store.
|
|
12
|
+
*
|
|
13
|
+
* @license MIT
|
|
14
|
+
*/
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
/**
|
|
18
|
+
* Pure environment lookup so tests can inject a process-env-like object
|
|
19
|
+
* without mutating `process.env`. Returns the path that the load/save
|
|
20
|
+
* layer should target.
|
|
21
|
+
*/
|
|
22
|
+
export function defaultSitesFilePath(env = process.env, log = (msg) => { process.stderr.write(msg + '\n'); }) {
|
|
23
|
+
const xdg = env.XDG_CONFIG_HOME;
|
|
24
|
+
if (xdg !== undefined && xdg.length > 0) {
|
|
25
|
+
return join(xdg, 'yt-builder-mcp', 'sites.json');
|
|
26
|
+
}
|
|
27
|
+
const home = env.HOME;
|
|
28
|
+
if (home !== undefined && home.length > 0) {
|
|
29
|
+
return join(home, '.config', 'yt-builder-mcp', 'sites.json');
|
|
30
|
+
}
|
|
31
|
+
const tmp = tmpdir();
|
|
32
|
+
log(`[yt-builder-mcp] WARN: neither XDG_CONFIG_HOME nor HOME is set — ` +
|
|
33
|
+
`sites file will be stored in ${tmp}/yt-builder-mcp/sites.json. ` +
|
|
34
|
+
`This is ephemeral; set HOME or XDG_CONFIG_HOME for persistence.`);
|
|
35
|
+
return join(tmp, 'yt-builder-mcp', 'sites.json');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/sites/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAChC,MAAyB,OAAO,CAAC,GAAG,EACpC,MAA6B,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,GAAG,CACC,mEAAmE;QACnE,gCAAgC,GAAG,8BAA8B;QACjE,iEAAiE,CACpE,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W12-R1.2 — shared site-probe helper.
|
|
3
|
+
*
|
|
4
|
+
* Both `sites/tools/sites-test.ts` (MCP tool surface) AND
|
|
5
|
+
* `sites/cli/test-site.ts` (CLI surface) need to run the same
|
|
6
|
+
* `/health` (no auth) + `/etag` (auth) parallel probe and classify
|
|
7
|
+
* the outcome into a `{plugin_reachable, bearer_valid, etag_received,
|
|
8
|
+
* summary}` shape. Pre-W12 the two call sites duplicated the
|
|
9
|
+
* Promise.allSettled + RestError branching twice (~40 LoC drift
|
|
10
|
+
* surface).
|
|
11
|
+
*
|
|
12
|
+
* This module is the single source of truth for that probe. The two
|
|
13
|
+
* call sites map the result into their respective output envelopes
|
|
14
|
+
* (toolkit detail-result for MCP, plain text lines for CLI) but never
|
|
15
|
+
* re-implement the probe-routing logic.
|
|
16
|
+
*
|
|
17
|
+
* Failure-mode mapping (audit-aligned):
|
|
18
|
+
* - /health rejects, /etag rejects → plugin unreachable
|
|
19
|
+
* - /health rejects, /etag 401/403 → plugin reachable (etag replied),
|
|
20
|
+
* bearer rejected
|
|
21
|
+
* - /health rejects, /etag other → plugin unreachable
|
|
22
|
+
* (bearer_error still surfaced)
|
|
23
|
+
* - /health ok, /etag rejects → plugin reachable, bearer rejected
|
|
24
|
+
* - /health ok, /etag ok → green
|
|
25
|
+
*
|
|
26
|
+
* Never throws on probe failure — those land in the result fields.
|
|
27
|
+
* Throws only on truly unexpected programmer errors (e.g. the client
|
|
28
|
+
* arg is not a RestClient).
|
|
29
|
+
*
|
|
30
|
+
* @license MIT
|
|
31
|
+
*/
|
|
32
|
+
import type { RestClient } from '../client.js';
|
|
33
|
+
/**
|
|
34
|
+
* Probe outcome shape consumed by both the MCP tool and the CLI. Optional
|
|
35
|
+
* HTTP status codes are surfaced when the probe yielded a `RestError`
|
|
36
|
+
* (helpful for operators triaging 401 vs 404 vs 500).
|
|
37
|
+
*/
|
|
38
|
+
export interface ProbeResult {
|
|
39
|
+
readonly plugin_reachable: boolean;
|
|
40
|
+
readonly bearer_valid: boolean;
|
|
41
|
+
readonly etag_received: boolean;
|
|
42
|
+
readonly summary: string;
|
|
43
|
+
readonly plugin_error?: string;
|
|
44
|
+
readonly bearer_error?: string;
|
|
45
|
+
readonly http_status_health?: number;
|
|
46
|
+
readonly http_status_etag?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Run the canonical `/health` + `/etag` parallel probe against a
|
|
50
|
+
* site-bound {@link RestClient}.
|
|
51
|
+
*
|
|
52
|
+
* `Promise.allSettled` so a thrown probe never short-circuits the
|
|
53
|
+
* other — both legs always contribute to the final classification.
|
|
54
|
+
*
|
|
55
|
+
* The summary string is deterministic per `{plugin_reachable, bearer_valid}`
|
|
56
|
+
* combination so customer-facing UX (CLI table, MCP detail-card) is
|
|
57
|
+
* identical across the two surfaces.
|
|
58
|
+
*/
|
|
59
|
+
export declare function probeSite(client: RestClient): Promise<ProbeResult>;
|
|
60
|
+
//# sourceMappingURL=probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/sites/probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAkExE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W12-R1.2 — shared site-probe helper.
|
|
3
|
+
*
|
|
4
|
+
* Both `sites/tools/sites-test.ts` (MCP tool surface) AND
|
|
5
|
+
* `sites/cli/test-site.ts` (CLI surface) need to run the same
|
|
6
|
+
* `/health` (no auth) + `/etag` (auth) parallel probe and classify
|
|
7
|
+
* the outcome into a `{plugin_reachable, bearer_valid, etag_received,
|
|
8
|
+
* summary}` shape. Pre-W12 the two call sites duplicated the
|
|
9
|
+
* Promise.allSettled + RestError branching twice (~40 LoC drift
|
|
10
|
+
* surface).
|
|
11
|
+
*
|
|
12
|
+
* This module is the single source of truth for that probe. The two
|
|
13
|
+
* call sites map the result into their respective output envelopes
|
|
14
|
+
* (toolkit detail-result for MCP, plain text lines for CLI) but never
|
|
15
|
+
* re-implement the probe-routing logic.
|
|
16
|
+
*
|
|
17
|
+
* Failure-mode mapping (audit-aligned):
|
|
18
|
+
* - /health rejects, /etag rejects → plugin unreachable
|
|
19
|
+
* - /health rejects, /etag 401/403 → plugin reachable (etag replied),
|
|
20
|
+
* bearer rejected
|
|
21
|
+
* - /health rejects, /etag other → plugin unreachable
|
|
22
|
+
* (bearer_error still surfaced)
|
|
23
|
+
* - /health ok, /etag rejects → plugin reachable, bearer rejected
|
|
24
|
+
* - /health ok, /etag ok → green
|
|
25
|
+
*
|
|
26
|
+
* Never throws on probe failure — those land in the result fields.
|
|
27
|
+
* Throws only on truly unexpected programmer errors (e.g. the client
|
|
28
|
+
* arg is not a RestClient).
|
|
29
|
+
*
|
|
30
|
+
* @license MIT
|
|
31
|
+
*/
|
|
32
|
+
import { RestError } from '../errors.js';
|
|
33
|
+
/**
|
|
34
|
+
* Run the canonical `/health` + `/etag` parallel probe against a
|
|
35
|
+
* site-bound {@link RestClient}.
|
|
36
|
+
*
|
|
37
|
+
* `Promise.allSettled` so a thrown probe never short-circuits the
|
|
38
|
+
* other — both legs always contribute to the final classification.
|
|
39
|
+
*
|
|
40
|
+
* The summary string is deterministic per `{plugin_reachable, bearer_valid}`
|
|
41
|
+
* combination so customer-facing UX (CLI table, MCP detail-card) is
|
|
42
|
+
* identical across the two surfaces.
|
|
43
|
+
*/
|
|
44
|
+
export async function probeSite(client) {
|
|
45
|
+
const [healthSettled, etagSettled] = await Promise.allSettled([
|
|
46
|
+
client.get('/health'),
|
|
47
|
+
client.get('/etag'),
|
|
48
|
+
]);
|
|
49
|
+
let pluginReachable = false;
|
|
50
|
+
let bearerValid = false;
|
|
51
|
+
let etagReceived = false;
|
|
52
|
+
let pluginError;
|
|
53
|
+
let bearerError;
|
|
54
|
+
let httpStatusHealth;
|
|
55
|
+
let httpStatusEtag;
|
|
56
|
+
// /health leg — plain liveness probe (no auth required).
|
|
57
|
+
if (healthSettled.status === 'fulfilled') {
|
|
58
|
+
pluginReachable = true;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const e = healthSettled.reason;
|
|
62
|
+
if (e instanceof RestError) {
|
|
63
|
+
httpStatusHealth = e.status;
|
|
64
|
+
pluginError = `HTTP ${String(e.status)}: ${e.message}`;
|
|
65
|
+
}
|
|
66
|
+
else if (e instanceof Error) {
|
|
67
|
+
pluginError = e.message;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
pluginError = String(e);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// /etag leg — bearer-gated. 401/403 means the plugin DID respond
|
|
74
|
+
// and the auth check fired — so we can confidently flip
|
|
75
|
+
// plugin_reachable even if /health hasn't already.
|
|
76
|
+
if (etagSettled.status === 'fulfilled') {
|
|
77
|
+
bearerValid = true;
|
|
78
|
+
etagReceived = true;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const e = etagSettled.reason;
|
|
82
|
+
if (e instanceof RestError) {
|
|
83
|
+
httpStatusEtag = e.status;
|
|
84
|
+
bearerError = `HTTP ${String(e.status)}: ${e.message}`;
|
|
85
|
+
if (e.status === 401 || e.status === 403) {
|
|
86
|
+
pluginReachable = true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (e instanceof Error) {
|
|
90
|
+
bearerError = e.message;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
bearerError = String(e);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const summary = pluginReachable && bearerValid
|
|
97
|
+
? 'OK — plugin reachable and Bearer key accepted.'
|
|
98
|
+
: !pluginReachable
|
|
99
|
+
? 'FAIL — plugin not reachable. Verify the site URL and that the yt-builder-mcp plugin is active.'
|
|
100
|
+
: 'FAIL — plugin reachable but Bearer key rejected. Regenerate the key or update the secret reference.';
|
|
101
|
+
return {
|
|
102
|
+
plugin_reachable: pluginReachable,
|
|
103
|
+
bearer_valid: bearerValid,
|
|
104
|
+
etag_received: etagReceived,
|
|
105
|
+
summary,
|
|
106
|
+
...(pluginError !== undefined ? { plugin_error: pluginError } : {}),
|
|
107
|
+
...(bearerError !== undefined ? { bearer_error: bearerError } : {}),
|
|
108
|
+
...(httpStatusHealth !== undefined ? { http_status_health: httpStatusHealth } : {}),
|
|
109
|
+
...(httpStatusEtag !== undefined ? { http_status_etag: httpStatusEtag } : {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/sites/probe.ts"],"names":[],"mappings":"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"}
|