@tabstack/sdk 1.0.5 → 2.1.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/CHANGELOG.md +117 -0
- package/LICENSE +1 -1
- package/README.md +282 -356
- package/api-promise.d.mts +2 -0
- package/api-promise.d.mts.map +1 -0
- package/api-promise.d.ts +2 -0
- package/api-promise.d.ts.map +1 -0
- package/api-promise.js +6 -0
- package/api-promise.js.map +1 -0
- package/api-promise.mjs +2 -0
- package/api-promise.mjs.map +1 -0
- package/client.d.mts +186 -0
- package/client.d.mts.map +1 -0
- package/client.d.ts +186 -0
- package/client.d.ts.map +1 -0
- package/client.js +467 -0
- package/client.js.map +1 -0
- package/client.mjs +463 -0
- package/client.mjs.map +1 -0
- package/core/api-promise.d.mts +46 -0
- package/core/api-promise.d.mts.map +1 -0
- package/core/api-promise.d.ts +46 -0
- package/core/api-promise.d.ts.map +1 -0
- package/core/api-promise.js +74 -0
- package/core/api-promise.js.map +1 -0
- package/core/api-promise.mjs +70 -0
- package/core/api-promise.mjs.map +1 -0
- package/core/error.d.mts +46 -0
- package/core/error.d.mts.map +1 -0
- package/core/error.d.ts +46 -0
- package/core/error.d.ts.map +1 -0
- package/core/error.js +113 -0
- package/core/error.js.map +1 -0
- package/core/error.mjs +97 -0
- package/core/error.mjs.map +1 -0
- package/core/resource.d.mts +6 -0
- package/core/resource.d.mts.map +1 -0
- package/core/resource.d.ts +6 -0
- package/core/resource.d.ts.map +1 -0
- package/core/resource.js +11 -0
- package/core/resource.js.map +1 -0
- package/core/resource.mjs +7 -0
- package/core/resource.mjs.map +1 -0
- package/core/streaming.d.mts +33 -0
- package/core/streaming.d.mts.map +1 -0
- package/core/streaming.d.ts +33 -0
- package/core/streaming.d.ts.map +1 -0
- package/core/streaming.js +263 -0
- package/core/streaming.js.map +1 -0
- package/core/streaming.mjs +258 -0
- package/core/streaming.mjs.map +1 -0
- package/core/uploads.d.mts +3 -0
- package/core/uploads.d.mts.map +1 -0
- package/core/uploads.d.ts +3 -0
- package/core/uploads.d.ts.map +1 -0
- package/core/uploads.js +6 -0
- package/core/uploads.js.map +1 -0
- package/core/uploads.mjs +2 -0
- package/core/uploads.mjs.map +1 -0
- package/error.d.mts +2 -0
- package/error.d.mts.map +1 -0
- package/error.d.ts +2 -0
- package/error.d.ts.map +1 -0
- package/error.js +6 -0
- package/error.js.map +1 -0
- package/error.mjs +2 -0
- package/error.mjs.map +1 -0
- package/index.d.mts +6 -0
- package/index.d.mts.map +1 -0
- package/index.d.ts +6 -0
- package/index.d.ts.map +1 -0
- package/index.js +30 -0
- package/index.js.map +1 -0
- package/index.mjs +7 -0
- package/index.mjs.map +1 -0
- package/internal/builtin-types.d.mts +73 -0
- package/internal/builtin-types.d.mts.map +1 -0
- package/internal/builtin-types.d.ts +73 -0
- package/internal/builtin-types.d.ts.map +1 -0
- package/internal/builtin-types.js +4 -0
- package/internal/builtin-types.js.map +1 -0
- package/internal/builtin-types.mjs +3 -0
- package/internal/builtin-types.mjs.map +1 -0
- package/internal/decoders/line.d.mts +17 -0
- package/internal/decoders/line.d.mts.map +1 -0
- package/internal/decoders/line.d.ts +17 -0
- package/internal/decoders/line.d.ts.map +1 -0
- package/internal/decoders/line.js +113 -0
- package/internal/decoders/line.js.map +1 -0
- package/internal/decoders/line.mjs +108 -0
- package/internal/decoders/line.mjs.map +1 -0
- package/internal/detect-platform.d.mts +15 -0
- package/internal/detect-platform.d.mts.map +1 -0
- package/internal/detect-platform.d.ts +15 -0
- package/internal/detect-platform.d.ts.map +1 -0
- package/internal/detect-platform.js +162 -0
- package/internal/detect-platform.js.map +1 -0
- package/internal/detect-platform.mjs +157 -0
- package/internal/detect-platform.mjs.map +1 -0
- package/internal/errors.d.mts +3 -0
- package/internal/errors.d.mts.map +1 -0
- package/internal/errors.d.ts +3 -0
- package/internal/errors.d.ts.map +1 -0
- package/internal/errors.js +41 -0
- package/internal/errors.js.map +1 -0
- package/internal/errors.mjs +36 -0
- package/internal/errors.mjs.map +1 -0
- package/internal/headers.d.mts +20 -0
- package/internal/headers.d.mts.map +1 -0
- package/internal/headers.d.ts +20 -0
- package/internal/headers.d.ts.map +1 -0
- package/internal/headers.js +79 -0
- package/internal/headers.js.map +1 -0
- package/internal/headers.mjs +74 -0
- package/internal/headers.mjs.map +1 -0
- package/internal/parse.d.mts +12 -0
- package/internal/parse.d.mts.map +1 -0
- package/internal/parse.d.ts +12 -0
- package/internal/parse.d.ts.map +1 -0
- package/internal/parse.js +45 -0
- package/internal/parse.js.map +1 -0
- package/internal/parse.mjs +42 -0
- package/internal/parse.mjs.map +1 -0
- package/internal/request-options.d.mts +77 -0
- package/internal/request-options.d.mts.map +1 -0
- package/internal/request-options.d.ts +77 -0
- package/internal/request-options.d.ts.map +1 -0
- package/internal/request-options.js +14 -0
- package/internal/request-options.js.map +1 -0
- package/internal/request-options.mjs +10 -0
- package/internal/request-options.mjs.map +1 -0
- package/internal/shim-types.d.mts +17 -0
- package/internal/shim-types.d.mts.map +1 -0
- package/internal/shim-types.d.ts +17 -0
- package/internal/shim-types.d.ts.map +1 -0
- package/internal/shim-types.js +4 -0
- package/internal/shim-types.js.map +1 -0
- package/internal/shim-types.mjs +3 -0
- package/internal/shim-types.mjs.map +1 -0
- package/internal/shims.d.mts +20 -0
- package/internal/shims.d.mts.map +1 -0
- package/internal/shims.d.ts +20 -0
- package/internal/shims.d.ts.map +1 -0
- package/internal/shims.js +92 -0
- package/internal/shims.js.map +1 -0
- package/internal/shims.mjs +85 -0
- package/internal/shims.mjs.map +1 -0
- package/internal/to-file.d.mts +45 -0
- package/internal/to-file.d.mts.map +1 -0
- package/internal/to-file.d.ts +45 -0
- package/internal/to-file.d.ts.map +1 -0
- package/internal/to-file.js +91 -0
- package/internal/to-file.js.map +1 -0
- package/internal/to-file.mjs +88 -0
- package/internal/to-file.mjs.map +1 -0
- package/internal/tslib.js +81 -0
- package/internal/tslib.mjs +17 -0
- package/internal/types.d.mts +69 -0
- package/internal/types.d.mts.map +1 -0
- package/internal/types.d.ts +69 -0
- package/internal/types.d.ts.map +1 -0
- package/internal/types.js +4 -0
- package/internal/types.js.map +1 -0
- package/internal/types.mjs +3 -0
- package/internal/types.mjs.map +1 -0
- package/internal/uploads.d.mts +42 -0
- package/internal/uploads.d.mts.map +1 -0
- package/internal/uploads.d.ts +42 -0
- package/internal/uploads.d.ts.map +1 -0
- package/internal/uploads.js +141 -0
- package/internal/uploads.js.map +1 -0
- package/internal/uploads.mjs +131 -0
- package/internal/uploads.mjs.map +1 -0
- package/internal/utils/base64.d.mts +3 -0
- package/internal/utils/base64.d.mts.map +1 -0
- package/internal/utils/base64.d.ts +3 -0
- package/internal/utils/base64.d.ts.map +1 -0
- package/internal/utils/base64.js +38 -0
- package/internal/utils/base64.js.map +1 -0
- package/internal/utils/base64.mjs +33 -0
- package/internal/utils/base64.mjs.map +1 -0
- package/internal/utils/bytes.d.mts +4 -0
- package/internal/utils/bytes.d.mts.map +1 -0
- package/internal/utils/bytes.d.ts +4 -0
- package/internal/utils/bytes.d.ts.map +1 -0
- package/internal/utils/bytes.js +31 -0
- package/internal/utils/bytes.js.map +1 -0
- package/internal/utils/bytes.mjs +26 -0
- package/internal/utils/bytes.mjs.map +1 -0
- package/internal/utils/env.d.mts +9 -0
- package/internal/utils/env.d.mts.map +1 -0
- package/internal/utils/env.d.ts +9 -0
- package/internal/utils/env.d.ts.map +1 -0
- package/internal/utils/env.js +22 -0
- package/internal/utils/env.js.map +1 -0
- package/internal/utils/env.mjs +18 -0
- package/internal/utils/env.mjs.map +1 -0
- package/internal/utils/log.d.mts +37 -0
- package/internal/utils/log.d.mts.map +1 -0
- package/internal/utils/log.d.ts +37 -0
- package/internal/utils/log.d.ts.map +1 -0
- package/internal/utils/log.js +85 -0
- package/internal/utils/log.js.map +1 -0
- package/internal/utils/log.mjs +79 -0
- package/internal/utils/log.mjs.map +1 -0
- package/internal/utils/path.d.mts +15 -0
- package/internal/utils/path.d.mts.map +1 -0
- package/internal/utils/path.d.ts +15 -0
- package/internal/utils/path.d.ts.map +1 -0
- package/internal/utils/path.js +79 -0
- package/internal/utils/path.js.map +1 -0
- package/internal/utils/path.mjs +74 -0
- package/internal/utils/path.mjs.map +1 -0
- package/internal/utils/sleep.d.mts +2 -0
- package/internal/utils/sleep.d.mts.map +1 -0
- package/internal/utils/sleep.d.ts +2 -0
- package/internal/utils/sleep.d.ts.map +1 -0
- package/internal/utils/sleep.js +7 -0
- package/internal/utils/sleep.js.map +1 -0
- package/internal/utils/sleep.mjs +3 -0
- package/internal/utils/sleep.mjs.map +1 -0
- package/internal/utils/uuid.d.mts +5 -0
- package/internal/utils/uuid.d.mts.map +1 -0
- package/internal/utils/uuid.d.ts +5 -0
- package/internal/utils/uuid.d.ts.map +1 -0
- package/internal/utils/uuid.js +19 -0
- package/internal/utils/uuid.js.map +1 -0
- package/internal/utils/uuid.mjs +15 -0
- package/internal/utils/uuid.mjs.map +1 -0
- package/internal/utils/values.d.mts +18 -0
- package/internal/utils/values.d.mts.map +1 -0
- package/internal/utils/values.d.ts +18 -0
- package/internal/utils/values.d.ts.map +1 -0
- package/internal/utils/values.js +112 -0
- package/internal/utils/values.js.map +1 -0
- package/internal/utils/values.mjs +94 -0
- package/internal/utils/values.mjs.map +1 -0
- package/internal/utils.d.mts +7 -0
- package/internal/utils.d.mts.map +1 -0
- package/internal/utils.d.ts +7 -0
- package/internal/utils.d.ts.map +1 -0
- package/internal/utils.js +11 -0
- package/internal/utils.js.map +1 -0
- package/internal/utils.mjs +8 -0
- package/internal/utils.mjs.map +1 -0
- package/package.json +139 -82
- package/resource.d.mts +2 -0
- package/resource.d.mts.map +1 -0
- package/resource.d.ts +2 -0
- package/resource.d.ts.map +1 -0
- package/resource.js +6 -0
- package/resource.js.map +1 -0
- package/resource.mjs +2 -0
- package/resource.mjs.map +1 -0
- package/resources/agent.d.mts +154 -0
- package/resources/agent.d.mts.map +1 -0
- package/resources/agent.d.ts +154 -0
- package/resources/agent.d.ts.map +1 -0
- package/resources/agent.js +88 -0
- package/resources/agent.js.map +1 -0
- package/resources/agent.mjs +84 -0
- package/resources/agent.mjs.map +1 -0
- package/resources/extract.d.mts +207 -0
- package/resources/extract.d.mts.map +1 -0
- package/resources/extract.d.ts +207 -0
- package/resources/extract.d.ts.map +1 -0
- package/resources/extract.js +61 -0
- package/resources/extract.js.map +1 -0
- package/resources/extract.mjs +57 -0
- package/resources/extract.mjs.map +1 -0
- package/resources/generate.d.mts +79 -0
- package/resources/generate.d.mts.map +1 -0
- package/resources/generate.d.ts +79 -0
- package/resources/generate.d.ts.map +1 -0
- package/resources/generate.js +44 -0
- package/resources/generate.js.map +1 -0
- package/resources/generate.mjs +40 -0
- package/resources/generate.mjs.map +1 -0
- package/resources/index.d.mts +4 -0
- package/resources/index.d.mts.map +1 -0
- package/resources/index.d.ts +4 -0
- package/resources/index.d.ts.map +1 -0
- package/resources/index.js +11 -0
- package/resources/index.js.map +1 -0
- package/resources/index.mjs +5 -0
- package/resources/index.mjs.map +1 -0
- package/resources.d.mts +2 -0
- package/resources.d.mts.map +1 -0
- package/resources.d.ts +2 -0
- package/resources.d.ts.map +1 -0
- package/resources.js +5 -0
- package/resources.js.map +1 -0
- package/resources.mjs +2 -0
- package/resources.mjs.map +1 -0
- package/src/api-promise.ts +2 -0
- package/src/client.ts +764 -0
- package/src/core/README.md +3 -0
- package/src/core/api-promise.ts +92 -0
- package/src/core/error.ts +130 -0
- package/src/core/resource.ts +11 -0
- package/src/core/streaming.ts +315 -0
- package/src/core/uploads.ts +2 -0
- package/src/error.ts +2 -0
- package/src/index.ts +22 -0
- package/src/internal/README.md +3 -0
- package/src/internal/builtin-types.ts +93 -0
- package/src/internal/decoders/line.ts +135 -0
- package/src/internal/detect-platform.ts +196 -0
- package/src/internal/errors.ts +33 -0
- package/src/internal/headers.ts +97 -0
- package/src/internal/parse.ts +64 -0
- package/src/internal/request-options.ts +93 -0
- package/src/internal/shim-types.ts +26 -0
- package/src/internal/shims.ts +107 -0
- package/src/internal/to-file.ts +154 -0
- package/src/internal/types.ts +95 -0
- package/src/internal/uploads.ts +187 -0
- package/src/internal/utils/base64.ts +40 -0
- package/src/internal/utils/bytes.ts +32 -0
- package/src/internal/utils/env.ts +18 -0
- package/src/internal/utils/log.ts +126 -0
- package/src/internal/utils/path.ts +88 -0
- package/src/internal/utils/sleep.ts +3 -0
- package/src/internal/utils/uuid.ts +17 -0
- package/src/internal/utils/values.ts +105 -0
- package/src/internal/utils.ts +8 -0
- package/src/lib/.keep +4 -0
- package/src/resource.ts +2 -0
- package/src/resources/agent.ts +194 -0
- package/src/resources/extract.ts +248 -0
- package/src/resources/generate.ts +89 -0
- package/src/resources/index.ts +17 -0
- package/src/resources.ts +1 -0
- package/src/streaming.ts +2 -0
- package/src/tsconfig.json +11 -0
- package/src/uploads.ts +2 -0
- package/src/version.ts +1 -0
- package/streaming.d.mts +2 -0
- package/streaming.d.mts.map +1 -0
- package/streaming.d.ts +2 -0
- package/streaming.d.ts.map +1 -0
- package/streaming.js +6 -0
- package/streaming.js.map +1 -0
- package/streaming.mjs +2 -0
- package/streaming.mjs.map +1 -0
- package/uploads.d.mts +2 -0
- package/uploads.d.mts.map +1 -0
- package/uploads.d.ts +2 -0
- package/uploads.d.ts.map +1 -0
- package/uploads.js +6 -0
- package/uploads.js.map +1 -0
- package/uploads.mjs +2 -0
- package/uploads.mjs.map +1 -0
- package/version.d.mts +2 -0
- package/version.d.mts.map +1 -0
- package/version.d.ts +2 -0
- package/version.d.ts.map +1 -0
- package/version.js +5 -0
- package/version.js.map +1 -0
- package/version.mjs +2 -0
- package/version.mjs.map +1 -0
- package/dist/cjs/agent.d.ts +0 -156
- package/dist/cjs/agent.d.ts.map +0 -1
- package/dist/cjs/agent.js +0 -211
- package/dist/cjs/agent.js.map +0 -1
- package/dist/cjs/agent.test.d.ts +0 -5
- package/dist/cjs/agent.test.d.ts.map +0 -1
- package/dist/cjs/agent.test.js +0 -441
- package/dist/cjs/agent.test.js.map +0 -1
- package/dist/cjs/client.d.ts +0 -58
- package/dist/cjs/client.d.ts.map +0 -1
- package/dist/cjs/client.js +0 -58
- package/dist/cjs/client.js.map +0 -1
- package/dist/cjs/client.test.d.ts +0 -5
- package/dist/cjs/client.test.d.ts.map +0 -1
- package/dist/cjs/client.test.js +0 -255
- package/dist/cjs/client.test.js.map +0 -1
- package/dist/cjs/exceptions.d.ts +0 -57
- package/dist/cjs/exceptions.d.ts.map +0 -1
- package/dist/cjs/exceptions.js +0 -95
- package/dist/cjs/exceptions.js.map +0 -1
- package/dist/cjs/exceptions.test.d.ts +0 -5
- package/dist/cjs/exceptions.test.d.ts.map +0 -1
- package/dist/cjs/exceptions.test.js +0 -239
- package/dist/cjs/exceptions.test.js.map +0 -1
- package/dist/cjs/extract.d.ts +0 -151
- package/dist/cjs/extract.d.ts.map +0 -1
- package/dist/cjs/extract.js +0 -165
- package/dist/cjs/extract.js.map +0 -1
- package/dist/cjs/extract.test.d.ts +0 -5
- package/dist/cjs/extract.test.d.ts.map +0 -1
- package/dist/cjs/extract.test.js +0 -250
- package/dist/cjs/extract.test.js.map +0 -1
- package/dist/cjs/generate.d.ts +0 -113
- package/dist/cjs/generate.d.ts.map +0 -1
- package/dist/cjs/generate.js +0 -124
- package/dist/cjs/generate.js.map +0 -1
- package/dist/cjs/generate.test.d.ts +0 -5
- package/dist/cjs/generate.test.d.ts.map +0 -1
- package/dist/cjs/generate.test.js +0 -314
- package/dist/cjs/generate.test.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -52
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js +0 -72
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/package.json +0 -3
- package/dist/cjs/types.d.ts +0 -73
- package/dist/cjs/types.d.ts.map +0 -1
- package/dist/cjs/types.js +0 -118
- package/dist/cjs/types.js.map +0 -1
- package/dist/cjs/types.test.d.ts +0 -5
- package/dist/cjs/types.test.d.ts.map +0 -1
- package/dist/cjs/types.test.js +0 -370
- package/dist/cjs/types.test.js.map +0 -1
- package/dist/cjs/util/http.d.ts +0 -29
- package/dist/cjs/util/http.d.ts.map +0 -1
- package/dist/cjs/util/http.js +0 -201
- package/dist/cjs/util/http.js.map +0 -1
- package/dist/cjs/util/http.test.d.ts +0 -5
- package/dist/cjs/util/http.test.d.ts.map +0 -1
- package/dist/cjs/util/http.test.js +0 -237
- package/dist/cjs/util/http.test.js.map +0 -1
- package/dist/esm/agent.d.ts +0 -156
- package/dist/esm/agent.d.ts.map +0 -1
- package/dist/esm/agent.js +0 -207
- package/dist/esm/agent.js.map +0 -1
- package/dist/esm/agent.test.d.ts +0 -5
- package/dist/esm/agent.test.d.ts.map +0 -1
- package/dist/esm/agent.test.js +0 -439
- package/dist/esm/agent.test.js.map +0 -1
- package/dist/esm/client.d.ts +0 -58
- package/dist/esm/client.d.ts.map +0 -1
- package/dist/esm/client.js +0 -54
- package/dist/esm/client.js.map +0 -1
- package/dist/esm/client.test.d.ts +0 -5
- package/dist/esm/client.test.d.ts.map +0 -1
- package/dist/esm/client.test.js +0 -253
- package/dist/esm/client.test.js.map +0 -1
- package/dist/esm/exceptions.d.ts +0 -57
- package/dist/esm/exceptions.d.ts.map +0 -1
- package/dist/esm/exceptions.js +0 -85
- package/dist/esm/exceptions.js.map +0 -1
- package/dist/esm/exceptions.test.d.ts +0 -5
- package/dist/esm/exceptions.test.d.ts.map +0 -1
- package/dist/esm/exceptions.test.js +0 -237
- package/dist/esm/exceptions.test.js.map +0 -1
- package/dist/esm/extract.d.ts +0 -151
- package/dist/esm/extract.d.ts.map +0 -1
- package/dist/esm/extract.js +0 -161
- package/dist/esm/extract.js.map +0 -1
- package/dist/esm/extract.test.d.ts +0 -5
- package/dist/esm/extract.test.d.ts.map +0 -1
- package/dist/esm/extract.test.js +0 -248
- package/dist/esm/extract.test.js.map +0 -1
- package/dist/esm/generate.d.ts +0 -113
- package/dist/esm/generate.d.ts.map +0 -1
- package/dist/esm/generate.js +0 -120
- package/dist/esm/generate.js.map +0 -1
- package/dist/esm/generate.test.d.ts +0 -5
- package/dist/esm/generate.test.d.ts.map +0 -1
- package/dist/esm/generate.test.js +0 -312
- package/dist/esm/generate.test.js.map +0 -1
- package/dist/esm/index.d.ts +0 -52
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js +0 -53
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/dist/esm/types.d.ts +0 -73
- package/dist/esm/types.d.ts.map +0 -1
- package/dist/esm/types.js +0 -110
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/types.test.d.ts +0 -5
- package/dist/esm/types.test.d.ts.map +0 -1
- package/dist/esm/types.test.js +0 -368
- package/dist/esm/types.test.js.map +0 -1
- package/dist/esm/util/http.d.ts +0 -29
- package/dist/esm/util/http.d.ts.map +0 -1
- package/dist/esm/util/http.js +0 -164
- package/dist/esm/util/http.js.map +0 -1
- package/dist/esm/util/http.test.d.ts +0 -5
- package/dist/esm/util/http.test.d.ts.map +0 -1
- package/dist/esm/util/http.test.js +0 -232
- package/dist/esm/util/http.test.js.map +0 -1
- package/dist/types/agent.d.ts +0 -156
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.test.d.ts +0 -5
- package/dist/types/agent.test.d.ts.map +0 -1
- package/dist/types/client.d.ts +0 -58
- package/dist/types/client.d.ts.map +0 -1
- package/dist/types/client.test.d.ts +0 -5
- package/dist/types/client.test.d.ts.map +0 -1
- package/dist/types/exceptions.d.ts +0 -57
- package/dist/types/exceptions.d.ts.map +0 -1
- package/dist/types/exceptions.test.d.ts +0 -5
- package/dist/types/exceptions.test.d.ts.map +0 -1
- package/dist/types/extract.d.ts +0 -151
- package/dist/types/extract.d.ts.map +0 -1
- package/dist/types/extract.test.d.ts +0 -5
- package/dist/types/extract.test.d.ts.map +0 -1
- package/dist/types/generate.d.ts +0 -113
- package/dist/types/generate.d.ts.map +0 -1
- package/dist/types/generate.test.d.ts +0 -5
- package/dist/types/generate.test.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -52
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/types.d.ts +0 -73
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/types.test.d.ts +0 -5
- package/dist/types/types.test.d.ts.map +0 -1
- package/dist/types/util/http.d.ts +0 -29
- package/dist/types/util/http.d.ts.map +0 -1
- package/dist/types/util/http.test.d.ts +0 -5
- package/dist/types/util/http.test.d.ts.map +0 -1
package/dist/cjs/agent.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Agent client for Tabstack SDK
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Agent = void 0;
|
|
7
|
-
const types_1 = require("./types");
|
|
8
|
-
/**
|
|
9
|
-
* Agent client for AI-powered web automation
|
|
10
|
-
*
|
|
11
|
-
* This class provides methods for executing complex web automation tasks using
|
|
12
|
-
* natural language instructions. The automation runs in a browser and streams
|
|
13
|
-
* real-time progress updates.
|
|
14
|
-
*/
|
|
15
|
-
class Agent {
|
|
16
|
-
constructor(httpClient) {
|
|
17
|
-
this.httpClient = httpClient;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Execute AI-powered browser automation task with streaming updates
|
|
21
|
-
*
|
|
22
|
-
* Execute complex web automation tasks using natural language instructions. This method
|
|
23
|
-
* always streams responses using Server-Sent Events (SSE), providing real-time progress
|
|
24
|
-
* updates as the task executes. Perfect for web scraping, form filling, navigation,
|
|
25
|
-
* information gathering, and multi-step workflows.
|
|
26
|
-
*
|
|
27
|
-
* @param task - The task description in natural language. Example: "Find the top 3 trending repositories on GitHub and extract their names, descriptions, and star counts"
|
|
28
|
-
* @param options - Optional automation options
|
|
29
|
-
* @param options.url - Starting URL for the task. Optional but recommended for better context.
|
|
30
|
-
* @param options.data - JSON data to provide context for form filling or complex tasks. Example: { "language": "Python", "timeRange": "today" }
|
|
31
|
-
* @param options.guardrails - Safety constraints for execution. Example: "browse and extract data only, don't star or fork repositories"
|
|
32
|
-
* @param options.maxIterations - Maximum task iterations. Default: 50, Min: 1, Max: 100
|
|
33
|
-
* @param options.maxValidationAttempts - Maximum validation attempts. Default: 3, Min: 1, Max: 10
|
|
34
|
-
*
|
|
35
|
-
* @yields AutomateEvent objects representing different stages of task execution
|
|
36
|
-
*
|
|
37
|
-
* @throws {BadRequestError} When task is missing, URL format is invalid, or maxIterations is out of range
|
|
38
|
-
* @throws {UnauthorizedError} When API key is invalid or missing
|
|
39
|
-
* @throws {ServerError} When automation server call fails
|
|
40
|
-
* @throws {ServiceUnavailableError} When automate service is not available
|
|
41
|
-
*
|
|
42
|
-
* Event Types:
|
|
43
|
-
* - **Task Events**: `start`, `task:setup`, `task:started`, `task:completed`, `task:aborted`, `task:validated`, `task:validation_error`
|
|
44
|
-
* - **Agent Events**: `agent:processing`, `agent:status`, `agent:step`, `agent:action`, `agent:reasoned`, `agent:extracted`, `agent:waiting`
|
|
45
|
-
* - **Browser Events**: `browser:navigated`, `browser:action_started`, `browser:action_completed`, `browser:screenshot_captured`
|
|
46
|
-
* - **System Events**: `system:debug_compression`, `system:debug_message`
|
|
47
|
-
* - **Stream Control**: `complete`, `done`, `error`
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* Extract GitHub trending repositories:
|
|
51
|
-
* ```typescript
|
|
52
|
-
* for await (const event of tabs.agent.automate(
|
|
53
|
-
* 'Find the top 3 trending repositories and extract their names, descriptions, and star counts',
|
|
54
|
-
* {
|
|
55
|
-
* url: 'https://github.com/trending',
|
|
56
|
-
* guardrails: 'browse and extract only, don\'t interact with repositories'
|
|
57
|
-
* }
|
|
58
|
-
* )) {
|
|
59
|
-
* console.log(`Event: ${event.type}`);
|
|
60
|
-
*
|
|
61
|
-
* if (event.type === 'task:completed') {
|
|
62
|
-
* console.log('Result:', event.data.get('finalAnswer'));
|
|
63
|
-
* } else if (event.type === 'agent:extracted') {
|
|
64
|
-
* console.log('Extracted data:', event.data.get('extractedData'));
|
|
65
|
-
* } else if (event.type === 'browser:navigated') {
|
|
66
|
-
* console.log('Navigated to:', event.data.get('url'));
|
|
67
|
-
* }
|
|
68
|
-
* }
|
|
69
|
-
* ```
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* Scrape product information:
|
|
73
|
-
* ```typescript
|
|
74
|
-
* for await (const event of tabs.agent.automate(
|
|
75
|
-
* 'Find the product name, price, and availability status',
|
|
76
|
-
* {
|
|
77
|
-
* url: 'https://example-store.com/product/wireless-headphones',
|
|
78
|
-
* guardrails: 'extract product details only, don\'t add to cart or checkout',
|
|
79
|
-
* maxIterations: 20
|
|
80
|
-
* }
|
|
81
|
-
* )) {
|
|
82
|
-
* if (event.type === 'agent:processing') {
|
|
83
|
-
* console.log('Agent thinking:', event.data.get('operation'));
|
|
84
|
-
* } else if (event.type === 'task:completed') {
|
|
85
|
-
* const result = event.data.get('finalAnswer');
|
|
86
|
-
* console.log('Product info:', result);
|
|
87
|
-
* }
|
|
88
|
-
* }
|
|
89
|
-
* ```
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
* Fill out contact form:
|
|
93
|
-
* ```typescript
|
|
94
|
-
* for await (const event of tabs.agent.automate(
|
|
95
|
-
* 'Submit the contact form with my information',
|
|
96
|
-
* {
|
|
97
|
-
* url: 'https://company.com/contact',
|
|
98
|
-
* data: {
|
|
99
|
-
* name: 'Alex Johnson',
|
|
100
|
-
* email: 'alex@example.com',
|
|
101
|
-
* message: 'Interested in learning more about your enterprise plan'
|
|
102
|
-
* },
|
|
103
|
-
* maxIterations: 30,
|
|
104
|
-
* maxValidationAttempts: 5
|
|
105
|
-
* }
|
|
106
|
-
* )) {
|
|
107
|
-
* if (event.type === 'agent:action') {
|
|
108
|
-
* console.log('Action:', event.data.get('action'), event.data.get('value'));
|
|
109
|
-
* } else if (event.type === 'task:completed') {
|
|
110
|
-
* console.log('Form submitted successfully!');
|
|
111
|
-
* }
|
|
112
|
-
* }
|
|
113
|
-
* ```
|
|
114
|
-
*
|
|
115
|
-
* @example
|
|
116
|
-
* Handle all event types:
|
|
117
|
-
* ```typescript
|
|
118
|
-
* for await (const event of tabs.agent.automate(
|
|
119
|
-
* 'Research TypeScript frameworks and compare them',
|
|
120
|
-
* { url: 'https://www.npmjs.com' }
|
|
121
|
-
* )) {
|
|
122
|
-
* switch (event.type) {
|
|
123
|
-
* case 'start':
|
|
124
|
-
* console.log('Task started');
|
|
125
|
-
* break;
|
|
126
|
-
* case 'agent:status':
|
|
127
|
-
* console.log('Status:', event.data.get('message'));
|
|
128
|
-
* break;
|
|
129
|
-
* case 'agent:step':
|
|
130
|
-
* const iteration = event.data.get('currentIteration');
|
|
131
|
-
* console.log(`Processing step ${iteration}...`);
|
|
132
|
-
* break;
|
|
133
|
-
* case 'browser:navigated':
|
|
134
|
-
* console.log('Page:', event.data.get('title'));
|
|
135
|
-
* break;
|
|
136
|
-
* case 'task:completed':
|
|
137
|
-
* console.log('Final result:', event.data.get('finalAnswer'));
|
|
138
|
-
* break;
|
|
139
|
-
* case 'error':
|
|
140
|
-
* console.error('Error occurred:', event.data.getRaw());
|
|
141
|
-
* break;
|
|
142
|
-
* }
|
|
143
|
-
* }
|
|
144
|
-
* ```
|
|
145
|
-
*/
|
|
146
|
-
async *automate(task, options) {
|
|
147
|
-
const requestData = {
|
|
148
|
-
task,
|
|
149
|
-
maxIterations: options?.maxIterations ?? 50,
|
|
150
|
-
maxValidationAttempts: options?.maxValidationAttempts ?? 3,
|
|
151
|
-
};
|
|
152
|
-
if (options?.url)
|
|
153
|
-
requestData.url = options.url;
|
|
154
|
-
if (options?.data)
|
|
155
|
-
requestData.data = options.data;
|
|
156
|
-
if (options?.guardrails)
|
|
157
|
-
requestData.guardrails = options.guardrails;
|
|
158
|
-
// Stream the response and parse SSE events
|
|
159
|
-
let currentEventType = null;
|
|
160
|
-
let currentEventData = '';
|
|
161
|
-
for await (const line of this.httpClient.postStream('v1/automate', requestData)) {
|
|
162
|
-
// SSE format: "event: <type>" or "data: <json>"
|
|
163
|
-
if (line.startsWith('event:')) {
|
|
164
|
-
// If we have a pending event, yield it before starting a new one
|
|
165
|
-
if (currentEventType) {
|
|
166
|
-
yield this.parseEvent(currentEventType, currentEventData);
|
|
167
|
-
currentEventData = '';
|
|
168
|
-
}
|
|
169
|
-
// Extract event type
|
|
170
|
-
currentEventType = line.slice(6).trim();
|
|
171
|
-
}
|
|
172
|
-
else if (line.startsWith('data:')) {
|
|
173
|
-
// Accumulate event data (can be multiline)
|
|
174
|
-
const dataLine = line.slice(5).trim();
|
|
175
|
-
if (currentEventData) {
|
|
176
|
-
currentEventData += '\n' + dataLine;
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
currentEventData = dataLine;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else if (line === '') {
|
|
183
|
-
// Empty line marks the end of an event
|
|
184
|
-
if (currentEventType) {
|
|
185
|
-
yield this.parseEvent(currentEventType, currentEventData);
|
|
186
|
-
currentEventType = null;
|
|
187
|
-
currentEventData = '';
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
// Yield any remaining event
|
|
192
|
-
if (currentEventType) {
|
|
193
|
-
yield this.parseEvent(currentEventType, currentEventData);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Parse SSE event data
|
|
198
|
-
*/
|
|
199
|
-
parseEvent(eventType, eventData) {
|
|
200
|
-
try {
|
|
201
|
-
const data = JSON.parse(eventData);
|
|
202
|
-
return types_1.AutomateEvent.fromJSON(eventType, data);
|
|
203
|
-
}
|
|
204
|
-
catch {
|
|
205
|
-
// If data is not valid JSON, return it as-is
|
|
206
|
-
return types_1.AutomateEvent.fromJSON(eventType, { raw: eventData });
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
exports.Agent = Agent;
|
|
211
|
-
//# sourceMappingURL=agent.js.map
|
package/dist/cjs/agent.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/agent.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../src/agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/cjs/agent.test.js
DELETED
|
@@ -1,441 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Tests for Agent
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
// @ts-nocheck
|
|
7
|
-
const agent_1 = require("./agent");
|
|
8
|
-
const http_1 = require("./util/http");
|
|
9
|
-
// Mock HTTPClient
|
|
10
|
-
jest.mock('./util/http');
|
|
11
|
-
describe('Agent', () => {
|
|
12
|
-
let agent;
|
|
13
|
-
let mockHttpClient;
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
mockHttpClient = new http_1.HTTPClient({ apiKey: 'test-key' });
|
|
16
|
-
agent = new agent_1.Agent(mockHttpClient);
|
|
17
|
-
});
|
|
18
|
-
afterEach(() => {
|
|
19
|
-
jest.clearAllMocks();
|
|
20
|
-
});
|
|
21
|
-
// Helper to create async generator from array
|
|
22
|
-
async function* streamLines(lines) {
|
|
23
|
-
for (const line of lines) {
|
|
24
|
-
yield line;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
describe('automate', () => {
|
|
28
|
-
it('should execute task with minimal options', async () => {
|
|
29
|
-
const sseLines = [
|
|
30
|
-
'event: start',
|
|
31
|
-
'data: {"message":"Task started"}',
|
|
32
|
-
'',
|
|
33
|
-
'event: task:completed',
|
|
34
|
-
'data: {"finalAnswer":"Result"}',
|
|
35
|
-
'',
|
|
36
|
-
];
|
|
37
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
38
|
-
const events = [];
|
|
39
|
-
for await (const event of agent.automate('Test task')) {
|
|
40
|
-
events.push(event);
|
|
41
|
-
}
|
|
42
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
43
|
-
task: 'Test task',
|
|
44
|
-
maxIterations: 50,
|
|
45
|
-
maxValidationAttempts: 3,
|
|
46
|
-
});
|
|
47
|
-
expect(events).toHaveLength(2);
|
|
48
|
-
expect(events[0].type).toBe('start');
|
|
49
|
-
expect(events[1].type).toBe('task:completed');
|
|
50
|
-
});
|
|
51
|
-
it('should execute task with url option', async () => {
|
|
52
|
-
const sseLines = ['event: start', 'data: {}', ''];
|
|
53
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
54
|
-
const events = [];
|
|
55
|
-
for await (const event of agent.automate('Test task', {
|
|
56
|
-
url: 'https://example.com',
|
|
57
|
-
})) {
|
|
58
|
-
events.push(event);
|
|
59
|
-
}
|
|
60
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
61
|
-
task: 'Test task',
|
|
62
|
-
url: 'https://example.com',
|
|
63
|
-
maxIterations: 50,
|
|
64
|
-
maxValidationAttempts: 3,
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
it('should execute task with data option', async () => {
|
|
68
|
-
const sseLines = ['event: start', 'data: {}', ''];
|
|
69
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
70
|
-
const data = { name: 'John', email: 'john@example.com' };
|
|
71
|
-
const events = [];
|
|
72
|
-
for await (const event of agent.automate('Fill form', { data })) {
|
|
73
|
-
events.push(event);
|
|
74
|
-
}
|
|
75
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
76
|
-
task: 'Fill form',
|
|
77
|
-
data,
|
|
78
|
-
maxIterations: 50,
|
|
79
|
-
maxValidationAttempts: 3,
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
it('should execute task with guardrails option', async () => {
|
|
83
|
-
const sseLines = ['event: start', 'data: {}', ''];
|
|
84
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
85
|
-
const events = [];
|
|
86
|
-
for await (const event of agent.automate('Browse site', {
|
|
87
|
-
guardrails: 'read only, no modifications',
|
|
88
|
-
})) {
|
|
89
|
-
events.push(event);
|
|
90
|
-
}
|
|
91
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
92
|
-
task: 'Browse site',
|
|
93
|
-
guardrails: 'read only, no modifications',
|
|
94
|
-
maxIterations: 50,
|
|
95
|
-
maxValidationAttempts: 3,
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
it('should execute task with custom maxIterations', async () => {
|
|
99
|
-
const sseLines = ['event: start', 'data: {}', ''];
|
|
100
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
101
|
-
const events = [];
|
|
102
|
-
for await (const event of agent.automate('Test task', { maxIterations: 100 })) {
|
|
103
|
-
events.push(event);
|
|
104
|
-
}
|
|
105
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
106
|
-
task: 'Test task',
|
|
107
|
-
maxIterations: 100,
|
|
108
|
-
maxValidationAttempts: 3,
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
it('should execute task with custom maxValidationAttempts', async () => {
|
|
112
|
-
const sseLines = ['event: start', 'data: {}', ''];
|
|
113
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
114
|
-
const events = [];
|
|
115
|
-
for await (const event of agent.automate('Test task', { maxValidationAttempts: 5 })) {
|
|
116
|
-
events.push(event);
|
|
117
|
-
}
|
|
118
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
119
|
-
task: 'Test task',
|
|
120
|
-
maxIterations: 50,
|
|
121
|
-
maxValidationAttempts: 5,
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
it('should execute task with all options', async () => {
|
|
125
|
-
const sseLines = ['event: start', 'data: {}', ''];
|
|
126
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
127
|
-
const events = [];
|
|
128
|
-
for await (const event of agent.automate('Complete task', {
|
|
129
|
-
url: 'https://example.com',
|
|
130
|
-
data: { key: 'value' },
|
|
131
|
-
guardrails: 'safe mode',
|
|
132
|
-
maxIterations: 75,
|
|
133
|
-
maxValidationAttempts: 4,
|
|
134
|
-
})) {
|
|
135
|
-
events.push(event);
|
|
136
|
-
}
|
|
137
|
-
expect(mockHttpClient.postStream).toHaveBeenCalledWith('v1/automate', {
|
|
138
|
-
task: 'Complete task',
|
|
139
|
-
url: 'https://example.com',
|
|
140
|
-
data: { key: 'value' },
|
|
141
|
-
guardrails: 'safe mode',
|
|
142
|
-
maxIterations: 75,
|
|
143
|
-
maxValidationAttempts: 4,
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
describe('SSE parsing', () => {
|
|
148
|
-
it('should parse single event', async () => {
|
|
149
|
-
const sseLines = ['event: start', 'data: {"message":"Started"}', ''];
|
|
150
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
151
|
-
const events = [];
|
|
152
|
-
for await (const event of agent.automate('Task')) {
|
|
153
|
-
events.push(event);
|
|
154
|
-
}
|
|
155
|
-
expect(events).toHaveLength(1);
|
|
156
|
-
expect(events[0].type).toBe('start');
|
|
157
|
-
expect(events[0].data.get('message')).toBe('Started');
|
|
158
|
-
});
|
|
159
|
-
it('should parse multiple events', async () => {
|
|
160
|
-
const sseLines = [
|
|
161
|
-
'event: start',
|
|
162
|
-
'data: {"step":1}',
|
|
163
|
-
'',
|
|
164
|
-
'event: agent:processing',
|
|
165
|
-
'data: {"operation":"analyze"}',
|
|
166
|
-
'',
|
|
167
|
-
'event: task:completed',
|
|
168
|
-
'data: {"finalAnswer":"Done"}',
|
|
169
|
-
'',
|
|
170
|
-
];
|
|
171
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
172
|
-
const events = [];
|
|
173
|
-
for await (const event of agent.automate('Task')) {
|
|
174
|
-
events.push(event);
|
|
175
|
-
}
|
|
176
|
-
expect(events).toHaveLength(3);
|
|
177
|
-
expect(events[0].type).toBe('start');
|
|
178
|
-
expect(events[1].type).toBe('agent:processing');
|
|
179
|
-
expect(events[2].type).toBe('task:completed');
|
|
180
|
-
});
|
|
181
|
-
it('should handle multiline data', async () => {
|
|
182
|
-
const sseLines = [
|
|
183
|
-
'event: agent:extracted',
|
|
184
|
-
'data: {"items":[',
|
|
185
|
-
'data: {"name":"Item1"},',
|
|
186
|
-
'data: {"name":"Item2"}',
|
|
187
|
-
'data: ]}',
|
|
188
|
-
'',
|
|
189
|
-
];
|
|
190
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
191
|
-
const events = [];
|
|
192
|
-
for await (const event of agent.automate('Task')) {
|
|
193
|
-
events.push(event);
|
|
194
|
-
}
|
|
195
|
-
expect(events).toHaveLength(1);
|
|
196
|
-
expect(events[0].type).toBe('agent:extracted');
|
|
197
|
-
// Data should be concatenated with newlines
|
|
198
|
-
const data = events[0].data.getRaw();
|
|
199
|
-
expect(data).toBeDefined();
|
|
200
|
-
});
|
|
201
|
-
it('should handle events without empty line separator', async () => {
|
|
202
|
-
const sseLines = ['event: start', 'data: {"message":"Started"}'];
|
|
203
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
204
|
-
const events = [];
|
|
205
|
-
for await (const event of agent.automate('Task')) {
|
|
206
|
-
events.push(event);
|
|
207
|
-
}
|
|
208
|
-
// Should still yield the last event even without trailing empty line
|
|
209
|
-
expect(events).toHaveLength(1);
|
|
210
|
-
expect(events[0].type).toBe('start');
|
|
211
|
-
});
|
|
212
|
-
it('should handle events with extra whitespace', async () => {
|
|
213
|
-
const sseLines = ['event: start ', 'data: {"message":"Test"} ', ''];
|
|
214
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
215
|
-
const events = [];
|
|
216
|
-
for await (const event of agent.automate('Task')) {
|
|
217
|
-
events.push(event);
|
|
218
|
-
}
|
|
219
|
-
expect(events).toHaveLength(1);
|
|
220
|
-
expect(events[0].type).toBe('start');
|
|
221
|
-
expect(events[0].data.get('message')).toBe('Test');
|
|
222
|
-
});
|
|
223
|
-
it('should skip empty lines between data', async () => {
|
|
224
|
-
const sseLines = ['event: start', '', 'data: {"message":"Test"}', '', ''];
|
|
225
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
226
|
-
const events = [];
|
|
227
|
-
for await (const event of agent.automate('Task')) {
|
|
228
|
-
events.push(event);
|
|
229
|
-
}
|
|
230
|
-
expect(events).toHaveLength(1);
|
|
231
|
-
expect(events[0].type).toBe('start');
|
|
232
|
-
});
|
|
233
|
-
it('should handle different event types', async () => {
|
|
234
|
-
const eventTypes = [
|
|
235
|
-
'start',
|
|
236
|
-
'task:setup',
|
|
237
|
-
'task:started',
|
|
238
|
-
'task:completed',
|
|
239
|
-
'agent:processing',
|
|
240
|
-
'agent:status',
|
|
241
|
-
'agent:step',
|
|
242
|
-
'agent:action',
|
|
243
|
-
'browser:navigated',
|
|
244
|
-
'complete',
|
|
245
|
-
'done',
|
|
246
|
-
'error',
|
|
247
|
-
];
|
|
248
|
-
const sseLines = [];
|
|
249
|
-
eventTypes.forEach((type) => {
|
|
250
|
-
sseLines.push(`event: ${type}`);
|
|
251
|
-
sseLines.push('data: {}');
|
|
252
|
-
sseLines.push('');
|
|
253
|
-
});
|
|
254
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
255
|
-
const events = [];
|
|
256
|
-
for await (const event of agent.automate('Task')) {
|
|
257
|
-
events.push(event);
|
|
258
|
-
}
|
|
259
|
-
expect(events).toHaveLength(eventTypes.length);
|
|
260
|
-
events.forEach((event, index) => {
|
|
261
|
-
expect(event.type).toBe(eventTypes[index]);
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
describe('parseEvent', () => {
|
|
266
|
-
it('should parse valid JSON data', async () => {
|
|
267
|
-
const sseLines = [
|
|
268
|
-
'event: agent:extracted',
|
|
269
|
-
'data: {"extractedData":{"title":"Test","count":42}}',
|
|
270
|
-
'',
|
|
271
|
-
];
|
|
272
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
273
|
-
const events = [];
|
|
274
|
-
for await (const event of agent.automate('Task')) {
|
|
275
|
-
events.push(event);
|
|
276
|
-
}
|
|
277
|
-
expect(events[0].data.get('extractedData')).toEqual({ title: 'Test', count: 42 });
|
|
278
|
-
});
|
|
279
|
-
it('should handle invalid JSON gracefully', async () => {
|
|
280
|
-
const sseLines = ['event: error', 'data: Invalid JSON {{{', ''];
|
|
281
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
282
|
-
const events = [];
|
|
283
|
-
for await (const event of agent.automate('Task')) {
|
|
284
|
-
events.push(event);
|
|
285
|
-
}
|
|
286
|
-
expect(events[0].type).toBe('error');
|
|
287
|
-
expect(events[0].data.get('raw')).toBe('Invalid JSON {{{');
|
|
288
|
-
});
|
|
289
|
-
it('should handle empty data', async () => {
|
|
290
|
-
const sseLines = ['event: start', 'data: ', ''];
|
|
291
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
292
|
-
const events = [];
|
|
293
|
-
for await (const event of agent.automate('Task')) {
|
|
294
|
-
events.push(event);
|
|
295
|
-
}
|
|
296
|
-
expect(events).toHaveLength(1);
|
|
297
|
-
expect(events[0].type).toBe('start');
|
|
298
|
-
});
|
|
299
|
-
it('should handle complex nested JSON', async () => {
|
|
300
|
-
const complexData = {
|
|
301
|
-
result: {
|
|
302
|
-
items: [
|
|
303
|
-
{ id: 1, name: 'Item 1', tags: ['a', 'b'] },
|
|
304
|
-
{ id: 2, name: 'Item 2', tags: ['c', 'd'] },
|
|
305
|
-
],
|
|
306
|
-
metadata: { count: 2, timestamp: 1234567890 },
|
|
307
|
-
},
|
|
308
|
-
};
|
|
309
|
-
const sseLines = ['event: agent:extracted', `data: ${JSON.stringify(complexData)}`, ''];
|
|
310
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
311
|
-
const events = [];
|
|
312
|
-
for await (const event of agent.automate('Task')) {
|
|
313
|
-
events.push(event);
|
|
314
|
-
}
|
|
315
|
-
expect(events[0].data.get('result')).toEqual(complexData.result);
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
describe('Event data access', () => {
|
|
319
|
-
it('should access event data properties', async () => {
|
|
320
|
-
const sseLines = [
|
|
321
|
-
'event: browser:navigated',
|
|
322
|
-
'data: {"url":"https://example.com","title":"Example"}',
|
|
323
|
-
'',
|
|
324
|
-
];
|
|
325
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
326
|
-
const events = [];
|
|
327
|
-
for await (const event of agent.automate('Task')) {
|
|
328
|
-
events.push(event);
|
|
329
|
-
}
|
|
330
|
-
expect(events[0].data.get('url')).toBe('https://example.com');
|
|
331
|
-
expect(events[0].data.get('title')).toBe('Example');
|
|
332
|
-
});
|
|
333
|
-
it('should handle missing properties', async () => {
|
|
334
|
-
const sseLines = ['event: start', 'data: {"message":"Test"}', ''];
|
|
335
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
336
|
-
const events = [];
|
|
337
|
-
for await (const event of agent.automate('Task')) {
|
|
338
|
-
events.push(event);
|
|
339
|
-
}
|
|
340
|
-
expect(events[0].data.get('nonexistent')).toBeUndefined();
|
|
341
|
-
expect(events[0].data.get('nonexistent', 'default')).toBe('default');
|
|
342
|
-
});
|
|
343
|
-
it('should access raw event data', async () => {
|
|
344
|
-
const sseLines = [
|
|
345
|
-
'event: agent:step',
|
|
346
|
-
'data: {"currentIteration":5,"totalIterations":50}',
|
|
347
|
-
'',
|
|
348
|
-
];
|
|
349
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
350
|
-
const events = [];
|
|
351
|
-
for await (const event of agent.automate('Task')) {
|
|
352
|
-
events.push(event);
|
|
353
|
-
}
|
|
354
|
-
const raw = events[0].data.getRaw();
|
|
355
|
-
expect(raw.currentIteration).toBe(5);
|
|
356
|
-
expect(raw.totalIterations).toBe(50);
|
|
357
|
-
});
|
|
358
|
-
});
|
|
359
|
-
describe('Integration scenarios', () => {
|
|
360
|
-
it('should stream complete automation workflow', async () => {
|
|
361
|
-
const sseLines = [
|
|
362
|
-
'event: start',
|
|
363
|
-
'data: {"message":"Starting automation"}',
|
|
364
|
-
'',
|
|
365
|
-
'event: task:setup',
|
|
366
|
-
'data: {"task":"Extract data"}',
|
|
367
|
-
'',
|
|
368
|
-
'event: browser:navigated',
|
|
369
|
-
'data: {"url":"https://example.com"}',
|
|
370
|
-
'',
|
|
371
|
-
'event: agent:processing',
|
|
372
|
-
'data: {"operation":"analyze"}',
|
|
373
|
-
'',
|
|
374
|
-
'event: agent:extracted',
|
|
375
|
-
'data: {"extractedData":{"items":[]}}',
|
|
376
|
-
'',
|
|
377
|
-
'event: task:completed',
|
|
378
|
-
'data: {"finalAnswer":"Success"}',
|
|
379
|
-
'',
|
|
380
|
-
'event: done',
|
|
381
|
-
'data: {}',
|
|
382
|
-
'',
|
|
383
|
-
];
|
|
384
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
385
|
-
const events = [];
|
|
386
|
-
for await (const event of agent.automate('Extract data', {
|
|
387
|
-
url: 'https://example.com',
|
|
388
|
-
})) {
|
|
389
|
-
events.push(event);
|
|
390
|
-
}
|
|
391
|
-
expect(events).toHaveLength(7);
|
|
392
|
-
expect(events[0]?.type).toBe('start');
|
|
393
|
-
expect(events[events.length - 2]?.type).toBe('task:completed');
|
|
394
|
-
expect(events[events.length - 1]?.type).toBe('done');
|
|
395
|
-
});
|
|
396
|
-
it('should handle error events', async () => {
|
|
397
|
-
const sseLines = [
|
|
398
|
-
'event: start',
|
|
399
|
-
'data: {"message":"Started"}',
|
|
400
|
-
'',
|
|
401
|
-
'event: error',
|
|
402
|
-
'data: {"error":"Task failed","reason":"Network error"}',
|
|
403
|
-
'',
|
|
404
|
-
];
|
|
405
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
406
|
-
const events = [];
|
|
407
|
-
for await (const event of agent.automate('Task')) {
|
|
408
|
-
events.push(event);
|
|
409
|
-
}
|
|
410
|
-
expect(events).toHaveLength(2);
|
|
411
|
-
expect(events[1]?.type).toBe('error');
|
|
412
|
-
expect(events[1]?.data.get('error')).toBe('Task failed');
|
|
413
|
-
});
|
|
414
|
-
it('should handle task abortion', async () => {
|
|
415
|
-
const sseLines = [
|
|
416
|
-
'event: start',
|
|
417
|
-
'data: {}',
|
|
418
|
-
'',
|
|
419
|
-
'event: task:aborted',
|
|
420
|
-
'data: {"reason":"Max iterations exceeded"}',
|
|
421
|
-
'',
|
|
422
|
-
];
|
|
423
|
-
mockHttpClient.postStream = jest.fn().mockReturnValue(streamLines(sseLines));
|
|
424
|
-
const events = [];
|
|
425
|
-
for await (const event of agent.automate('Task', { maxIterations: 10 })) {
|
|
426
|
-
events.push(event);
|
|
427
|
-
}
|
|
428
|
-
expect(events).toHaveLength(2);
|
|
429
|
-
expect(events[1]?.type).toBe('task:aborted');
|
|
430
|
-
});
|
|
431
|
-
it('should propagate HTTP client errors', async () => {
|
|
432
|
-
const error = new Error('Stream error');
|
|
433
|
-
mockHttpClient.postStream = jest.fn().mockImplementation(async function* () {
|
|
434
|
-
throw error;
|
|
435
|
-
});
|
|
436
|
-
const generator = agent.automate('Task');
|
|
437
|
-
await expect(generator.next()).rejects.toThrow('Stream error');
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
});
|
|
441
|
-
//# sourceMappingURL=agent.test.js.map
|