@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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Goodbye message generator for dev mode.
|
|
3
|
+
* Generates funny, shareable goodbye messages when users exit.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Pre-written goodbye messages for users who didn't test anything.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_GOODBYE_MESSAGES = [
|
|
9
|
+
"👋 Thanks for dropping by! Hope you'll come back to test some tools soon!",
|
|
10
|
+
"🚀 See you later! Don't forget to test those MCP tools when you're ready!",
|
|
11
|
+
'✨ Until next time! Your tools are waiting for you!',
|
|
12
|
+
'🎯 Catch you later! Ready to test when you are!',
|
|
13
|
+
'💫 Farewell! Come back when you want to see those tools in action!',
|
|
14
|
+
'🌟 Goodbye! Your MCP server is ready whenever you are!',
|
|
15
|
+
'🎉 See you soon! Time to make those tools shine!',
|
|
16
|
+
'🔥 Later! The tools are ready when you are!',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Generate a funny, shareable goodbye message using LLM.
|
|
20
|
+
*/
|
|
21
|
+
async function generateLLMGoodbyeMessage(llmProvider, sessionState) {
|
|
22
|
+
const toolCallsCount = sessionState.totalToolCalls;
|
|
23
|
+
const toolNames = sessionState.toolCalls
|
|
24
|
+
.map(tc => tc.name)
|
|
25
|
+
.filter((name, index, self) => self.indexOf(name) === index)
|
|
26
|
+
.slice(0, 5); // Limit to first 5 unique tool names
|
|
27
|
+
const sessionDuration = Math.round((Date.now() - sessionState.startTime.getTime()) / 1000);
|
|
28
|
+
const prompt = `You are a witty, humorous AI assistant. A developer just finished testing their MCP (Model Context Protocol) tools using Syrin, a debugging/testing tool.
|
|
29
|
+
|
|
30
|
+
Context:
|
|
31
|
+
- They tested ${toolCallsCount} tool${toolCallsCount !== 1 ? 's' : ''} in total
|
|
32
|
+
- Tool names tested: ${toolNames.length > 0 ? toolNames.join(', ') : 'various tools'}
|
|
33
|
+
- Session duration: ${sessionDuration} second${sessionDuration !== 1 ? 's' : ''}
|
|
34
|
+
|
|
35
|
+
Generate a funny, witty, and shareable goodbye message (2-3 sentences max). The message should:
|
|
36
|
+
1. Be humorous and natural
|
|
37
|
+
2. Reference what they tested in a clever way
|
|
38
|
+
3. Be something they'd want to share on social media (like "look what Syrin told me!")
|
|
39
|
+
4. Feel personal and engaging
|
|
40
|
+
5. Be cool and memorable
|
|
41
|
+
|
|
42
|
+
Keep it concise, funny, and make it feel like a natural conversation ending. Don't be overly technical - be witty and relatable.
|
|
43
|
+
|
|
44
|
+
Respond with ONLY the goodbye message, no quotes, no prefixes, just the message text.`;
|
|
45
|
+
try {
|
|
46
|
+
const response = await llmProvider.chat({
|
|
47
|
+
messages: [
|
|
48
|
+
{
|
|
49
|
+
role: 'user',
|
|
50
|
+
content: prompt,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
temperature: 0.9, // Higher temperature for more creativity
|
|
54
|
+
maxTokens: 150,
|
|
55
|
+
});
|
|
56
|
+
// Extract text content from response
|
|
57
|
+
const content = response.content;
|
|
58
|
+
if (typeof content === 'string' && content.trim()) {
|
|
59
|
+
return content.trim();
|
|
60
|
+
}
|
|
61
|
+
// Fallback if response format is unexpected
|
|
62
|
+
return getRandomDefaultMessage();
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// If LLM call fails, fall back to default message
|
|
66
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
67
|
+
console.error('Failed to generate LLM goodbye message:', errorMessage);
|
|
68
|
+
return getRandomDefaultMessage();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get a random default goodbye message.
|
|
73
|
+
*/
|
|
74
|
+
function getRandomDefaultMessage() {
|
|
75
|
+
const randomIndex = Math.floor(Math.random() * DEFAULT_GOODBYE_MESSAGES.length);
|
|
76
|
+
return DEFAULT_GOODBYE_MESSAGES[randomIndex];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generate an appropriate goodbye message based on session activity.
|
|
80
|
+
*
|
|
81
|
+
* @param llmProvider - LLM provider to use for generating funny messages (can be minimal interface)
|
|
82
|
+
* @param sessionState - Current session state
|
|
83
|
+
* @returns Promise resolving to goodbye message string
|
|
84
|
+
*/
|
|
85
|
+
export async function generateGoodbyeMessage(llmProvider, sessionState) {
|
|
86
|
+
// If user tested tools, try to generate a funny LLM message
|
|
87
|
+
if (sessionState.totalToolCalls > 0 && llmProvider) {
|
|
88
|
+
try {
|
|
89
|
+
return await generateLLMGoodbyeMessage(llmProvider, sessionState);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
// Fallback to default if LLM generation fails
|
|
93
|
+
console.error('Error generating LLM goodbye message:', error);
|
|
94
|
+
return getRandomDefaultMessage();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// If no tools tested or no LLM provider, use default messages
|
|
98
|
+
return getRandomDefaultMessage();
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=goodbye-messages.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text wrapping utility for user messages.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Wrap text to fit within a specified width.
|
|
6
|
+
*
|
|
7
|
+
* This function guarantees at least one line in the result. When the input is empty
|
|
8
|
+
* or contains only whitespace, it returns `['']` (a single empty string) rather than an empty array.
|
|
9
|
+
* This behavior ensures consistent handling in UI components that expect at least one line
|
|
10
|
+
* to render, preventing layout issues when displaying wrapped text.
|
|
11
|
+
*
|
|
12
|
+
* @param text - The text to wrap
|
|
13
|
+
* @param width - Maximum width per line
|
|
14
|
+
* @returns Array of wrapped lines. Always contains at least one element; returns `['']` for empty or whitespace-only input.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Normal text wrapping
|
|
18
|
+
* wrapText('Hello world', 5) // Returns ['Hello', 'world']
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Empty input returns single empty line
|
|
22
|
+
* wrapText('', 10) // Returns ['']
|
|
23
|
+
* wrapText(' ', 10) // Returns [''] (whitespace-only)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Long words are split across lines
|
|
27
|
+
* wrapText('supercalifragilistic', 5) // Returns ['super', 'calif', 'ragil', 'istic']
|
|
28
|
+
*/
|
|
29
|
+
export declare function wrapText(text: string, width: number): string[];
|
|
30
|
+
//# sourceMappingURL=text-wrapper.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text wrapping utility for user messages.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Wrap text to fit within a specified width.
|
|
6
|
+
*
|
|
7
|
+
* This function guarantees at least one line in the result. When the input is empty
|
|
8
|
+
* or contains only whitespace, it returns `['']` (a single empty string) rather than an empty array.
|
|
9
|
+
* This behavior ensures consistent handling in UI components that expect at least one line
|
|
10
|
+
* to render, preventing layout issues when displaying wrapped text.
|
|
11
|
+
*
|
|
12
|
+
* @param text - The text to wrap
|
|
13
|
+
* @param width - Maximum width per line
|
|
14
|
+
* @returns Array of wrapped lines. Always contains at least one element; returns `['']` for empty or whitespace-only input.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Normal text wrapping
|
|
18
|
+
* wrapText('Hello world', 5) // Returns ['Hello', 'world']
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Empty input returns single empty line
|
|
22
|
+
* wrapText('', 10) // Returns ['']
|
|
23
|
+
* wrapText(' ', 10) // Returns [''] (whitespace-only)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Long words are split across lines
|
|
27
|
+
* wrapText('supercalifragilistic', 5) // Returns ['super', 'calif', 'ragil', 'istic']
|
|
28
|
+
*/
|
|
29
|
+
export function wrapText(text, width) {
|
|
30
|
+
const words = text.split(/\s+/);
|
|
31
|
+
const lines = [];
|
|
32
|
+
let currentLine = '';
|
|
33
|
+
for (const word of words) {
|
|
34
|
+
// Skip empty tokens
|
|
35
|
+
if (word === '') {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Handle words longer than width
|
|
39
|
+
if (word.length > width) {
|
|
40
|
+
// Push current line if non-empty before inserting chunks
|
|
41
|
+
if (currentLine) {
|
|
42
|
+
lines.push(currentLine);
|
|
43
|
+
currentLine = '';
|
|
44
|
+
}
|
|
45
|
+
// Split word into chunks of size <= width
|
|
46
|
+
for (let i = 0; i < word.length; i += width) {
|
|
47
|
+
const chunk = word.substring(i, i + width);
|
|
48
|
+
if (chunk.length === width) {
|
|
49
|
+
// Full chunk - append as its own line
|
|
50
|
+
lines.push(chunk);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Remaining partial chunk - start new currentLine
|
|
54
|
+
currentLine = chunk;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Normal word handling
|
|
60
|
+
if (currentLine.length + word.length + 1 <= width) {
|
|
61
|
+
currentLine += (currentLine ? ' ' : '') + word;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (currentLine)
|
|
65
|
+
lines.push(currentLine);
|
|
66
|
+
currentLine = word;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (currentLine)
|
|
71
|
+
lines.push(currentLine);
|
|
72
|
+
return lines.length > 0 ? lines : [''];
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=text-wrapper.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation utilities for dev command.
|
|
3
|
+
* Separates UI/logic concerns by providing functions for displaying messages.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Build initial welcome messages for dev mode.
|
|
7
|
+
* Returns empty array - welcome banner now handles all welcome info.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildDevWelcomeMessages(): Array<{
|
|
10
|
+
role: 'system';
|
|
11
|
+
content: string;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Format tools list for display.
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatToolsList(tools: Array<{
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
}>): string;
|
|
20
|
+
/**
|
|
21
|
+
* Format command history for display.
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatCommandHistory(historyLines: string[]): string;
|
|
24
|
+
/**
|
|
25
|
+
* Format tool call info for display.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatToolCallInfo(name: string, arguments_: unknown): string;
|
|
28
|
+
/**
|
|
29
|
+
* Format tool result for display.
|
|
30
|
+
* Handles large JSON efficiently with size-based formatting.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatToolResult(name: string, result: unknown, duration?: number): string;
|
|
33
|
+
//# sourceMappingURL=dev-ui.d.ts.map
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation utilities for dev command.
|
|
3
|
+
* Separates UI/logic concerns by providing functions for displaying messages.
|
|
4
|
+
*/
|
|
5
|
+
import { Messages } from '../constants/index.js';
|
|
6
|
+
import { estimateObjectSize, formatJSONWithPagination, getJSONSummary, } from '../utils/json-formatter.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build initial welcome messages for dev mode.
|
|
9
|
+
* Returns empty array - welcome banner now handles all welcome info.
|
|
10
|
+
*/
|
|
11
|
+
export function buildDevWelcomeMessages() {
|
|
12
|
+
// Return empty array - welcome banner now handles all welcome info
|
|
13
|
+
// Old welcome messages are no longer needed as they're displayed in the persistent banner
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format tools list for display.
|
|
18
|
+
*/
|
|
19
|
+
export function formatToolsList(tools) {
|
|
20
|
+
let toolsList = `${Messages.DEV_TOOLS_HEADER}\n`;
|
|
21
|
+
if (tools.length === 0) {
|
|
22
|
+
toolsList += `${Messages.DEV_NO_TOOLS}`;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
for (const tool of tools) {
|
|
26
|
+
toolsList += ` • ${tool.name}`;
|
|
27
|
+
if (tool.description) {
|
|
28
|
+
toolsList += `: ${tool.description}`;
|
|
29
|
+
}
|
|
30
|
+
toolsList += '\n';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return toolsList.trim();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format command history for display.
|
|
37
|
+
*/
|
|
38
|
+
export function formatCommandHistory(historyLines) {
|
|
39
|
+
if (historyLines.length === 0) {
|
|
40
|
+
return Messages.DEV_NO_HISTORY;
|
|
41
|
+
}
|
|
42
|
+
let historyList = `${Messages.DEV_HISTORY_HEADER}\n`;
|
|
43
|
+
historyLines.forEach((line, index) => {
|
|
44
|
+
historyList += ` ${index + 1}. ${line}\n`;
|
|
45
|
+
});
|
|
46
|
+
return historyList.trim();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Format tool call info for display.
|
|
50
|
+
*/
|
|
51
|
+
export function formatToolCallInfo(name, arguments_) {
|
|
52
|
+
return `${Messages.DEV_TOOL_CALLING(name)}\nArguments: ${JSON.stringify(arguments_, null, 2)}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Format tool result for display.
|
|
56
|
+
* Handles large JSON efficiently with size-based formatting.
|
|
57
|
+
*/
|
|
58
|
+
export function formatToolResult(name, result, duration) {
|
|
59
|
+
const completed = Messages.DEV_TOOL_COMPLETED(name, duration);
|
|
60
|
+
// Fast size estimation without full stringification for very large data
|
|
61
|
+
// Use a lightweight size check first
|
|
62
|
+
let sizeBytes;
|
|
63
|
+
let resultText;
|
|
64
|
+
let parsedData = result;
|
|
65
|
+
try {
|
|
66
|
+
// Try lightweight size estimation first
|
|
67
|
+
if (typeof result === 'string') {
|
|
68
|
+
resultText = result;
|
|
69
|
+
sizeBytes = Buffer.byteLength(result, 'utf8');
|
|
70
|
+
try {
|
|
71
|
+
parsedData = JSON.parse(result);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Not JSON, treat as string
|
|
75
|
+
parsedData = result;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// For objects, estimate size without full stringification
|
|
80
|
+
// This is much faster for large objects
|
|
81
|
+
// Create a small sample by taking a slice/portion of the data
|
|
82
|
+
let sample;
|
|
83
|
+
if (Array.isArray(result)) {
|
|
84
|
+
// Sample first 10 items
|
|
85
|
+
sample = result.slice(0, 10);
|
|
86
|
+
}
|
|
87
|
+
else if (typeof result === 'object' &&
|
|
88
|
+
result !== null &&
|
|
89
|
+
!Array.isArray(result)) {
|
|
90
|
+
// Sample first 10 keys
|
|
91
|
+
const keys = Object.keys(result).slice(0, 10);
|
|
92
|
+
sample = Object.fromEntries(keys.map(key => [key, result[key]]));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
sample = result;
|
|
96
|
+
}
|
|
97
|
+
const sampleString = JSON.stringify(sample);
|
|
98
|
+
const estimatedSizePerChar = sampleString.length === 0
|
|
99
|
+
? 1 // Default to 1 byte per char for empty string (UTF-8 average)
|
|
100
|
+
: Buffer.byteLength(sampleString, 'utf8') / sampleString.length;
|
|
101
|
+
const estimatedTotalChars = estimateObjectSize(result);
|
|
102
|
+
sizeBytes = Math.floor(estimatedTotalChars * estimatedSizePerChar);
|
|
103
|
+
// Only stringify if we need to (for small/medium sizes)
|
|
104
|
+
if (sizeBytes < 500 * 1024) {
|
|
105
|
+
resultText = JSON.stringify(result, null, 2);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// For large data, skip stringification - we'll just show summary
|
|
109
|
+
resultText = '';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Fallback: treat as string
|
|
115
|
+
resultText = String(result);
|
|
116
|
+
sizeBytes = Buffer.byteLength(resultText, 'utf8');
|
|
117
|
+
parsedData = result;
|
|
118
|
+
}
|
|
119
|
+
const sizeKB = sizeBytes / 1024;
|
|
120
|
+
const sizeMB = sizeKB / 1024;
|
|
121
|
+
const sizeDisplay = sizeMB >= 1 ? `${sizeMB.toFixed(2)}MB` : `${sizeKB.toFixed(2)}KB`;
|
|
122
|
+
// For very large JSON (> 500KB), skip all expensive operations
|
|
123
|
+
// Just show a simple summary to avoid blocking the UI
|
|
124
|
+
if (sizeBytes > 500 * 1024) {
|
|
125
|
+
// Very large: Skip all formatting, just show summary
|
|
126
|
+
let structureInfo = '';
|
|
127
|
+
try {
|
|
128
|
+
if (Array.isArray(parsedData)) {
|
|
129
|
+
structureInfo = `Array with ${parsedData.length} items`;
|
|
130
|
+
}
|
|
131
|
+
else if (typeof parsedData === 'object' &&
|
|
132
|
+
parsedData !== null &&
|
|
133
|
+
!Array.isArray(parsedData)) {
|
|
134
|
+
const keys = Object.keys(parsedData);
|
|
135
|
+
structureInfo = `Object with ${keys.length} keys: ${keys.slice(0, 10).join(', ')}${keys.length > 10 ? '...' : ''}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Ignore errors in structure detection
|
|
140
|
+
}
|
|
141
|
+
return `${completed}\nResult (${sizeDisplay}${structureInfo ? ` | ${structureInfo}` : ''}):\n\n⚠️ Very large result - formatting skipped to maintain UI responsiveness.\n💡 Use /save-json to export the full data to a file for analysis.\n💡 Full JSON data is available in conversation history for LLM processing.`;
|
|
142
|
+
}
|
|
143
|
+
// For smaller data, we can do formatting (but still optimized)
|
|
144
|
+
// Get JSON summary for structure info (only for data we'll format)
|
|
145
|
+
let summary;
|
|
146
|
+
try {
|
|
147
|
+
summary = getJSONSummary(parsedData);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// If summary fails, use basic info
|
|
151
|
+
summary = {
|
|
152
|
+
type: Array.isArray(parsedData)
|
|
153
|
+
? 'array'
|
|
154
|
+
: typeof parsedData === 'object' && parsedData !== null
|
|
155
|
+
? 'object'
|
|
156
|
+
: typeof parsedData,
|
|
157
|
+
size: sizeBytes,
|
|
158
|
+
depth: 0,
|
|
159
|
+
hasLargeArrays: Array.isArray(parsedData) && parsedData.length > 100,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Size-based formatting strategy (only for < 500KB)
|
|
163
|
+
// Show collapsed summary by default for better performance
|
|
164
|
+
if (sizeBytes < 100 * 1024) {
|
|
165
|
+
// Small JSON (< 100KB): Show collapsed summary with option to expand
|
|
166
|
+
try {
|
|
167
|
+
// Get a quick summary without full formatting
|
|
168
|
+
let summaryText = '';
|
|
169
|
+
if (Array.isArray(parsedData)) {
|
|
170
|
+
summaryText = `Array with ${parsedData.length} items`;
|
|
171
|
+
if (parsedData.length > 0) {
|
|
172
|
+
summaryText += ` (showing first 3)`;
|
|
173
|
+
const preview = parsedData.slice(0, 3);
|
|
174
|
+
const previewStr = JSON.stringify(preview, null, 2).substring(0, 500);
|
|
175
|
+
summaryText += `:\n${previewStr}${parsedData.length > 3 ? '\n... (use /save-json to see full data)' : ''}`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (typeof parsedData === 'object' &&
|
|
179
|
+
parsedData !== null &&
|
|
180
|
+
!Array.isArray(parsedData)) {
|
|
181
|
+
const keys = Object.keys(parsedData);
|
|
182
|
+
summaryText = `Object with ${keys.length} keys`;
|
|
183
|
+
if (keys.length > 0) {
|
|
184
|
+
summaryText += ` (showing first 5)`;
|
|
185
|
+
const previewKeys = keys.slice(0, 5);
|
|
186
|
+
const preview = Object.fromEntries(previewKeys.map(k => [
|
|
187
|
+
k,
|
|
188
|
+
parsedData[k],
|
|
189
|
+
]));
|
|
190
|
+
const previewStr = JSON.stringify(preview, null, 2).substring(0, 500);
|
|
191
|
+
summaryText += `:\n${previewStr}${keys.length > 5 ? '\n... (use /save-json to see full data)' : ''}`;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Primitive or small value: show directly
|
|
196
|
+
summaryText = JSON.stringify(parsedData, null, 2).substring(0, 1000);
|
|
197
|
+
}
|
|
198
|
+
return `${completed}\nResult (${sizeDisplay}):\n${summaryText}\n\n💡 Use /save-json to export the full data to a file.`;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Fallback to plain JSON if formatting fails
|
|
202
|
+
const fallbackText = typeof parsedData === 'string'
|
|
203
|
+
? parsedData.substring(0, 1000)
|
|
204
|
+
: JSON.stringify(parsedData, null, 2).substring(0, 1000);
|
|
205
|
+
return `${completed}\nResult (${sizeDisplay}):\n${fallbackText}${sizeBytes > 1000 ? '\n... (use /save-json to see full data)' : ''}`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Medium JSON (100KB - 500KB): Show tree with pagination
|
|
210
|
+
try {
|
|
211
|
+
const treeFormatted = formatJSONWithPagination(parsedData, {
|
|
212
|
+
maxDepth: 3,
|
|
213
|
+
maxArrayItems: 50,
|
|
214
|
+
itemsPerPage: 20,
|
|
215
|
+
currentPage: 0,
|
|
216
|
+
});
|
|
217
|
+
let structureInfo = '';
|
|
218
|
+
if (summary.itemCount !== undefined) {
|
|
219
|
+
structureInfo = ` | ${summary.itemCount} items`;
|
|
220
|
+
}
|
|
221
|
+
else if (summary.keyCount !== undefined) {
|
|
222
|
+
structureInfo = ` | ${summary.keyCount} keys`;
|
|
223
|
+
}
|
|
224
|
+
return `${completed}\nResult (${sizeDisplay}${structureInfo}):\n${treeFormatted}\n\n💡 Tip: Large arrays are paginated. Use /save-json to export full data.`;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Fallback to summary if tree formatting fails
|
|
228
|
+
if (!resultText) {
|
|
229
|
+
resultText = JSON.stringify(parsedData, null, 2).substring(0, 5000);
|
|
230
|
+
}
|
|
231
|
+
const lines = resultText.split('\n');
|
|
232
|
+
const previewLines = 30;
|
|
233
|
+
const preview = lines.slice(0, previewLines).join('\n');
|
|
234
|
+
const remaining = lines.length - previewLines;
|
|
235
|
+
let structureInfo = '';
|
|
236
|
+
if (summary.itemCount !== undefined) {
|
|
237
|
+
structureInfo = ` | ${summary.itemCount} items`;
|
|
238
|
+
}
|
|
239
|
+
else if (summary.keyCount !== undefined) {
|
|
240
|
+
structureInfo = ` | ${summary.keyCount} keys`;
|
|
241
|
+
}
|
|
242
|
+
return `${completed}\nResult (${sizeDisplay}${structureInfo}):\n\nPreview (first ${previewLines} lines, ${remaining} more):\n${preview}\n\n[... ${remaining} more lines ...]`;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=dev-ui.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation layer for doctor command UI.
|
|
3
|
+
* Provides modern, minimalistic display for configuration validation results.
|
|
4
|
+
*/
|
|
5
|
+
interface CheckResult {
|
|
6
|
+
isValid: boolean;
|
|
7
|
+
message: string;
|
|
8
|
+
fix?: string;
|
|
9
|
+
value?: string;
|
|
10
|
+
}
|
|
11
|
+
interface DoctorReport {
|
|
12
|
+
config: {
|
|
13
|
+
version: unknown;
|
|
14
|
+
project_name: unknown;
|
|
15
|
+
agent_name: unknown;
|
|
16
|
+
transport: string;
|
|
17
|
+
mcp_url?: unknown;
|
|
18
|
+
script?: unknown;
|
|
19
|
+
};
|
|
20
|
+
transportCheck: CheckResult;
|
|
21
|
+
scriptCheck: CheckResult | null;
|
|
22
|
+
llmChecks: Array<{
|
|
23
|
+
provider: string;
|
|
24
|
+
apiKeyCheck: CheckResult;
|
|
25
|
+
modelCheck: CheckResult;
|
|
26
|
+
isDefault: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
localLlmChecks?: Array<{
|
|
29
|
+
provider: string;
|
|
30
|
+
check: CheckResult;
|
|
31
|
+
modelName?: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Display doctor report using plain console output.
|
|
36
|
+
* This avoids Ink taking control of stdin, which disables terminal history.
|
|
37
|
+
*/
|
|
38
|
+
export declare function displayDoctorReport(report: DoctorReport): Promise<void>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=doctor-ui.d.ts.map
|