@noodleseed/one 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents.d.ts +5 -2
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +103 -11
- package/dist/agents.js.map +1 -1
- package/dist/commands/author-loop.d.ts.map +1 -1
- package/dist/commands/author-loop.js +23 -1
- package/dist/commands/author-loop.js.map +1 -1
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +2 -1
- package/dist/commands/shared.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +15 -3
- package/dist/deploy.js.map +1 -1
- package/dist/react-widget-build.d.ts +4 -0
- package/dist/react-widget-build.d.ts.map +1 -0
- package/dist/react-widget-build.js +176 -0
- package/dist/react-widget-build.js.map +1 -0
- package/dist/skills-update.d.ts +43 -0
- package/dist/skills-update.d.ts.map +1 -0
- package/dist/skills-update.js +191 -0
- package/dist/skills-update.js.map +1 -0
- package/dist/tunnel.d.ts +42 -0
- package/dist/tunnel.d.ts.map +1 -0
- package/dist/tunnel.js +60 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/update.d.ts +1 -0
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +23 -11
- package/dist/update.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts +10 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +151 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.d.ts +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +49 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts +7 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +108 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts +29 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.js +87 -114
- package/node_modules/@noodle-borg/agent-kit/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts +17 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +360 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/package.json +4 -2
- package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +2 -2
- package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/connectors.js +4 -2
- package/node_modules/@noodle-borg/authoring/dist/connectors.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/customer-auth.d.ts +2 -2
- package/node_modules/@noodle-borg/authoring/dist/customer-auth.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/customer-auth.js +6 -3
- package/node_modules/@noodle-borg/authoring/dist/customer-auth.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/react.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/react.js +148 -9
- package/node_modules/@noodle-borg/authoring/dist/react.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/package.json +3 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +4 -3
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +20 -9
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-emit.js +2 -0
- package/node_modules/@noodle-borg/compiler/dist/widget-emit.js.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/auth-variables.d.ts +3 -0
- package/node_modules/@noodle-borg/connector-defs/dist/auth-variables.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/auth-variables.js +21 -0
- package/node_modules/@noodle-borg/connector-defs/dist/auth-variables.js.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/compile.js +5 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile.js.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/schema.js +11 -2
- package/node_modules/@noodle-borg/connector-defs/dist/schema.js.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/variables.d.ts +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/variables.d.ts.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/variables.js +7 -0
- package/node_modules/@noodle-borg/connector-defs/dist/variables.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js +14 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/widget/react-bridge-bootstrap.d.ts +3 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/react-bridge-bootstrap.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/react-bridge-bootstrap.js +30 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/react-bridge-bootstrap.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/credential-broker.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/credential-broker.js +27 -6
- package/node_modules/@noodle-borg/service/dist/credential-broker.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/managed-config-expressions.d.ts +6 -0
- package/node_modules/@noodle-borg/service/dist/managed-config-expressions.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/managed-config-expressions.js +80 -0
- package/node_modules/@noodle-borg/service/dist/managed-config-expressions.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.js +5 -1
- package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/serve.js +5 -1
- package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
- package/node_modules/@oxc-project/types/LICENSE +22 -0
- package/node_modules/@oxc-project/types/README.md +3 -0
- package/node_modules/@oxc-project/types/package.json +26 -0
- package/node_modules/@oxc-project/types/types.d.ts +1912 -0
- package/node_modules/@rolldown/binding-linux-x64-gnu/README.md +3 -0
- package/node_modules/@rolldown/binding-linux-x64-gnu/package.json +40 -0
- package/node_modules/@rolldown/binding-linux-x64-gnu/rolldown-binding.linux-x64-gnu.node +0 -0
- package/node_modules/@rolldown/pluginutils/LICENSE +21 -0
- package/node_modules/@rolldown/pluginutils/README.md +145 -0
- package/node_modules/@rolldown/pluginutils/dist/filter/index.d.mts +194 -0
- package/node_modules/@rolldown/pluginutils/dist/filter/index.mjs +2 -0
- package/node_modules/@rolldown/pluginutils/dist/filter-B_mD-HGz.mjs +323 -0
- package/node_modules/@rolldown/pluginutils/dist/index.d.mts +2 -0
- package/node_modules/@rolldown/pluginutils/dist/index.mjs +2 -0
- package/node_modules/@rolldown/pluginutils/package.json +40 -0
- package/node_modules/@vitejs/plugin-react/LICENSE +21 -0
- package/node_modules/@vitejs/plugin-react/README.md +169 -0
- package/node_modules/@vitejs/plugin-react/dist/index.d.ts +48 -0
- package/node_modules/@vitejs/plugin-react/dist/index.js +200 -0
- package/node_modules/@vitejs/plugin-react/dist/refresh-runtime.js +663 -0
- package/node_modules/@vitejs/plugin-react/package.json +87 -0
- package/node_modules/@vitejs/plugin-react/types/optionalTypes.d.ts +12 -0
- package/node_modules/@vitejs/plugin-react/types/preamble.d.ts +1 -0
- package/node_modules/detect-libc/LICENSE +201 -0
- package/node_modules/detect-libc/README.md +163 -0
- package/node_modules/detect-libc/index.d.ts +14 -0
- package/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/node_modules/detect-libc/lib/elf.js +39 -0
- package/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/node_modules/detect-libc/lib/process.js +24 -0
- package/node_modules/detect-libc/package.json +44 -0
- package/node_modules/fdir/LICENSE +7 -0
- package/node_modules/fdir/README.md +91 -0
- package/node_modules/fdir/dist/index.cjs +588 -0
- package/node_modules/fdir/dist/index.d.cts +155 -0
- package/node_modules/fdir/dist/index.d.mts +155 -0
- package/node_modules/fdir/dist/index.mjs +570 -0
- package/node_modules/fdir/package.json +103 -0
- package/node_modules/lightningcss/LICENSE +373 -0
- package/node_modules/lightningcss/README.md +105 -0
- package/node_modules/lightningcss/node/ast.d.ts +9892 -0
- package/node_modules/lightningcss/node/ast.js.flow +10539 -0
- package/node_modules/lightningcss/node/browserslistToTargets.js +48 -0
- package/node_modules/lightningcss/node/composeVisitors.js +450 -0
- package/node_modules/lightningcss/node/flags.js +28 -0
- package/node_modules/lightningcss/node/index.d.ts +494 -0
- package/node_modules/lightningcss/node/index.js +59 -0
- package/node_modules/lightningcss/node/index.js.flow +843 -0
- package/node_modules/lightningcss/node/index.mjs +4 -0
- package/node_modules/lightningcss/node/targets.d.ts +40 -0
- package/node_modules/lightningcss/node/targets.js.flow +39 -0
- package/node_modules/lightningcss/package.json +110 -0
- package/node_modules/lightningcss-linux-x64-gnu/LICENSE +373 -0
- package/node_modules/lightningcss-linux-x64-gnu/README.md +1 -0
- package/node_modules/lightningcss-linux-x64-gnu/lightningcss.linux-x64-gnu.node +0 -0
- package/node_modules/lightningcss-linux-x64-gnu/package.json +37 -0
- package/node_modules/nanoid/.claude/settings.local.json +14 -0
- package/node_modules/nanoid/LICENSE +20 -0
- package/node_modules/nanoid/README.md +39 -0
- package/node_modules/nanoid/async/index.browser.cjs +69 -0
- package/node_modules/nanoid/async/index.browser.js +34 -0
- package/node_modules/nanoid/async/index.cjs +71 -0
- package/node_modules/nanoid/async/index.d.ts +56 -0
- package/node_modules/nanoid/async/index.js +35 -0
- package/node_modules/nanoid/async/index.native.js +26 -0
- package/node_modules/nanoid/async/package.json +12 -0
- package/node_modules/nanoid/bin/nanoid.cjs +55 -0
- package/node_modules/nanoid/index.browser.cjs +72 -0
- package/node_modules/nanoid/index.browser.js +34 -0
- package/node_modules/nanoid/index.cjs +86 -0
- package/node_modules/nanoid/index.d.cts +91 -0
- package/node_modules/nanoid/index.d.ts +91 -0
- package/node_modules/nanoid/index.js +46 -0
- package/node_modules/nanoid/nanoid.js +1 -0
- package/node_modules/nanoid/non-secure/index.cjs +34 -0
- package/node_modules/nanoid/non-secure/index.d.ts +33 -0
- package/node_modules/nanoid/non-secure/index.js +21 -0
- package/node_modules/nanoid/non-secure/package.json +6 -0
- package/node_modules/nanoid/package.json +89 -0
- package/node_modules/nanoid/url-alphabet/index.cjs +7 -0
- package/node_modules/nanoid/url-alphabet/index.js +3 -0
- package/node_modules/nanoid/url-alphabet/package.json +6 -0
- package/node_modules/picocolors/LICENSE +15 -0
- package/node_modules/picocolors/README.md +21 -0
- package/node_modules/picocolors/package.json +25 -0
- package/node_modules/picocolors/picocolors.browser.js +4 -0
- package/node_modules/picocolors/picocolors.d.ts +5 -0
- package/node_modules/picocolors/picocolors.js +75 -0
- package/node_modules/picocolors/types.d.ts +51 -0
- package/node_modules/picomatch/LICENSE +21 -0
- package/node_modules/picomatch/README.md +749 -0
- package/node_modules/picomatch/index.js +17 -0
- package/node_modules/picomatch/lib/constants.js +184 -0
- package/node_modules/picomatch/lib/parse.js +1386 -0
- package/node_modules/picomatch/lib/picomatch.js +349 -0
- package/node_modules/picomatch/lib/scan.js +391 -0
- package/node_modules/picomatch/lib/utils.js +72 -0
- package/node_modules/picomatch/package.json +82 -0
- package/node_modules/picomatch/posix.js +3 -0
- package/node_modules/postcss/LICENSE +20 -0
- package/node_modules/postcss/README.md +28 -0
- package/node_modules/postcss/lib/at-rule.d.ts +139 -0
- package/node_modules/postcss/lib/at-rule.js +25 -0
- package/node_modules/postcss/lib/comment.d.ts +67 -0
- package/node_modules/postcss/lib/comment.js +13 -0
- package/node_modules/postcss/lib/container.d.ts +478 -0
- package/node_modules/postcss/lib/container.js +447 -0
- package/node_modules/postcss/lib/css-syntax-error.d.ts +247 -0
- package/node_modules/postcss/lib/css-syntax-error.js +133 -0
- package/node_modules/postcss/lib/declaration.d.ts +150 -0
- package/node_modules/postcss/lib/declaration.js +24 -0
- package/node_modules/postcss/lib/document.d.ts +68 -0
- package/node_modules/postcss/lib/document.js +33 -0
- package/node_modules/postcss/lib/fromJSON.d.ts +9 -0
- package/node_modules/postcss/lib/fromJSON.js +54 -0
- package/node_modules/postcss/lib/input.d.ts +226 -0
- package/node_modules/postcss/lib/input.js +273 -0
- package/node_modules/postcss/lib/lazy-result.d.ts +189 -0
- package/node_modules/postcss/lib/lazy-result.js +563 -0
- package/node_modules/postcss/lib/list.d.ts +60 -0
- package/node_modules/postcss/lib/list.js +58 -0
- package/node_modules/postcss/lib/map-generator.js +376 -0
- package/node_modules/postcss/lib/no-work-result.d.ts +45 -0
- package/node_modules/postcss/lib/no-work-result.js +137 -0
- package/node_modules/postcss/lib/node.d.ts +555 -0
- package/node_modules/postcss/lib/node.js +449 -0
- package/node_modules/postcss/lib/parse.d.ts +9 -0
- package/node_modules/postcss/lib/parse.js +42 -0
- package/node_modules/postcss/lib/parser.js +618 -0
- package/node_modules/postcss/lib/postcss.d.mts +66 -0
- package/node_modules/postcss/lib/postcss.d.ts +461 -0
- package/node_modules/postcss/lib/postcss.js +101 -0
- package/node_modules/postcss/lib/postcss.mjs +30 -0
- package/node_modules/postcss/lib/previous-map.d.ts +80 -0
- package/node_modules/postcss/lib/previous-map.js +161 -0
- package/node_modules/postcss/lib/processor.d.ts +114 -0
- package/node_modules/postcss/lib/processor.js +67 -0
- package/node_modules/postcss/lib/result.d.ts +204 -0
- package/node_modules/postcss/lib/result.js +42 -0
- package/node_modules/postcss/lib/root.d.ts +86 -0
- package/node_modules/postcss/lib/root.js +61 -0
- package/node_modules/postcss/lib/rule.d.ts +126 -0
- package/node_modules/postcss/lib/rule.js +27 -0
- package/node_modules/postcss/lib/stringifier.d.ts +45 -0
- package/node_modules/postcss/lib/stringifier.js +374 -0
- package/node_modules/postcss/lib/stringify.d.ts +9 -0
- package/node_modules/postcss/lib/stringify.js +11 -0
- package/node_modules/postcss/lib/symbols.js +5 -0
- package/node_modules/postcss/lib/terminal-highlight.js +70 -0
- package/node_modules/postcss/lib/tokenize.js +270 -0
- package/node_modules/postcss/lib/warn-once.js +13 -0
- package/node_modules/postcss/lib/warning.d.ts +146 -0
- package/node_modules/postcss/lib/warning.js +37 -0
- package/node_modules/postcss/package.json +88 -0
- package/node_modules/rolldown/LICENSE +25 -0
- package/node_modules/rolldown/README.md +11 -0
- package/node_modules/rolldown/bin/cli.mjs +2 -0
- package/node_modules/rolldown/dist/cli.d.mts +1 -0
- package/node_modules/rolldown/dist/cli.mjs +1202 -0
- package/node_modules/rolldown/dist/config.d.mts +14 -0
- package/node_modules/rolldown/dist/config.mjs +4 -0
- package/node_modules/rolldown/dist/experimental-index.d.mts +280 -0
- package/node_modules/rolldown/dist/experimental-index.mjs +330 -0
- package/node_modules/rolldown/dist/experimental-runtime-types.d.ts +107 -0
- package/node_modules/rolldown/dist/filter-index.d.mts +195 -0
- package/node_modules/rolldown/dist/filter-index.mjs +380 -0
- package/node_modules/rolldown/dist/get-log-filter.d.mts +3 -0
- package/node_modules/rolldown/dist/get-log-filter.mjs +68 -0
- package/node_modules/rolldown/dist/index.d.mts +4 -0
- package/node_modules/rolldown/dist/index.mjs +50 -0
- package/node_modules/rolldown/dist/parallel-plugin-worker.d.mts +1 -0
- package/node_modules/rolldown/dist/parallel-plugin-worker.mjs +28 -0
- package/node_modules/rolldown/dist/parallel-plugin.d.mts +13 -0
- package/node_modules/rolldown/dist/parallel-plugin.mjs +6 -0
- package/node_modules/rolldown/dist/parse-ast-index.d.mts +32 -0
- package/node_modules/rolldown/dist/parse-ast-index.mjs +60 -0
- package/node_modules/rolldown/dist/plugins-index.d.mts +33 -0
- package/node_modules/rolldown/dist/plugins-index.mjs +40 -0
- package/node_modules/rolldown/dist/shared/binding-B1q9aYT-.d.mts +1947 -0
- package/node_modules/rolldown/dist/shared/binding-Dh6LYCIB.mjs +589 -0
- package/node_modules/rolldown/dist/shared/bindingify-input-options-CzVhGygm.mjs +2240 -0
- package/node_modules/rolldown/dist/shared/constructors-688OwP2q.mjs +65 -0
- package/node_modules/rolldown/dist/shared/constructors-awZ1VNvg.d.mts +36 -0
- package/node_modules/rolldown/dist/shared/define-config-Demdg3_4.mjs +6 -0
- package/node_modules/rolldown/dist/shared/define-config-sxBscJ3M.d.mts +3901 -0
- package/node_modules/rolldown/dist/shared/error-B68YLzl3.mjs +85 -0
- package/node_modules/rolldown/dist/shared/get-log-filter-BpNVNJ5-.d.mts +35 -0
- package/node_modules/rolldown/dist/shared/load-config-BvPPEM7l.mjs +120 -0
- package/node_modules/rolldown/dist/shared/logging-BSNejiLS.d.mts +50 -0
- package/node_modules/rolldown/dist/shared/logs-aMKUxRpj.mjs +180 -0
- package/node_modules/rolldown/dist/shared/misc-CoQm4NHO.mjs +21 -0
- package/node_modules/rolldown/dist/shared/normalize-string-or-regex-BpXHYeN4.mjs +68 -0
- package/node_modules/rolldown/dist/shared/parse-CTgsjpo8.mjs +74 -0
- package/node_modules/rolldown/dist/shared/prompt-B1Yc1NPt.mjs +847 -0
- package/node_modules/rolldown/dist/shared/resolve-tsconfig-BkhP9bkX.mjs +124 -0
- package/node_modules/rolldown/dist/shared/rolldown-Brph2NSU.mjs +40 -0
- package/node_modules/rolldown/dist/shared/rolldown-build-DR0wzp0V.mjs +3264 -0
- package/node_modules/rolldown/dist/shared/transform-CEmFsvJW.d.mts +149 -0
- package/node_modules/rolldown/dist/shared/watch-FrHSqg24.mjs +374 -0
- package/node_modules/rolldown/dist/utils-index.d.mts +376 -0
- package/node_modules/rolldown/dist/utils-index.mjs +2414 -0
- package/node_modules/rolldown/package.json +153 -0
- package/node_modules/source-map-js/LICENSE +28 -0
- package/node_modules/source-map-js/README.md +765 -0
- package/node_modules/source-map-js/lib/array-set.js +121 -0
- package/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/node_modules/source-map-js/lib/base64.js +67 -0
- package/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/node_modules/source-map-js/lib/source-map-consumer.d.ts +1 -0
- package/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/node_modules/source-map-js/lib/source-map-generator.d.ts +1 -0
- package/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/node_modules/source-map-js/lib/source-node.d.ts +1 -0
- package/node_modules/source-map-js/lib/source-node.js +413 -0
- package/node_modules/source-map-js/lib/util.js +594 -0
- package/node_modules/source-map-js/package.json +71 -0
- package/node_modules/source-map-js/source-map.d.ts +104 -0
- package/node_modules/source-map-js/source-map.js +8 -0
- package/node_modules/tinyglobby/LICENSE +21 -0
- package/node_modules/tinyglobby/README.md +25 -0
- package/node_modules/tinyglobby/dist/index.cjs +335 -0
- package/node_modules/tinyglobby/dist/index.d.cts +148 -0
- package/node_modules/tinyglobby/dist/index.d.mts +148 -0
- package/node_modules/tinyglobby/dist/index.mjs +307 -0
- package/node_modules/tinyglobby/package.json +70 -0
- package/node_modules/vite/LICENSE.md +2287 -0
- package/node_modules/vite/README.md +20 -0
- package/node_modules/vite/bin/openChrome.js +68 -0
- package/node_modules/vite/bin/vite.js +79 -0
- package/node_modules/vite/client.d.ts +285 -0
- package/node_modules/vite/dist/client/client.mjs +1269 -0
- package/node_modules/vite/dist/client/env.mjs +18 -0
- package/node_modules/vite/dist/node/chunks/build.js +5371 -0
- package/node_modules/vite/dist/node/chunks/dist.js +6784 -0
- package/node_modules/vite/dist/node/chunks/lib.js +371 -0
- package/node_modules/vite/dist/node/chunks/logger.js +364 -0
- package/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts +96 -0
- package/node_modules/vite/dist/node/chunks/node.js +35770 -0
- package/node_modules/vite/dist/node/chunks/postcss-import.js +467 -0
- package/node_modules/vite/dist/node/cli.js +836 -0
- package/node_modules/vite/dist/node/index.d.ts +4010 -0
- package/node_modules/vite/dist/node/index.js +3 -0
- package/node_modules/vite/dist/node/internal.d.ts +2 -0
- package/node_modules/vite/dist/node/internal.js +2 -0
- package/node_modules/vite/dist/node/module-runner.d.ts +314 -0
- package/node_modules/vite/dist/node/module-runner.js +1274 -0
- package/node_modules/vite/misc/false.js +1 -0
- package/node_modules/vite/misc/true.js +1 -0
- package/node_modules/vite/package.json +194 -0
- package/node_modules/vite/types/customEvent.d.ts +79 -0
- package/node_modules/vite/types/hmrPayload.d.ts +80 -0
- package/node_modules/vite/types/hot.d.ts +39 -0
- package/node_modules/vite/types/import-meta.d.ts +5 -0
- package/node_modules/vite/types/importGlob.d.ts +131 -0
- package/node_modules/vite/types/importMeta.d.ts +30 -0
- package/node_modules/vite/types/internal/cssPreprocessorOptions.d.ts +44 -0
- package/node_modules/vite/types/internal/esbuildOptions.d.ts +28 -0
- package/node_modules/vite/types/internal/lightningcssOptions.d.ts +18 -0
- package/node_modules/vite/types/internal/rollupTypeCompat.d.ts +24 -0
- package/node_modules/vite/types/internal/terserOptions.d.ts +11 -0
- package/node_modules/vite/types/metadata.d.ts +47 -0
- package/package.json +22 -2
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, mkdtempSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
|
+
import { build as viteBuild } from 'vite';
|
|
7
|
+
export async function buildReactWidgetViews(manifestJson, options) {
|
|
8
|
+
const manifest = JSON.parse(manifestJson);
|
|
9
|
+
const widgets = manifest.widgets ?? [];
|
|
10
|
+
if (widgets.every((widget) => widget.view === undefined))
|
|
11
|
+
return manifestJson;
|
|
12
|
+
manifest.widgets = await Promise.all(widgets.map(async (widget) => {
|
|
13
|
+
if (widget.view === undefined)
|
|
14
|
+
return widget;
|
|
15
|
+
return {
|
|
16
|
+
...widget,
|
|
17
|
+
view: {
|
|
18
|
+
...widget.view,
|
|
19
|
+
compiledHtml: await buildReactWidgetHtml({
|
|
20
|
+
rootDir: options.rootDir,
|
|
21
|
+
title: widget.title ?? widget.view.component,
|
|
22
|
+
component: widget.view.component,
|
|
23
|
+
entry: widget.view.entry,
|
|
24
|
+
}),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}));
|
|
28
|
+
return JSON.stringify(manifest);
|
|
29
|
+
}
|
|
30
|
+
async function buildReactWidgetHtml(input) {
|
|
31
|
+
const entry = resolveWidgetEntry(input.rootDir, input.entry);
|
|
32
|
+
const dir = mkdtempSync(join(tmpdir(), `noodle-react-widget-${process.pid}-`));
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
const generatedEntry = join(dir, 'entry.tsx');
|
|
35
|
+
writeFileSync(generatedEntry, reactWidgetEntrySource(entry));
|
|
36
|
+
const result = await viteBuild({
|
|
37
|
+
root: input.rootDir,
|
|
38
|
+
configFile: false,
|
|
39
|
+
logLevel: 'silent',
|
|
40
|
+
mode: 'production',
|
|
41
|
+
define: { 'process.env.NODE_ENV': JSON.stringify('production') },
|
|
42
|
+
esbuild: { jsxDev: false },
|
|
43
|
+
plugins: [reactSourceAliasPlugin()],
|
|
44
|
+
resolve: {
|
|
45
|
+
alias: [
|
|
46
|
+
{ find: /^react$/, replacement: resolvePackageModule('react', input.rootDir) },
|
|
47
|
+
{
|
|
48
|
+
find: /^react\/jsx-runtime$/,
|
|
49
|
+
replacement: resolvePackageModule('react/jsx-runtime', input.rootDir),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
find: /^react\/jsx-dev-runtime$/,
|
|
53
|
+
replacement: resolvePackageModule('react/jsx-dev-runtime', input.rootDir),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
find: /^react-dom\/client$/,
|
|
57
|
+
replacement: resolvePackageModule('react-dom/client', input.rootDir),
|
|
58
|
+
},
|
|
59
|
+
{ find: /^@noodleseed\/one\/react$/, replacement: reactHelperModulePath() },
|
|
60
|
+
],
|
|
61
|
+
dedupe: ['react', 'react-dom'],
|
|
62
|
+
},
|
|
63
|
+
build: {
|
|
64
|
+
write: false,
|
|
65
|
+
sourcemap: false,
|
|
66
|
+
minify: true,
|
|
67
|
+
assetsInlineLimit: Number.MAX_SAFE_INTEGER,
|
|
68
|
+
rollupOptions: {
|
|
69
|
+
input: generatedEntry,
|
|
70
|
+
output: {
|
|
71
|
+
format: 'es',
|
|
72
|
+
inlineDynamicImports: true,
|
|
73
|
+
entryFileNames: 'widget.js',
|
|
74
|
+
assetFileNames: 'widget.[ext]',
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
const output = viteOutput(result);
|
|
80
|
+
if (output === undefined)
|
|
81
|
+
throw new Error(`React widget "${input.component}" produced no bundle`);
|
|
82
|
+
const scripts = output
|
|
83
|
+
.filter(isViteChunk)
|
|
84
|
+
.map((item) => item.code)
|
|
85
|
+
.join('\n');
|
|
86
|
+
const styles = output
|
|
87
|
+
.filter(isViteCssAsset)
|
|
88
|
+
.map((item) => String(item.source))
|
|
89
|
+
.join('\n');
|
|
90
|
+
return [
|
|
91
|
+
'<!doctype html>',
|
|
92
|
+
'<html>',
|
|
93
|
+
'<head>',
|
|
94
|
+
'<meta charset="utf-8">',
|
|
95
|
+
`<title>${escapeHtml(input.title)}</title>`,
|
|
96
|
+
styles ? `<style data-noodle-react-bundle>${safeStyle(styles)}</style>` : '',
|
|
97
|
+
'</head>',
|
|
98
|
+
'<body>',
|
|
99
|
+
`<main id="noodle-react-root" data-noodle-react-view="${escapeHtml(input.component)}"></main>`,
|
|
100
|
+
'<noscript>This React widget requires JavaScript in the host iframe.</noscript>',
|
|
101
|
+
`<script type="module" data-noodle-react-bundle>${safeScript(scripts)}</script>`,
|
|
102
|
+
'</body>',
|
|
103
|
+
'</html>',
|
|
104
|
+
].join('');
|
|
105
|
+
}
|
|
106
|
+
function viteOutput(result) {
|
|
107
|
+
if (Array.isArray(result))
|
|
108
|
+
return result[0]?.output;
|
|
109
|
+
return result?.output;
|
|
110
|
+
}
|
|
111
|
+
function isViteChunk(item) {
|
|
112
|
+
return item.type === 'chunk';
|
|
113
|
+
}
|
|
114
|
+
function isViteCssAsset(item) {
|
|
115
|
+
return item.type === 'asset' && item.fileName.endsWith('.css');
|
|
116
|
+
}
|
|
117
|
+
function resolveWidgetEntry(rootDir, entry) {
|
|
118
|
+
const resolved = isAbsolute(entry) ? entry : resolve(rootDir, entry);
|
|
119
|
+
if (!existsSync(resolved))
|
|
120
|
+
throw new Error(`React widget entry not found: ${entry}`);
|
|
121
|
+
return resolved;
|
|
122
|
+
}
|
|
123
|
+
function reactWidgetEntrySource(entry) {
|
|
124
|
+
return `
|
|
125
|
+
import React from 'react';
|
|
126
|
+
import { createRoot } from 'react-dom/client';
|
|
127
|
+
import Component from ${JSON.stringify(pathToFileURL(entry).href)};
|
|
128
|
+
|
|
129
|
+
const root = document.getElementById('noodle-react-root');
|
|
130
|
+
if (root) {
|
|
131
|
+
createRoot(root).render(React.createElement(Component));
|
|
132
|
+
}
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
function reactHelperModulePath() {
|
|
136
|
+
const sourcePath = resolve(packageRoot(), '..', 'authoring', 'src', 'react.ts');
|
|
137
|
+
if (existsSync(sourcePath))
|
|
138
|
+
return sourcePath;
|
|
139
|
+
return resolve(packageRoot(), 'node_modules', '@noodle-borg', 'authoring', 'dist', 'react.js');
|
|
140
|
+
}
|
|
141
|
+
function resolvePackageModule(id, rootDir) {
|
|
142
|
+
const fromApp = createRequire(join(rootDir, 'package.json'));
|
|
143
|
+
try {
|
|
144
|
+
return fromApp.resolve(id);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return createRequire(import.meta.url).resolve(id);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function reactSourceAliasPlugin() {
|
|
151
|
+
return {
|
|
152
|
+
name: 'noodle-react-source-alias',
|
|
153
|
+
resolveId(source) {
|
|
154
|
+
if (source === '@noodleseed/one/react')
|
|
155
|
+
return reactHelperModulePath();
|
|
156
|
+
return null;
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function packageRoot() {
|
|
161
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
162
|
+
}
|
|
163
|
+
function escapeHtml(value) {
|
|
164
|
+
return value
|
|
165
|
+
.replaceAll('&', '&')
|
|
166
|
+
.replaceAll('"', '"')
|
|
167
|
+
.replaceAll('<', '<')
|
|
168
|
+
.replaceAll('>', '>');
|
|
169
|
+
}
|
|
170
|
+
function safeScript(value) {
|
|
171
|
+
return value.replaceAll('</script', '<\\/script');
|
|
172
|
+
}
|
|
173
|
+
function safeStyle(value) {
|
|
174
|
+
return value.replaceAll('</style', '<\\/style');
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=react-widget-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-widget-build.js","sourceRoot":"","sources":["../src/react-widget-build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type AgentKitManifest } from '@noodle-borg/agent-kit';
|
|
2
|
+
export declare const AGENT_KIT_PACKAGE_NAME = "@noodleseed/agent-kit";
|
|
3
|
+
/** The agent-kit version vendored into this CLI build. The offline fallback uses this snapshot. */
|
|
4
|
+
export declare function bundledAgentKitVersion(): string;
|
|
5
|
+
export declare function skillsUpdatePromptMessage(latest: string, current: string): string;
|
|
6
|
+
/** Fetch the registry `latest` dist-tag version of `@noodleseed/agent-kit`. Returns undefined on any failure. */
|
|
7
|
+
export declare function fetchLatestAgentKitVersion(fetchImpl?: typeof fetch): Promise<string | undefined>;
|
|
8
|
+
export declare function isSkillsUpdateAvailable(registryVersion: string | undefined, current?: string): boolean;
|
|
9
|
+
export type SkillsStaleness = 'current' | 'stale' | 'unknown';
|
|
10
|
+
/** Compare an installed skill file's frontmatter version to the registry latest. */
|
|
11
|
+
export declare function skillStaleness(installedVersion: string | undefined, registryVersion: string | undefined): SkillsStaleness;
|
|
12
|
+
/**
|
|
13
|
+
* Extract every regular file from a `.tgz` tarball as `{package-relative path: text content}`.
|
|
14
|
+
* A minimal, dependency-free ustar reader; only handles the entries npm `pack` produces.
|
|
15
|
+
* Throws on malformed input so callers fall back to the bundled snapshot.
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractTarGz(tgz: Buffer): Map<string, string>;
|
|
18
|
+
export interface FetchedAgentKit {
|
|
19
|
+
readonly version: string;
|
|
20
|
+
readonly manifest: AgentKitManifest;
|
|
21
|
+
/** package-relative path → file content (every file listed in the manifest: SKILL.md + references). */
|
|
22
|
+
readonly files: ReadonlyMap<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export interface AgentKitResolveResult {
|
|
25
|
+
readonly status: 'no-update' | 'fetch-failed' | 'integrity-mismatch' | 'ready' | 'offline';
|
|
26
|
+
readonly kit?: FetchedAgentKit;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the latest `@noodleseed/agent-kit` skill files for writing.
|
|
30
|
+
*
|
|
31
|
+
* Fetches the published tarball (via `npm pack` by default), verifies every file's sha256 against
|
|
32
|
+
* the shipped `manifest.json`, and returns the verified files. Any failure (network, missing manifest,
|
|
33
|
+
* sha256 mismatch) returns a non-`ready` status so the caller falls back to the bundled snapshot —
|
|
34
|
+
* the CLI never writes untrusted or unverified content into a user's repo.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveAgentKit(input: {
|
|
37
|
+
readonly registryVersion: string | undefined;
|
|
38
|
+
readonly cacheDir: string;
|
|
39
|
+
readonly fetchImpl?: typeof fetch;
|
|
40
|
+
readonly packImpl?: (version: string, dir: string) => Promise<Buffer | undefined>;
|
|
41
|
+
readonly force?: boolean;
|
|
42
|
+
}): Promise<AgentKitResolveResult>;
|
|
43
|
+
//# sourceMappingURL=skills-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-update.d.ts","sourceRoot":"","sources":["../src/skills-update.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,gBAAgB,EAAiB,MAAM,wBAAwB,CAAC;AAGjG,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAG9D,mGAAmG;AACnG,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,iHAAiH;AACjH,wBAAsB,0BAA0B,CAC9C,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAED,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,GAAE,MAAiC,GACzC,OAAO,CAET;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE9D,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,eAAe,CAMjB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmB7D;AAUD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,oBAAoB,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3F,QAAQ,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA+BjC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { gunzipSync } from 'node:zlib';
|
|
5
|
+
import { AGENT_KIT_VERSION, contentSha256 } from '@noodle-borg/agent-kit';
|
|
6
|
+
import { compareVersions } from './update.js';
|
|
7
|
+
export const AGENT_KIT_PACKAGE_NAME = '@noodleseed/agent-kit';
|
|
8
|
+
const REGISTRY_LATEST_URL = `https://registry.npmjs.org/${AGENT_KIT_PACKAGE_NAME.replace('/', '%2F')}/latest`;
|
|
9
|
+
/** The agent-kit version vendored into this CLI build. The offline fallback uses this snapshot. */
|
|
10
|
+
export function bundledAgentKitVersion() {
|
|
11
|
+
return AGENT_KIT_VERSION;
|
|
12
|
+
}
|
|
13
|
+
export function skillsUpdatePromptMessage(latest, current) {
|
|
14
|
+
return `Skills updated in v${latest} (you have v${current}). Run \`noodle agents setup --write\` to refresh.`;
|
|
15
|
+
}
|
|
16
|
+
/** Fetch the registry `latest` dist-tag version of `@noodleseed/agent-kit`. Returns undefined on any failure. */
|
|
17
|
+
export async function fetchLatestAgentKitVersion(fetchImpl = fetch) {
|
|
18
|
+
try {
|
|
19
|
+
const res = await fetchImpl(REGISTRY_LATEST_URL, {
|
|
20
|
+
headers: { accept: 'application/json' },
|
|
21
|
+
signal: AbortSignal.timeout(1500),
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok)
|
|
24
|
+
return undefined;
|
|
25
|
+
const body = (await res.json());
|
|
26
|
+
return typeof body.version === 'string' ? body.version : undefined;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function isSkillsUpdateAvailable(registryVersion, current = bundledAgentKitVersion()) {
|
|
33
|
+
return registryVersion !== undefined && compareVersions(registryVersion, current) > 0;
|
|
34
|
+
}
|
|
35
|
+
/** Compare an installed skill file's frontmatter version to the registry latest. */
|
|
36
|
+
export function skillStaleness(installedVersion, registryVersion) {
|
|
37
|
+
if (registryVersion === undefined)
|
|
38
|
+
return 'unknown';
|
|
39
|
+
if (installedVersion === undefined)
|
|
40
|
+
return 'stale';
|
|
41
|
+
const cmp = compareVersions(registryVersion, installedVersion);
|
|
42
|
+
if (cmp === 0)
|
|
43
|
+
return 'current';
|
|
44
|
+
return cmp > 0 ? 'stale' : 'current';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Extract every regular file from a `.tgz` tarball as `{package-relative path: text content}`.
|
|
48
|
+
* A minimal, dependency-free ustar reader; only handles the entries npm `pack` produces.
|
|
49
|
+
* Throws on malformed input so callers fall back to the bundled snapshot.
|
|
50
|
+
*/
|
|
51
|
+
export function extractTarGz(tgz) {
|
|
52
|
+
const tar = gunzipSync(tgz);
|
|
53
|
+
const files = new Map();
|
|
54
|
+
let offset = 0;
|
|
55
|
+
while (offset + 512 <= tar.length) {
|
|
56
|
+
const header = tar.subarray(offset, offset + 512);
|
|
57
|
+
const name = readField(header, 0, 100).replace(/\0/g, '');
|
|
58
|
+
if (name === '')
|
|
59
|
+
break;
|
|
60
|
+
const size = parseOctal(readField(header, 124, 12));
|
|
61
|
+
const typeflag = String.fromCharCode(header[156] ?? 0x30);
|
|
62
|
+
offset += 512;
|
|
63
|
+
if (typeflag === '0' || typeflag === '\0') {
|
|
64
|
+
const content = tar.subarray(offset, offset + size);
|
|
65
|
+
files.set(name, Buffer.from(content).toString('utf8'));
|
|
66
|
+
}
|
|
67
|
+
// tar records are padded to 512-byte boundaries
|
|
68
|
+
offset += Math.ceil(size / 512) * 512;
|
|
69
|
+
}
|
|
70
|
+
return files;
|
|
71
|
+
}
|
|
72
|
+
function readField(buf, start, len) {
|
|
73
|
+
return buf.toString('latin1', start, start + len);
|
|
74
|
+
}
|
|
75
|
+
function parseOctal(s) {
|
|
76
|
+
return Number.parseInt(s.replace(/\0/g, '').trim(), 8) || 0;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve the latest `@noodleseed/agent-kit` skill files for writing.
|
|
80
|
+
*
|
|
81
|
+
* Fetches the published tarball (via `npm pack` by default), verifies every file's sha256 against
|
|
82
|
+
* the shipped `manifest.json`, and returns the verified files. Any failure (network, missing manifest,
|
|
83
|
+
* sha256 mismatch) returns a non-`ready` status so the caller falls back to the bundled snapshot —
|
|
84
|
+
* the CLI never writes untrusted or unverified content into a user's repo.
|
|
85
|
+
*/
|
|
86
|
+
export async function resolveAgentKit(input) {
|
|
87
|
+
const version = input.registryVersion;
|
|
88
|
+
if (version === undefined)
|
|
89
|
+
return { status: 'offline' };
|
|
90
|
+
if (!isSkillsUpdateAvailable(version) && input.force !== true) {
|
|
91
|
+
return { status: 'no-update' };
|
|
92
|
+
}
|
|
93
|
+
const cacheVersionDir = join(input.cacheDir, version);
|
|
94
|
+
const manifestPath = join(cacheVersionDir, 'manifest.json');
|
|
95
|
+
if (!input.force && existsSync(manifestPath)) {
|
|
96
|
+
const cached = loadCachedKit(cacheVersionDir);
|
|
97
|
+
if (cached !== undefined)
|
|
98
|
+
return { status: 'ready', kit: cached };
|
|
99
|
+
}
|
|
100
|
+
const packImpl = input.packImpl ?? defaultPack;
|
|
101
|
+
const tgz = await packImpl(version, cacheVersionDir).catch(() => undefined);
|
|
102
|
+
if (tgz === undefined)
|
|
103
|
+
return { status: 'fetch-failed' };
|
|
104
|
+
try {
|
|
105
|
+
const entries = extractTarGz(tgz);
|
|
106
|
+
const manifest = readManifest(entries);
|
|
107
|
+
if (manifest === undefined)
|
|
108
|
+
return { status: 'fetch-failed' };
|
|
109
|
+
const files = new Map();
|
|
110
|
+
for (const entry of manifest.files) {
|
|
111
|
+
const content = entries.get(`package/${entry.path}`);
|
|
112
|
+
if (content === undefined)
|
|
113
|
+
return { status: 'integrity-mismatch' };
|
|
114
|
+
if (contentSha256(content) !== entry.sha256)
|
|
115
|
+
return { status: 'integrity-mismatch' };
|
|
116
|
+
files.set(entry.path, content);
|
|
117
|
+
}
|
|
118
|
+
writeCache(cacheVersionDir, manifest, files);
|
|
119
|
+
return { status: 'ready', kit: { version, manifest, files } };
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return { status: 'fetch-failed' };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function readManifest(entries) {
|
|
126
|
+
const content = entries.get('package/manifest.json');
|
|
127
|
+
if (content === undefined)
|
|
128
|
+
return undefined;
|
|
129
|
+
try {
|
|
130
|
+
return JSON.parse(content);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function loadCachedKit(dir) {
|
|
137
|
+
try {
|
|
138
|
+
const manifest = JSON.parse(readFileSync(join(dir, 'manifest.json'), 'utf8'));
|
|
139
|
+
const files = new Map();
|
|
140
|
+
for (const entry of manifest.files) {
|
|
141
|
+
const content = readFileSync(join(dir, entry.path), 'utf8');
|
|
142
|
+
if (contentSha256(content) !== entry.sha256)
|
|
143
|
+
return undefined;
|
|
144
|
+
files.set(entry.path, content);
|
|
145
|
+
}
|
|
146
|
+
return { version: manifest.packageVersion, manifest, files };
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function writeCache(dir, manifest, files) {
|
|
153
|
+
mkdirSync(dir, { recursive: true });
|
|
154
|
+
for (const [path, content] of files) {
|
|
155
|
+
const full = join(dir, path);
|
|
156
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
157
|
+
writeFileSync(full, content);
|
|
158
|
+
}
|
|
159
|
+
writeFileSync(join(dir, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
160
|
+
}
|
|
161
|
+
// Default pack implementation: `npm pack @noodleseed/agent-kit@<version>` into a temp directory.
|
|
162
|
+
async function defaultPack(version, dir) {
|
|
163
|
+
mkdirSync(dir, { recursive: true });
|
|
164
|
+
return new Promise((resolve) => {
|
|
165
|
+
const child = spawn('npm', ['pack', `${AGENT_KIT_PACKAGE_NAME}@${version}`], {
|
|
166
|
+
cwd: dir,
|
|
167
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
168
|
+
});
|
|
169
|
+
let stdout = '';
|
|
170
|
+
child.stdout?.on('data', (chunk) => {
|
|
171
|
+
stdout += chunk.toString();
|
|
172
|
+
});
|
|
173
|
+
child.on('error', () => resolve(undefined));
|
|
174
|
+
child.on('close', (code) => {
|
|
175
|
+
if (code !== 0)
|
|
176
|
+
return resolve(undefined);
|
|
177
|
+
const filename = stdout.trim().split('\n').pop();
|
|
178
|
+
if (filename === undefined)
|
|
179
|
+
return resolve(undefined);
|
|
180
|
+
try {
|
|
181
|
+
const bytes = readFileSync(join(dir, filename));
|
|
182
|
+
rmSync(join(dir, filename), { force: true });
|
|
183
|
+
resolve(bytes);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
resolve(undefined);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=skills-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-update.js","sourceRoot":"","sources":["../src/skills-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAyB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAC9D,MAAM,mBAAmB,GAAG,8BAA8B,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC;AAE9G,mGAAmG;AACnG,MAAM,UAAU,sBAAsB;IACpC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAc,EAAE,OAAe;IACvE,OAAO,sBAAsB,MAAM,eAAe,OAAO,oDAAoD,CAAC;AAChH,CAAC;AAED,iHAAiH;AACjH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,YAA0B,KAAK;IAE/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,mBAAmB,EAAE;YAC/C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;QACzD,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,eAAmC,EACnC,UAAkB,sBAAsB,EAAE;IAE1C,OAAO,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACxF,CAAC;AAID,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAC5B,gBAAoC,EACpC,eAAmC;IAEnC,IAAI,eAAe,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACnD,MAAM,GAAG,GAAG,eAAe,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IAC/D,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,KAAK,EAAE;YAAE,MAAM;QACvB,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAC;QACd,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;YACpD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,gDAAgD;QAChD,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW;IACxD,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAcD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAMrC;IACC,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACxD,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACpE,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC;IAC/C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5E,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACnE,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACrF,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,UAAU,CAAC,eAAe,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAA4B;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAC7B,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAC9D,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,GAAW,EACX,QAA0B,EAC1B,KAAkC;IAElC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,iGAAiG;AACjG,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,GAAW;IACrD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,sBAAsB,IAAI,OAAO,EAAE,CAAC,EAAE;YAC3E,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACjD,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tunnel.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev tunnel — phase 1 (cloudflared stopgap). See ADR 0103.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `cloudflared tunnel --url <loopback>` (Cloudflare Quick Tunnels) so a cloud-hosted AI client
|
|
5
|
+
* can reach the loopback `noodle dev` server. `cloudflared` is an external, user-installed binary
|
|
6
|
+
* (Apache-2.0) — never an npm dependency and never bundled. The dev server stays bound to loopback;
|
|
7
|
+
* cloudflared dials it locally. This module never logs request/response bodies, headers, or tokens —
|
|
8
|
+
* it only parses the assigned public URL and never forwards raw child output.
|
|
9
|
+
*/
|
|
10
|
+
/** The subset of `node:child_process` ChildProcess this module needs, so tests can inject a fake. */
|
|
11
|
+
export interface TunnelProcess {
|
|
12
|
+
readonly stdout: NodeJS.EventEmitter | null;
|
|
13
|
+
readonly stderr: NodeJS.EventEmitter | null;
|
|
14
|
+
on(event: 'error', listener: (err: Error) => void): unknown;
|
|
15
|
+
on(event: 'exit', listener: (code: number | null) => void): unknown;
|
|
16
|
+
kill(signal?: NodeJS.Signals): boolean;
|
|
17
|
+
}
|
|
18
|
+
export type SpawnFn = (command: string, args: readonly string[]) => TunnelProcess;
|
|
19
|
+
export interface StartTunnelOptions {
|
|
20
|
+
/** The loopback origin of the dev server, e.g. `http://127.0.0.1:54321`. */
|
|
21
|
+
readonly localOrigin: string;
|
|
22
|
+
/** The full loopback MCP URL the dev server serves (origin + tenant path). */
|
|
23
|
+
readonly localMcpUrl: string;
|
|
24
|
+
/** Injectable spawner (defaults to `node:child_process` spawn); used by tests to avoid cloudflared. */
|
|
25
|
+
readonly spawn?: SpawnFn;
|
|
26
|
+
/** Max time to wait for cloudflared to report a URL before giving up. */
|
|
27
|
+
readonly timeoutMs?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface TunnelHandle {
|
|
30
|
+
/** The public Cloudflare origin, e.g. `https://blue-cat-1234.trycloudflare.com`. */
|
|
31
|
+
readonly publicOrigin: string;
|
|
32
|
+
/** The public MCP URL (public origin + the dev server's tenant path). */
|
|
33
|
+
readonly publicMcpUrl: string;
|
|
34
|
+
/** Stop the cloudflared process. */
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Start a Cloudflare Quick Tunnel to the loopback dev server and resolve once the public URL appears.
|
|
39
|
+
* Rejects with install guidance when the binary is missing, or if cloudflared exits / times out first.
|
|
40
|
+
*/
|
|
41
|
+
export declare function startTunnel(options: StartTunnelOptions): Promise<TunnelHandle>;
|
|
42
|
+
//# sourceMappingURL=tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,qGAAqG;AACrG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;IAC5D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,aAAa,CAAC;AAElF,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uGAAuG;IACvG,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,oCAAoC;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAOD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAyDpF"}
|
package/dist/tunnel.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
2
|
+
const CLOUDFLARED = 'cloudflared';
|
|
3
|
+
const URL_RE = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/i;
|
|
4
|
+
const INSTALL_HINT = 'cloudflared not found. Install it (https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/), then retry `noodle dev --tunnel`.';
|
|
5
|
+
/**
|
|
6
|
+
* Start a Cloudflare Quick Tunnel to the loopback dev server and resolve once the public URL appears.
|
|
7
|
+
* Rejects with install guidance when the binary is missing, or if cloudflared exits / times out first.
|
|
8
|
+
*/
|
|
9
|
+
export async function startTunnel(options) {
|
|
10
|
+
const spawnFn = options.spawn ?? ((command, args) => nodeSpawn(command, [...args]));
|
|
11
|
+
const timeoutMs = options.timeoutMs ?? 20_000;
|
|
12
|
+
const child = spawnFn(CLOUDFLARED, ['tunnel', '--url', options.localOrigin]);
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
let settled = false;
|
|
15
|
+
let buffer = '';
|
|
16
|
+
const timer = setTimeout(() => {
|
|
17
|
+
if (settled)
|
|
18
|
+
return;
|
|
19
|
+
settled = true;
|
|
20
|
+
child.kill('SIGTERM');
|
|
21
|
+
reject(new Error(`cloudflared did not report a tunnel URL within ${timeoutMs}ms`));
|
|
22
|
+
}, timeoutMs);
|
|
23
|
+
timer.unref?.();
|
|
24
|
+
const finish = (fn) => {
|
|
25
|
+
if (settled)
|
|
26
|
+
return;
|
|
27
|
+
settled = true;
|
|
28
|
+
clearTimeout(timer);
|
|
29
|
+
fn();
|
|
30
|
+
};
|
|
31
|
+
// Parse the assigned URL from cloudflared's output. We deliberately never echo the raw output.
|
|
32
|
+
const onData = (chunk) => {
|
|
33
|
+
if (settled)
|
|
34
|
+
return;
|
|
35
|
+
buffer += chunk.toString();
|
|
36
|
+
const match = buffer.match(URL_RE);
|
|
37
|
+
if (!match)
|
|
38
|
+
return;
|
|
39
|
+
const publicOrigin = match[0];
|
|
40
|
+
const publicMcpUrl = publicOrigin + options.localMcpUrl.slice(options.localOrigin.length);
|
|
41
|
+
finish(() => resolve({
|
|
42
|
+
publicOrigin,
|
|
43
|
+
publicMcpUrl,
|
|
44
|
+
close: () => new Promise((res) => {
|
|
45
|
+
child.on('exit', () => res());
|
|
46
|
+
child.kill('SIGTERM');
|
|
47
|
+
}),
|
|
48
|
+
}));
|
|
49
|
+
};
|
|
50
|
+
child.stdout?.on('data', onData);
|
|
51
|
+
child.stderr?.on('data', onData);
|
|
52
|
+
child.on('error', (err) => {
|
|
53
|
+
finish(() => reject(new Error(err.code === 'ENOENT' ? INSTALL_HINT : `cloudflared: ${err.message}`)));
|
|
54
|
+
});
|
|
55
|
+
child.on('exit', (code) => {
|
|
56
|
+
finish(() => reject(new Error(`cloudflared exited (code ${code ?? 'null'}) before opening a tunnel`)));
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
|
package/dist/update.d.ts
CHANGED
|
@@ -10,4 +10,5 @@ export declare function maybeCheckForCliUpdate(input: {
|
|
|
10
10
|
/** Injectable updater (defaults to {@link runUpdateCommand}); used by tests to avoid spawning npm. */
|
|
11
11
|
readonly runUpdate?: (rest: readonly string[]) => Promise<number>;
|
|
12
12
|
}): Promise<void>;
|
|
13
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
13
14
|
//# sourceMappingURL=update.d.ts.map
|
package/dist/update.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,eAAO,MAAM,qBAAqB,0CAA8C,CAAC;AAOjF,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB/E;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,sGAAsG;IACtG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyChB;AA2CD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D"}
|
package/dist/update.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { readConfig, writeConfig } from './config.js';
|
|
4
|
+
import { bundledAgentKitVersion, fetchLatestAgentKitVersion, isSkillsUpdateAvailable, skillsUpdatePromptMessage, } from './skills-update.js';
|
|
4
5
|
export const CLI_PACKAGE_NAME = '@noodleseed/one';
|
|
5
6
|
export const GLOBAL_UPDATE_COMMAND = `npm install -g ${CLI_PACKAGE_NAME}@latest`;
|
|
6
7
|
const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
@@ -41,22 +42,33 @@ export async function maybeCheckForCliUpdate(input) {
|
|
|
41
42
|
if (wasRecentlyChecked(config.updateCheck?.checkedAt))
|
|
42
43
|
return;
|
|
43
44
|
const latestVersion = await fetchLatestVersion(input.fetchImpl ?? fetch).catch(() => undefined);
|
|
44
|
-
|
|
45
|
+
// Skills check shares the same interactive gate + 24h throttle as the CLI check (no second notifier).
|
|
46
|
+
const skillsLatest = await fetchLatestAgentKitVersion(input.fetchImpl ?? fetch).catch(() => undefined);
|
|
47
|
+
if (latestVersion === undefined && skillsLatest === undefined)
|
|
45
48
|
return;
|
|
46
49
|
writeConfig({
|
|
47
50
|
...readConfig(input.home),
|
|
48
|
-
updateCheck: {
|
|
51
|
+
updateCheck: {
|
|
52
|
+
checkedAt: new Date().toISOString(),
|
|
53
|
+
...(latestVersion !== undefined ? { latestVersion } : {}),
|
|
54
|
+
...(skillsLatest !== undefined ? { skillsLatestVersion: skillsLatest } : {}),
|
|
55
|
+
},
|
|
49
56
|
}, input.home);
|
|
50
57
|
const currentVersion = currentCliVersion();
|
|
51
|
-
if (compareVersions(latestVersion, currentVersion)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
if (latestVersion !== undefined && compareVersions(latestVersion, currentVersion) > 0) {
|
|
59
|
+
console.error(`A newer Noodle CLI is available: ${currentVersion} -> ${latestVersion}`);
|
|
60
|
+
if (isAutoUpdateEnabled(input.env)) {
|
|
61
|
+
console.error('NOODLE_AUTO_UPDATE is set — updating now...');
|
|
62
|
+
await (input.runUpdate ?? runUpdateCommand)(['--yes']);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error(`Update: ${GLOBAL_UPDATE_COMMAND}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Self-checking skills: notify (no auto-update) when the registry has a newer agent-kit.
|
|
69
|
+
if (skillsLatest !== undefined && isSkillsUpdateAvailable(skillsLatest)) {
|
|
70
|
+
console.error(skillsUpdatePromptMessage(skillsLatest, bundledAgentKitVersion()));
|
|
58
71
|
}
|
|
59
|
-
console.error(`Update: ${GLOBAL_UPDATE_COMMAND}`);
|
|
60
72
|
}
|
|
61
73
|
/** Opt-in auto-update. Enabled when `NOODLE_AUTO_UPDATE` is set to anything other than `0`/`false`. */
|
|
62
74
|
function isAutoUpdateEnabled(env) {
|
|
@@ -99,7 +111,7 @@ async function fetchLatestVersion(fetchImpl) {
|
|
|
99
111
|
const body = (await res.json());
|
|
100
112
|
return typeof body.version === 'string' ? body.version : undefined;
|
|
101
113
|
}
|
|
102
|
-
function compareVersions(a, b) {
|
|
114
|
+
export function compareVersions(a, b) {
|
|
103
115
|
const left = parseVersion(a);
|
|
104
116
|
const right = parseVersion(b);
|
|
105
117
|
for (let i = 0; i < Math.max(left.length, right.length); i++) {
|