@syrin/cli 1.3.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/LICENSE +15 -0
- package/README.md +302 -0
- package/dist/cli/commands/analyse.d.ts +16 -0
- package/dist/cli/commands/analyse.js +61 -0
- package/dist/cli/commands/dev.d.ts +23 -0
- package/dist/cli/commands/dev.js +419 -0
- package/dist/cli/commands/doctor.d.ts +10 -0
- package/dist/cli/commands/doctor.js +195 -0
- package/dist/cli/commands/index.d.ts +12 -0
- package/dist/cli/commands/index.js +12 -0
- package/dist/cli/commands/init.d.ts +16 -0
- package/dist/cli/commands/init.js +90 -0
- package/dist/cli/commands/list.d.ts +15 -0
- package/dist/cli/commands/list.js +50 -0
- package/dist/cli/commands/rollback.d.ts +12 -0
- package/dist/cli/commands/rollback.js +101 -0
- package/dist/cli/commands/test.d.ts +31 -0
- package/dist/cli/commands/test.js +88 -0
- package/dist/cli/commands/update.d.ts +9 -0
- package/dist/cli/commands/update.js +76 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.js +342 -0
- package/dist/cli/prompts/index.d.ts +5 -0
- package/dist/cli/prompts/index.js +5 -0
- package/dist/cli/prompts/init-prompt.d.ts +17 -0
- package/dist/cli/prompts/init-prompt.js +263 -0
- package/dist/cli/utils/command-error-handler.d.ts +14 -0
- package/dist/cli/utils/command-error-handler.js +35 -0
- package/dist/cli/utils/common-types.d.ts +24 -0
- package/dist/cli/utils/common-types.js +6 -0
- package/dist/cli/utils/connection-handler.d.ts +37 -0
- package/dist/cli/utils/connection-handler.js +90 -0
- package/dist/cli/utils/index.d.ts +11 -0
- package/dist/cli/utils/index.js +11 -0
- package/dist/cli/utils/option-parsers.d.ts +41 -0
- package/dist/cli/utils/option-parsers.js +92 -0
- package/dist/cli/utils/output-utils.d.ts +12 -0
- package/dist/cli/utils/output-utils.js +21 -0
- package/dist/cli/utils/transport-resolver.d.ts +33 -0
- package/dist/cli/utils/transport-resolver.js +82 -0
- package/dist/cli/utils/version-banner.d.ts +10 -0
- package/dist/cli/utils/version-banner.js +26 -0
- package/dist/config/env-checker.d.ts +37 -0
- package/dist/config/env-checker.js +136 -0
- package/dist/config/generator.d.ts +19 -0
- package/dist/config/generator.js +196 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.js +9 -0
- package/dist/config/loader.d.ts +19 -0
- package/dist/config/loader.js +57 -0
- package/dist/config/schema.d.ts +42 -0
- package/dist/config/schema.js +181 -0
- package/dist/config/syrin.template.yaml +127 -0
- package/dist/config/types.d.ts +87 -0
- package/dist/config/types.js +6 -0
- package/dist/constants/app.d.ts +9 -0
- package/dist/constants/app.js +9 -0
- package/dist/constants/commands.d.ts +43 -0
- package/dist/constants/commands.js +43 -0
- package/dist/constants/defaults.d.ts +18 -0
- package/dist/constants/defaults.js +18 -0
- package/dist/constants/env-vars.d.ts +11 -0
- package/dist/constants/env-vars.js +11 -0
- package/dist/constants/icons.d.ts +23 -0
- package/dist/constants/icons.js +23 -0
- package/dist/constants/index.d.ts +17 -0
- package/dist/constants/index.js +17 -0
- package/dist/constants/labels.d.ts +38 -0
- package/dist/constants/labels.js +42 -0
- package/dist/constants/links.d.ts +10 -0
- package/dist/constants/links.js +11 -0
- package/dist/constants/list.d.ts +10 -0
- package/dist/constants/list.js +9 -0
- package/dist/constants/llm.d.ts +26 -0
- package/dist/constants/llm.js +25 -0
- package/dist/constants/messages.d.ts +107 -0
- package/dist/constants/messages.js +138 -0
- package/dist/constants/paths.d.ts +29 -0
- package/dist/constants/paths.js +29 -0
- package/dist/constants/transport.d.ts +9 -0
- package/dist/constants/transport.js +8 -0
- package/dist/events/emitter.d.ts +64 -0
- package/dist/events/emitter.js +142 -0
- package/dist/events/event-type.d.ts +66 -0
- package/dist/events/event-type.js +81 -0
- package/dist/events/payloads/diagnostics.d.ts +24 -0
- package/dist/events/payloads/diagnostics.js +5 -0
- package/dist/events/payloads/index.d.ts +15 -0
- package/dist/events/payloads/index.js +6 -0
- package/dist/events/payloads/llm.d.ts +58 -0
- package/dist/events/payloads/llm.js +6 -0
- package/dist/events/payloads/registry.d.ts +28 -0
- package/dist/events/payloads/registry.js +5 -0
- package/dist/events/payloads/session.d.ts +32 -0
- package/dist/events/payloads/session.js +5 -0
- package/dist/events/payloads/testing.d.ts +17 -0
- package/dist/events/payloads/testing.js +5 -0
- package/dist/events/payloads/tool.d.ts +29 -0
- package/dist/events/payloads/tool.js +5 -0
- package/dist/events/payloads/transport.d.ts +30 -0
- package/dist/events/payloads/transport.js +5 -0
- package/dist/events/payloads/validation.d.ts +37 -0
- package/dist/events/payloads/validation.js +5 -0
- package/dist/events/payloads/workflow.d.ts +45 -0
- package/dist/events/payloads/workflow.js +5 -0
- package/dist/events/store/file-store.d.ts +37 -0
- package/dist/events/store/file-store.js +113 -0
- package/dist/events/store/index.d.ts +7 -0
- package/dist/events/store/index.js +6 -0
- package/dist/events/store/memory-store.d.ts +26 -0
- package/dist/events/store/memory-store.js +39 -0
- package/dist/events/store.d.ts +11 -0
- package/dist/events/store.js +2 -0
- package/dist/events/types.d.ts +14 -0
- package/dist/events/types.js +2 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +30 -0
- package/dist/presentation/analysis-ui.d.ts +24 -0
- package/dist/presentation/analysis-ui.js +158 -0
- package/dist/presentation/dev/chat-ui-types.d.ts +68 -0
- package/dist/presentation/dev/chat-ui-types.js +5 -0
- package/dist/presentation/dev/chat-ui.d.ts +61 -0
- package/dist/presentation/dev/chat-ui.js +714 -0
- package/dist/presentation/dev/components/assistant-message.d.ts +19 -0
- package/dist/presentation/dev/components/assistant-message.js +36 -0
- package/dist/presentation/dev/components/header.d.ts +16 -0
- package/dist/presentation/dev/components/header.js +22 -0
- package/dist/presentation/dev/components/index.d.ts +13 -0
- package/dist/presentation/dev/components/index.js +13 -0
- package/dist/presentation/dev/components/input-panel.d.ts +22 -0
- package/dist/presentation/dev/components/input-panel.js +43 -0
- package/dist/presentation/dev/components/message-component.d.ts +16 -0
- package/dist/presentation/dev/components/message-component.js +51 -0
- package/dist/presentation/dev/components/messages-list.d.ts +24 -0
- package/dist/presentation/dev/components/messages-list.js +48 -0
- package/dist/presentation/dev/components/system-message.d.ts +16 -0
- package/dist/presentation/dev/components/system-message.js +26 -0
- package/dist/presentation/dev/components/user-message.d.ts +21 -0
- package/dist/presentation/dev/components/user-message.js +35 -0
- package/dist/presentation/dev/components/welcome-banner.d.ts +24 -0
- package/dist/presentation/dev/components/welcome-banner.js +146 -0
- package/dist/presentation/dev/goodbye-messages.d.ts +31 -0
- package/dist/presentation/dev/goodbye-messages.js +100 -0
- package/dist/presentation/dev/index.d.ts +5 -0
- package/dist/presentation/dev/index.js +5 -0
- package/dist/presentation/dev/text-wrapper.d.ts +30 -0
- package/dist/presentation/dev/text-wrapper.js +74 -0
- package/dist/presentation/dev-ui.d.ts +33 -0
- package/dist/presentation/dev-ui.js +246 -0
- package/dist/presentation/doctor-ui.d.ts +40 -0
- package/dist/presentation/doctor-ui.js +157 -0
- package/dist/presentation/init-ui.d.ts +14 -0
- package/dist/presentation/init-ui.js +41 -0
- package/dist/presentation/list-ui.d.ts +44 -0
- package/dist/presentation/list-ui.js +139 -0
- package/dist/presentation/test-ui.d.ts +49 -0
- package/dist/presentation/test-ui.js +358 -0
- package/dist/runtime/analysis/analyser.d.ts +14 -0
- package/dist/runtime/analysis/analyser.js +88 -0
- package/dist/runtime/analysis/dependencies.d.ts +10 -0
- package/dist/runtime/analysis/dependencies.js +140 -0
- package/dist/runtime/analysis/index.d.ts +10 -0
- package/dist/runtime/analysis/index.js +10 -0
- package/dist/runtime/analysis/indexer.d.ts +10 -0
- package/dist/runtime/analysis/indexer.js +62 -0
- package/dist/runtime/analysis/loader.d.ts +15 -0
- package/dist/runtime/analysis/loader.js +47 -0
- package/dist/runtime/analysis/normalizer.d.ts +14 -0
- package/dist/runtime/analysis/normalizer.js +184 -0
- package/dist/runtime/analysis/rules/__test-helpers__.d.ts +18 -0
- package/dist/runtime/analysis/rules/__test-helpers__.js +40 -0
- package/dist/runtime/analysis/rules/base.d.ts +38 -0
- package/dist/runtime/analysis/rules/base.js +23 -0
- package/dist/runtime/analysis/rules/error-codes.d.ts +64 -0
- package/dist/runtime/analysis/rules/error-codes.js +73 -0
- package/dist/runtime/analysis/rules/errors/e000-tool-not-found.d.ts +35 -0
- package/dist/runtime/analysis/rules/errors/e000-tool-not-found.js +32 -0
- package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.js +30 -0
- package/dist/runtime/analysis/rules/errors/e002-underspecified-input.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e002-underspecified-input.js +52 -0
- package/dist/runtime/analysis/rules/errors/e003-type-mismatch.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e003-type-mismatch.js +73 -0
- package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.js +47 -0
- package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.js +73 -0
- package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.js +57 -0
- package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.js +56 -0
- package/dist/runtime/analysis/rules/errors/e008-circular-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e008-circular-dependency.js +84 -0
- package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.js +89 -0
- package/dist/runtime/analysis/rules/errors/e010-non-serializable.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e010-non-serializable.js +46 -0
- package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.js +33 -0
- package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.js +40 -0
- package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.d.ts +37 -0
- package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.js +34 -0
- package/dist/runtime/analysis/rules/errors/e013-output-explosion.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e013-output-explosion.js +36 -0
- package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.d.ts +42 -0
- package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.js +46 -0
- package/dist/runtime/analysis/rules/errors/e014-output-explosion.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e014-output-explosion.js +36 -0
- package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.d.ts +42 -0
- package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.js +46 -0
- package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.d.ts +44 -0
- package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.js +66 -0
- package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.d.ts +43 -0
- package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.js +42 -0
- package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.d.ts +44 -0
- package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.js +66 -0
- package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.d.ts +57 -0
- package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.js +80 -0
- package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.d.ts +43 -0
- package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.js +42 -0
- package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.d.ts +57 -0
- package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.js +80 -0
- package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.d.ts +38 -0
- package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.js +37 -0
- package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.d.ts +38 -0
- package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.js +37 -0
- package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.d.ts +65 -0
- package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.js +109 -0
- package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.d.ts +65 -0
- package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.js +109 -0
- package/dist/runtime/analysis/rules/errors/e100-missing-output-schema.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e100-missing-output-schema.js +30 -0
- package/dist/runtime/analysis/rules/errors/e101-missing-tool-description.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e101-missing-tool-description.js +33 -0
- package/dist/runtime/analysis/rules/errors/e102-underspecified-input.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e102-underspecified-input.js +52 -0
- package/dist/runtime/analysis/rules/errors/e103-type-mismatch.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e103-type-mismatch.js +72 -0
- package/dist/runtime/analysis/rules/errors/e104-param-not-in-description.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e104-param-not-in-description.js +57 -0
- package/dist/runtime/analysis/rules/errors/e105-free-text-propagation.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e105-free-text-propagation.js +47 -0
- package/dist/runtime/analysis/rules/errors/e106-output-not-guaranteed.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e106-output-not-guaranteed.js +58 -0
- package/dist/runtime/analysis/rules/errors/e107-circular-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e107-circular-dependency.js +84 -0
- package/dist/runtime/analysis/rules/errors/e108-implicit-user-input.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e108-implicit-user-input.js +94 -0
- package/dist/runtime/analysis/rules/errors/e109-non-serializable.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e109-non-serializable.js +44 -0
- package/dist/runtime/analysis/rules/errors/e110-tool-ambiguity.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e110-tool-ambiguity.js +73 -0
- package/dist/runtime/analysis/rules/errors/e200-input-validation-failed.d.ts +57 -0
- package/dist/runtime/analysis/rules/errors/e200-input-validation-failed.js +71 -0
- package/dist/runtime/analysis/rules/errors/e300-output-validation-failed.d.ts +43 -0
- package/dist/runtime/analysis/rules/errors/e300-output-validation-failed.js +44 -0
- package/dist/runtime/analysis/rules/errors/e301-output-explosion.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e301-output-explosion.js +36 -0
- package/dist/runtime/analysis/rules/errors/e400-tool-execution-failed.d.ts +38 -0
- package/dist/runtime/analysis/rules/errors/e400-tool-execution-failed.js +37 -0
- package/dist/runtime/analysis/rules/errors/e403-unbounded-execution.d.ts +44 -0
- package/dist/runtime/analysis/rules/errors/e403-unbounded-execution.js +66 -0
- package/dist/runtime/analysis/rules/errors/e500-side-effect-detected.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e500-side-effect-detected.js +40 -0
- package/dist/runtime/analysis/rules/errors/e501-hidden-dependency.d.ts +47 -0
- package/dist/runtime/analysis/rules/errors/e501-hidden-dependency.js +46 -0
- package/dist/runtime/analysis/rules/errors/e600-unexpected-test-result.d.ts +65 -0
- package/dist/runtime/analysis/rules/errors/e600-unexpected-test-result.js +109 -0
- package/dist/runtime/analysis/rules/index.d.ts +18 -0
- package/dist/runtime/analysis/rules/index.js +94 -0
- package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.js +39 -0
- package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.d.ts +24 -0
- package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.js +40 -0
- package/dist/runtime/analysis/rules/warnings/w003-missing-examples.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w003-missing-examples.js +84 -0
- package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.js +96 -0
- package/dist/runtime/analysis/rules/warnings/w005-generic-description.d.ts +53 -0
- package/dist/runtime/analysis/rules/warnings/w005-generic-description.js +108 -0
- package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.js +44 -0
- package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.js +37 -0
- package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.js +97 -0
- package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.js +88 -0
- package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.js +81 -0
- package/dist/runtime/analysis/rules/warnings/w021-weak-schema.d.ts +40 -0
- package/dist/runtime/analysis/rules/warnings/w021-weak-schema.js +32 -0
- package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.d.ts +39 -0
- package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.js +36 -0
- package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.d.ts +38 -0
- package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.js +36 -0
- package/dist/runtime/analysis/rules/warnings/w100-implicit-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w100-implicit-dependency.js +89 -0
- package/dist/runtime/analysis/rules/warnings/w101-free-text-without-normalization.d.ts +24 -0
- package/dist/runtime/analysis/rules/warnings/w101-free-text-without-normalization.js +40 -0
- package/dist/runtime/analysis/rules/warnings/w102-missing-examples.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w102-missing-examples.js +76 -0
- package/dist/runtime/analysis/rules/warnings/w103-overloaded-responsibility.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w103-overloaded-responsibility.js +91 -0
- package/dist/runtime/analysis/rules/warnings/w104-generic-description.d.ts +53 -0
- package/dist/runtime/analysis/rules/warnings/w104-generic-description.js +108 -0
- package/dist/runtime/analysis/rules/warnings/w105-optional-as-required.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w105-optional-as-required.js +45 -0
- package/dist/runtime/analysis/rules/warnings/w106-broad-output-schema.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w106-broad-output-schema.js +37 -0
- package/dist/runtime/analysis/rules/warnings/w107-multiple-entry-points.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w107-multiple-entry-points.js +97 -0
- package/dist/runtime/analysis/rules/warnings/w108-hidden-side-effects.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w108-hidden-side-effects.js +94 -0
- package/dist/runtime/analysis/rules/warnings/w109-output-not-reusable.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w109-output-not-reusable.js +63 -0
- package/dist/runtime/analysis/rules/warnings/w110-weak-schema.d.ts +40 -0
- package/dist/runtime/analysis/rules/warnings/w110-weak-schema.js +32 -0
- package/dist/runtime/analysis/rules/warnings/w300-high-entropy-output.d.ts +39 -0
- package/dist/runtime/analysis/rules/warnings/w300-high-entropy-output.js +47 -0
- package/dist/runtime/analysis/rules/warnings/w301-unstable-defaults.d.ts +38 -0
- package/dist/runtime/analysis/rules/warnings/w301-unstable-defaults.js +36 -0
- package/dist/runtime/analysis/strict-mode.d.ts +21 -0
- package/dist/runtime/analysis/strict-mode.js +44 -0
- package/dist/runtime/analysis/types.d.ts +133 -0
- package/dist/runtime/analysis/types.js +6 -0
- package/dist/runtime/analysis/utils.d.ts +19 -0
- package/dist/runtime/analysis/utils.js +21 -0
- package/dist/runtime/dev/data-manager.d.ts +55 -0
- package/dist/runtime/dev/data-manager.js +87 -0
- package/dist/runtime/dev/event-mapper.d.ts +100 -0
- package/dist/runtime/dev/event-mapper.js +400 -0
- package/dist/runtime/dev/formatter.d.ts +94 -0
- package/dist/runtime/dev/formatter.js +236 -0
- package/dist/runtime/dev/index.d.ts +9 -0
- package/dist/runtime/dev/index.js +9 -0
- package/dist/runtime/dev/repl.d.ts +114 -0
- package/dist/runtime/dev/repl.js +310 -0
- package/dist/runtime/dev/session.d.ts +86 -0
- package/dist/runtime/dev/session.js +447 -0
- package/dist/runtime/dev/stack-trace.d.ts +77 -0
- package/dist/runtime/dev/stack-trace.js +286 -0
- package/dist/runtime/dev/types.d.ts +54 -0
- package/dist/runtime/dev/types.js +5 -0
- package/dist/runtime/llm/claude.d.ts +27 -0
- package/dist/runtime/llm/claude.js +150 -0
- package/dist/runtime/llm/factory.d.ts +30 -0
- package/dist/runtime/llm/factory.js +78 -0
- package/dist/runtime/llm/index.d.ts +10 -0
- package/dist/runtime/llm/index.js +10 -0
- package/dist/runtime/llm/ollama.d.ts +45 -0
- package/dist/runtime/llm/ollama.js +449 -0
- package/dist/runtime/llm/openai.d.ts +27 -0
- package/dist/runtime/llm/openai.js +170 -0
- package/dist/runtime/llm/provider.d.ts +32 -0
- package/dist/runtime/llm/provider.js +6 -0
- package/dist/runtime/llm/types.d.ts +55 -0
- package/dist/runtime/llm/types.js +6 -0
- package/dist/runtime/mcp/client/base.d.ts +40 -0
- package/dist/runtime/mcp/client/base.js +157 -0
- package/dist/runtime/mcp/client/manager.d.ts +91 -0
- package/dist/runtime/mcp/client/manager.js +248 -0
- package/dist/runtime/mcp/client/process.d.ts +31 -0
- package/dist/runtime/mcp/client/process.js +82 -0
- package/dist/runtime/mcp/connection.d.ts +63 -0
- package/dist/runtime/mcp/connection.js +449 -0
- package/dist/runtime/mcp/index.d.ts +9 -0
- package/dist/runtime/mcp/index.js +9 -0
- package/dist/runtime/mcp/list.d.ts +50 -0
- package/dist/runtime/mcp/list.js +65 -0
- package/dist/runtime/mcp/stdio-transport.d.ts +23 -0
- package/dist/runtime/mcp/stdio-transport.js +71 -0
- package/dist/runtime/mcp/types.d.ts +85 -0
- package/dist/runtime/mcp/types.js +6 -0
- package/dist/runtime/sandbox/executor.d.ts +102 -0
- package/dist/runtime/sandbox/executor.js +537 -0
- package/dist/runtime/sandbox/index.d.ts +9 -0
- package/dist/runtime/sandbox/index.js +9 -0
- package/dist/runtime/sandbox/io-monitor.d.ts +78 -0
- package/dist/runtime/sandbox/io-monitor.js +98 -0
- package/dist/runtime/sandbox/time-parser.d.ts +19 -0
- package/dist/runtime/sandbox/time-parser.js +67 -0
- package/dist/runtime/sandbox/types.d.ts +58 -0
- package/dist/runtime/sandbox/types.js +23 -0
- package/dist/runtime/test/behavior-observer.d.ts +61 -0
- package/dist/runtime/test/behavior-observer.js +140 -0
- package/dist/runtime/test/contract-loader.d.ts +41 -0
- package/dist/runtime/test/contract-loader.js +158 -0
- package/dist/runtime/test/contract-schema.d.ts +46 -0
- package/dist/runtime/test/contract-schema.js +107 -0
- package/dist/runtime/test/contract-types.d.ts +106 -0
- package/dist/runtime/test/contract-types.js +6 -0
- package/dist/runtime/test/dependency-tracker.d.ts +66 -0
- package/dist/runtime/test/dependency-tracker.js +80 -0
- package/dist/runtime/test/formatters.d.ts +18 -0
- package/dist/runtime/test/formatters.js +172 -0
- package/dist/runtime/test/index.d.ts +12 -0
- package/dist/runtime/test/index.js +13 -0
- package/dist/runtime/test/input-generator.d.ts +33 -0
- package/dist/runtime/test/input-generator.js +498 -0
- package/dist/runtime/test/mcp-root-detector.d.ts +31 -0
- package/dist/runtime/test/mcp-root-detector.js +105 -0
- package/dist/runtime/test/orchestrator.d.ts +131 -0
- package/dist/runtime/test/orchestrator.js +738 -0
- package/dist/runtime/test/output-validator.d.ts +44 -0
- package/dist/runtime/test/output-validator.js +262 -0
- package/dist/runtime/test/retry-tester.d.ts +44 -0
- package/dist/runtime/test/retry-tester.js +103 -0
- package/dist/runtime/test/runner.d.ts +28 -0
- package/dist/runtime/test/runner.js +55 -0
- package/dist/runtime/test/synthetic-input-generator.d.ts +11 -0
- package/dist/runtime/test/synthetic-input-generator.js +154 -0
- package/dist/runtime/test/test-runner.d.ts +28 -0
- package/dist/runtime/test/test-runner.js +55 -0
- package/dist/types/factories.d.ts +16 -0
- package/dist/types/factories.js +43 -0
- package/dist/types/ids.d.ts +16 -0
- package/dist/types/ids.js +2 -0
- package/dist/types/opaque.d.ts +4 -0
- package/dist/types/opaque.js +2 -0
- package/dist/utils/errors.d.ts +92 -0
- package/dist/utils/errors.js +97 -0
- package/dist/utils/gitignore.d.ts +11 -0
- package/dist/utils/gitignore.js +59 -0
- package/dist/utils/json-file-saver.d.ts +17 -0
- package/dist/utils/json-file-saver.js +81 -0
- package/dist/utils/json-formatter.d.ts +63 -0
- package/dist/utils/json-formatter.js +344 -0
- package/dist/utils/logger.d.ts +184 -0
- package/dist/utils/logger.js +330 -0
- package/dist/utils/package-manager.d.ts +30 -0
- package/dist/utils/package-manager.js +157 -0
- package/dist/utils/version-checker.d.ts +47 -0
- package/dist/utils/version-checker.js +167 -0
- package/dist/utils/version-display.d.ts +10 -0
- package/dist/utils/version-display.js +20 -0
- package/package.json +106 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base LLM provider interface.
|
|
3
|
+
* All LLM providers must implement this interface.
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMRequest, LLMResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Base interface for all LLM providers.
|
|
8
|
+
*/
|
|
9
|
+
export interface LLMProvider {
|
|
10
|
+
/**
|
|
11
|
+
* Send a chat request to the LLM.
|
|
12
|
+
* @param request - The LLM request with messages and tools
|
|
13
|
+
* @returns Promise resolving to LLM response
|
|
14
|
+
*/
|
|
15
|
+
chat(request: LLMRequest): Promise<LLMResponse>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if this provider supports tool/function calling.
|
|
18
|
+
* @returns true if tool calling is supported
|
|
19
|
+
*/
|
|
20
|
+
supportsToolCalls(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Get the name of this provider.
|
|
23
|
+
* @returns Provider name (e.g., "OpenAI", "Claude", "Ollama")
|
|
24
|
+
*/
|
|
25
|
+
getName(): string;
|
|
26
|
+
/**
|
|
27
|
+
* Get the model name being used.
|
|
28
|
+
* @returns Model name
|
|
29
|
+
*/
|
|
30
|
+
getModelName(): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM provider type definitions.
|
|
3
|
+
* Common types used across all LLM provider implementations.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Message role in a conversation.
|
|
7
|
+
*/
|
|
8
|
+
export type MessageRole = 'user' | 'assistant' | 'system';
|
|
9
|
+
/**
|
|
10
|
+
* A message in the conversation.
|
|
11
|
+
*/
|
|
12
|
+
export interface LLMMessage {
|
|
13
|
+
role: MessageRole;
|
|
14
|
+
content: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Tool definition for LLM function calling.
|
|
18
|
+
*/
|
|
19
|
+
export interface ToolDefinition {
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
inputSchema: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A tool call proposed by the LLM.
|
|
26
|
+
*/
|
|
27
|
+
export interface ToolCall {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
arguments: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* LLM response containing text and optional tool calls.
|
|
34
|
+
*/
|
|
35
|
+
export interface LLMResponse {
|
|
36
|
+
content: string;
|
|
37
|
+
finishReason?: 'stop' | 'length' | 'tool_calls' | 'error';
|
|
38
|
+
toolCalls?: ToolCall[];
|
|
39
|
+
usage?: {
|
|
40
|
+
promptTokens: number;
|
|
41
|
+
completionTokens: number;
|
|
42
|
+
totalTokens: number;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Request to send to LLM.
|
|
47
|
+
*/
|
|
48
|
+
export interface LLMRequest {
|
|
49
|
+
messages: LLMMessage[];
|
|
50
|
+
tools?: ToolDefinition[];
|
|
51
|
+
temperature?: number;
|
|
52
|
+
maxTokens?: number;
|
|
53
|
+
systemPrompt?: string;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base MCP client manager with shared functionality.
|
|
3
|
+
*/
|
|
4
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
5
|
+
import type { EventEmitter } from '../../../events/emitter.js';
|
|
6
|
+
import type { TransportType } from '../../../config/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Base class for MCP client managers with shared functionality.
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class BaseMCPClientManager {
|
|
11
|
+
protected readonly eventEmitter: EventEmitter;
|
|
12
|
+
protected client: Client | null;
|
|
13
|
+
protected connected: boolean;
|
|
14
|
+
constructor(eventEmitter: EventEmitter);
|
|
15
|
+
/**
|
|
16
|
+
* Get available tools from the MCP server.
|
|
17
|
+
*/
|
|
18
|
+
getAvailableTools(): Promise<Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
inputSchema: Record<string, unknown>;
|
|
22
|
+
}>>;
|
|
23
|
+
/**
|
|
24
|
+
* Execute a tool call.
|
|
25
|
+
*/
|
|
26
|
+
executeTool(toolName: string, toolArguments: Record<string, unknown>, executionMode: boolean): Promise<unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if the manager is connected.
|
|
29
|
+
*/
|
|
30
|
+
isConnected(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Get the transport type (must be implemented by subclasses).
|
|
33
|
+
*/
|
|
34
|
+
abstract getTransportType(): TransportType;
|
|
35
|
+
/**
|
|
36
|
+
* Helper to emit transport error events.
|
|
37
|
+
*/
|
|
38
|
+
protected emitTransportError(errorMessage: string, errorCode: string, recoverable: boolean): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base MCP client manager with shared functionality.
|
|
3
|
+
*/
|
|
4
|
+
import { TransportEventType, ToolExecutionEventType, } from '../../../events/event-type.js';
|
|
5
|
+
import { ConfigurationError } from '../../../utils/errors.js';
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
+
/**
|
|
8
|
+
* Base class for MCP client managers with shared functionality.
|
|
9
|
+
*/
|
|
10
|
+
export class BaseMCPClientManager {
|
|
11
|
+
eventEmitter;
|
|
12
|
+
client = null;
|
|
13
|
+
connected = false;
|
|
14
|
+
constructor(eventEmitter) {
|
|
15
|
+
this.eventEmitter = eventEmitter;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get available tools from the MCP server.
|
|
19
|
+
*/
|
|
20
|
+
async getAvailableTools() {
|
|
21
|
+
if (!this.client || !this.connected) {
|
|
22
|
+
throw new ConfigurationError('MCP client is not connected');
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const response = await this.client.listTools();
|
|
26
|
+
return (response.tools || []).map(tool => ({
|
|
27
|
+
name: tool.name,
|
|
28
|
+
description: tool.description || '',
|
|
29
|
+
inputSchema: tool.inputSchema || {},
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
34
|
+
await this.emitTransportError(`Failed to list tools: ${errorMessage}`, 'LIST_TOOLS_ERROR', true);
|
|
35
|
+
throw new Error(`Failed to list tools: ${errorMessage}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute a tool call.
|
|
40
|
+
*/
|
|
41
|
+
async executeTool(toolName, toolArguments, executionMode) {
|
|
42
|
+
if (!this.client || !this.connected) {
|
|
43
|
+
throw new ConfigurationError('MCP client is not connected');
|
|
44
|
+
}
|
|
45
|
+
const executionId = uuidv4();
|
|
46
|
+
const startTime = Date.now();
|
|
47
|
+
// Emit tool execution started event
|
|
48
|
+
await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_STARTED, {
|
|
49
|
+
tool_name: toolName,
|
|
50
|
+
arguments: toolArguments,
|
|
51
|
+
execution_id: executionId,
|
|
52
|
+
});
|
|
53
|
+
// Emit transport message sent event
|
|
54
|
+
// Construct request body from source variables to ensure consistency
|
|
55
|
+
const requestMessage = JSON.stringify({
|
|
56
|
+
method: 'tools/call',
|
|
57
|
+
params: {
|
|
58
|
+
name: toolName,
|
|
59
|
+
arguments: toolArguments,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
// Derive tool_name and tool_arguments from the same source variables
|
|
63
|
+
// used to construct request_body to guarantee consistency
|
|
64
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_MESSAGE_SENT, {
|
|
65
|
+
transport_type: this.getTransportType(),
|
|
66
|
+
message_type: 'tools/call',
|
|
67
|
+
size_bytes: Buffer.byteLength(requestMessage, 'utf8'),
|
|
68
|
+
tool_name: toolName,
|
|
69
|
+
tool_arguments: toolArguments,
|
|
70
|
+
request_body: requestMessage,
|
|
71
|
+
});
|
|
72
|
+
if (!executionMode) {
|
|
73
|
+
// Preview mode - don't actually execute
|
|
74
|
+
const duration = Date.now() - startTime;
|
|
75
|
+
await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_COMPLETED, {
|
|
76
|
+
tool_name: toolName,
|
|
77
|
+
arguments: toolArguments,
|
|
78
|
+
result: {
|
|
79
|
+
preview: true,
|
|
80
|
+
message: 'Tool call preview (not executed)',
|
|
81
|
+
},
|
|
82
|
+
execution_id: executionId,
|
|
83
|
+
duration_ms: duration,
|
|
84
|
+
});
|
|
85
|
+
return { preview: true, message: 'Tool call preview (not executed)' };
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
// Execute the tool
|
|
89
|
+
const result = await this.client.callTool({
|
|
90
|
+
name: toolName,
|
|
91
|
+
arguments: toolArguments,
|
|
92
|
+
});
|
|
93
|
+
const duration = Date.now() - startTime;
|
|
94
|
+
// Emit transport message received event
|
|
95
|
+
const responseMessage = JSON.stringify(result);
|
|
96
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_MESSAGE_RECEIVED, {
|
|
97
|
+
transport_type: this.getTransportType(),
|
|
98
|
+
message_type: 'tools/call_response',
|
|
99
|
+
size_bytes: Buffer.byteLength(responseMessage, 'utf8'),
|
|
100
|
+
});
|
|
101
|
+
// Extract result content
|
|
102
|
+
const resultContent = result.content || [];
|
|
103
|
+
const textContent = resultContent
|
|
104
|
+
.filter((item) => item.type === 'text')
|
|
105
|
+
.map((item) => item.text || '')
|
|
106
|
+
.join('\n');
|
|
107
|
+
const toolResult = textContent || result;
|
|
108
|
+
// Emit tool execution completed event
|
|
109
|
+
await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_COMPLETED, {
|
|
110
|
+
tool_name: toolName,
|
|
111
|
+
arguments: toolArguments,
|
|
112
|
+
result: toolResult,
|
|
113
|
+
execution_id: executionId,
|
|
114
|
+
duration_ms: duration,
|
|
115
|
+
});
|
|
116
|
+
return toolResult;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const duration = Date.now() - startTime;
|
|
120
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
121
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
122
|
+
// Emit tool execution failed event
|
|
123
|
+
await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_FAILED, {
|
|
124
|
+
tool_name: toolName,
|
|
125
|
+
arguments: toolArguments,
|
|
126
|
+
execution_id: executionId,
|
|
127
|
+
error: {
|
|
128
|
+
message: errorMessage,
|
|
129
|
+
code: 'TOOL_EXECUTION_ERROR',
|
|
130
|
+
stack_trace: errorStack,
|
|
131
|
+
error_type: 'runtime',
|
|
132
|
+
},
|
|
133
|
+
duration_ms: duration,
|
|
134
|
+
});
|
|
135
|
+
await this.emitTransportError(errorMessage, 'TOOL_EXECUTION_ERROR', true);
|
|
136
|
+
throw new Error(`Tool execution failed: ${errorMessage}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if the manager is connected.
|
|
141
|
+
*/
|
|
142
|
+
isConnected() {
|
|
143
|
+
return this.connected;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Helper to emit transport error events.
|
|
147
|
+
*/
|
|
148
|
+
async emitTransportError(errorMessage, errorCode, recoverable) {
|
|
149
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
|
|
150
|
+
transport_type: this.getTransportType(),
|
|
151
|
+
error_message: errorMessage,
|
|
152
|
+
error_code: errorCode,
|
|
153
|
+
recoverable,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Client Manager.
|
|
3
|
+
* Manages MCP client connections and tool execution with event integration.
|
|
4
|
+
*/
|
|
5
|
+
import type { EventEmitter } from '../../../events/emitter.js';
|
|
6
|
+
import type { TransportType } from '../../../config/types.js';
|
|
7
|
+
import type { MCPURL, Command } from '../../../types/ids.js';
|
|
8
|
+
import { BaseMCPClientManager } from './base.js';
|
|
9
|
+
/**
|
|
10
|
+
* MCP client manager interface.
|
|
11
|
+
*/
|
|
12
|
+
export interface MCPClientManager {
|
|
13
|
+
/**
|
|
14
|
+
* Connect to the MCP server.
|
|
15
|
+
* @returns Promise that resolves when connected
|
|
16
|
+
*/
|
|
17
|
+
connect(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Disconnect from the MCP server.
|
|
20
|
+
* @returns Promise that resolves when disconnected
|
|
21
|
+
*/
|
|
22
|
+
disconnect(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Get available tools from the MCP server.
|
|
25
|
+
* @returns Array of tool definitions
|
|
26
|
+
*/
|
|
27
|
+
getAvailableTools(): Promise<Array<{
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
inputSchema: Record<string, unknown>;
|
|
31
|
+
}>>;
|
|
32
|
+
/**
|
|
33
|
+
* Execute a tool call.
|
|
34
|
+
* @param toolName - Name of the tool to execute
|
|
35
|
+
* @param toolArguments - Tool arguments
|
|
36
|
+
* @param executionMode - Whether to actually execute (true) or just preview (false)
|
|
37
|
+
* @returns Tool execution result
|
|
38
|
+
*/
|
|
39
|
+
executeTool(toolName: string, toolArguments: Record<string, unknown>, executionMode: boolean): Promise<unknown>;
|
|
40
|
+
/**
|
|
41
|
+
* Check if the manager is connected.
|
|
42
|
+
* @returns true if connected
|
|
43
|
+
*/
|
|
44
|
+
isConnected(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Get the transport type.
|
|
47
|
+
* @returns Transport type
|
|
48
|
+
*/
|
|
49
|
+
getTransportType(): TransportType;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* HTTP-based MCP client manager.
|
|
53
|
+
*/
|
|
54
|
+
export declare class HTTPMCPClientManager extends BaseMCPClientManager implements MCPClientManager {
|
|
55
|
+
private readonly mcpUrl;
|
|
56
|
+
private readonly shouldSpawn;
|
|
57
|
+
private readonly serverCommand?;
|
|
58
|
+
private transport;
|
|
59
|
+
private process;
|
|
60
|
+
constructor(mcpUrl: string, eventEmitter: EventEmitter, shouldSpawn?: boolean, serverCommand?: string | undefined);
|
|
61
|
+
connect(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Spawn the HTTP server as a child process and capture logs.
|
|
64
|
+
*/
|
|
65
|
+
private spawnServer;
|
|
66
|
+
disconnect(): Promise<void>;
|
|
67
|
+
getTransportType(): TransportType;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Stdio-based MCP client manager.
|
|
71
|
+
*/
|
|
72
|
+
export declare class StdioMCPClientManager extends BaseMCPClientManager implements MCPClientManager {
|
|
73
|
+
private readonly command;
|
|
74
|
+
private transport;
|
|
75
|
+
private process;
|
|
76
|
+
constructor(command: string, eventEmitter: EventEmitter);
|
|
77
|
+
connect(): Promise<void>;
|
|
78
|
+
disconnect(): Promise<void>;
|
|
79
|
+
getTransportType(): TransportType;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Factory function to create an MCP client manager.
|
|
83
|
+
* @param transport - Transport type
|
|
84
|
+
* @param mcpUrl - MCP URL (for HTTP transport)
|
|
85
|
+
* @param command - Command to spawn server (optional, only if shouldSpawn is true)
|
|
86
|
+
* @param eventEmitter - Event emitter for emitting events
|
|
87
|
+
* @param shouldSpawn - Whether to spawn the server as a child process
|
|
88
|
+
* @returns MCP client manager instance
|
|
89
|
+
*/
|
|
90
|
+
export declare function createMCPClientManager(transport: TransportType, mcpUrl: MCPURL | string | undefined, command: Command | string | undefined, eventEmitter: EventEmitter, shouldSpawn?: boolean): MCPClientManager;
|
|
91
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Client Manager.
|
|
3
|
+
* Manages MCP client connections and tool execution with event integration.
|
|
4
|
+
*/
|
|
5
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
7
|
+
import { TransportEventType } from '../../../events/event-type.js';
|
|
8
|
+
import { getConnectedClient } from '../connection.js';
|
|
9
|
+
import { ConfigurationError } from '../../../utils/errors.js';
|
|
10
|
+
import { logger } from '../../../utils/logger.js';
|
|
11
|
+
import { parseCommand, setupProcessLogCapture, spawnProcess } from './process.js';
|
|
12
|
+
import { BaseMCPClientManager } from './base.js';
|
|
13
|
+
/**
|
|
14
|
+
* HTTP-based MCP client manager.
|
|
15
|
+
*/
|
|
16
|
+
export class HTTPMCPClientManager extends BaseMCPClientManager {
|
|
17
|
+
mcpUrl;
|
|
18
|
+
shouldSpawn;
|
|
19
|
+
serverCommand;
|
|
20
|
+
transport = null;
|
|
21
|
+
process = null;
|
|
22
|
+
constructor(mcpUrl, eventEmitter, shouldSpawn = false, serverCommand) {
|
|
23
|
+
super(eventEmitter);
|
|
24
|
+
this.mcpUrl = mcpUrl;
|
|
25
|
+
this.shouldSpawn = shouldSpawn;
|
|
26
|
+
this.serverCommand = serverCommand;
|
|
27
|
+
}
|
|
28
|
+
async connect() {
|
|
29
|
+
if (this.connected) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
// Spawn server process if needed
|
|
34
|
+
if (this.shouldSpawn && this.serverCommand) {
|
|
35
|
+
this.spawnServer();
|
|
36
|
+
// Wait a bit for server to start
|
|
37
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
38
|
+
}
|
|
39
|
+
// Emit transport initialization event
|
|
40
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_INITIALIZED, {
|
|
41
|
+
transport_type: 'http',
|
|
42
|
+
endpoint: this.mcpUrl,
|
|
43
|
+
...(this.shouldSpawn && this.serverCommand
|
|
44
|
+
? { command: this.serverCommand }
|
|
45
|
+
: {}),
|
|
46
|
+
});
|
|
47
|
+
const connection = await getConnectedClient(this.mcpUrl, undefined, 10000);
|
|
48
|
+
this.client = connection.client;
|
|
49
|
+
this.transport = connection.transport;
|
|
50
|
+
this.connected = true;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
54
|
+
// Clean up spawned process on error
|
|
55
|
+
if (this.process) {
|
|
56
|
+
this.process.kill();
|
|
57
|
+
this.process = null;
|
|
58
|
+
}
|
|
59
|
+
// Emit transport error event
|
|
60
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
|
|
61
|
+
transport_type: 'http',
|
|
62
|
+
error_message: errorMessage,
|
|
63
|
+
error_code: 'CONNECTION_FAILED',
|
|
64
|
+
recoverable: true,
|
|
65
|
+
});
|
|
66
|
+
throw new ConfigurationError(`Failed to connect to MCP server at ${this.mcpUrl}: ${errorMessage}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Spawn the HTTP server as a child process and capture logs.
|
|
71
|
+
*/
|
|
72
|
+
spawnServer() {
|
|
73
|
+
if (!this.serverCommand) {
|
|
74
|
+
throw new ConfigurationError('Server command is required for spawning');
|
|
75
|
+
}
|
|
76
|
+
const command = this.serverCommand.trim();
|
|
77
|
+
if (!command) {
|
|
78
|
+
throw new ConfigurationError('Server command is empty');
|
|
79
|
+
}
|
|
80
|
+
const { executable, args } = parseCommand(command);
|
|
81
|
+
this.process = spawnProcess(executable, args);
|
|
82
|
+
setupProcessLogCapture(this.process);
|
|
83
|
+
// Handle process errors
|
|
84
|
+
this.process.on('error', (error) => {
|
|
85
|
+
void this.emitTransportError(`Failed to spawn server process: ${error.message}`, 'SPAWN_ERROR', false);
|
|
86
|
+
});
|
|
87
|
+
// Handle process exit
|
|
88
|
+
this.process.on('exit', (code, signal) => {
|
|
89
|
+
if (code !== null && code !== 0) {
|
|
90
|
+
void this.emitTransportError(`Server process exited with code ${code}${signal ? ` (signal: ${signal})` : ''}`, 'SERVER_EXIT', false);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async disconnect() {
|
|
95
|
+
if (!this.connected) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
if (this.transport) {
|
|
100
|
+
await this.transport.close();
|
|
101
|
+
}
|
|
102
|
+
this.connected = false;
|
|
103
|
+
this.client = null;
|
|
104
|
+
this.transport = null;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
// Log but don't throw - cleanup errors are non-critical
|
|
108
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
109
|
+
logger.error('Error closing transport during disconnect', err);
|
|
110
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
|
|
111
|
+
transport_type: 'http',
|
|
112
|
+
error_message: err.message,
|
|
113
|
+
error_code: 'DISCONNECT_ERROR',
|
|
114
|
+
recoverable: false,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
getTransportType() {
|
|
119
|
+
return 'http';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Stdio-based MCP client manager.
|
|
124
|
+
*/
|
|
125
|
+
export class StdioMCPClientManager extends BaseMCPClientManager {
|
|
126
|
+
command;
|
|
127
|
+
transport = null;
|
|
128
|
+
process = null;
|
|
129
|
+
constructor(command, eventEmitter) {
|
|
130
|
+
super(eventEmitter);
|
|
131
|
+
this.command = command;
|
|
132
|
+
}
|
|
133
|
+
async connect() {
|
|
134
|
+
if (this.connected) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const command = this.command.trim();
|
|
139
|
+
if (!command) {
|
|
140
|
+
throw new ConfigurationError('Command is empty');
|
|
141
|
+
}
|
|
142
|
+
const { executable, args } = parseCommand(command);
|
|
143
|
+
// Emit transport initialization event
|
|
144
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_INITIALIZED, {
|
|
145
|
+
transport_type: 'stdio',
|
|
146
|
+
command: this.command,
|
|
147
|
+
});
|
|
148
|
+
// Create MCP client
|
|
149
|
+
this.client = new Client({
|
|
150
|
+
name: 'syrin',
|
|
151
|
+
version: '1.0.0',
|
|
152
|
+
}, {
|
|
153
|
+
capabilities: {},
|
|
154
|
+
});
|
|
155
|
+
// Spawn the process
|
|
156
|
+
this.process = spawnProcess(executable, args);
|
|
157
|
+
setupProcessLogCapture(this.process);
|
|
158
|
+
// Create stdio transport
|
|
159
|
+
this.transport = new StdioClientTransport({
|
|
160
|
+
command: executable,
|
|
161
|
+
args,
|
|
162
|
+
env: process.env,
|
|
163
|
+
});
|
|
164
|
+
// Set up error handler
|
|
165
|
+
this.client.onerror = () => {
|
|
166
|
+
// Error handler - errors are logged but we'll catch them in try-catch
|
|
167
|
+
};
|
|
168
|
+
// Set up process error handler
|
|
169
|
+
this.process.on('error', (error) => {
|
|
170
|
+
throw new Error(`Failed to start process: ${error.message}`);
|
|
171
|
+
});
|
|
172
|
+
// Connect with timeout
|
|
173
|
+
const connectionPromise = this.client.connect(this.transport);
|
|
174
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
175
|
+
setTimeout(() => {
|
|
176
|
+
if (this.process) {
|
|
177
|
+
this.process.kill();
|
|
178
|
+
}
|
|
179
|
+
reject(new Error(`Connection timeout after 10000ms`));
|
|
180
|
+
}, 10000);
|
|
181
|
+
});
|
|
182
|
+
await Promise.race([connectionPromise, timeoutPromise]);
|
|
183
|
+
this.connected = true;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
187
|
+
// Clean up on error
|
|
188
|
+
if (this.process) {
|
|
189
|
+
this.process.kill();
|
|
190
|
+
this.process = null;
|
|
191
|
+
}
|
|
192
|
+
// Emit transport error event
|
|
193
|
+
await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
|
|
194
|
+
transport_type: 'stdio',
|
|
195
|
+
error_message: errorMessage,
|
|
196
|
+
error_code: 'CONNECTION_FAILED',
|
|
197
|
+
recoverable: true,
|
|
198
|
+
});
|
|
199
|
+
throw new ConfigurationError(`Failed to connect to MCP server via stdio: ${errorMessage}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async disconnect() {
|
|
203
|
+
if (!this.connected) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
if (this.transport) {
|
|
208
|
+
await this.transport.close();
|
|
209
|
+
}
|
|
210
|
+
this.connected = false;
|
|
211
|
+
this.client = null;
|
|
212
|
+
this.transport = null;
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
216
|
+
logger.error('Error closing transport during disconnect', err);
|
|
217
|
+
await this.emitTransportError(err.message, 'DISCONNECT_ERROR', false);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
getTransportType() {
|
|
221
|
+
return 'stdio';
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Factory function to create an MCP client manager.
|
|
226
|
+
* @param transport - Transport type
|
|
227
|
+
* @param mcpUrl - MCP URL (for HTTP transport)
|
|
228
|
+
* @param command - Command to spawn server (optional, only if shouldSpawn is true)
|
|
229
|
+
* @param eventEmitter - Event emitter for emitting events
|
|
230
|
+
* @param shouldSpawn - Whether to spawn the server as a child process
|
|
231
|
+
* @returns MCP client manager instance
|
|
232
|
+
*/
|
|
233
|
+
export function createMCPClientManager(transport, mcpUrl, command, eventEmitter, shouldSpawn = false) {
|
|
234
|
+
if (transport === 'http') {
|
|
235
|
+
if (!mcpUrl) {
|
|
236
|
+
throw new ConfigurationError('MCP URL is required for HTTP transport');
|
|
237
|
+
}
|
|
238
|
+
return new HTTPMCPClientManager(mcpUrl, eventEmitter, shouldSpawn, command);
|
|
239
|
+
}
|
|
240
|
+
if (transport === 'stdio') {
|
|
241
|
+
if (!command) {
|
|
242
|
+
throw new ConfigurationError('Command is required for stdio transport');
|
|
243
|
+
}
|
|
244
|
+
return new StdioMCPClientManager(command, eventEmitter);
|
|
245
|
+
}
|
|
246
|
+
throw new ConfigurationError(`Unsupported transport type: ${String(transport)}`);
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process spawning utilities for MCP servers.
|
|
3
|
+
*/
|
|
4
|
+
import * as childProcess from 'child_process';
|
|
5
|
+
/**
|
|
6
|
+
* Check if a command contains shell operators that require shell execution.
|
|
7
|
+
* We only detect patterns that absolutely require a shell, avoiding false positives.
|
|
8
|
+
* Essential operators: &&, ||, |, ;, $, $(, `
|
|
9
|
+
*/
|
|
10
|
+
export declare function requiresShellExecution(command: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Parse a command into executable and arguments.
|
|
13
|
+
* Handles shell operators by wrapping in shell execution.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseCommand(command: string): {
|
|
16
|
+
executable: string;
|
|
17
|
+
args: string[];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Set up log capture for a child process.
|
|
21
|
+
* Captures stdout and stderr, formatting them appropriately.
|
|
22
|
+
*/
|
|
23
|
+
export declare function setupProcessLogCapture(process: childProcess.ChildProcess): void;
|
|
24
|
+
/**
|
|
25
|
+
* Spawn a process with proper configuration.
|
|
26
|
+
*/
|
|
27
|
+
export declare function spawnProcess(executable: string, args: string[], options?: {
|
|
28
|
+
cwd?: string;
|
|
29
|
+
env?: Record<string, string>;
|
|
30
|
+
}): childProcess.ChildProcess;
|
|
31
|
+
//# sourceMappingURL=process.d.ts.map
|