veryfront 0.1.48 → 0.1.49
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/esm/cli/app/components/inline-input.d.ts +1 -4
- package/esm/cli/app/components/inline-input.d.ts.map +1 -1
- package/esm/cli/app/components/inline-input.js +1 -1
- package/esm/cli/app/components/list-select.d.ts +0 -8
- package/esm/cli/app/components/list-select.d.ts.map +1 -1
- package/esm/cli/app/components/list-select.js +0 -13
- package/esm/cli/app/operations/project-creation.d.ts +2 -14
- package/esm/cli/app/operations/project-creation.d.ts.map +1 -1
- package/esm/cli/app/operations/project-creation.js +3 -68
- package/esm/cli/app/shell.js +1 -1
- package/esm/cli/app/utils.d.ts +1 -2
- package/esm/cli/app/utils.d.ts.map +1 -1
- package/esm/cli/app/utils.js +1 -17
- package/esm/cli/app/views/dashboard.d.ts +0 -4
- package/esm/cli/app/views/dashboard.d.ts.map +1 -1
- package/esm/cli/app/views/dashboard.js +0 -15
- package/esm/cli/app/views/startup.d.ts +0 -4
- package/esm/cli/app/views/startup.d.ts.map +1 -1
- package/esm/cli/app/views/startup.js +0 -7
- package/esm/cli/auth/login.d.ts.map +1 -1
- package/esm/cli/auth/login.js +1 -2
- package/esm/cli/auth/token-store.js +1 -1
- package/esm/cli/auth/utils.d.ts +2 -1
- package/esm/cli/auth/utils.d.ts.map +1 -1
- package/esm/cli/commands/generate/integration-generator.js +1 -1
- package/esm/cli/commands/install/types.d.ts +2 -2
- package/esm/cli/help/formatters.d.ts +1 -1
- package/esm/cli/help/formatters.d.ts.map +1 -1
- package/esm/cli/help/formatters.js +8 -4
- package/esm/cli/help/main-help.d.ts.map +1 -1
- package/esm/cli/help/main-help.js +2 -2
- package/esm/cli/mcp/server.d.ts +0 -1
- package/esm/cli/mcp/server.d.ts.map +1 -1
- package/esm/cli/mcp/server.js +2 -5
- package/esm/cli/mcp/tools/dev-tools.d.ts +1 -1
- package/esm/cli/mcp/tools/dev-tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools/dev-tools.js +1 -2
- package/esm/cli/mcp/tools/scaffold-tools.d.ts +2 -2
- package/esm/cli/mcp/tools.d.ts +1 -2
- package/esm/cli/mcp/tools.d.ts.map +1 -1
- package/esm/cli/mcp/tools.js +1 -2
- package/esm/cli/shared/reserve-slug.d.ts.map +1 -1
- package/esm/cli/shared/reserve-slug.js +1 -3
- package/esm/cli/sync/ignore.d.ts +1 -1
- package/esm/cli/sync/ignore.d.ts.map +1 -1
- package/esm/cli/sync/ignore.js +22 -18
- package/esm/cli/ui/colors.d.ts +0 -1
- package/esm/cli/ui/colors.d.ts.map +1 -1
- package/esm/cli/ui/colors.js +0 -10
- package/esm/cli/ui/dot-matrix.d.ts.map +1 -1
- package/esm/cli/ui/dot-matrix.js +2 -5
- package/esm/cli/ui/tui.js +2 -3
- package/esm/cli/utils/index.js +1 -2
- package/esm/cli/utils/package-manager.d.ts.map +1 -1
- package/esm/cli/utils/package-manager.js +3 -4
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +22 -19
- package/esm/src/agent/chat-handler.d.ts.map +1 -1
- package/esm/src/agent/chat-handler.js +8 -23
- package/esm/src/agent/factory.d.ts +0 -8
- package/esm/src/agent/factory.d.ts.map +1 -1
- package/esm/src/agent/factory.js +50 -1
- package/esm/src/agent/index.d.ts +16 -1
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +16 -1
- package/esm/src/agent/memory/memory.d.ts +2 -2
- package/esm/src/agent/memory/memory.d.ts.map +1 -1
- package/esm/src/agent/memory/memory.js +0 -1
- package/esm/src/agent/react/use-chat/types.d.ts +2 -0
- package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.js +15 -9
- package/esm/src/agent/runtime/index.d.ts +18 -0
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +167 -36
- package/esm/src/agent/runtime/tool-helpers.d.ts +6 -1
- package/esm/src/agent/runtime/tool-helpers.d.ts.map +1 -1
- package/esm/src/agent/runtime/tool-helpers.js +10 -1
- package/esm/src/agent/schemas/agent.schema.d.ts +4 -4
- package/esm/src/agent/types.d.ts +10 -0
- package/esm/src/agent/types.d.ts.map +1 -1
- package/esm/src/ai/registry-manager.d.ts.map +1 -1
- package/esm/src/ai/registry-manager.js +2 -1
- package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts +0 -2
- package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts.map +1 -1
- package/esm/src/build/bundler/code-splitter/manifest-builder.js +1 -1
- package/esm/src/build/compiler/mdx-compiler/validator.d.ts.map +1 -1
- package/esm/src/build/compiler/mdx-compiler/validator.js +2 -3
- package/esm/src/build/compiler/mdx-to-js.d.ts +0 -2
- package/esm/src/build/compiler/mdx-to-js.d.ts.map +1 -1
- package/esm/src/build/compiler/mdx-to-js.js +0 -81
- package/esm/src/build/index.d.ts +0 -6
- package/esm/src/build/index.d.ts.map +1 -1
- package/esm/src/build/index.js +0 -1
- package/esm/src/build/production-build/build/route-collector.d.ts.map +1 -1
- package/esm/src/build/production-build/build/route-collector.js +2 -3
- package/esm/src/build/production-build/templates.d.ts +5 -9
- package/esm/src/build/production-build/templates.d.ts.map +1 -1
- package/esm/src/build/production-build/templates.js +6 -18
- package/esm/src/build/vendor-cache.d.ts.map +1 -1
- package/esm/src/build/vendor-cache.js +0 -5
- package/esm/src/cache/tokenizing-gateway.d.ts +0 -2
- package/esm/src/cache/tokenizing-gateway.d.ts.map +1 -1
- package/esm/src/cache/tokenizing-gateway.js +1 -3
- package/esm/src/chat/index.d.ts +2 -2
- package/esm/src/chat/index.d.ts.map +1 -1
- package/esm/src/chat/index.js +1 -1
- package/esm/src/config/define-config.d.ts.map +1 -1
- package/esm/src/config/define-config.js +28 -25
- package/esm/src/config/loader.d.ts.map +1 -1
- package/esm/src/config/loader.js +10 -7
- package/esm/src/config/schemas/config.schema.d.ts +58 -12
- package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
- package/esm/src/config/schemas/config.schema.js +12 -0
- package/esm/src/data/data-fetcher.d.ts +1 -2
- package/esm/src/data/data-fetcher.d.ts.map +1 -1
- package/esm/src/data/data-fetcher.js +14 -15
- package/esm/src/data/server-data-fetcher.d.ts +0 -3
- package/esm/src/data/server-data-fetcher.d.ts.map +1 -1
- package/esm/src/data/server-data-fetcher.js +1 -8
- package/esm/src/data/static-data-fetcher.d.ts +1 -3
- package/esm/src/data/static-data-fetcher.d.ts.map +1 -1
- package/esm/src/data/static-data-fetcher.js +1 -3
- package/esm/src/discovery/discovery-engine.d.ts.map +1 -1
- package/esm/src/discovery/discovery-engine.js +19 -1
- package/esm/src/discovery/discovery-utils.d.ts +0 -4
- package/esm/src/discovery/discovery-utils.d.ts.map +1 -1
- package/esm/src/discovery/discovery-utils.js +0 -6
- package/esm/src/discovery/file-discovery.d.ts +3 -1
- package/esm/src/discovery/file-discovery.d.ts.map +1 -1
- package/esm/src/discovery/file-discovery.js +3 -8
- package/esm/src/discovery/handlers/index.d.ts +1 -0
- package/esm/src/discovery/handlers/index.d.ts.map +1 -1
- package/esm/src/discovery/handlers/index.js +1 -0
- package/esm/src/discovery/handlers/skill-handler.d.ts +26 -0
- package/esm/src/discovery/handlers/skill-handler.d.ts.map +1 -0
- package/esm/src/discovery/handlers/skill-handler.js +87 -0
- package/esm/src/discovery/handlers/task-handler.d.ts.map +1 -1
- package/esm/src/discovery/handlers/task-handler.js +1 -5
- package/esm/src/discovery/transpiler.d.ts.map +1 -1
- package/esm/src/discovery/transpiler.js +7 -4
- package/esm/src/discovery/types.d.ts +3 -0
- package/esm/src/discovery/types.d.ts.map +1 -1
- package/esm/src/embedding/resolve.d.ts.map +1 -1
- package/esm/src/embedding/resolve.js +1 -3
- package/esm/src/embedding/upload-handler.d.ts.map +1 -1
- package/esm/src/embedding/upload-handler.js +4 -3
- package/esm/src/embedding/upload-store.js +4 -4
- package/esm/src/errors/error-registry.d.ts +2 -1
- package/esm/src/errors/error-registry.d.ts.map +1 -1
- package/esm/src/errors/http-error.d.ts +1 -2
- package/esm/src/errors/http-error.d.ts.map +1 -1
- package/esm/src/errors/http-error.js +2 -2
- package/esm/src/errors/middleware/cli-error-boundary.d.ts.map +1 -1
- package/esm/src/errors/middleware/cli-error-boundary.js +13 -2
- package/esm/src/errors/middleware/wrap-unknown.d.ts +0 -7
- package/esm/src/errors/middleware/wrap-unknown.d.ts.map +1 -1
- package/esm/src/errors/middleware/wrap-unknown.js +0 -9
- package/esm/src/errors/veryfront-error.d.ts +0 -3
- package/esm/src/errors/veryfront-error.d.ts.map +1 -1
- package/esm/src/errors/veryfront-error.js +0 -5
- package/esm/src/html/schemas/html.schema.d.ts +2 -2
- package/esm/src/html/styles-builder/css-hash-cache.d.ts.map +1 -1
- package/esm/src/html/styles-builder/css-hash-cache.js +1 -2
- package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
- package/esm/src/html/styles-builder/plugin-loader.js +50 -21
- package/esm/src/html/styles-builder/tailwind-compiler-cache.d.ts.map +1 -1
- package/esm/src/html/styles-builder/tailwind-compiler-cache.js +12 -4
- package/esm/src/html/utils.d.ts +0 -7
- package/esm/src/html/utils.d.ts.map +1 -1
- package/esm/src/html/utils.js +0 -25
- package/esm/src/modules/component-registry/registry.d.ts +0 -3
- package/esm/src/modules/component-registry/registry.d.ts.map +1 -1
- package/esm/src/modules/component-registry/registry.js +0 -3
- package/esm/src/oauth/handlers/callback-handler.d.ts +2 -0
- package/esm/src/oauth/handlers/callback-handler.d.ts.map +1 -1
- package/esm/src/oauth/handlers/callback-handler.js +10 -4
- package/esm/src/oauth/providers/common.d.ts.map +1 -1
- package/esm/src/oauth/providers/common.js +0 -23
- package/esm/src/observability/auto-instrument/react-instrumentation.js +2 -1
- package/esm/src/observability/instruments/instruments-factory.d.ts +1 -1
- package/esm/src/observability/instruments/instruments-factory.d.ts.map +1 -1
- package/esm/src/observability/instruments/instruments-factory.js +5 -4
- package/esm/src/observability/metrics/config.js +5 -4
- package/esm/src/observability/metrics/manager.js +1 -1
- package/esm/src/observability/tracing/span-operations.d.ts.map +1 -1
- package/esm/src/observability/tracing/span-operations.js +14 -8
- package/esm/src/platform/compat/console/node.d.ts +0 -1
- package/esm/src/platform/compat/console/node.d.ts.map +1 -1
- package/esm/src/platform/compat/console/node.js +4 -11
- package/esm/src/platform/compat/fs.d.ts.map +1 -1
- package/esm/src/platform/compat/fs.js +4 -2
- package/esm/src/platform/compat/opaque-deps.d.ts +4 -2
- package/esm/src/platform/compat/opaque-deps.d.ts.map +1 -1
- package/esm/src/platform/compat/opaque-deps.js +1 -1
- package/esm/src/platform/compat/path/basic-operations.d.ts.map +1 -1
- package/esm/src/platform/compat/path/basic-operations.js +8 -7
- package/esm/src/platform/compat/path/resolution.d.ts.map +1 -1
- package/esm/src/platform/compat/path/resolution.js +15 -10
- package/esm/src/platform/compat/path/url-conversion.d.ts.map +1 -1
- package/esm/src/platform/compat/path/url-conversion.js +3 -2
- package/esm/src/platform/compat/process.d.ts +2 -14
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +92 -70
- package/esm/src/provider/index.d.ts +1 -1
- package/esm/src/provider/index.d.ts.map +1 -1
- package/esm/src/provider/index.js +1 -1
- package/esm/src/provider/local/ai-sdk-adapter.d.ts.map +1 -1
- package/esm/src/provider/local/ai-sdk-adapter.js +18 -18
- package/esm/src/provider/local/env.d.ts.map +1 -1
- package/esm/src/provider/local/env.js +2 -1
- package/esm/src/provider/model-registry.d.ts +10 -0
- package/esm/src/provider/model-registry.d.ts.map +1 -1
- package/esm/src/provider/model-registry.js +43 -0
- package/esm/src/proxy/retry.d.ts +3 -3
- package/esm/src/proxy/retry.d.ts.map +1 -1
- package/esm/src/proxy/retry.js +0 -7
- package/esm/src/proxy/tracing.d.ts +1 -5
- package/esm/src/proxy/tracing.d.ts.map +1 -1
- package/esm/src/proxy/tracing.js +1 -7
- package/esm/src/react/components/ai/chat/components/code-block.js +1 -1
- package/esm/src/react/components/ai/chat/components/skill-badge.d.ts +12 -0
- package/esm/src/react/components/ai/chat/components/skill-badge.d.ts.map +1 -0
- package/esm/src/react/components/ai/chat/components/skill-badge.js +34 -0
- package/esm/src/react/components/ai/chat/components/step-indicator.js +4 -4
- package/esm/src/react/components/ai/chat/composition/chat-message-list.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat/composition/chat-message-list.js +8 -2
- package/esm/src/react/components/ai/chat/composition/message.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat/composition/message.js +8 -2
- package/esm/src/react/components/ai/chat/index.d.ts +4 -1
- package/esm/src/react/components/ai/chat/index.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat/index.js +4 -3
- package/esm/src/react/components/ai/chat/utils/message-parts.d.ts +2 -0
- package/esm/src/react/components/ai/chat/utils/message-parts.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat/utils/message-parts.js +9 -0
- package/esm/src/react/components/ai/chat-with-sidebar.d.ts +1 -0
- package/esm/src/react/components/ai/chat-with-sidebar.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat-with-sidebar.js +1 -0
- package/esm/src/react/components/ai/chat.d.ts +1 -1
- package/esm/src/react/components/ai/chat.d.ts.map +1 -1
- package/esm/src/react/components/ai/chat.js +1 -1
- package/esm/src/rendering/cache/index.d.ts +1 -5
- package/esm/src/rendering/cache/index.d.ts.map +1 -1
- package/esm/src/rendering/cache/index.js +1 -5
- package/esm/src/rendering/orchestrator/pipeline.d.ts +11 -2
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/shared/context-aware-cache.d.ts.map +1 -1
- package/esm/src/rendering/shared/context-aware-cache.js +0 -4
- package/esm/src/repositories/schemas/index.d.ts +1 -1
- package/esm/src/repositories/schemas/index.d.ts.map +1 -1
- package/esm/src/repositories/schemas/index.js +1 -1
- package/esm/src/repositories/schemas/repository.schema.d.ts +0 -11
- package/esm/src/repositories/schemas/repository.schema.d.ts.map +1 -1
- package/esm/src/repositories/schemas/repository.schema.js +0 -13
- package/esm/src/repositories/types.d.ts +1 -1
- package/esm/src/repositories/types.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +63 -7
- package/esm/src/routing/api/openapi/path-utils.d.ts +0 -19
- package/esm/src/routing/api/openapi/path-utils.d.ts.map +1 -1
- package/esm/src/routing/api/openapi/path-utils.js +0 -34
- package/esm/src/routing/api/openapi/spec-generator.d.ts.map +1 -1
- package/esm/src/routing/api/openapi/spec-generator.js +1 -19
- package/esm/src/routing/api/openapi/types.d.ts +1 -0
- package/esm/src/routing/api/openapi/types.d.ts.map +1 -1
- package/esm/src/routing/api/openapi/types.js +18 -0
- package/esm/src/sandbox/sandbox.d.ts +1 -0
- package/esm/src/sandbox/sandbox.d.ts.map +1 -1
- package/esm/src/sandbox/sandbox.js +7 -8
- package/esm/src/security/http/cors/constants.d.ts +0 -2
- package/esm/src/security/http/cors/constants.d.ts.map +1 -1
- package/esm/src/security/http/cors/constants.js +0 -2
- package/esm/src/security/http/response/index.d.ts +3 -4
- package/esm/src/security/http/response/index.d.ts.map +1 -1
- package/esm/src/security/http/response/index.js +2 -3
- package/esm/src/server/context/enriched-context.d.ts +0 -8
- package/esm/src/server/context/enriched-context.d.ts.map +1 -1
- package/esm/src/server/context/enriched-context.js +1 -12
- package/esm/src/server/dev-server/server.d.ts.map +1 -1
- package/esm/src/server/dev-server/server.js +11 -4
- package/esm/src/server/dev-ui/manifest.d.ts +20 -20
- package/esm/src/server/dev-ui/manifest.js +20 -20
- package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/framework-candidates.generated.js +426 -179
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +14 -24
- package/esm/src/server/shared/renderer/memory/pressure.d.ts +0 -7
- package/esm/src/server/shared/renderer/memory/pressure.d.ts.map +1 -1
- package/esm/src/server/shared/renderer/memory/pressure.js +1 -13
- package/esm/src/server/utils/domain-lookup.d.ts +0 -4
- package/esm/src/server/utils/domain-lookup.d.ts.map +1 -1
- package/esm/src/server/utils/domain-lookup.js +0 -3
- package/esm/src/skill/allowed-tools.d.ts +54 -0
- package/esm/src/skill/allowed-tools.d.ts.map +1 -0
- package/esm/src/skill/allowed-tools.js +87 -0
- package/esm/src/skill/executor.d.ts +28 -0
- package/esm/src/skill/executor.d.ts.map +1 -0
- package/esm/src/skill/executor.js +187 -0
- package/esm/src/skill/index.d.ts +19 -0
- package/esm/src/skill/index.d.ts.map +1 -0
- package/esm/src/skill/index.js +24 -0
- package/esm/src/skill/parser.d.ts +30 -0
- package/esm/src/skill/parser.d.ts.map +1 -0
- package/esm/src/skill/parser.js +162 -0
- package/esm/src/skill/path-safety.d.ts +22 -0
- package/esm/src/skill/path-safety.d.ts.map +1 -0
- package/esm/src/skill/path-safety.js +156 -0
- package/esm/src/skill/prompt-augmentation.d.ts +19 -0
- package/esm/src/skill/prompt-augmentation.d.ts.map +1 -0
- package/esm/src/skill/prompt-augmentation.js +36 -0
- package/esm/src/skill/registry.d.ts +25 -0
- package/esm/src/skill/registry.d.ts.map +1 -0
- package/esm/src/skill/registry.js +42 -0
- package/esm/src/skill/tools.d.ts +27 -0
- package/esm/src/skill/tools.d.ts.map +1 -0
- package/esm/src/skill/tools.js +149 -0
- package/esm/src/skill/types.d.ts +85 -0
- package/esm/src/skill/types.d.ts.map +1 -0
- package/esm/src/skill/types.js +27 -0
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
- package/esm/src/studio/element-selector-injector.d.ts +0 -2
- package/esm/src/studio/element-selector-injector.d.ts.map +1 -1
- package/esm/src/task/runner.d.ts +6 -0
- package/esm/src/task/runner.d.ts.map +1 -1
- package/esm/src/task/runner.js +8 -8
- package/esm/src/tool/factory.js +31 -39
- package/esm/src/transforms/esm/http-cache-helpers.d.ts +0 -8
- package/esm/src/transforms/esm/http-cache-helpers.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-cache-helpers.js +0 -20
- package/esm/src/transforms/esm/path-resolver.d.ts +0 -14
- package/esm/src/transforms/esm/path-resolver.d.ts.map +1 -1
- package/esm/src/transforms/esm/path-resolver.js +1 -92
- package/esm/src/transforms/esm/source-url-embed.d.ts +0 -14
- package/esm/src/transforms/esm/source-url-embed.d.ts.map +1 -1
- package/esm/src/transforms/esm/source-url-embed.js +0 -47
- package/esm/src/transforms/esm/transform-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/transform-cache.js +2 -6
- package/esm/src/transforms/mdx/index.d.ts +0 -1
- package/esm/src/transforms/mdx/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/index.js +0 -4
- package/esm/src/transforms/pipeline/context.d.ts +0 -1
- package/esm/src/transforms/pipeline/context.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/context.js +0 -1
- package/esm/src/transforms/pipeline/index.d.ts +1 -2
- package/esm/src/transforms/pipeline/index.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/index.js +0 -3
- package/esm/src/transforms/pipeline/stages/ssr-http-cache.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-http-cache.js +0 -1
- package/esm/src/types/entities/getEntityInfo.js +1 -1
- package/esm/src/types/index.d.ts +2 -13
- package/esm/src/types/index.d.ts.map +1 -1
- package/esm/src/types/server.d.ts +2 -1
- package/esm/src/types/server.d.ts.map +1 -1
- package/esm/src/utils/cache-file-ops.d.ts +1 -1
- package/esm/src/utils/cache-file-ops.d.ts.map +1 -1
- package/esm/src/utils/cache-file-ops.js +5 -6
- package/esm/src/utils/lru-wrapper.d.ts.map +1 -1
- package/esm/src/utils/lru-wrapper.js +2 -4
- package/esm/src/workflow/claude-code/event-publisher.d.ts +0 -4
- package/esm/src/workflow/claude-code/event-publisher.d.ts.map +1 -1
- package/esm/src/workflow/claude-code/event-publisher.js +2 -6
- package/esm/src/workflow/executor/workflow-executor.d.ts.map +1 -1
- package/esm/src/workflow/executor/workflow-executor.js +6 -1
- package/esm/src/workflow/react/use-workflow-list.d.ts.map +1 -1
- package/esm/src/workflow/react/use-workflow-list.js +2 -1
- package/esm/src/workflow/schemas/workflow.schema.d.ts +8 -8
- package/package.json +1 -2
- package/src/cli/app/components/inline-input.ts +0 -5
- package/src/cli/app/components/list-select.ts +0 -21
- package/src/cli/app/operations/project-creation.ts +4 -109
- package/src/cli/app/shell.ts +1 -1
- package/src/cli/app/utils.ts +0 -22
- package/src/cli/app/views/dashboard.ts +0 -17
- package/src/cli/app/views/startup.ts +0 -13
- package/src/cli/auth/login.ts +1 -2
- package/src/cli/auth/token-store.ts +1 -1
- package/src/cli/auth/utils.ts +2 -1
- package/src/cli/commands/generate/integration-generator.ts +1 -1
- package/src/cli/help/formatters.ts +11 -4
- package/src/cli/help/main-help.ts +2 -3
- package/src/cli/mcp/server.ts +2 -5
- package/src/cli/mcp/tools/dev-tools.ts +1 -2
- package/src/cli/mcp/tools.ts +8 -2
- package/src/cli/shared/reserve-slug.ts +1 -4
- package/src/cli/sync/ignore.ts +26 -21
- package/src/cli/ui/colors.ts +0 -12
- package/src/cli/ui/dot-matrix.ts +3 -6
- package/src/cli/ui/tui.ts +3 -3
- package/src/cli/utils/index.ts +1 -1
- package/src/cli/utils/package-manager.ts +3 -4
- package/src/deno.js +22 -19
- package/src/src/agent/chat-handler.ts +8 -23
- package/src/src/agent/factory.ts +58 -9
- package/src/src/agent/index.ts +16 -1
- package/src/src/agent/memory/memory.ts +0 -9
- package/src/src/agent/react/use-chat/types.ts +2 -0
- package/src/src/agent/react/use-chat/use-chat.ts +15 -9
- package/src/src/agent/runtime/index.ts +213 -35
- package/src/src/agent/runtime/tool-helpers.ts +9 -0
- package/src/src/agent/types.ts +10 -0
- package/src/src/ai/registry-manager.ts +2 -1
- package/src/src/build/bundler/code-splitter/manifest-builder.ts +1 -1
- package/src/src/build/compiler/mdx-compiler/validator.ts +3 -7
- package/src/src/build/compiler/mdx-to-js.ts +0 -101
- package/src/src/build/index.ts +0 -8
- package/src/src/build/production-build/build/route-collector.ts +2 -4
- package/src/src/build/production-build/templates.ts +9 -18
- package/src/src/build/vendor-cache.ts +0 -6
- package/src/src/cache/tokenizing-gateway.ts +1 -9
- package/src/src/chat/index.ts +3 -0
- package/src/src/config/define-config.ts +30 -29
- package/src/src/config/loader.ts +10 -9
- package/src/src/config/schemas/config.schema.ts +12 -0
- package/src/src/data/data-fetcher.ts +15 -21
- package/src/src/data/server-data-fetcher.ts +1 -8
- package/src/src/data/static-data-fetcher.ts +1 -6
- package/src/src/discovery/discovery-engine.ts +27 -0
- package/src/src/discovery/discovery-utils.ts +0 -7
- package/src/src/discovery/file-discovery.ts +3 -9
- package/src/src/discovery/handlers/index.ts +1 -0
- package/src/src/discovery/handlers/skill-handler.ts +123 -0
- package/src/src/discovery/handlers/task-handler.ts +1 -5
- package/src/src/discovery/transpiler.ts +7 -4
- package/src/src/discovery/types.ts +3 -0
- package/src/src/embedding/resolve.ts +1 -3
- package/src/src/embedding/upload-handler.ts +7 -3
- package/src/src/embedding/upload-store.ts +4 -4
- package/src/src/errors/error-registry.ts +2 -2
- package/src/src/errors/http-error.ts +7 -3
- package/src/src/errors/middleware/cli-error-boundary.ts +28 -2
- package/src/src/errors/middleware/wrap-unknown.ts +0 -10
- package/src/src/errors/veryfront-error.ts +0 -9
- package/src/src/html/styles-builder/css-hash-cache.ts +5 -2
- package/src/src/html/styles-builder/plugin-loader.ts +58 -21
- package/src/src/html/styles-builder/tailwind-compiler-cache.ts +11 -4
- package/src/src/html/utils.ts +0 -33
- package/src/src/modules/component-registry/registry.ts +0 -3
- package/src/src/modules/server/websocket-handler.ts +1 -1
- package/src/src/oauth/handlers/callback-handler.ts +17 -5
- package/src/src/oauth/providers/base.ts +3 -3
- package/src/src/oauth/providers/common.ts +0 -23
- package/src/src/observability/auto-instrument/react-instrumentation.ts +2 -2
- package/src/src/observability/instruments/instruments-factory.ts +6 -6
- package/src/src/observability/metrics/config.ts +5 -5
- package/src/src/observability/metrics/manager.ts +1 -1
- package/src/src/observability/tracing/span-operations.ts +14 -9
- package/src/src/platform/compat/console/node.ts +4 -14
- package/src/src/platform/compat/fs.ts +14 -3
- package/src/src/platform/compat/opaque-deps.ts +10 -5
- package/src/src/platform/compat/path/basic-operations.ts +9 -7
- package/src/src/platform/compat/path/resolution.ts +15 -8
- package/src/src/platform/compat/path/url-conversion.ts +10 -6
- package/src/src/platform/compat/process.ts +133 -76
- package/src/src/provider/index.ts +1 -0
- package/src/src/provider/local/ai-sdk-adapter.ts +40 -37
- package/src/src/provider/local/env.ts +4 -1
- package/src/src/provider/model-registry.ts +47 -0
- package/src/src/proxy/retry.ts +0 -9
- package/src/src/proxy/tracing.ts +1 -9
- package/src/src/react/components/ai/chat/components/code-block.tsx +1 -1
- package/src/src/react/components/ai/chat/components/skill-badge.tsx +51 -0
- package/src/src/react/components/ai/chat/components/step-indicator.tsx +4 -4
- package/src/src/react/components/ai/chat/composition/chat-message-list.tsx +9 -2
- package/src/src/react/components/ai/chat/composition/message.tsx +9 -2
- package/src/src/react/components/ai/chat/index.tsx +6 -1
- package/src/src/react/components/ai/chat/utils/message-parts.ts +11 -0
- package/src/src/react/components/ai/chat-with-sidebar.tsx +2 -0
- package/src/src/react/components/ai/chat.tsx +3 -0
- package/src/src/rendering/cache/index.ts +12 -5
- package/src/src/rendering/orchestrator/pipeline.ts +12 -2
- package/src/src/rendering/renderer.ts +1 -1
- package/src/src/rendering/shared/context-aware-cache.ts +0 -5
- package/src/src/repositories/schemas/index.ts +0 -2
- package/src/src/repositories/schemas/repository.schema.ts +0 -15
- package/src/src/repositories/types.ts +1 -6
- package/src/src/routing/api/module-loader/loader.ts +88 -3
- package/src/src/routing/api/openapi/path-utils.ts +0 -39
- package/src/src/routing/api/openapi/spec-generator.ts +1 -20
- package/src/src/routing/api/openapi/types.ts +20 -0
- package/src/src/sandbox/sandbox.ts +8 -8
- package/src/src/security/http/cors/constants.ts +0 -4
- package/src/src/security/http/response/index.ts +3 -9
- package/src/src/server/context/enriched-context.ts +1 -19
- package/src/src/server/dev-server/server.ts +11 -4
- package/src/src/server/dev-ui/manifest.js +20 -20
- package/src/src/server/handlers/dev/framework-candidates.generated.ts +426 -179
- package/src/src/server/runtime-handler/index.ts +17 -28
- package/src/src/server/shared/renderer/memory/pressure.ts +2 -15
- package/src/src/server/utils/domain-lookup.ts +0 -4
- package/src/src/skill/allowed-tools.ts +107 -0
- package/src/src/skill/executor.ts +215 -0
- package/src/src/skill/index.ts +60 -0
- package/src/src/skill/parser.ts +214 -0
- package/src/src/skill/path-safety.ts +203 -0
- package/src/src/skill/prompt-augmentation.ts +48 -0
- package/src/src/skill/registry.ts +51 -0
- package/src/src/skill/tools.ts +197 -0
- package/src/src/skill/types.ts +107 -0
- package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
- package/src/src/studio/element-selector-injector.ts +0 -2
- package/src/src/task/runner.ts +10 -8
- package/src/src/tool/factory.ts +54 -54
- package/src/src/transforms/esm/http-cache-helpers.ts +0 -20
- package/src/src/transforms/esm/path-resolver.ts +1 -140
- package/src/src/transforms/esm/source-url-embed.ts +0 -53
- package/src/src/transforms/esm/transform-cache.ts +3 -7
- package/src/src/transforms/mdx/index.ts +0 -5
- package/src/src/transforms/pipeline/context.ts +0 -2
- package/src/src/transforms/pipeline/index.ts +0 -4
- package/src/src/transforms/pipeline/stages/ssr-http-cache.ts +0 -1
- package/src/src/types/entities/getEntityInfo.ts +1 -1
- package/src/src/types/index.ts +1 -20
- package/src/src/types/server.ts +1 -1
- package/src/src/utils/cache-file-ops.ts +5 -5
- package/src/src/utils/lru-wrapper.ts +2 -8
- package/src/src/workflow/claude-code/event-publisher.ts +13 -4
- package/src/src/workflow/executor/workflow-executor.ts +7 -2
- package/src/src/workflow/react/use-workflow-list.ts +3 -2
- package/esm/src/transforms/mdx/parser.d.ts +0 -4
- package/esm/src/transforms/mdx/parser.d.ts.map +0 -1
- package/esm/src/transforms/mdx/parser.js +0 -49
- package/src/src/transforms/mdx/parser.ts +0 -65
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill frontmatter parser
|
|
3
|
+
*
|
|
4
|
+
* Parses SKILL.md files with YAML frontmatter.
|
|
5
|
+
* Primary parser: gray-matter shim (#std/front-matter/yaml.ts)
|
|
6
|
+
* Fallback: regex + line-by-line parser
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { createError, toError } from "../errors/veryfront-error.js";
|
|
11
|
+
import { SKILL_ALLOWED_TOOL_PATTERN_REGEX, SKILL_DESCRIPTION_MAX_LENGTH, SKILL_NAME_REGEX, } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Parse SKILL.md content into frontmatter + body.
|
|
14
|
+
*
|
|
15
|
+
* Uses gray-matter shim as primary parser with a regex fallback
|
|
16
|
+
* for environments where gray-matter is not available.
|
|
17
|
+
*/
|
|
18
|
+
export async function parseSkillFrontmatter(content) {
|
|
19
|
+
// Try primary parser: gray-matter shim
|
|
20
|
+
try {
|
|
21
|
+
const { extract } = await import("../platform/compat/std/front-matter-yaml.js");
|
|
22
|
+
const result = extract(content);
|
|
23
|
+
return { frontmatter: result.attrs, body: result.body };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Fall through to fallback
|
|
27
|
+
}
|
|
28
|
+
// Fallback: regex-based parser
|
|
29
|
+
return parseFrontmatterFallback(content);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Regex-based fallback parser for YAML frontmatter.
|
|
33
|
+
* Handles simple key: value pairs (no nested YAML).
|
|
34
|
+
*/
|
|
35
|
+
function parseFrontmatterFallback(content) {
|
|
36
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
37
|
+
if (!match) {
|
|
38
|
+
return { frontmatter: {}, body: content };
|
|
39
|
+
}
|
|
40
|
+
const rawFrontmatter = match[1];
|
|
41
|
+
const body = match[2];
|
|
42
|
+
const frontmatter = {};
|
|
43
|
+
for (const line of rawFrontmatter.split("\n")) {
|
|
44
|
+
const trimmed = line.trim();
|
|
45
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
46
|
+
continue;
|
|
47
|
+
const colonIndex = trimmed.indexOf(":");
|
|
48
|
+
if (colonIndex === -1)
|
|
49
|
+
continue;
|
|
50
|
+
const key = trimmed.slice(0, colonIndex).trim();
|
|
51
|
+
const value = trimmed.slice(colonIndex + 1).trim();
|
|
52
|
+
frontmatter[key] = value;
|
|
53
|
+
}
|
|
54
|
+
return { frontmatter, body };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate and normalize parsed frontmatter into SkillMetadata.
|
|
58
|
+
*
|
|
59
|
+
* @param frontmatter - Parsed frontmatter object
|
|
60
|
+
* @param directoryName - Directory name used as fallback for skill name
|
|
61
|
+
*/
|
|
62
|
+
export function validateSkillMetadata(frontmatter, directoryName) {
|
|
63
|
+
// Name: from frontmatter or directory name
|
|
64
|
+
const rawName = typeof frontmatter.name === "string" ? frontmatter.name.trim() : directoryName;
|
|
65
|
+
if (!SKILL_NAME_REGEX.test(rawName)) {
|
|
66
|
+
throw toError(createError({
|
|
67
|
+
type: "agent",
|
|
68
|
+
message: `Invalid skill name "${rawName}": must be lowercase alphanumeric with hyphens, 1-64 characters`,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
// Description: required
|
|
72
|
+
const rawDescription = frontmatter.description;
|
|
73
|
+
if (!rawDescription || typeof rawDescription !== "string" || !rawDescription.trim()) {
|
|
74
|
+
throw toError(createError({
|
|
75
|
+
type: "agent",
|
|
76
|
+
message: `Skill "${rawName}" is missing a required "description" field`,
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
const description = rawDescription.trim().slice(0, SKILL_DESCRIPTION_MAX_LENGTH);
|
|
80
|
+
// Allowed-tools: parse from space-delimited string or array
|
|
81
|
+
const allowedTools = parseAllowedTools(frontmatter["allowed-tools"], rawName);
|
|
82
|
+
// License: optional string passthrough
|
|
83
|
+
const license = typeof frontmatter.license === "string" ? frontmatter.license.trim() : undefined;
|
|
84
|
+
// Compatibility: optional string passthrough
|
|
85
|
+
const compatibility = typeof frontmatter.compatibility === "string"
|
|
86
|
+
? frontmatter.compatibility.trim()
|
|
87
|
+
: undefined;
|
|
88
|
+
// Metadata: convert nested object values to strings
|
|
89
|
+
const metadata = parseMetadata(frontmatter.metadata);
|
|
90
|
+
return {
|
|
91
|
+
name: rawName,
|
|
92
|
+
description,
|
|
93
|
+
...(allowedTools && { allowedTools }),
|
|
94
|
+
...(license && { license }),
|
|
95
|
+
...(compatibility && { compatibility }),
|
|
96
|
+
...(metadata && { metadata }),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Parse `allowed-tools` from frontmatter.
|
|
101
|
+
* Accepts a space-delimited string or an array of strings.
|
|
102
|
+
* Validates each pattern against SKILL_ALLOWED_TOOL_PATTERN_REGEX.
|
|
103
|
+
*/
|
|
104
|
+
function parseAllowedTools(value, skillName) {
|
|
105
|
+
if (value === undefined || value === null)
|
|
106
|
+
return undefined;
|
|
107
|
+
let patterns;
|
|
108
|
+
if (typeof value === "string") {
|
|
109
|
+
patterns = value.split(/\s+/).filter(Boolean);
|
|
110
|
+
}
|
|
111
|
+
else if (Array.isArray(value)) {
|
|
112
|
+
patterns = [];
|
|
113
|
+
for (const rawPattern of value) {
|
|
114
|
+
if (typeof rawPattern !== "string") {
|
|
115
|
+
throw toError(createError({
|
|
116
|
+
type: "agent",
|
|
117
|
+
message: `Skill "${skillName}" has invalid allowed-tools value: expected all entries to be strings`,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
const pattern = rawPattern.trim();
|
|
121
|
+
if (!pattern) {
|
|
122
|
+
throw toError(createError({
|
|
123
|
+
type: "agent",
|
|
124
|
+
message: `Skill "${skillName}" has invalid allowed-tools pattern: empty value`,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
patterns.push(pattern);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
throw toError(createError({
|
|
132
|
+
type: "agent",
|
|
133
|
+
message: `Skill "${skillName}" has invalid allowed-tools value: expected a string or array of strings, got ${typeof value}`,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
if (patterns.length === 0)
|
|
137
|
+
return undefined;
|
|
138
|
+
// Validate each pattern (fail closed)
|
|
139
|
+
for (const pattern of patterns) {
|
|
140
|
+
if (!SKILL_ALLOWED_TOOL_PATTERN_REGEX.test(pattern)) {
|
|
141
|
+
throw toError(createError({
|
|
142
|
+
type: "agent",
|
|
143
|
+
message: `Skill "${skillName}" has invalid allowed-tools pattern "${pattern}". ` +
|
|
144
|
+
`Only exact tool IDs (e.g. "Read") and prefix wildcards (e.g. "api:*") are supported.`,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return patterns;
|
|
149
|
+
}
|
|
150
|
+
/** Convert metadata object values to strings */
|
|
151
|
+
function parseMetadata(value) {
|
|
152
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
153
|
+
return undefined;
|
|
154
|
+
const entries = Object.entries(value);
|
|
155
|
+
if (entries.length === 0)
|
|
156
|
+
return undefined;
|
|
157
|
+
const result = {};
|
|
158
|
+
for (const [k, v] of entries) {
|
|
159
|
+
result[k] = String(v);
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FileSystemAdapter } from "../platform/adapters/base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validate that a requested path is safe within a skill's root directory.
|
|
4
|
+
*
|
|
5
|
+
* @param skillRoot - Absolute path to the skill directory
|
|
6
|
+
* @param requestedPath - Relative path requested (e.g. "references/CLAUSES.md")
|
|
7
|
+
* @param allowedSubdirs - Allowed top-level subdirectories (e.g. ["references", "assets"])
|
|
8
|
+
* @param fsAdapter - Optional file system adapter for VFS/cloud-backed projects
|
|
9
|
+
* @returns The validated canonical path
|
|
10
|
+
* @throws If the path is invalid, escapes the skill root, or the file doesn't exist
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateSkillPath(skillRoot: string, requestedPath: string, allowedSubdirs: string[], fsAdapter?: FileSystemAdapter): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* List files in a skill subdirectory.
|
|
15
|
+
*
|
|
16
|
+
* @param skillRoot - Absolute path to the skill directory
|
|
17
|
+
* @param subdir - Subdirectory name (e.g. "references", "scripts")
|
|
18
|
+
* @param fsAdapter - Optional file system adapter for VFS/cloud-backed projects
|
|
19
|
+
* @returns Array of relative paths like "references/filename.md"
|
|
20
|
+
*/
|
|
21
|
+
export declare function listSkillSubdir(skillRoot: string, subdir: string, fsAdapter?: FileSystemAdapter): Promise<string[]>;
|
|
22
|
+
//# sourceMappingURL=path-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-safety.d.ts","sourceRoot":"","sources":["../../../src/src/skill/path-safety.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAiFtE;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EAAE,EACxB,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA2DjB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill path safety
|
|
3
|
+
*
|
|
4
|
+
* Validates file paths within skill directories to prevent traversal attacks.
|
|
5
|
+
* Uses centralized validatePath() from #veryfront/security.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import * as dntShim from "../../_dnt.shims.js";
|
|
10
|
+
import { validatePath } from "../security/index.js";
|
|
11
|
+
import { isAbsolute, join, relative, resolve } from "../platform/compat/path/index.js";
|
|
12
|
+
import { exists, readDir, stat } from "../platform/compat/fs.js";
|
|
13
|
+
import { createError, toError } from "../errors/veryfront-error.js";
|
|
14
|
+
function isInsideDir(baseDir, targetPath) {
|
|
15
|
+
const rel = relative(baseDir, targetPath);
|
|
16
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
17
|
+
}
|
|
18
|
+
async function pathExists(path, fsAdapter) {
|
|
19
|
+
return fsAdapter ? await fsAdapter.exists(path) : await exists(path);
|
|
20
|
+
}
|
|
21
|
+
async function assertIsFile(path, fsAdapter) {
|
|
22
|
+
const info = fsAdapter ? await fsAdapter.stat(path) : await stat(path);
|
|
23
|
+
if (!info.isFile) {
|
|
24
|
+
throw toError(createError({
|
|
25
|
+
type: "agent",
|
|
26
|
+
message: `Skill path must point to a file: "${path}"`,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function resolveLocalRealPath(path) {
|
|
31
|
+
if (typeof dntShim.Deno !== "undefined") {
|
|
32
|
+
return await dntShim.Deno.realPath(path);
|
|
33
|
+
}
|
|
34
|
+
const fs = await import("node:fs/promises");
|
|
35
|
+
return await fs.realpath(path);
|
|
36
|
+
}
|
|
37
|
+
async function isLocalSymlink(path) {
|
|
38
|
+
try {
|
|
39
|
+
if (typeof dntShim.Deno !== "undefined") {
|
|
40
|
+
const info = await dntShim.Deno.lstat(path);
|
|
41
|
+
return info.isSymlink;
|
|
42
|
+
}
|
|
43
|
+
const fs = await import("node:fs/promises");
|
|
44
|
+
const info = await fs.lstat(path);
|
|
45
|
+
return info.isSymbolicLink();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function isAdapterSymlink(fsAdapter, parentDir, segment) {
|
|
52
|
+
for await (const entry of fsAdapter.readDir(parentDir)) {
|
|
53
|
+
if (entry.name !== segment)
|
|
54
|
+
continue;
|
|
55
|
+
return entry.isSymlink;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
async function hasSymlinkInPath(skillRoot, canonicalPath, fsAdapter) {
|
|
60
|
+
const resolvedRoot = resolve(skillRoot);
|
|
61
|
+
const resolvedTarget = resolve(canonicalPath);
|
|
62
|
+
const rel = relative(resolvedRoot, resolvedTarget).replaceAll("\\", "/");
|
|
63
|
+
if (!rel)
|
|
64
|
+
return false;
|
|
65
|
+
if (rel.startsWith("..") || isAbsolute(rel))
|
|
66
|
+
return true;
|
|
67
|
+
let current = resolvedRoot;
|
|
68
|
+
for (const segment of rel.split("/").filter(Boolean)) {
|
|
69
|
+
if (fsAdapter) {
|
|
70
|
+
if (await isAdapterSymlink(fsAdapter, current, segment))
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
else if (await isLocalSymlink(join(current, segment))) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
current = join(current, segment);
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate that a requested path is safe within a skill's root directory.
|
|
82
|
+
*
|
|
83
|
+
* @param skillRoot - Absolute path to the skill directory
|
|
84
|
+
* @param requestedPath - Relative path requested (e.g. "references/CLAUSES.md")
|
|
85
|
+
* @param allowedSubdirs - Allowed top-level subdirectories (e.g. ["references", "assets"])
|
|
86
|
+
* @param fsAdapter - Optional file system adapter for VFS/cloud-backed projects
|
|
87
|
+
* @returns The validated canonical path
|
|
88
|
+
* @throws If the path is invalid, escapes the skill root, or the file doesn't exist
|
|
89
|
+
*/
|
|
90
|
+
export async function validateSkillPath(skillRoot, requestedPath, allowedSubdirs, fsAdapter) {
|
|
91
|
+
const result = await validatePath(requestedPath, {
|
|
92
|
+
baseDir: skillRoot,
|
|
93
|
+
allowedDirs: allowedSubdirs,
|
|
94
|
+
level: "strict",
|
|
95
|
+
allowAbsolute: false,
|
|
96
|
+
});
|
|
97
|
+
if (!result.valid) {
|
|
98
|
+
throw toError(createError({
|
|
99
|
+
type: "agent",
|
|
100
|
+
message: `Skill path validation failed for "${requestedPath}": ${result.error ?? "access denied"}`,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
const canonicalPath = result.canonicalPath;
|
|
104
|
+
// Verify the path exists and points to a file.
|
|
105
|
+
if (!(await pathExists(canonicalPath, fsAdapter))) {
|
|
106
|
+
throw toError(createError({
|
|
107
|
+
type: "agent",
|
|
108
|
+
message: `File not found: "${requestedPath}" in skill directory`,
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
await assertIsFile(canonicalPath, fsAdapter);
|
|
112
|
+
// Enforce strict no-symlink policy for skill files.
|
|
113
|
+
if (await hasSymlinkInPath(skillRoot, canonicalPath, fsAdapter)) {
|
|
114
|
+
throw toError(createError({
|
|
115
|
+
type: "agent",
|
|
116
|
+
message: `Skill path contains a symlink and is not allowed: "${requestedPath}"`,
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
// Defense-in-depth: local realpath check to block symlink escapes.
|
|
120
|
+
if (!fsAdapter) {
|
|
121
|
+
const [realRoot, realTarget] = await Promise.all([
|
|
122
|
+
resolveLocalRealPath(skillRoot),
|
|
123
|
+
resolveLocalRealPath(canonicalPath),
|
|
124
|
+
]);
|
|
125
|
+
if (!isInsideDir(realRoot, realTarget)) {
|
|
126
|
+
throw toError(createError({
|
|
127
|
+
type: "agent",
|
|
128
|
+
message: `Skill path escapes root directory via symlink: "${requestedPath}"`,
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return canonicalPath;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* List files in a skill subdirectory.
|
|
136
|
+
*
|
|
137
|
+
* @param skillRoot - Absolute path to the skill directory
|
|
138
|
+
* @param subdir - Subdirectory name (e.g. "references", "scripts")
|
|
139
|
+
* @param fsAdapter - Optional file system adapter for VFS/cloud-backed projects
|
|
140
|
+
* @returns Array of relative paths like "references/filename.md"
|
|
141
|
+
*/
|
|
142
|
+
export async function listSkillSubdir(skillRoot, subdir, fsAdapter) {
|
|
143
|
+
const dirPath = join(skillRoot, subdir);
|
|
144
|
+
const dirExists = fsAdapter ? await fsAdapter.exists(dirPath) : await exists(dirPath);
|
|
145
|
+
if (!dirExists) {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
const files = [];
|
|
149
|
+
const entries = fsAdapter ? fsAdapter.readDir(dirPath) : readDir(dirPath);
|
|
150
|
+
for await (const entry of entries) {
|
|
151
|
+
if (entry.isFile) {
|
|
152
|
+
files.push(`${subdir}/${entry.name}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return files;
|
|
156
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Prompt Augmentation
|
|
3
|
+
*
|
|
4
|
+
* Builds the skill manifest section that gets appended to agent system prompts.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { Skill } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Build the skill manifest prompt section for an agent's system prompt.
|
|
11
|
+
*
|
|
12
|
+
* Lists all available skills with their descriptions and instructions
|
|
13
|
+
* on how to use the skill tools (load-skill, load-skill-reference, execute-skill-script).
|
|
14
|
+
*
|
|
15
|
+
* @param skills - Map of resolved skills for the agent
|
|
16
|
+
* @returns Prompt section string, or empty string if no skills
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildSkillManifestPrompt(skills: Map<string, Skill>): string;
|
|
19
|
+
//# sourceMappingURL=prompt-augmentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-augmentation.d.ts","sourceRoot":"","sources":["../../../src/src/skill/prompt-augmentation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,CA4B3E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Prompt Augmentation
|
|
3
|
+
*
|
|
4
|
+
* Builds the skill manifest section that gets appended to agent system prompts.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Build the skill manifest prompt section for an agent's system prompt.
|
|
10
|
+
*
|
|
11
|
+
* Lists all available skills with their descriptions and instructions
|
|
12
|
+
* on how to use the skill tools (load-skill, load-skill-reference, execute-skill-script).
|
|
13
|
+
*
|
|
14
|
+
* @param skills - Map of resolved skills for the agent
|
|
15
|
+
* @returns Prompt section string, or empty string if no skills
|
|
16
|
+
*/
|
|
17
|
+
export function buildSkillManifestPrompt(skills) {
|
|
18
|
+
if (skills.size === 0)
|
|
19
|
+
return "";
|
|
20
|
+
const lines = [
|
|
21
|
+
"## Available Skills",
|
|
22
|
+
"",
|
|
23
|
+
"You have access to skills via tool calling. IMPORTANT: You MUST call the load-skill tool (not write it as text) to activate a skill before performing skill-related tasks.",
|
|
24
|
+
"",
|
|
25
|
+
];
|
|
26
|
+
for (const [id, skill] of skills) {
|
|
27
|
+
lines.push(`- **${id}**: ${skill.metadata.description}`);
|
|
28
|
+
}
|
|
29
|
+
lines.push("");
|
|
30
|
+
lines.push("### Skill Tools (call these as tools, never write them as text)");
|
|
31
|
+
lines.push("");
|
|
32
|
+
lines.push("- load-skill: Call with { skillId } to load a skill's full instructions and available references/scripts");
|
|
33
|
+
lines.push("- load-skill-reference: Call with { skillId, reference } to read a reference file from the skill");
|
|
34
|
+
lines.push("- execute-skill-script: Call with { skillId, script, args?, env?, timeoutMs? } to execute a script");
|
|
35
|
+
return lines.join("\n");
|
|
36
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Registry
|
|
3
|
+
*
|
|
4
|
+
* Project-scoped registry for discovered skills.
|
|
5
|
+
* Follows the same pattern as src/tool/registry.ts.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { Skill } from "./types.js";
|
|
10
|
+
import { ScopedRegistryFacade } from "../ai/registry-facade.js";
|
|
11
|
+
declare class SkillRegistryClass extends ScopedRegistryFacade<Skill> {
|
|
12
|
+
/**
|
|
13
|
+
* Resolve skills for an agent configuration.
|
|
14
|
+
*
|
|
15
|
+
* @param skillsConfig - `true` for all skills, or array of specific skill IDs
|
|
16
|
+
* @returns Map of resolved skills (missing IDs are silently skipped)
|
|
17
|
+
*/
|
|
18
|
+
resolveForAgent(skillsConfig: true | string[]): Map<string, Skill>;
|
|
19
|
+
}
|
|
20
|
+
export declare const skillRegistry: SkillRegistryClass;
|
|
21
|
+
export declare function registerSkill(id: string, skill: Skill): void;
|
|
22
|
+
export declare function getSkill(id: string): Skill | undefined;
|
|
23
|
+
export declare function getAllSkills(): Map<string, Skill>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/src/skill/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIhE,cAAM,kBAAmB,SAAQ,oBAAoB,CAAC,KAAK,CAAC;IAC1D;;;;;OAKG;IACH,eAAe,CAAC,YAAY,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;CAcnE;AAED,eAAO,MAAM,aAAa,oBAAuC,CAAC;AAElE,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAE5D;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEtD;AAED,wBAAgB,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAEjD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Registry
|
|
3
|
+
*
|
|
4
|
+
* Project-scoped registry for discovered skills.
|
|
5
|
+
* Follows the same pattern as src/tool/registry.ts.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { ProjectScopedRegistryManager } from "../ai/registry-manager.js";
|
|
10
|
+
import { ScopedRegistryFacade } from "../ai/registry-facade.js";
|
|
11
|
+
const skillManager = new ProjectScopedRegistryManager("skill");
|
|
12
|
+
class SkillRegistryClass extends ScopedRegistryFacade {
|
|
13
|
+
/**
|
|
14
|
+
* Resolve skills for an agent configuration.
|
|
15
|
+
*
|
|
16
|
+
* @param skillsConfig - `true` for all skills, or array of specific skill IDs
|
|
17
|
+
* @returns Map of resolved skills (missing IDs are silently skipped)
|
|
18
|
+
*/
|
|
19
|
+
resolveForAgent(skillsConfig) {
|
|
20
|
+
if (skillsConfig === true) {
|
|
21
|
+
return this.getAll();
|
|
22
|
+
}
|
|
23
|
+
const result = new Map();
|
|
24
|
+
for (const id of skillsConfig) {
|
|
25
|
+
const skill = this.get(id);
|
|
26
|
+
if (skill) {
|
|
27
|
+
result.set(id, skill);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export const skillRegistry = new SkillRegistryClass(skillManager);
|
|
34
|
+
export function registerSkill(id, skill) {
|
|
35
|
+
skillRegistry.register(id, skill);
|
|
36
|
+
}
|
|
37
|
+
export function getSkill(id) {
|
|
38
|
+
return skillRegistry.get(id);
|
|
39
|
+
}
|
|
40
|
+
export function getAllSkills() {
|
|
41
|
+
return skillRegistry.getAll();
|
|
42
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tools
|
|
3
|
+
*
|
|
4
|
+
* Three tools exposed to agents for interacting with skills:
|
|
5
|
+
* - load-skill: Load a skill's full instructions
|
|
6
|
+
* - load-skill-reference: Read a reference file from a skill
|
|
7
|
+
* - execute-skill-script: Execute a script from a skill
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { Tool } from "../tool/index.js";
|
|
12
|
+
/**
|
|
13
|
+
* Create the load-skill tool.
|
|
14
|
+
* Loads a skill's full instructions, available references, and scripts.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createLoadSkillTool(): Tool;
|
|
17
|
+
/**
|
|
18
|
+
* Create the load-skill-reference tool.
|
|
19
|
+
* Reads a reference file from a skill's references/ or assets/ directory.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createLoadSkillReferenceTool(): Tool;
|
|
22
|
+
/**
|
|
23
|
+
* Create the execute-skill-script tool.
|
|
24
|
+
* Executes a script from a skill's scripts/ directory.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createExecuteSkillScriptTool(): Tool;
|
|
27
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/src/skill/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA2B7C;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAyD1C;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAkCnD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAiDnD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tools
|
|
3
|
+
*
|
|
4
|
+
* Three tools exposed to agents for interacting with skills:
|
|
5
|
+
* - load-skill: Load a skill's full instructions
|
|
6
|
+
* - load-skill-reference: Read a reference file from a skill
|
|
7
|
+
* - execute-skill-script: Execute a script from a skill
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { tool } from "../tool/factory.js";
|
|
13
|
+
import { readTextFile } from "../platform/compat/fs.js";
|
|
14
|
+
import { join } from "../platform/compat/path/index.js";
|
|
15
|
+
import { createError, toError } from "../errors/veryfront-error.js";
|
|
16
|
+
import { skillRegistry } from "./registry.js";
|
|
17
|
+
import { parseSkillFrontmatter } from "./parser.js";
|
|
18
|
+
import { listSkillSubdir, validateSkillPath } from "./path-safety.js";
|
|
19
|
+
import { getSkillScriptExecutor } from "./executor.js";
|
|
20
|
+
import { SKILL_ASSETS_DIR, SKILL_MD_FILENAME, SKILL_REFERENCES_DIR, SKILL_SCRIPTS_DIR, } from "./types.js";
|
|
21
|
+
/**
|
|
22
|
+
* Read a file from a skill directory.
|
|
23
|
+
* Uses skill.fsAdapter if available (VFS/cloud), otherwise falls back to compat readTextFile.
|
|
24
|
+
*/
|
|
25
|
+
async function readSkillFile(skill, path) {
|
|
26
|
+
if (skill.fsAdapter) {
|
|
27
|
+
return await skill.fsAdapter.readFile(path);
|
|
28
|
+
}
|
|
29
|
+
return await readTextFile(path);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create the load-skill tool.
|
|
33
|
+
* Loads a skill's full instructions, available references, and scripts.
|
|
34
|
+
*/
|
|
35
|
+
export function createLoadSkillTool() {
|
|
36
|
+
return tool({
|
|
37
|
+
id: "load-skill",
|
|
38
|
+
description: "Load a skill's full instructions. Returns the skill's markdown instructions, " +
|
|
39
|
+
"allowed tools policy, and lists of available reference files and scripts.",
|
|
40
|
+
inputSchema: z.object({
|
|
41
|
+
skillId: z.string().describe("The ID of the skill to load"),
|
|
42
|
+
}),
|
|
43
|
+
execute: async (input) => {
|
|
44
|
+
const skill = skillRegistry.get(input.skillId);
|
|
45
|
+
if (!skill) {
|
|
46
|
+
const available = skillRegistry.getAllIds().join(", ");
|
|
47
|
+
throw toError(createError({
|
|
48
|
+
type: "agent",
|
|
49
|
+
message: `Skill "${input.skillId}" not found. Available skills: ${available || "none"}`,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
// Read SKILL.md
|
|
53
|
+
const skillMdPath = join(skill.rootPath, SKILL_MD_FILENAME);
|
|
54
|
+
const content = await readSkillFile(skill, skillMdPath);
|
|
55
|
+
// Parse frontmatter to get instructions
|
|
56
|
+
const parsed = await parseSkillFrontmatter(content);
|
|
57
|
+
// List available references and scripts
|
|
58
|
+
const references = await listSkillSubdir(skill.rootPath, SKILL_REFERENCES_DIR, skill.fsAdapter);
|
|
59
|
+
const scripts = await listSkillSubdir(skill.rootPath, SKILL_SCRIPTS_DIR, skill.fsAdapter);
|
|
60
|
+
return {
|
|
61
|
+
instructions: parsed.body,
|
|
62
|
+
allowedTools: skill.metadata.allowedTools,
|
|
63
|
+
references,
|
|
64
|
+
scripts,
|
|
65
|
+
...(scripts.length === 0 && references.length === 0
|
|
66
|
+
? {
|
|
67
|
+
note: "This skill has no scripts or reference files. Do NOT call execute-skill-script or load-skill-reference.",
|
|
68
|
+
}
|
|
69
|
+
: scripts.length === 0
|
|
70
|
+
? { note: "This skill has no scripts. Do NOT call execute-skill-script." }
|
|
71
|
+
: references.length === 0
|
|
72
|
+
? { note: "This skill has no reference files. Do NOT call load-skill-reference." }
|
|
73
|
+
: {}),
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create the load-skill-reference tool.
|
|
80
|
+
* Reads a reference file from a skill's references/ or assets/ directory.
|
|
81
|
+
*/
|
|
82
|
+
export function createLoadSkillReferenceTool() {
|
|
83
|
+
return tool({
|
|
84
|
+
id: "load-skill-reference",
|
|
85
|
+
description: "Read a reference file from a skill. Only files in the skill's " +
|
|
86
|
+
"references/ and assets/ directories are accessible.",
|
|
87
|
+
inputSchema: z.object({
|
|
88
|
+
skillId: z.string().describe("The ID of the skill"),
|
|
89
|
+
reference: z.string().describe("Relative path to the reference file (e.g. 'references/CLAUSES.md')"),
|
|
90
|
+
}),
|
|
91
|
+
execute: async (input) => {
|
|
92
|
+
const skill = skillRegistry.get(input.skillId);
|
|
93
|
+
if (!skill) {
|
|
94
|
+
throw toError(createError({
|
|
95
|
+
type: "agent",
|
|
96
|
+
message: `Skill "${input.skillId}" not found`,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
// Validate path safety (only references/ and assets/ allowed)
|
|
100
|
+
const validatedPath = await validateSkillPath(skill.rootPath, input.reference, [SKILL_REFERENCES_DIR, SKILL_ASSETS_DIR], skill.fsAdapter);
|
|
101
|
+
const content = await readSkillFile(skill, validatedPath);
|
|
102
|
+
return { content, path: input.reference };
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Create the execute-skill-script tool.
|
|
108
|
+
* Executes a script from a skill's scripts/ directory.
|
|
109
|
+
*/
|
|
110
|
+
export function createExecuteSkillScriptTool() {
|
|
111
|
+
return tool({
|
|
112
|
+
id: "execute-skill-script",
|
|
113
|
+
description: "Execute a script from a skill's scripts/ directory. Returns stdout, stderr, and exit code.",
|
|
114
|
+
inputSchema: z.object({
|
|
115
|
+
skillId: z.string().describe("The ID of the skill"),
|
|
116
|
+
script: z.string().describe("Relative path to the script (e.g. 'scripts/setup.sh')"),
|
|
117
|
+
args: z.array(z.string()).optional().describe("Arguments to pass to the script"),
|
|
118
|
+
env: z.record(z.string()).optional().describe("Environment variables for the script"),
|
|
119
|
+
timeoutMs: z
|
|
120
|
+
.number()
|
|
121
|
+
.int()
|
|
122
|
+
.positive()
|
|
123
|
+
.max(300_000)
|
|
124
|
+
.optional()
|
|
125
|
+
.describe("Optional execution timeout in milliseconds (max 300000)"),
|
|
126
|
+
}),
|
|
127
|
+
execute: async (input) => {
|
|
128
|
+
const skill = skillRegistry.get(input.skillId);
|
|
129
|
+
if (!skill) {
|
|
130
|
+
throw toError(createError({
|
|
131
|
+
type: "agent",
|
|
132
|
+
message: `Skill "${input.skillId}" not found`,
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
// Validate path safety (only scripts/ allowed)
|
|
136
|
+
const validatedPath = await validateSkillPath(skill.rootPath, input.script, [SKILL_SCRIPTS_DIR], skill.fsAdapter);
|
|
137
|
+
const scriptContent = await readSkillFile(skill, validatedPath);
|
|
138
|
+
const executor = getSkillScriptExecutor();
|
|
139
|
+
return await executor.execute({
|
|
140
|
+
scriptPath: validatedPath,
|
|
141
|
+
scriptContent,
|
|
142
|
+
args: input.args,
|
|
143
|
+
env: input.env,
|
|
144
|
+
cwd: skill.rootPath,
|
|
145
|
+
timeoutMs: input.timeoutMs,
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
}
|