@kaitranntt/ccs 6.7.0 → 6.7.1-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -23
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +24 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/services/index.d.ts +10 -0
- package/dist/api/services/index.d.ts.map +1 -0
- package/dist/api/services/index.js +26 -0
- package/dist/api/services/index.js.map +1 -0
- package/dist/api/services/profile-reader.d.ts +28 -0
- package/dist/api/services/profile-reader.d.ts.map +1 -0
- package/dist/api/services/profile-reader.js +148 -0
- package/dist/api/services/profile-reader.js.map +1 -0
- package/dist/api/services/profile-types.d.ts +42 -0
- package/dist/api/services/profile-types.d.ts.map +1 -0
- package/dist/api/services/profile-types.js +8 -0
- package/dist/api/services/profile-types.js.map +1 -0
- package/dist/api/services/profile-writer.d.ts +6 -0
- package/dist/api/services/profile-writer.d.ts.map +1 -0
- package/dist/api/services/profile-writer.js +176 -0
- package/dist/api/services/profile-writer.js.map +1 -0
- package/dist/api/services/validation-service.d.ts +26 -0
- package/dist/api/services/validation-service.d.ts.map +1 -0
- package/dist/api/services/validation-service.js +77 -0
- package/dist/api/services/validation-service.js.map +1 -0
- package/dist/auth/auth-commands.d.ts +16 -22
- package/dist/auth/auth-commands.d.ts.map +1 -1
- package/dist/auth/auth-commands.js +29 -467
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/commands/create-command.d.ts +11 -0
- package/dist/auth/commands/create-command.d.ts.map +1 -0
- package/dist/auth/commands/create-command.js +137 -0
- package/dist/auth/commands/create-command.js.map +1 -0
- package/dist/auth/commands/default-command.d.ts +15 -0
- package/dist/auth/commands/default-command.d.ts.map +1 -0
- package/dist/auth/commands/default-command.js +71 -0
- package/dist/auth/commands/default-command.js.map +1 -0
- package/dist/auth/commands/index.d.ts +12 -0
- package/dist/auth/commands/index.d.ts.map +1 -0
- package/dist/auth/commands/index.js +25 -0
- package/dist/auth/commands/index.js.map +1 -0
- package/dist/auth/commands/list-command.d.ts +11 -0
- package/dist/auth/commands/list-command.d.ts.map +1 -0
- package/dist/auth/commands/list-command.js +124 -0
- package/dist/auth/commands/list-command.js.map +1 -0
- package/dist/auth/commands/remove-command.d.ts +11 -0
- package/dist/auth/commands/remove-command.d.ts.map +1 -0
- package/dist/auth/commands/remove-command.js +102 -0
- package/dist/auth/commands/remove-command.js.map +1 -0
- package/dist/auth/commands/show-command.d.ts +11 -0
- package/dist/auth/commands/show-command.d.ts.map +1 -0
- package/dist/auth/commands/show-command.js +103 -0
- package/dist/auth/commands/show-command.js.map +1 -0
- package/dist/auth/commands/types.d.ts +50 -0
- package/dist/auth/commands/types.d.ts.map +1 -0
- package/dist/auth/commands/types.js +26 -0
- package/dist/auth/commands/types.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/profile-detector.d.ts +0 -5
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +1 -9
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts +0 -4
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +3 -10
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/ccs.js +21 -4
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/auth/auth-types.d.ts +85 -0
- package/dist/cliproxy/auth/auth-types.d.ts.map +1 -0
- package/dist/cliproxy/auth/auth-types.js +100 -0
- package/dist/cliproxy/auth/auth-types.js.map +1 -0
- package/dist/cliproxy/auth/environment-detector.d.ts +30 -0
- package/dist/cliproxy/auth/environment-detector.d.ts.map +1 -0
- package/dist/cliproxy/auth/environment-detector.js +124 -0
- package/dist/cliproxy/auth/environment-detector.js.map +1 -0
- package/dist/cliproxy/auth/index.d.ts +11 -0
- package/dist/cliproxy/auth/index.d.ts.map +1 -0
- package/dist/cliproxy/auth/index.js +35 -0
- package/dist/cliproxy/auth/index.js.map +1 -0
- package/dist/cliproxy/auth/oauth-handler.d.ts +29 -0
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-handler.js +205 -0
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -0
- package/dist/cliproxy/auth/oauth-process.d.ts +27 -0
- package/dist/cliproxy/auth/oauth-process.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-process.js +209 -0
- package/dist/cliproxy/auth/oauth-process.js.map +1 -0
- package/dist/cliproxy/auth/token-manager.d.ts +53 -0
- package/dist/cliproxy/auth/token-manager.d.ts.map +1 -0
- package/dist/cliproxy/auth/token-manager.js +250 -0
- package/dist/cliproxy/auth/token-manager.js.map +1 -0
- package/dist/cliproxy/auth-handler.d.ts +13 -103
- package/dist/cliproxy/auth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth-handler.js +35 -766
- package/dist/cliproxy/auth-handler.js.map +1 -1
- package/dist/cliproxy/binary/downloader.d.ts +29 -0
- package/dist/cliproxy/binary/downloader.d.ts.map +1 -0
- package/dist/cliproxy/binary/downloader.js +218 -0
- package/dist/cliproxy/binary/downloader.js.map +1 -0
- package/dist/cliproxy/binary/extractor.d.ts +12 -0
- package/dist/cliproxy/binary/extractor.d.ts.map +1 -0
- package/dist/cliproxy/binary/extractor.js +27 -0
- package/dist/cliproxy/binary/extractor.js.map +1 -0
- package/dist/cliproxy/binary/index.d.ts +13 -0
- package/dist/cliproxy/binary/index.d.ts.map +1 -0
- package/dist/cliproxy/binary/index.js +53 -0
- package/dist/cliproxy/binary/index.js.map +1 -0
- package/dist/cliproxy/binary/installer.d.ts +24 -0
- package/dist/cliproxy/binary/installer.d.ts.map +1 -0
- package/dist/cliproxy/binary/installer.js +117 -0
- package/dist/cliproxy/binary/installer.js.map +1 -0
- package/dist/cliproxy/binary/lifecycle.d.ts +11 -0
- package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -0
- package/dist/cliproxy/binary/lifecycle.js +106 -0
- package/dist/cliproxy/binary/lifecycle.js.map +1 -0
- package/dist/cliproxy/binary/tar-extractor.d.ts +9 -0
- package/dist/cliproxy/binary/tar-extractor.d.ts.map +1 -0
- package/dist/cliproxy/binary/tar-extractor.js +118 -0
- package/dist/cliproxy/binary/tar-extractor.js.map +1 -0
- package/dist/cliproxy/binary/types.d.ts +24 -0
- package/dist/cliproxy/binary/types.d.ts.map +1 -0
- package/dist/cliproxy/binary/types.js +14 -0
- package/dist/cliproxy/binary/types.js.map +1 -0
- package/dist/cliproxy/binary/updater.d.ts +7 -0
- package/dist/cliproxy/binary/updater.d.ts.map +1 -0
- package/dist/cliproxy/binary/updater.js +18 -0
- package/dist/cliproxy/binary/updater.js.map +1 -0
- package/dist/cliproxy/binary/verifier.d.ts +18 -0
- package/dist/cliproxy/binary/verifier.d.ts.map +1 -0
- package/dist/cliproxy/binary/verifier.js +82 -0
- package/dist/cliproxy/binary/verifier.js.map +1 -0
- package/dist/cliproxy/binary/version-cache.d.ts +46 -0
- package/dist/cliproxy/binary/version-cache.d.ts.map +1 -0
- package/dist/cliproxy/binary/version-cache.js +171 -0
- package/dist/cliproxy/binary/version-cache.js.map +1 -0
- package/dist/cliproxy/binary/version-checker.d.ts +19 -0
- package/dist/cliproxy/binary/version-checker.d.ts.map +1 -0
- package/dist/cliproxy/binary/version-checker.js +77 -0
- package/dist/cliproxy/binary/version-checker.js.map +1 -0
- package/dist/cliproxy/binary/zip-extractor.d.ts +9 -0
- package/dist/cliproxy/binary/zip-extractor.d.ts.map +1 -0
- package/dist/cliproxy/binary/zip-extractor.js +110 -0
- package/dist/cliproxy/binary/zip-extractor.js.map +1 -0
- package/dist/cliproxy/binary-manager.d.ts +16 -170
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +38 -865
- package/dist/cliproxy/binary-manager.js.map +1 -1
- package/dist/cliproxy/remote-proxy-client.d.ts +3 -0
- package/dist/cliproxy/remote-proxy-client.d.ts.map +1 -1
- package/dist/cliproxy/remote-proxy-client.js +7 -3
- package/dist/cliproxy/remote-proxy-client.js.map +1 -1
- package/dist/cliproxy/services/binary-service.d.ts +65 -0
- package/dist/cliproxy/services/binary-service.d.ts.map +1 -0
- package/dist/cliproxy/services/binary-service.js +140 -0
- package/dist/cliproxy/services/binary-service.js.map +1 -0
- package/dist/cliproxy/services/index.d.ts +8 -0
- package/dist/cliproxy/services/index.d.ts.map +1 -0
- package/dist/cliproxy/services/index.js +31 -0
- package/dist/cliproxy/services/index.js.map +1 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.d.ts +38 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.d.ts.map +1 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.js +41 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.js.map +1 -0
- package/dist/cliproxy/services/variant-config-adapter.d.ts +38 -0
- package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -0
- package/dist/cliproxy/services/variant-config-adapter.js +172 -0
- package/dist/cliproxy/services/variant-config-adapter.js.map +1 -0
- package/dist/cliproxy/services/variant-service.d.ts +37 -0
- package/dist/cliproxy/services/variant-service.d.ts.map +1 -0
- package/dist/cliproxy/services/variant-service.js +128 -0
- package/dist/cliproxy/services/variant-service.js.map +1 -0
- package/dist/cliproxy/services/variant-settings.d.ts +32 -0
- package/dist/cliproxy/services/variant-settings.d.ts.map +1 -0
- package/dist/cliproxy/services/variant-settings.js +128 -0
- package/dist/cliproxy/services/variant-settings.js.map +1 -0
- package/dist/commands/api-command.d.ts +3 -6
- package/dist/commands/api-command.d.ts.map +1 -1
- package/dist/commands/api-command.js +84 -445
- package/dist/commands/api-command.js.map +1 -1
- package/dist/commands/cliproxy-command.d.ts +0 -3
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +182 -621
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/index.d.ts +17 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +33 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/config/unified-config-loader.d.ts +7 -0
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +11 -1
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/delegation/executor/index.d.ts +7 -0
- package/dist/delegation/executor/index.d.ts.map +1 -0
- package/dist/delegation/executor/index.js +28 -0
- package/dist/delegation/executor/index.js.map +1 -0
- package/dist/delegation/executor/result-aggregator.d.ts +30 -0
- package/dist/delegation/executor/result-aggregator.d.ts.map +1 -0
- package/dist/delegation/executor/result-aggregator.js +66 -0
- package/dist/delegation/executor/result-aggregator.js.map +1 -0
- package/dist/delegation/executor/stream-parser.d.ts +28 -0
- package/dist/delegation/executor/stream-parser.d.ts.map +1 -0
- package/dist/delegation/executor/stream-parser.js +140 -0
- package/dist/delegation/executor/stream-parser.js.map +1 -0
- package/dist/delegation/executor/types.d.ts +121 -0
- package/dist/delegation/executor/types.d.ts.map +1 -0
- package/dist/delegation/executor/types.js +6 -0
- package/dist/delegation/executor/types.js.map +1 -0
- package/dist/delegation/headless-executor.d.ts +13 -91
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +84 -291
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/delegation/index.d.ts +11 -0
- package/dist/delegation/index.d.ts.map +1 -0
- package/dist/delegation/index.js +33 -0
- package/dist/delegation/index.js.map +1 -0
- package/dist/delegation/result-formatter.d.ts +1 -30
- package/dist/delegation/result-formatter.d.ts.map +1 -1
- package/dist/delegation/result-formatter.js.map +1 -1
- package/dist/errors/cleanup-registry.d.ts +64 -0
- package/dist/errors/cleanup-registry.d.ts.map +1 -0
- package/dist/errors/cleanup-registry.js +141 -0
- package/dist/errors/cleanup-registry.js.map +1 -0
- package/dist/errors/error-handler.d.ts +45 -0
- package/dist/errors/error-handler.d.ts.map +1 -0
- package/dist/errors/error-handler.js +150 -0
- package/dist/errors/error-handler.js.map +1 -0
- package/dist/errors/error-types.d.ts +102 -0
- package/dist/errors/error-types.d.ts.map +1 -0
- package/dist/errors/error-types.js +158 -0
- package/dist/errors/error-types.js.map +1 -0
- package/dist/errors/exit-codes.d.ts +49 -0
- package/dist/errors/exit-codes.d.ts.map +1 -0
- package/dist/errors/exit-codes.js +72 -0
- package/dist/errors/exit-codes.js.map +1 -0
- package/dist/errors/index.d.ts +29 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +62 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/glmt/glmt-transformer.d.ts +29 -248
- package/dist/glmt/glmt-transformer.d.ts.map +1 -1
- package/dist/glmt/glmt-transformer.js +63 -718
- package/dist/glmt/glmt-transformer.js.map +1 -1
- package/dist/glmt/index.d.ts +14 -0
- package/dist/glmt/index.d.ts.map +1 -0
- package/dist/glmt/index.js +41 -0
- package/dist/glmt/index.js.map +1 -0
- package/dist/glmt/pipeline/content-transformer.d.ts +39 -0
- package/dist/glmt/pipeline/content-transformer.d.ts.map +1 -0
- package/dist/glmt/pipeline/content-transformer.js +162 -0
- package/dist/glmt/pipeline/content-transformer.js.map +1 -0
- package/dist/glmt/pipeline/index.d.ts +12 -0
- package/dist/glmt/pipeline/index.d.ts.map +1 -0
- package/dist/glmt/pipeline/index.js +20 -0
- package/dist/glmt/pipeline/index.js.map +1 -0
- package/dist/glmt/pipeline/request-transformer.d.ts +31 -0
- package/dist/glmt/pipeline/request-transformer.d.ts.map +1 -0
- package/dist/glmt/pipeline/request-transformer.js +116 -0
- package/dist/glmt/pipeline/request-transformer.js.map +1 -0
- package/dist/glmt/pipeline/response-builder.d.ts +52 -0
- package/dist/glmt/pipeline/response-builder.d.ts.map +1 -0
- package/dist/glmt/pipeline/response-builder.js +205 -0
- package/dist/glmt/pipeline/response-builder.js.map +1 -0
- package/dist/glmt/pipeline/stream-parser.d.ts +59 -0
- package/dist/glmt/pipeline/stream-parser.d.ts.map +1 -0
- package/dist/glmt/pipeline/stream-parser.js +241 -0
- package/dist/glmt/pipeline/stream-parser.js.map +1 -0
- package/dist/glmt/pipeline/tool-call-handler.d.ts +22 -0
- package/dist/glmt/pipeline/tool-call-handler.d.ts.map +1 -0
- package/dist/glmt/pipeline/tool-call-handler.js +87 -0
- package/dist/glmt/pipeline/tool-call-handler.js.map +1 -0
- package/dist/glmt/pipeline/types.d.ts +159 -0
- package/dist/glmt/pipeline/types.d.ts.map +1 -0
- package/dist/glmt/pipeline/types.js +6 -0
- package/dist/glmt/pipeline/types.js.map +1 -0
- package/dist/management/checks/cliproxy-check.d.ts +37 -0
- package/dist/management/checks/cliproxy-check.d.ts.map +1 -0
- package/dist/management/checks/cliproxy-check.js +187 -0
- package/dist/management/checks/cliproxy-check.js.map +1 -0
- package/dist/management/checks/config-check.d.ts +27 -0
- package/dist/management/checks/config-check.d.ts.map +1 -0
- package/dist/management/checks/config-check.js +158 -0
- package/dist/management/checks/config-check.js.map +1 -0
- package/dist/management/checks/env-check.d.ts +17 -0
- package/dist/management/checks/env-check.d.ts.map +1 -0
- package/dist/management/checks/env-check.js +71 -0
- package/dist/management/checks/env-check.js.map +1 -0
- package/dist/management/checks/index.d.ts +12 -0
- package/dist/management/checks/index.d.ts.map +1 -0
- package/dist/management/checks/index.js +48 -0
- package/dist/management/checks/index.js.map +1 -0
- package/dist/management/checks/oauth-check.d.ts +16 -0
- package/dist/management/checks/oauth-check.d.ts.map +1 -0
- package/dist/management/checks/oauth-check.js +68 -0
- package/dist/management/checks/oauth-check.js.map +1 -0
- package/dist/management/checks/profile-check.d.ts +36 -0
- package/dist/management/checks/profile-check.d.ts.map +1 -0
- package/dist/management/checks/profile-check.js +165 -0
- package/dist/management/checks/profile-check.js.map +1 -0
- package/dist/management/checks/symlink-check.d.ts +30 -0
- package/dist/management/checks/symlink-check.d.ts.map +1 -0
- package/dist/management/checks/symlink-check.js +204 -0
- package/dist/management/checks/symlink-check.js.map +1 -0
- package/dist/management/checks/system-check.d.ts +25 -0
- package/dist/management/checks/system-check.d.ts.map +1 -0
- package/dist/management/checks/system-check.js +136 -0
- package/dist/management/checks/system-check.js.map +1 -0
- package/dist/management/checks/types.d.ts +64 -0
- package/dist/management/checks/types.d.ts.map +1 -0
- package/dist/management/checks/types.js +63 -0
- package/dist/management/checks/types.js.map +1 -0
- package/dist/management/doctor.d.ts +3 -92
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +15 -831
- package/dist/management/doctor.js.map +1 -1
- package/dist/management/index.d.ts +15 -0
- package/dist/management/index.d.ts.map +1 -0
- package/dist/management/index.js +56 -0
- package/dist/management/index.js.map +1 -0
- package/dist/management/repair/auto-repair.d.ts +13 -0
- package/dist/management/repair/auto-repair.d.ts.map +1 -0
- package/dist/management/repair/auto-repair.js +170 -0
- package/dist/management/repair/auto-repair.js.map +1 -0
- package/dist/management/repair/index.d.ts +5 -0
- package/dist/management/repair/index.d.ts.map +1 -0
- package/dist/management/repair/index.js +9 -0
- package/dist/management/repair/index.js.map +1 -0
- package/dist/types/delegation.d.ts +1 -13
- package/dist/types/delegation.d.ts.map +1 -1
- package/dist/types/utils.d.ts +27 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/ui/assets/{accounts-p1_nf0Jy.js → accounts--0JKEYYO.js} +1 -1
- package/dist/ui/assets/analytics-CX5PurM9.js +1 -0
- package/dist/ui/assets/api-D80tfZOx.js +1 -0
- package/dist/ui/assets/{card-CCDc-Mx9.js → card-B-DPlvgo.js} +1 -1
- package/dist/ui/assets/cliproxy-D4AoDTZB.js +3 -0
- package/dist/ui/assets/cliproxy-control-panel-CJ2CfYod.js +1 -0
- package/dist/ui/assets/{code-editor-Br9x-r-E.js → code-editor-DIj6qdUG.js} +1 -1
- package/dist/ui/assets/confirm-dialog-DZkzZLrs.js +1 -0
- package/dist/ui/assets/copilot-Q9tyCgYD.js +4 -0
- package/dist/ui/assets/form-utils-DP6ILe7Z.js +20 -0
- package/dist/ui/assets/health-Cw76uZRy.js +1 -0
- package/dist/ui/assets/{icons-BOsxPbiD.js → icons-ZmwVoUeR.js} +1 -1
- package/dist/ui/assets/index-C1W0iP_Z.js +46 -0
- package/dist/ui/assets/index-It66SkKf.css +1 -0
- package/dist/ui/assets/{radix-ui-DFHQr9A5.js → radix-ui-CV3R9pD6.js} +3 -3
- package/dist/ui/assets/settings-CDdHW_gU.js +1 -0
- package/dist/ui/assets/{shared-BfYhSN4-.js → shared--pI8rTbP.js} +1 -1
- package/dist/ui/assets/{switch-CMk95lwf.js → switch-BP6SzLyZ.js} +1 -1
- package/dist/ui/assets/{tanstack-C4gT2P7V.js → tanstack-Df9bCj5R.js} +1 -1
- package/dist/ui/index.html +6 -6
- package/dist/utils/claude-spawner.d.ts +54 -0
- package/dist/utils/claude-spawner.d.ts.map +1 -0
- package/dist/utils/claude-spawner.js +118 -0
- package/dist/utils/claude-spawner.js.map +1 -0
- package/dist/utils/delegation-validator.d.ts +8 -4
- package/dist/utils/delegation-validator.d.ts.map +1 -1
- package/dist/utils/delegation-validator.js.map +1 -1
- package/dist/utils/helpers.d.ts +0 -11
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +1 -57
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +50 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/time.d.ts +10 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +27 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/ui/boxes.d.ts +24 -0
- package/dist/utils/ui/boxes.d.ts.map +1 -0
- package/dist/utils/ui/boxes.js +108 -0
- package/dist/utils/ui/boxes.js.map +1 -0
- package/dist/utils/ui/colors.d.ts +25 -0
- package/dist/utils/ui/colors.d.ts.map +1 -0
- package/dist/utils/ui/colors.js +70 -0
- package/dist/utils/ui/colors.js.map +1 -0
- package/dist/utils/ui/index.d.ts +51 -0
- package/dist/utils/ui/index.d.ts.map +1 -0
- package/dist/utils/ui/index.js +96 -0
- package/dist/utils/ui/index.js.map +1 -0
- package/dist/utils/ui/indicators.d.ts +23 -0
- package/dist/utils/ui/indicators.d.ts.map +1 -0
- package/dist/utils/ui/indicators.js +39 -0
- package/dist/utils/ui/indicators.js.map +1 -0
- package/dist/utils/ui/init.d.ts +30 -0
- package/dist/utils/ui/init.d.ts.map +1 -0
- package/dist/utils/ui/init.js +102 -0
- package/dist/utils/ui/init.js.map +1 -0
- package/dist/utils/ui/spinner.d.ts +13 -0
- package/dist/utils/ui/spinner.d.ts.map +1 -0
- package/dist/utils/ui/spinner.js +89 -0
- package/dist/utils/ui/spinner.js.map +1 -0
- package/dist/utils/ui/tables.d.ts +12 -0
- package/dist/utils/ui/tables.d.ts.map +1 -0
- package/dist/utils/ui/tables.js +69 -0
- package/dist/utils/ui/tables.js.map +1 -0
- package/dist/utils/ui/tasks.d.ts +26 -0
- package/dist/utils/ui/tasks.d.ts.map +1 -0
- package/dist/utils/ui/tasks.js +102 -0
- package/dist/utils/ui/tasks.js.map +1 -0
- package/dist/utils/ui/text.d.ts +24 -0
- package/dist/utils/ui/text.d.ts.map +1 -0
- package/dist/utils/ui/text.js +60 -0
- package/dist/utils/ui/text.js.map +1 -0
- package/dist/utils/ui/types.d.ts +36 -0
- package/dist/utils/ui/types.d.ts.map +1 -0
- package/dist/utils/ui/types.js +33 -0
- package/dist/utils/ui/types.js.map +1 -0
- package/dist/utils/ui.d.ts +3 -138
- package/dist/utils/ui.d.ts.map +1 -1
- package/dist/utils/ui.js +40 -567
- package/dist/utils/ui.js.map +1 -1
- package/dist/utils/websearch/gemini-cli.d.ts +36 -0
- package/dist/utils/websearch/gemini-cli.d.ts.map +1 -0
- package/dist/utils/websearch/gemini-cli.js +132 -0
- package/dist/utils/websearch/gemini-cli.js.map +1 -0
- package/dist/utils/websearch/grok-cli.d.ts +26 -0
- package/dist/utils/websearch/grok-cli.d.ts.map +1 -0
- package/dist/utils/websearch/grok-cli.js +81 -0
- package/dist/utils/websearch/grok-cli.js.map +1 -0
- package/dist/utils/websearch/hook-config.d.ts +21 -0
- package/dist/utils/websearch/hook-config.d.ts.map +1 -0
- package/dist/utils/websearch/hook-config.js +183 -0
- package/dist/utils/websearch/hook-config.js.map +1 -0
- package/dist/utils/websearch/hook-env.d.ts +16 -0
- package/dist/utils/websearch/hook-env.d.ts.map +1 -0
- package/dist/utils/websearch/hook-env.js +62 -0
- package/dist/utils/websearch/hook-env.js.map +1 -0
- package/dist/utils/websearch/hook-installer.d.ts +27 -0
- package/dist/utils/websearch/hook-installer.d.ts.map +1 -0
- package/dist/utils/websearch/hook-installer.js +141 -0
- package/dist/utils/websearch/hook-installer.js.map +1 -0
- package/dist/utils/websearch/index.d.ts +15 -0
- package/dist/utils/websearch/index.d.ts.map +1 -0
- package/dist/utils/websearch/index.js +44 -0
- package/dist/utils/websearch/index.js.map +1 -0
- package/dist/utils/websearch/opencode-cli.d.ts +26 -0
- package/dist/utils/websearch/opencode-cli.d.ts.map +1 -0
- package/dist/utils/websearch/opencode-cli.js +81 -0
- package/dist/utils/websearch/opencode-cli.js.map +1 -0
- package/dist/utils/websearch/status.d.ts +35 -0
- package/dist/utils/websearch/status.d.ts.map +1 -0
- package/dist/utils/websearch/status.js +185 -0
- package/dist/utils/websearch/status.js.map +1 -0
- package/dist/utils/websearch/types.d.ts +85 -0
- package/dist/utils/websearch/types.d.ts.map +1 -0
- package/dist/utils/websearch/types.js +10 -0
- package/dist/utils/websearch/types.js.map +1 -0
- package/dist/utils/websearch-manager.d.ts +7 -186
- package/dist/utils/websearch-manager.d.ts.map +1 -1
- package/dist/utils/websearch-manager.js +37 -710
- package/dist/utils/websearch-manager.js.map +1 -1
- package/dist/web-server/data-aggregator.d.ts +3 -51
- package/dist/web-server/data-aggregator.d.ts.map +1 -1
- package/dist/web-server/data-aggregator.js +18 -386
- package/dist/web-server/data-aggregator.js.map +1 -1
- package/dist/web-server/health/cliproxy-checks.d.ts +23 -0
- package/dist/web-server/health/cliproxy-checks.d.ts.map +1 -0
- package/dist/web-server/health/cliproxy-checks.js +145 -0
- package/dist/web-server/health/cliproxy-checks.js.map +1 -0
- package/dist/web-server/health/config-checks.d.ts +19 -0
- package/dist/web-server/health/config-checks.d.ts.map +1 -0
- package/dist/web-server/health/config-checks.js +174 -0
- package/dist/web-server/health/config-checks.js.map +1 -0
- package/dist/web-server/health/environment-checks.d.ts +11 -0
- package/dist/web-server/health/environment-checks.d.ts.map +1 -0
- package/dist/web-server/health/environment-checks.js +40 -0
- package/dist/web-server/health/environment-checks.js.map +1 -0
- package/dist/web-server/health/index.d.ts +13 -0
- package/dist/web-server/health/index.d.ts.map +1 -0
- package/dist/web-server/health/index.js +41 -0
- package/dist/web-server/health/index.js.map +1 -0
- package/dist/web-server/health/oauth-checks.d.ts +11 -0
- package/dist/web-server/health/oauth-checks.d.ts.map +1 -0
- package/dist/web-server/health/oauth-checks.js +34 -0
- package/dist/web-server/health/oauth-checks.js.map +1 -0
- package/dist/web-server/health/profile-checks.d.ts +19 -0
- package/dist/web-server/health/profile-checks.d.ts.map +1 -0
- package/dist/web-server/health/profile-checks.js +152 -0
- package/dist/web-server/health/profile-checks.js.map +1 -0
- package/dist/web-server/health/symlink-checks.d.ts +15 -0
- package/dist/web-server/health/symlink-checks.d.ts.map +1 -0
- package/dist/web-server/health/symlink-checks.js +173 -0
- package/dist/web-server/health/symlink-checks.js.map +1 -0
- package/dist/web-server/health/system-checks.d.ts +19 -0
- package/dist/web-server/health/system-checks.d.ts.map +1 -0
- package/dist/web-server/health/system-checks.js +127 -0
- package/dist/web-server/health/system-checks.js.map +1 -0
- package/dist/web-server/health/types.d.ts +34 -0
- package/dist/web-server/health/types.d.ts.map +1 -0
- package/dist/web-server/health/types.js +8 -0
- package/dist/web-server/health/types.js.map +1 -0
- package/dist/web-server/health/websearch-checks.d.ts +11 -0
- package/dist/web-server/health/websearch-checks.d.ts.map +1 -0
- package/dist/web-server/health/websearch-checks.js +53 -0
- package/dist/web-server/health/websearch-checks.js.map +1 -0
- package/dist/web-server/health-service.d.ts +4 -30
- package/dist/web-server/health-service.d.ts.map +1 -1
- package/dist/web-server/health-service.js +28 -695
- package/dist/web-server/health-service.js.map +1 -1
- package/dist/web-server/index.d.ts.map +1 -1
- package/dist/web-server/index.js +2 -5
- package/dist/web-server/index.js.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts +6 -0
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -0
- package/dist/web-server/routes/cliproxy-auth-routes.js +202 -0
- package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -0
- package/dist/web-server/routes/cliproxy-stats-routes.d.ts +6 -0
- package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -0
- package/dist/web-server/routes/cliproxy-stats-routes.js +253 -0
- package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -0
- package/dist/web-server/routes/config-routes.d.ts +6 -0
- package/dist/web-server/routes/config-routes.d.ts.map +1 -0
- package/dist/web-server/routes/config-routes.js +145 -0
- package/dist/web-server/routes/config-routes.js.map +1 -0
- package/dist/web-server/routes/copilot-routes.d.ts +6 -0
- package/dist/web-server/routes/copilot-routes.d.ts.map +1 -0
- package/dist/web-server/routes/copilot-routes.js +195 -0
- package/dist/web-server/routes/copilot-routes.js.map +1 -0
- package/dist/web-server/routes/copilot-settings-routes.d.ts +6 -0
- package/dist/web-server/routes/copilot-settings-routes.d.ts.map +1 -0
- package/dist/web-server/routes/copilot-settings-routes.js +122 -0
- package/dist/web-server/routes/copilot-settings-routes.js.map +1 -0
- package/dist/web-server/routes/health-routes.d.ts +6 -0
- package/dist/web-server/routes/health-routes.d.ts.map +1 -0
- package/dist/web-server/routes/health-routes.js +30 -0
- package/dist/web-server/routes/health-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts +8 -0
- package/dist/web-server/routes/index.d.ts.map +1 -0
- package/dist/web-server/routes/index.js +54 -0
- package/dist/web-server/routes/index.js.map +1 -0
- package/dist/web-server/routes/misc-routes.d.ts +6 -0
- package/dist/web-server/routes/misc-routes.d.ts.map +1 -0
- package/dist/web-server/routes/misc-routes.js +219 -0
- package/dist/web-server/routes/misc-routes.js.map +1 -0
- package/dist/web-server/routes/profile-routes.d.ts +6 -0
- package/dist/web-server/routes/profile-routes.d.ts.map +1 -0
- package/dist/web-server/routes/profile-routes.js +164 -0
- package/dist/web-server/routes/profile-routes.js.map +1 -0
- package/dist/web-server/routes/provider-routes.d.ts +6 -0
- package/dist/web-server/routes/provider-routes.d.ts.map +1 -0
- package/dist/web-server/routes/provider-routes.js +146 -0
- package/dist/web-server/routes/provider-routes.js.map +1 -0
- package/dist/web-server/routes/route-helpers.d.ts +55 -0
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -0
- package/dist/web-server/routes/route-helpers.js +201 -0
- package/dist/web-server/routes/route-helpers.js.map +1 -0
- package/dist/web-server/routes/settings-routes.d.ts +6 -0
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -0
- package/dist/web-server/routes/settings-routes.js +207 -0
- package/dist/web-server/routes/settings-routes.js.map +1 -0
- package/dist/web-server/routes/variant-routes.d.ts +6 -0
- package/dist/web-server/routes/variant-routes.d.ts.map +1 -0
- package/dist/web-server/routes/variant-routes.js +158 -0
- package/dist/web-server/routes/variant-routes.js.map +1 -0
- package/dist/web-server/routes/websearch-routes.d.ts +6 -0
- package/dist/web-server/routes/websearch-routes.d.ts.map +1 -0
- package/dist/web-server/routes/websearch-routes.js +130 -0
- package/dist/web-server/routes/websearch-routes.js.map +1 -0
- package/dist/web-server/services/index.d.ts +7 -0
- package/dist/web-server/services/index.d.ts.map +1 -0
- package/dist/web-server/services/index.js +21 -0
- package/dist/web-server/services/index.js.map +1 -0
- package/dist/web-server/services/usage-aggregator.d.ts +7 -0
- package/dist/web-server/services/usage-aggregator.d.ts.map +1 -0
- package/dist/web-server/services/usage-aggregator.js +23 -0
- package/dist/web-server/services/usage-aggregator.js.map +1 -0
- package/dist/web-server/usage/aggregator.d.ts +54 -0
- package/dist/web-server/usage/aggregator.d.ts.map +1 -0
- package/dist/web-server/usage/aggregator.js +470 -0
- package/dist/web-server/usage/aggregator.js.map +1 -0
- package/dist/web-server/usage/data-aggregator.d.ts +55 -0
- package/dist/web-server/usage/data-aggregator.d.ts.map +1 -0
- package/dist/web-server/usage/data-aggregator.js +391 -0
- package/dist/web-server/usage/data-aggregator.js.map +1 -0
- package/dist/web-server/usage/disk-cache.d.ts +46 -0
- package/dist/web-server/usage/disk-cache.d.ts.map +1 -0
- package/dist/web-server/usage/disk-cache.js +162 -0
- package/dist/web-server/usage/disk-cache.js.map +1 -0
- package/dist/web-server/usage/handlers.d.ts +50 -0
- package/dist/web-server/usage/handlers.d.ts.map +1 -0
- package/dist/web-server/usage/handlers.js +524 -0
- package/dist/web-server/usage/handlers.js.map +1 -0
- package/dist/web-server/usage/index.d.ts +12 -0
- package/dist/web-server/usage/index.d.ts.map +1 -0
- package/dist/web-server/usage/index.js +54 -0
- package/dist/web-server/usage/index.js.map +1 -0
- package/dist/web-server/usage/routes.d.ts +11 -0
- package/dist/web-server/usage/routes.d.ts.map +1 -0
- package/dist/web-server/usage/routes.js +37 -0
- package/dist/web-server/usage/routes.js.map +1 -0
- package/dist/web-server/usage/types.d.ts +119 -0
- package/dist/web-server/usage/types.d.ts.map +1 -0
- package/dist/web-server/usage/types.js +9 -0
- package/dist/web-server/usage/types.js.map +1 -0
- package/dist/web-server/usage-disk-cache.d.ts +3 -42
- package/dist/web-server/usage-disk-cache.d.ts.map +1 -1
- package/dist/web-server/usage-disk-cache.js +5 -144
- package/dist/web-server/usage-disk-cache.js.map +1 -1
- package/dist/web-server/usage-routes.d.ts +3 -31
- package/dist/web-server/usage-routes.d.ts.map +1 -1
- package/dist/web-server/usage-routes.js +8 -1139
- package/dist/web-server/usage-routes.js.map +1 -1
- package/dist/web-server/usage-types.d.ts +3 -115
- package/dist/web-server/usage-types.d.ts.map +1 -1
- package/dist/web-server/usage-types.js +17 -3
- package/dist/web-server/usage-types.js.map +1 -1
- package/package.json +1 -1
- package/scripts/dev-release.sh +113 -0
- package/dist/ui/assets/analytics-D1k2nYcF.js +0 -1
- package/dist/ui/assets/api-D9VVmZ1j.js +0 -1
- package/dist/ui/assets/cliproxy-CTt_Nsft.js +0 -1
- package/dist/ui/assets/cliproxy-control-panel-DKMAi4_4.js +0 -1
- package/dist/ui/assets/copilot-C6F8PT_L.js +0 -4
- package/dist/ui/assets/form-utils-BuXDJb0w.js +0 -20
- package/dist/ui/assets/health-DiAvJaSn.js +0 -1
- package/dist/ui/assets/index-Brq6EBKZ.css +0 -1
- package/dist/ui/assets/index-ByU8ZhED.js +0 -48
- package/dist/ui/assets/settings-CEomZLGl.js +0 -1
- package/dist/web-server/routes.d.ts +0 -7
- package/dist/web-server/routes.d.ts.map +0 -1
- package/dist/web-server/routes.js +0 -1891
- package/dist/web-server/routes.js.map +0 -1
|
@@ -1,19 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* GlmtTransformer -
|
|
3
|
+
* GlmtTransformer - Orchestrator for Anthropic ↔ OpenAI format transformation
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* - Debug mode: Log raw data to ~/.ccs/logs/ (CCS_DEBUG=1)
|
|
11
|
-
* - Verbose mode: Console logging with timestamps
|
|
12
|
-
* - Validation: Self-test transformation results
|
|
13
|
-
*
|
|
14
|
-
* Control Tags (in user prompt):
|
|
15
|
-
* <Thinking:On|Off> - Enable/disable reasoning
|
|
16
|
-
* <Effort:Low|Medium|High> - Control reasoning depth
|
|
5
|
+
* Pipeline Architecture:
|
|
6
|
+
* - RequestTransformer: Anthropic → OpenAI request conversion
|
|
7
|
+
* - StreamParser: Delta processing for streaming responses
|
|
8
|
+
* - ResponseBuilder: SSE event generation
|
|
9
|
+
* - ToolCallHandler: Tool call processing
|
|
17
10
|
*/
|
|
18
11
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
12
|
if (k2 === undefined) k2 = k;
|
|
@@ -40,436 +33,132 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
40
33
|
};
|
|
41
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
35
|
exports.GlmtTransformer = void 0;
|
|
43
|
-
const crypto = __importStar(require("crypto"));
|
|
44
36
|
const fs = __importStar(require("fs"));
|
|
45
37
|
const path = __importStar(require("path"));
|
|
46
38
|
const os = __importStar(require("os"));
|
|
47
|
-
const
|
|
48
|
-
const reasoning_enforcer_1 = require("./reasoning-enforcer");
|
|
39
|
+
const pipeline_1 = require("./pipeline");
|
|
49
40
|
class GlmtTransformer {
|
|
50
41
|
constructor(config = {}) {
|
|
51
|
-
this.defaultThinking = config.defaultThinking ?? true;
|
|
52
42
|
this.verbose = config.verbose || false;
|
|
53
|
-
// CCS_DEBUG controls all debug logging (file + console)
|
|
54
43
|
const debugEnabled = process.env.CCS_DEBUG === '1';
|
|
55
44
|
this.debugLog = config.debugLog ?? debugEnabled;
|
|
56
|
-
this.debugMode = config.debugMode ?? debugEnabled;
|
|
57
45
|
this.debugLogDir = config.debugLogDir || path.join(os.homedir(), '.ccs', 'logs');
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
this.
|
|
67
|
-
|
|
46
|
+
// Initialize pipeline components
|
|
47
|
+
this.requestTransformer = new pipeline_1.RequestTransformer({
|
|
48
|
+
defaultThinking: config.defaultThinking ?? true,
|
|
49
|
+
verbose: this.verbose,
|
|
50
|
+
explicitReasoning: config.explicitReasoning ?? true,
|
|
51
|
+
log: (msg) => this.log(msg),
|
|
52
|
+
});
|
|
53
|
+
this.responseBuilder = new pipeline_1.ResponseBuilder(this.verbose);
|
|
54
|
+
this.toolCallHandler = new pipeline_1.ToolCallHandler();
|
|
55
|
+
this.contentTransformer = new pipeline_1.ContentTransformer(config.defaultThinking ?? true);
|
|
56
|
+
this.streamParser = new pipeline_1.StreamParser({
|
|
57
|
+
verbose: this.verbose,
|
|
58
|
+
debugMode: config.debugMode ?? debugEnabled,
|
|
59
|
+
debugLog: this.debugLog,
|
|
60
|
+
writeDebugLog: (type, data) => this.writeDebugLog(type, data),
|
|
68
61
|
});
|
|
69
62
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Transform Anthropic request to OpenAI format
|
|
72
|
-
*/
|
|
63
|
+
/** Transform Anthropic request to OpenAI format */
|
|
73
64
|
transformRequest(anthropicRequest) {
|
|
74
|
-
// Log original request
|
|
75
65
|
this.writeDebugLog('request-anthropic', anthropicRequest);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const hasControlTags = this.hasThinkingTags(anthropicRequest.messages || []);
|
|
80
|
-
// 2. Detect "think" keywords in user prompts (Anthropic-style)
|
|
81
|
-
const keywordConfig = this.detectThinkKeywords(anthropicRequest.messages || []);
|
|
82
|
-
if (keywordConfig && !anthropicRequest.thinking && !hasControlTags) {
|
|
83
|
-
thinkingConfig.thinking = keywordConfig.thinking;
|
|
84
|
-
thinkingConfig.effort = keywordConfig.effort;
|
|
85
|
-
this.log(`Detected think keyword: ${keywordConfig.keyword}, effort=${keywordConfig.effort}`);
|
|
86
|
-
}
|
|
87
|
-
// 3. Check anthropicRequest.thinking parameter (takes precedence)
|
|
88
|
-
if (anthropicRequest.thinking) {
|
|
89
|
-
if (anthropicRequest.thinking.type === 'enabled') {
|
|
90
|
-
thinkingConfig.thinking = true;
|
|
91
|
-
this.log('Claude CLI explicitly enabled thinking (overrides budget)');
|
|
92
|
-
}
|
|
93
|
-
else if (anthropicRequest.thinking.type === 'disabled') {
|
|
94
|
-
thinkingConfig.thinking = false;
|
|
95
|
-
this.log('Claude CLI explicitly disabled thinking (overrides budget)');
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
this.log(`Warning: Unknown thinking type: ${anthropicRequest.thinking.type}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
this.log(`Final thinking control: ${JSON.stringify(thinkingConfig)}`);
|
|
102
|
-
// 3. Map model
|
|
103
|
-
const glmModel = this.mapModel(anthropicRequest.model);
|
|
104
|
-
// 4. Inject locale instruction before sanitization
|
|
105
|
-
const messagesWithLocale = this.localeEnforcer.injectInstruction((anthropicRequest.messages || []));
|
|
106
|
-
// 4.5. Inject reasoning instruction (if enabled or thinking requested)
|
|
107
|
-
const messagesWithReasoning = this.reasoningEnforcer.injectInstruction(messagesWithLocale, thinkingConfig);
|
|
108
|
-
// 5. Convert to OpenAI format
|
|
109
|
-
const openaiRequest = {
|
|
110
|
-
model: glmModel,
|
|
111
|
-
messages: this.sanitizeMessages(messagesWithReasoning),
|
|
112
|
-
max_tokens: this.getMaxTokens(glmModel),
|
|
113
|
-
stream: anthropicRequest.stream ?? false,
|
|
114
|
-
};
|
|
115
|
-
// 5.5. Transform tools parameter if present
|
|
116
|
-
if (anthropicRequest.tools && anthropicRequest.tools.length > 0) {
|
|
117
|
-
openaiRequest.tools = this.transformTools(anthropicRequest.tools);
|
|
118
|
-
// Always use "auto" as Z.AI doesn't support other modes
|
|
119
|
-
openaiRequest.tool_choice = 'auto';
|
|
120
|
-
this.log(`Transformed ${anthropicRequest.tools.length} tools for OpenAI format`);
|
|
121
|
-
}
|
|
122
|
-
// 6. Preserve optional parameters
|
|
123
|
-
if (anthropicRequest.temperature !== undefined) {
|
|
124
|
-
openaiRequest.temperature = anthropicRequest.temperature;
|
|
125
|
-
}
|
|
126
|
-
if (anthropicRequest.top_p !== undefined) {
|
|
127
|
-
openaiRequest.top_p = anthropicRequest.top_p;
|
|
128
|
-
}
|
|
129
|
-
// 7. Handle streaming
|
|
130
|
-
if (anthropicRequest.stream !== undefined) {
|
|
131
|
-
openaiRequest.stream = anthropicRequest.stream;
|
|
132
|
-
}
|
|
133
|
-
// 8. Inject reasoning parameters
|
|
134
|
-
this.injectReasoningParams(openaiRequest, thinkingConfig);
|
|
135
|
-
// Log transformed request
|
|
136
|
-
this.writeDebugLog('request-openai', openaiRequest);
|
|
137
|
-
return { openaiRequest, thinkingConfig };
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
const err = error;
|
|
141
|
-
console.error('[glmt-transformer] Request transformation error:', err);
|
|
142
|
-
// Return original request with warning
|
|
143
|
-
return {
|
|
144
|
-
openaiRequest: anthropicRequest,
|
|
145
|
-
thinkingConfig: { thinking: false, effort: 'medium' },
|
|
146
|
-
error: err.message,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
66
|
+
const result = this.requestTransformer.transform(anthropicRequest);
|
|
67
|
+
this.writeDebugLog('request-openai', result.openaiRequest);
|
|
68
|
+
return result;
|
|
149
69
|
}
|
|
150
|
-
/**
|
|
151
|
-
* Transform OpenAI response to Anthropic format
|
|
152
|
-
*/
|
|
70
|
+
/** Transform OpenAI response to Anthropic format */
|
|
153
71
|
transformResponse(openaiResponse, _thinkingConfig = { thinking: false, effort: 'medium' }) {
|
|
154
|
-
// Log original response
|
|
155
72
|
this.writeDebugLog('response-openai', openaiResponse);
|
|
156
73
|
try {
|
|
157
74
|
const choice = openaiResponse.choices?.[0];
|
|
158
|
-
if (!choice)
|
|
75
|
+
if (!choice)
|
|
159
76
|
throw new Error('No choices in OpenAI response');
|
|
160
|
-
}
|
|
161
77
|
const message = choice.message;
|
|
162
78
|
const content = [];
|
|
163
|
-
// Add thinking block if reasoning_content exists
|
|
164
79
|
if (message.reasoning_content) {
|
|
165
|
-
|
|
166
|
-
const lineCount = message.reasoning_content.split('\n').length;
|
|
167
|
-
const preview = message.reasoning_content.substring(0, 100).replace(/\n/g, ' ').trim();
|
|
168
|
-
this.log(`Detected reasoning_content:`);
|
|
169
|
-
this.log(` Length: ${length} characters`);
|
|
170
|
-
this.log(` Lines: ${lineCount}`);
|
|
171
|
-
this.log(` Preview: ${preview}...`);
|
|
80
|
+
this.log(`Detected reasoning_content: ${message.reasoning_content.length} chars`);
|
|
172
81
|
content.push({
|
|
173
82
|
type: 'thinking',
|
|
174
83
|
thinking: message.reasoning_content,
|
|
175
|
-
signature: this.generateThinkingSignature(message.reasoning_content),
|
|
84
|
+
signature: this.responseBuilder.generateThinkingSignature(message.reasoning_content),
|
|
176
85
|
});
|
|
177
86
|
}
|
|
178
|
-
else {
|
|
179
|
-
this.log('No reasoning_content in OpenAI response');
|
|
180
|
-
this.log('Note: This is expected if thinking not requested or model cannot reason');
|
|
181
|
-
}
|
|
182
|
-
// Add text content
|
|
183
87
|
if (message.content) {
|
|
184
|
-
content.push({
|
|
185
|
-
type: 'text',
|
|
186
|
-
text: message.content,
|
|
187
|
-
});
|
|
88
|
+
content.push({ type: 'text', text: message.content });
|
|
188
89
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
message.tool_calls.forEach((toolCall) => {
|
|
192
|
-
let parsedInput;
|
|
193
|
-
try {
|
|
194
|
-
parsedInput = JSON.parse(toolCall.function.arguments || '{}');
|
|
195
|
-
}
|
|
196
|
-
catch (parseError) {
|
|
197
|
-
const err = parseError;
|
|
198
|
-
this.log(`Warning: Invalid JSON in tool arguments: ${err.message}`);
|
|
199
|
-
parsedInput = { _error: 'Invalid JSON', _raw: toolCall.function.arguments };
|
|
200
|
-
}
|
|
201
|
-
content.push({
|
|
202
|
-
type: 'tool_use',
|
|
203
|
-
id: toolCall.id,
|
|
204
|
-
name: toolCall.function.name,
|
|
205
|
-
input: parsedInput,
|
|
206
|
-
});
|
|
207
|
-
});
|
|
90
|
+
if (message.tool_calls?.length) {
|
|
91
|
+
content.push(...this.toolCallHandler.processToolCalls(message.tool_calls));
|
|
208
92
|
}
|
|
209
93
|
const anthropicResponse = {
|
|
210
94
|
id: openaiResponse.id || 'msg_' + Date.now(),
|
|
211
95
|
type: 'message',
|
|
212
96
|
role: 'assistant',
|
|
213
|
-
content
|
|
97
|
+
content,
|
|
214
98
|
model: openaiResponse.model || 'glm-4.6',
|
|
215
|
-
stop_reason: this.mapStopReason(choice.finish_reason || 'stop'),
|
|
99
|
+
stop_reason: this.responseBuilder.mapStopReason(choice.finish_reason || 'stop'),
|
|
216
100
|
usage: {
|
|
217
101
|
input_tokens: openaiResponse.usage?.prompt_tokens || 0,
|
|
218
102
|
output_tokens: openaiResponse.usage?.completion_tokens || 0,
|
|
219
103
|
},
|
|
220
104
|
};
|
|
221
|
-
// Validate transformation in verbose mode
|
|
222
|
-
if (this.verbose) {
|
|
223
|
-
const validation = this.validateTransformation(anthropicResponse);
|
|
224
|
-
this.log(`Transformation validation: ${validation.passed}/${validation.total} checks passed`);
|
|
225
|
-
if (!validation.valid) {
|
|
226
|
-
this.log(`Failed checks: ${JSON.stringify(validation.checks, null, 2)}`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// Log transformed response
|
|
230
105
|
this.writeDebugLog('response-anthropic', anthropicResponse);
|
|
231
106
|
return anthropicResponse;
|
|
232
107
|
}
|
|
233
108
|
catch (error) {
|
|
234
109
|
const err = error;
|
|
235
110
|
console.error('[glmt-transformer] Response transformation error:', err);
|
|
236
|
-
// Return minimal valid response
|
|
237
111
|
return {
|
|
238
112
|
id: 'msg_error_' + Date.now(),
|
|
239
113
|
type: 'message',
|
|
240
114
|
role: 'assistant',
|
|
241
|
-
content: [
|
|
242
|
-
{
|
|
243
|
-
type: 'text',
|
|
244
|
-
text: '[Transformation Error] ' + err.message,
|
|
245
|
-
},
|
|
246
|
-
],
|
|
115
|
+
content: [{ type: 'text', text: '[Transformation Error] ' + err.message }],
|
|
247
116
|
model: 'glm-4.6',
|
|
248
117
|
stop_reason: 'end_turn',
|
|
249
118
|
usage: { input_tokens: 0, output_tokens: 0 },
|
|
250
119
|
};
|
|
251
120
|
}
|
|
252
121
|
}
|
|
253
|
-
/**
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
sanitizeMessages(messages) {
|
|
257
|
-
const result = [];
|
|
258
|
-
for (const msg of messages) {
|
|
259
|
-
// If content is a string, add as-is
|
|
260
|
-
if (typeof msg.content === 'string') {
|
|
261
|
-
result.push(msg);
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
// If content is an array, process blocks
|
|
265
|
-
if (Array.isArray(msg.content)) {
|
|
266
|
-
// Separate tool_result blocks from other content
|
|
267
|
-
const toolResults = msg.content.filter((block) => block.type === 'tool_result');
|
|
268
|
-
const textBlocks = msg.content.filter((block) => block.type === 'text');
|
|
269
|
-
// const toolUseBlocks = msg.content.filter(block => block.type === 'tool_use');
|
|
270
|
-
// CRITICAL: Tool messages must come BEFORE user text in OpenAI API
|
|
271
|
-
for (const toolResult of toolResults) {
|
|
272
|
-
result.push({
|
|
273
|
-
role: 'tool',
|
|
274
|
-
content: typeof toolResult.content === 'string'
|
|
275
|
-
? toolResult.content
|
|
276
|
-
: JSON.stringify(toolResult.content),
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
// Add text content as user/assistant message AFTER tool messages
|
|
280
|
-
if (textBlocks.length > 0) {
|
|
281
|
-
const textContent = textBlocks.length === 1
|
|
282
|
-
? textBlocks[0].text || ''
|
|
283
|
-
: textBlocks.map((b) => b.text || '').join('\n');
|
|
284
|
-
result.push({
|
|
285
|
-
role: msg.role,
|
|
286
|
-
content: textContent,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
// If no content at all, add empty message
|
|
290
|
-
if (textBlocks.length === 0 && toolResults.length === 0) {
|
|
291
|
-
result.push({
|
|
292
|
-
role: msg.role,
|
|
293
|
-
content: '',
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
// Fallback: return message as-is
|
|
299
|
-
result.push(msg);
|
|
300
|
-
}
|
|
301
|
-
return result;
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Transform Anthropic tools to OpenAI tools format
|
|
305
|
-
*/
|
|
306
|
-
transformTools(anthropicTools) {
|
|
307
|
-
return anthropicTools.map((tool) => ({
|
|
308
|
-
type: 'function',
|
|
309
|
-
function: {
|
|
310
|
-
name: tool.name,
|
|
311
|
-
description: tool.description,
|
|
312
|
-
parameters: tool.input_schema || {},
|
|
313
|
-
},
|
|
314
|
-
}));
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Check if messages contain thinking control tags
|
|
318
|
-
*/
|
|
319
|
-
hasThinkingTags(messages) {
|
|
320
|
-
for (const msg of messages) {
|
|
321
|
-
if (msg.role !== 'user')
|
|
322
|
-
continue;
|
|
323
|
-
const content = msg.content;
|
|
324
|
-
if (typeof content !== 'string')
|
|
325
|
-
continue;
|
|
326
|
-
// Check for control tags
|
|
327
|
-
if (/<Thinking:(On|Off)>/i.test(content) || /<Effort:(Low|Medium|High)>/i.test(content)) {
|
|
328
|
-
return true;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Extract thinking control tags from user messages
|
|
335
|
-
*/
|
|
336
|
-
extractThinkingControl(messages) {
|
|
337
|
-
const config = {
|
|
338
|
-
thinking: this.defaultThinking,
|
|
339
|
-
effort: 'medium',
|
|
340
|
-
};
|
|
341
|
-
// Scan user messages for control tags
|
|
342
|
-
for (const msg of messages) {
|
|
343
|
-
if (msg.role !== 'user')
|
|
344
|
-
continue;
|
|
345
|
-
const content = msg.content;
|
|
346
|
-
if (typeof content !== 'string')
|
|
347
|
-
continue;
|
|
348
|
-
// Check for <Thinking:On|Off>
|
|
349
|
-
const thinkingMatch = content.match(/<Thinking:(On|Off)>/i);
|
|
350
|
-
if (thinkingMatch) {
|
|
351
|
-
config.thinking = thinkingMatch[1].toLowerCase() === 'on';
|
|
352
|
-
}
|
|
353
|
-
// Check for <Effort:Low|Medium|High>
|
|
354
|
-
const effortMatch = content.match(/<Effort:(Low|Medium|High)>/i);
|
|
355
|
-
if (effortMatch) {
|
|
356
|
-
config.effort = effortMatch[1].toLowerCase();
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
return config;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Generate thinking signature for Claude Code UI
|
|
363
|
-
*/
|
|
364
|
-
generateThinkingSignature(thinking) {
|
|
365
|
-
// Generate signature hash
|
|
366
|
-
const hash = crypto.createHash('sha256').update(thinking).digest('hex').substring(0, 16);
|
|
367
|
-
return {
|
|
368
|
-
type: 'thinking_signature',
|
|
369
|
-
hash: hash,
|
|
370
|
-
length: thinking.length,
|
|
371
|
-
timestamp: Date.now(),
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Detect Anthropic-style "think" keywords in user prompts
|
|
376
|
-
*/
|
|
377
|
-
detectThinkKeywords(messages) {
|
|
378
|
-
if (!messages || messages.length === 0)
|
|
379
|
-
return null;
|
|
380
|
-
// Extract text from user messages
|
|
381
|
-
const text = messages
|
|
382
|
-
.filter((m) => m.role === 'user')
|
|
383
|
-
.map((m) => {
|
|
384
|
-
if (typeof m.content === 'string')
|
|
385
|
-
return m.content;
|
|
386
|
-
if (Array.isArray(m.content)) {
|
|
387
|
-
return m.content
|
|
388
|
-
.filter((block) => block.type === 'text')
|
|
389
|
-
.map((block) => block.text || '')
|
|
390
|
-
.join(' ');
|
|
391
|
-
}
|
|
392
|
-
return '';
|
|
393
|
-
})
|
|
394
|
-
.join(' ');
|
|
395
|
-
// Priority: ultrathink > think harder > think hard > think
|
|
396
|
-
if (/\bultrathink\b/i.test(text)) {
|
|
397
|
-
return { thinking: true, effort: 'max', keyword: 'ultrathink' };
|
|
398
|
-
}
|
|
399
|
-
if (/\bthink\s+harder\b/i.test(text)) {
|
|
400
|
-
return { thinking: true, effort: 'high', keyword: 'think harder' };
|
|
401
|
-
}
|
|
402
|
-
if (/\bthink\s+hard\b/i.test(text)) {
|
|
403
|
-
return { thinking: true, effort: 'medium', keyword: 'think hard' };
|
|
404
|
-
}
|
|
405
|
-
if (/\bthink\b/i.test(text)) {
|
|
406
|
-
return { thinking: true, effort: 'low', keyword: 'think' };
|
|
407
|
-
}
|
|
408
|
-
return null; // No keywords detected
|
|
409
|
-
}
|
|
410
|
-
/**
|
|
411
|
-
* Inject reasoning parameters into OpenAI request
|
|
412
|
-
*/
|
|
413
|
-
injectReasoningParams(openaiRequest, thinkingConfig) {
|
|
414
|
-
// Always enable sampling for temperature/top_p to work
|
|
415
|
-
openaiRequest.do_sample = true;
|
|
416
|
-
// Add thinking-specific parameters if enabled
|
|
417
|
-
if (thinkingConfig.thinking) {
|
|
418
|
-
openaiRequest.reasoning = true;
|
|
419
|
-
openaiRequest.reasoning_effort = thinkingConfig.effort;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Map Anthropic model to GLM model
|
|
424
|
-
*/
|
|
425
|
-
mapModel(_anthropicModel) {
|
|
426
|
-
// Default to GLM-4.6 (latest and most capable)
|
|
427
|
-
return 'GLM-4.6';
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Get max tokens for model
|
|
431
|
-
*/
|
|
432
|
-
getMaxTokens(model) {
|
|
433
|
-
return this.modelMaxTokens[model] || 128000;
|
|
122
|
+
/** Transform streaming delta (delegates to StreamParser) */
|
|
123
|
+
transformDelta(openaiEvent, accumulator) {
|
|
124
|
+
return this.streamParser.transformDelta(openaiEvent, accumulator);
|
|
434
125
|
}
|
|
435
|
-
/**
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
mapStopReason(openaiReason) {
|
|
439
|
-
const mapping = {
|
|
440
|
-
stop: 'end_turn',
|
|
441
|
-
length: 'max_tokens',
|
|
442
|
-
tool_calls: 'tool_use',
|
|
443
|
-
content_filter: 'stop_sequence',
|
|
444
|
-
};
|
|
445
|
-
return mapping[openaiReason] || 'end_turn';
|
|
126
|
+
/** Finalize streaming (delegates to StreamParser) */
|
|
127
|
+
finalizeDelta(accumulator) {
|
|
128
|
+
return this.streamParser.finalizeDelta(accumulator);
|
|
446
129
|
}
|
|
447
|
-
/**
|
|
448
|
-
* Write debug log to file
|
|
449
|
-
*/
|
|
450
130
|
writeDebugLog(type, data) {
|
|
451
131
|
if (!this.debugLog)
|
|
452
132
|
return;
|
|
453
133
|
try {
|
|
454
134
|
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('.')[0];
|
|
455
|
-
const
|
|
456
|
-
const filepath = path.join(this.debugLogDir, filename);
|
|
457
|
-
// Ensure directory exists
|
|
135
|
+
const filepath = path.join(this.debugLogDir, `${timestamp}-${type}.json`);
|
|
458
136
|
fs.mkdirSync(this.debugLogDir, { recursive: true });
|
|
459
|
-
// Write file (pretty-printed)
|
|
460
137
|
fs.writeFileSync(filepath, JSON.stringify(data, null, 2) + '\n', 'utf8');
|
|
461
|
-
if (this.verbose) {
|
|
462
|
-
this.log(`Debug log written: ${filepath}`);
|
|
463
|
-
}
|
|
464
138
|
}
|
|
465
139
|
catch (error) {
|
|
466
|
-
|
|
467
|
-
|
|
140
|
+
console.error(`[glmt-transformer] Debug log error: ${error.message}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
log(message) {
|
|
144
|
+
if (this.verbose) {
|
|
145
|
+
console.error(`[glmt-transformer] [${new Date().toTimeString().split(' ')[0]}] ${message}`);
|
|
468
146
|
}
|
|
469
147
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
148
|
+
// ========== Backwards-compatible public methods ==========
|
|
149
|
+
/** Generate thinking signature (delegates to ResponseBuilder) */
|
|
150
|
+
generateThinkingSignature(thinking) {
|
|
151
|
+
return this.responseBuilder.generateThinkingSignature(thinking);
|
|
152
|
+
}
|
|
153
|
+
/** Map stop reason (delegates to ResponseBuilder) */
|
|
154
|
+
mapStopReason(openaiReason) {
|
|
155
|
+
return this.responseBuilder.mapStopReason(openaiReason);
|
|
156
|
+
}
|
|
157
|
+
/** Detect think keywords (delegates to ContentTransformer) */
|
|
158
|
+
detectThinkKeywords(messages) {
|
|
159
|
+
return this.contentTransformer.detectThinkKeywords(messages);
|
|
160
|
+
}
|
|
161
|
+
/** Validate transformation result */
|
|
473
162
|
validateTransformation(anthropicResponse) {
|
|
474
163
|
const checks = {
|
|
475
164
|
hasContent: Boolean(anthropicResponse.content && anthropicResponse.content.length > 0),
|
|
@@ -482,350 +171,6 @@ class GlmtTransformer {
|
|
|
482
171
|
const total = Object.keys(checks).length;
|
|
483
172
|
return { checks, passed, total, valid: passed === total };
|
|
484
173
|
}
|
|
485
|
-
/**
|
|
486
|
-
* Transform OpenAI streaming delta to Anthropic events
|
|
487
|
-
*/
|
|
488
|
-
transformDelta(openaiEvent, accumulator) {
|
|
489
|
-
const events = [];
|
|
490
|
-
// Debug logging for streaming deltas
|
|
491
|
-
if (this.debugLog && openaiEvent.data) {
|
|
492
|
-
this.writeDebugLog('delta-openai', openaiEvent.data);
|
|
493
|
-
}
|
|
494
|
-
// Handle [DONE] marker
|
|
495
|
-
if (openaiEvent.event === 'done') {
|
|
496
|
-
if (!accumulator.isFinalized()) {
|
|
497
|
-
return this.finalizeDelta(accumulator);
|
|
498
|
-
}
|
|
499
|
-
return []; // Already finalized
|
|
500
|
-
}
|
|
501
|
-
// Usage update (appears in final chunk, may be before choice data)
|
|
502
|
-
if (openaiEvent.data?.usage) {
|
|
503
|
-
accumulator.updateUsage(openaiEvent.data.usage);
|
|
504
|
-
// If we have both usage AND finish_reason, finalize immediately
|
|
505
|
-
if (accumulator.getFinishReason()) {
|
|
506
|
-
events.push(...this.finalizeDelta(accumulator));
|
|
507
|
-
return events;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
const choice = openaiEvent.data?.choices?.[0];
|
|
511
|
-
if (!choice)
|
|
512
|
-
return events;
|
|
513
|
-
const delta = choice.delta;
|
|
514
|
-
if (!delta)
|
|
515
|
-
return events;
|
|
516
|
-
// Message start
|
|
517
|
-
if (!accumulator.isMessageStarted()) {
|
|
518
|
-
if (openaiEvent.data?.model) {
|
|
519
|
-
accumulator.setModel(openaiEvent.data.model);
|
|
520
|
-
}
|
|
521
|
-
events.push(this.createMessageStartEvent(accumulator));
|
|
522
|
-
accumulator.setMessageStarted(true);
|
|
523
|
-
}
|
|
524
|
-
// Role
|
|
525
|
-
if (delta.role) {
|
|
526
|
-
accumulator.setRole(delta.role);
|
|
527
|
-
}
|
|
528
|
-
// Reasoning content delta
|
|
529
|
-
if (delta.reasoning_content) {
|
|
530
|
-
const currentBlock = accumulator.getCurrentBlock();
|
|
531
|
-
if (this.debugMode) {
|
|
532
|
-
console.error(`[GLMT-DEBUG] Reasoning delta: ${delta.reasoning_content.length} chars`);
|
|
533
|
-
console.error(`[GLMT-DEBUG] Current block: ${currentBlock?.type || 'none'}, index: ${currentBlock?.index ?? 'N/A'}`);
|
|
534
|
-
}
|
|
535
|
-
if (!currentBlock || currentBlock.type !== 'thinking') {
|
|
536
|
-
// Start thinking block
|
|
537
|
-
const block = accumulator.startBlock('thinking');
|
|
538
|
-
events.push(this.createContentBlockStartEvent(block));
|
|
539
|
-
if (this.debugMode) {
|
|
540
|
-
console.error(`[GLMT-DEBUG] Started new thinking block ${block.index}`);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
accumulator.addDelta(delta.reasoning_content);
|
|
544
|
-
const currentThinkingBlock = accumulator.getCurrentBlock();
|
|
545
|
-
if (currentThinkingBlock) {
|
|
546
|
-
events.push(this.createThinkingDeltaEvent(currentThinkingBlock, delta.reasoning_content));
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
// Text content delta
|
|
550
|
-
if (delta.content) {
|
|
551
|
-
const currentBlock = accumulator.getCurrentBlock();
|
|
552
|
-
// Close thinking block if transitioning from thinking to text
|
|
553
|
-
if (currentBlock && currentBlock.type === 'thinking' && !currentBlock.stopped) {
|
|
554
|
-
const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
|
|
555
|
-
if (signatureEvent) {
|
|
556
|
-
events.push(signatureEvent);
|
|
557
|
-
}
|
|
558
|
-
events.push(this.createContentBlockStopEvent(currentBlock));
|
|
559
|
-
accumulator.stopCurrentBlock();
|
|
560
|
-
}
|
|
561
|
-
if (!accumulator.getCurrentBlock() || accumulator.getCurrentBlock()?.type !== 'text') {
|
|
562
|
-
// Start text block
|
|
563
|
-
const block = accumulator.startBlock('text');
|
|
564
|
-
events.push(this.createContentBlockStartEvent(block));
|
|
565
|
-
}
|
|
566
|
-
accumulator.addDelta(delta.content);
|
|
567
|
-
const currentTextBlock = accumulator.getCurrentBlock();
|
|
568
|
-
if (currentTextBlock) {
|
|
569
|
-
events.push(this.createTextDeltaEvent(currentTextBlock, delta.content));
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
// Check for planning loop
|
|
573
|
-
if (accumulator.checkForLoop()) {
|
|
574
|
-
this.log('WARNING: Planning loop detected - 3 consecutive thinking blocks with no tool calls');
|
|
575
|
-
this.log('Forcing early finalization to prevent unbounded planning');
|
|
576
|
-
// Close current block if any
|
|
577
|
-
const currentBlock = accumulator.getCurrentBlock();
|
|
578
|
-
if (currentBlock && !currentBlock.stopped) {
|
|
579
|
-
if (currentBlock.type === 'thinking') {
|
|
580
|
-
const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
|
|
581
|
-
if (signatureEvent) {
|
|
582
|
-
events.push(signatureEvent);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
events.push(this.createContentBlockStopEvent(currentBlock));
|
|
586
|
-
accumulator.stopCurrentBlock();
|
|
587
|
-
}
|
|
588
|
-
// Force finalization
|
|
589
|
-
events.push(...this.finalizeDelta(accumulator));
|
|
590
|
-
return events;
|
|
591
|
-
}
|
|
592
|
-
// Tool calls deltas
|
|
593
|
-
if (delta.tool_calls && delta.tool_calls.length > 0) {
|
|
594
|
-
// Close current content block ONCE before processing any tool calls
|
|
595
|
-
const currentBlock = accumulator.getCurrentBlock();
|
|
596
|
-
if (currentBlock && !currentBlock.stopped) {
|
|
597
|
-
if (currentBlock.type === 'thinking') {
|
|
598
|
-
const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
|
|
599
|
-
if (signatureEvent) {
|
|
600
|
-
events.push(signatureEvent);
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
events.push(this.createContentBlockStopEvent(currentBlock));
|
|
604
|
-
accumulator.stopCurrentBlock();
|
|
605
|
-
}
|
|
606
|
-
// Process each tool call delta
|
|
607
|
-
for (const toolCallDelta of delta.tool_calls) {
|
|
608
|
-
// Track tool call state
|
|
609
|
-
const isNewToolCall = !accumulator.hasToolCall(toolCallDelta.index);
|
|
610
|
-
accumulator.addToolCallDelta(toolCallDelta);
|
|
611
|
-
// Emit tool use events (start + input_json deltas)
|
|
612
|
-
if (isNewToolCall) {
|
|
613
|
-
// Start new tool_use block in accumulator
|
|
614
|
-
const block = accumulator.startBlock('tool_use');
|
|
615
|
-
const toolCall = accumulator.getToolCall(toolCallDelta.index);
|
|
616
|
-
events.push({
|
|
617
|
-
event: 'content_block_start',
|
|
618
|
-
data: {
|
|
619
|
-
type: 'content_block_start',
|
|
620
|
-
index: block.index,
|
|
621
|
-
content_block: {
|
|
622
|
-
type: 'tool_use',
|
|
623
|
-
id: toolCall?.id || `tool_${toolCallDelta.index}`,
|
|
624
|
-
name: toolCall?.function?.name || '',
|
|
625
|
-
},
|
|
626
|
-
},
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
// Emit input_json delta if arguments present
|
|
630
|
-
if (toolCallDelta.function?.arguments) {
|
|
631
|
-
const currentToolBlock = accumulator.getCurrentBlock();
|
|
632
|
-
if (currentToolBlock && currentToolBlock.type === 'tool_use') {
|
|
633
|
-
events.push({
|
|
634
|
-
event: 'content_block_delta',
|
|
635
|
-
data: {
|
|
636
|
-
type: 'content_block_delta',
|
|
637
|
-
index: currentToolBlock.index,
|
|
638
|
-
delta: {
|
|
639
|
-
type: 'input_json_delta',
|
|
640
|
-
partial_json: toolCallDelta.function.arguments,
|
|
641
|
-
},
|
|
642
|
-
},
|
|
643
|
-
});
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
// Finish reason
|
|
649
|
-
if (choice.finish_reason) {
|
|
650
|
-
accumulator.setFinishReason(choice.finish_reason);
|
|
651
|
-
// If we have both finish_reason AND usage, finalize immediately
|
|
652
|
-
if (accumulator.hasUsageReceived()) {
|
|
653
|
-
events.push(...this.finalizeDelta(accumulator));
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
// Debug logging for generated events
|
|
657
|
-
if (this.debugLog && events.length > 0) {
|
|
658
|
-
this.writeDebugLog('delta-anthropic-events', {
|
|
659
|
-
events,
|
|
660
|
-
accumulator: accumulator.getSummary(),
|
|
661
|
-
});
|
|
662
|
-
}
|
|
663
|
-
return events;
|
|
664
|
-
}
|
|
665
|
-
/**
|
|
666
|
-
* Finalize streaming and generate closing events
|
|
667
|
-
*/
|
|
668
|
-
finalizeDelta(accumulator) {
|
|
669
|
-
if (accumulator.isFinalized()) {
|
|
670
|
-
return []; // Already finalized
|
|
671
|
-
}
|
|
672
|
-
const events = [];
|
|
673
|
-
// Close current content block if any
|
|
674
|
-
const currentBlock = accumulator.getCurrentBlock();
|
|
675
|
-
if (currentBlock && !currentBlock.stopped) {
|
|
676
|
-
if (currentBlock.type === 'thinking') {
|
|
677
|
-
const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
|
|
678
|
-
if (signatureEvent) {
|
|
679
|
-
events.push(signatureEvent);
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
events.push(this.createContentBlockStopEvent(currentBlock));
|
|
683
|
-
accumulator.stopCurrentBlock();
|
|
684
|
-
}
|
|
685
|
-
// Message delta (stop reason + usage)
|
|
686
|
-
events.push({
|
|
687
|
-
event: 'message_delta',
|
|
688
|
-
data: {
|
|
689
|
-
type: 'message_delta',
|
|
690
|
-
delta: {
|
|
691
|
-
stop_reason: this.mapStopReason(accumulator.getFinishReason() || 'stop'),
|
|
692
|
-
},
|
|
693
|
-
usage: {
|
|
694
|
-
input_tokens: accumulator.getInputTokens(),
|
|
695
|
-
output_tokens: accumulator.getOutputTokens(),
|
|
696
|
-
},
|
|
697
|
-
},
|
|
698
|
-
});
|
|
699
|
-
// Message stop
|
|
700
|
-
events.push({
|
|
701
|
-
event: 'message_stop',
|
|
702
|
-
data: {
|
|
703
|
-
type: 'message_stop',
|
|
704
|
-
},
|
|
705
|
-
});
|
|
706
|
-
accumulator.setFinalized(true);
|
|
707
|
-
return events;
|
|
708
|
-
}
|
|
709
|
-
/**
|
|
710
|
-
* Create message_start event
|
|
711
|
-
*/
|
|
712
|
-
createMessageStartEvent(accumulator) {
|
|
713
|
-
return {
|
|
714
|
-
event: 'message_start',
|
|
715
|
-
data: {
|
|
716
|
-
type: 'message_start',
|
|
717
|
-
message: {
|
|
718
|
-
id: accumulator.getMessageId(),
|
|
719
|
-
type: 'message',
|
|
720
|
-
role: accumulator.getRole(),
|
|
721
|
-
content: [],
|
|
722
|
-
model: accumulator.getModel() || 'glm-4.6',
|
|
723
|
-
stop_reason: null,
|
|
724
|
-
usage: {
|
|
725
|
-
input_tokens: accumulator.getInputTokens(),
|
|
726
|
-
output_tokens: 0,
|
|
727
|
-
},
|
|
728
|
-
},
|
|
729
|
-
},
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
/**
|
|
733
|
-
* Create content_block_start event
|
|
734
|
-
*/
|
|
735
|
-
createContentBlockStartEvent(block) {
|
|
736
|
-
return {
|
|
737
|
-
event: 'content_block_start',
|
|
738
|
-
data: {
|
|
739
|
-
type: 'content_block_start',
|
|
740
|
-
index: block.index,
|
|
741
|
-
content_block: {
|
|
742
|
-
type: block.type,
|
|
743
|
-
[block.type]: '',
|
|
744
|
-
},
|
|
745
|
-
},
|
|
746
|
-
};
|
|
747
|
-
}
|
|
748
|
-
/**
|
|
749
|
-
* Create thinking_delta event
|
|
750
|
-
*/
|
|
751
|
-
createThinkingDeltaEvent(block, delta) {
|
|
752
|
-
return {
|
|
753
|
-
event: 'content_block_delta',
|
|
754
|
-
data: {
|
|
755
|
-
type: 'content_block_delta',
|
|
756
|
-
index: block.index,
|
|
757
|
-
delta: {
|
|
758
|
-
type: 'thinking_delta',
|
|
759
|
-
thinking: delta,
|
|
760
|
-
},
|
|
761
|
-
},
|
|
762
|
-
};
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Create text_delta event
|
|
766
|
-
*/
|
|
767
|
-
createTextDeltaEvent(block, delta) {
|
|
768
|
-
return {
|
|
769
|
-
event: 'content_block_delta',
|
|
770
|
-
data: {
|
|
771
|
-
type: 'content_block_delta',
|
|
772
|
-
index: block.index,
|
|
773
|
-
delta: {
|
|
774
|
-
type: 'text_delta',
|
|
775
|
-
text: delta,
|
|
776
|
-
},
|
|
777
|
-
},
|
|
778
|
-
};
|
|
779
|
-
}
|
|
780
|
-
/**
|
|
781
|
-
* Create thinking signature delta event
|
|
782
|
-
*/
|
|
783
|
-
createSignatureDeltaEvent(block) {
|
|
784
|
-
// FIX: Guard against empty content (signature timing race)
|
|
785
|
-
if (!block.content || block.content.length === 0) {
|
|
786
|
-
if (this.verbose) {
|
|
787
|
-
this.log(`WARNING: Skipping signature for empty thinking block ${block.index}`);
|
|
788
|
-
this.log(`This indicates a race condition - signature requested before content accumulated`);
|
|
789
|
-
}
|
|
790
|
-
return null;
|
|
791
|
-
}
|
|
792
|
-
const signature = this.generateThinkingSignature(block.content);
|
|
793
|
-
if (this.verbose) {
|
|
794
|
-
this.log(`Generating signature for block ${block.index}: ${block.content.length} chars`);
|
|
795
|
-
}
|
|
796
|
-
return {
|
|
797
|
-
event: 'content_block_delta',
|
|
798
|
-
data: {
|
|
799
|
-
type: 'content_block_delta',
|
|
800
|
-
index: block.index,
|
|
801
|
-
delta: {
|
|
802
|
-
type: 'thinking_signature_delta',
|
|
803
|
-
signature: signature,
|
|
804
|
-
},
|
|
805
|
-
},
|
|
806
|
-
};
|
|
807
|
-
}
|
|
808
|
-
/**
|
|
809
|
-
* Create content_block_stop event
|
|
810
|
-
*/
|
|
811
|
-
createContentBlockStopEvent(block) {
|
|
812
|
-
return {
|
|
813
|
-
event: 'content_block_stop',
|
|
814
|
-
data: {
|
|
815
|
-
type: 'content_block_stop',
|
|
816
|
-
index: block.index,
|
|
817
|
-
},
|
|
818
|
-
};
|
|
819
|
-
}
|
|
820
|
-
/**
|
|
821
|
-
* Log message if verbose
|
|
822
|
-
*/
|
|
823
|
-
log(message) {
|
|
824
|
-
if (this.verbose) {
|
|
825
|
-
const timestamp = new Date().toTimeString().split(' ')[0]; // HH:MM:SS
|
|
826
|
-
console.error(`[glmt-transformer] [${timestamp}] ${message}`);
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
174
|
}
|
|
830
175
|
exports.GlmtTransformer = GlmtTransformer;
|
|
831
176
|
exports.default = GlmtTransformer;
|