From ed1e9a08b2c4494a0f02a07538c3c3ef96f615e0 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Sun, 7 Sep 2025 08:51:47 +0000 Subject: [PATCH] feat(taskbuffer-dashboard): Add TaskBuffer dashboard web component, demo and browser tests; add HTML entry and update dependencies --- LICENSE | 2 +- changelog.md | 10 + html/index.html | 21 + package.json | 9 +- pnpm-lock.yaml | 1288 ++++++++-------- readme.md | 1390 ++++++------------ test/test.10.webcomponent.browser.ts | 141 ++ ts/00_commitinfo_data.ts | 2 +- ts_web/00_commitinfo_data.ts | 2 +- ts_web/elements/taskbuffer-dashboard.demo.ts | 311 ++++ ts_web/index.ts | 12 + ts_web/taskbuffer-dashboard.ts | 541 +++++++ 12 files changed, 2128 insertions(+), 1601 deletions(-) create mode 100644 html/index.html create mode 100644 test/test.10.webcomponent.browser.ts create mode 100644 ts_web/elements/taskbuffer-dashboard.demo.ts create mode 100644 ts_web/index.ts create mode 100644 ts_web/taskbuffer-dashboard.ts diff --git a/LICENSE b/LICENSE index b249dfc..b7a4a71 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 Push.Rocks +Copyright (c) 2016 Task Venture Capital GmbH Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/changelog.md b/changelog.md index db15190..ddab9a6 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,15 @@ # Changelog +## 2025-09-07 - 3.4.0 - feat(taskbuffer-dashboard) +Add TaskBuffer dashboard web component, demo and browser tests; add HTML entry and update dependencies + +- Introduce a new web component taskbuffer-dashboard for real-time visualization of tasks and schedules (ts_web/taskbuffer-dashboard.ts). +- Add a demo wrapper and interactive UI for the dashboard (ts_web/elements/taskbuffer-dashboard.demo.ts). +- Provide web exports and typings for web usage (ts_web/index.ts) and include an HTML entry (html/index.html). +- Add browser-oriented tests to validate metadata structures for the web component (test/test.10.webcomponent.browser.ts). +- Bump package version to 3.3.0 in package.json as part of this change. +- Update/add dependencies and devDependencies (@design.estate/dees-element added; smartlog, @git.zone/tsbuild and @git.zone/tstest bumped). + ## 2025-09-06 - 3.2.0 - feat(core) Add step-based progress tracking, task metadata and enhanced TaskManager scheduling/metadata APIs diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..eb2b429 --- /dev/null +++ b/html/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/package.json b/package.json index be5b25a..d2eab64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@push.rocks/taskbuffer", - "version": "3.2.0", + "version": "3.3.0", "private": false, "description": "A flexible task management library supporting TypeScript, allowing for task buffering, scheduling, and execution with dependency management.", "main": "dist_ts/index.js", @@ -34,19 +34,20 @@ }, "homepage": "https://code.foss.global/push.rocks/taskbuffer#readme", "dependencies": { + "@design.estate/dees-element": "^2.1.2", "@push.rocks/lik": "^6.0.5", "@push.rocks/smartdelay": "^3.0.5", - "@push.rocks/smartlog": "^3.0.3", + "@push.rocks/smartlog": "^3.1.9", "@push.rocks/smartpromise": "^4.0.3", "@push.rocks/smartrx": "^3.0.6", "@push.rocks/smarttime": "^4.0.6", "@push.rocks/smartunique": "^3.0.6" }, "devDependencies": { - "@git.zone/tsbuild": "^2.1.66", + "@git.zone/tsbuild": "^2.6.8", "@git.zone/tsbundle": "^2.0.8", "@git.zone/tsrun": "^1.2.44", - "@git.zone/tstest": "^2.3.5", + "@git.zone/tstest": "^2.3.6", "@types/node": "^20.8.7" }, "files": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca29690..1c8f711 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@design.estate/dees-element': + specifier: ^2.1.2 + version: 2.1.2 '@push.rocks/lik': specifier: ^6.0.5 version: 6.2.2 @@ -15,8 +18,8 @@ importers: specifier: ^3.0.5 version: 3.0.5 '@push.rocks/smartlog': - specifier: ^3.0.3 - version: 3.1.8 + specifier: ^3.1.9 + version: 3.1.9 '@push.rocks/smartpromise': specifier: ^4.0.3 version: 4.2.3 @@ -31,8 +34,8 @@ importers: version: 3.0.9 devDependencies: '@git.zone/tsbuild': - specifier: ^2.1.66 - version: 2.6.7 + specifier: ^2.6.8 + version: 2.6.8 '@git.zone/tsbundle': specifier: ^2.0.8 version: 2.5.1 @@ -40,8 +43,8 @@ importers: specifier: ^1.2.44 version: 1.3.3 '@git.zone/tstest': - specifier: ^2.3.5 - version: 2.3.5(socks@2.8.7)(typescript@5.9.2) + specifier: ^2.3.6 + version: 2.3.6(socks@2.8.7)(typescript@5.9.2) '@types/node': specifier: ^20.8.7 version: 20.19.11 @@ -57,8 +60,8 @@ packages: '@api.global/typedrequest@3.1.10': resolution: {integrity: sha512-EiCp44XVcMjBvEs4oM1nMUaeY4ySU0Pzt3+mDwVG5DNP6EV87Nwancbr2jKScvaFNel9eeDgGtgEnFBKjOnApA==} - '@api.global/typedserver@3.0.77': - resolution: {integrity: sha512-ikFR2dQcH5ErrUCAXxw6YDyfPtMyaB1sALtkA0QBCKVttoidMb8C/quQhCfzfhJxaVFGwBSCvlgQhUDR2N/zUQ==} + '@api.global/typedserver@3.0.79': + resolution: {integrity: sha512-NIZMQOeqEpqPT3qeA0hqTyLgZw5zO3bvRHkiDfFOrWMtnfvOLWZwmqJAcgpSSHHiwzuw47NNPvBZdJGXKnH+Zg==} '@api.global/typedsocket@3.0.1': resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} @@ -86,44 +89,44 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.876.0': - resolution: {integrity: sha512-rrdrB0IlHfRaY+qxo87iSPJJxjCZ2WIV0wKi0EWz02yBpq17c0o6Vzc8f1+ksR+IZGkGttQnD2j4UpItMdLSKg==} + '@aws-sdk/client-s3@3.883.0': + resolution: {integrity: sha512-+l/p5G/bbobzcils5wKSV1vQEITvJIXDkLfkMWLpF6CC3YfdSDlVn1VOD+NcfuOuVGv4UkwcJzWuC6eaX6t8jg==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.876.0': - resolution: {integrity: sha512-Vf0PMF7HVpvllrfPODnBZmlz6kT/y2AvOt1RQG3+qD0VrHWzShc5nwgRZ+yyP3xkKVhZsQ3sJapfZTFnjqMOYA==} + '@aws-sdk/client-sso@3.883.0': + resolution: {integrity: sha512-Ybjw76yPceEBO7+VLjy5+/Gr0A1UNymSDHda5w8tfsS2iHZt/vuD6wrYpHdLoUx4H5la8ZhwcSfK/+kmE+QLPw==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.876.0': - resolution: {integrity: sha512-sVFBFkdoPOPyY13NaXO1E/R9O5J6ixzHnnRbqrbXYM2QQgLNPTKIiRtmVEuVoFV9YULg+/aKm7caix8m468y9w==} + '@aws-sdk/core@3.883.0': + resolution: {integrity: sha512-FmkqnqBLkXi4YsBPbF6vzPa0m4XKUuvgKDbamfw4DZX2CzfBZH6UU4IwmjNV3ZM38m0xraHarK8KIbGSadN3wg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.876.0': - resolution: {integrity: sha512-cof7lwp2AlrAfRs0pt4W2KMS2VMBvEmpcti1UOFfSJIqkn+cyJliMJ8LHg22GI+kUexjvxdAqSbf3M7OHvEW+w==} + '@aws-sdk/credential-provider-env@3.883.0': + resolution: {integrity: sha512-Z6tPBXPCodfhIF1rvQKoeRGMkwL6TK0xdl1UoMIA1x4AfBpPICAF77JkFBExk/pdiFYq1d04Qzddd/IiujSlLg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.876.0': - resolution: {integrity: sha512-wzmef2NBp2+X1l8D4Q8hx1G8oI3+WdvLdPev9VnVpRYZxYGRWVPl++wvCBsCn/ZL0mdWopPkhHA3kFexQhMzvg==} + '@aws-sdk/credential-provider-http@3.883.0': + resolution: {integrity: sha512-P589ug1lMOOEYLTaQJjSP+Gee34za8Kk2LfteNQfO9SpByHFgGj++Sg8VyIe30eZL8Q+i4qTt24WDCz1c+dgYg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.876.0': - resolution: {integrity: sha512-JHbW6fqnJsVjGHCyko7B0NVPT1nEAPxkM3CGjUcVGsHgJBkxOLVCMQqTRyHcDdeHR2qeojlLoOHRz97xIHQjYw==} + '@aws-sdk/credential-provider-ini@3.883.0': + resolution: {integrity: sha512-n6z9HTzuDEdugXvPiE/95VJXbF4/gBffdV/SRHDJKtDHaRuvp/gggbfmfVSTFouGVnlKPb2pQWQsW3Nr/Y3Lrw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.876.0': - resolution: {integrity: sha512-eHbNt1+Hi43e8ANnwf6toapLSxfMiyGq459y3Uh6i7NBOiWWKEsOVcgOfUC3RCoqeikxovt1tFM2cEElWUIOhg==} + '@aws-sdk/credential-provider-node@3.883.0': + resolution: {integrity: sha512-QIUhsatsrwfB9ZsKpmi0EySSfexVP61wgN7hr493DOileh2QsKW4XATEfsWNmx0dj9323Vg1Mix7bXtRfl9cGg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.876.0': - resolution: {integrity: sha512-SMX4OlHvspu3gF4hxe7WAnZFhxpiCye+WlBSVoWfW/i9XNhtrZS1JMr29MK34GlCTk9qO7FlRwds/Z5k7xPpHg==} + '@aws-sdk/credential-provider-process@3.883.0': + resolution: {integrity: sha512-m1shbHY/Vppy4EdddG9r8x64TO/9FsCjokp5HbKcZvVoTOTgUJrdT8q2TAQJ89+zYIJDqsKbqfrmfwJ1zOdnGQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.876.0': - resolution: {integrity: sha512-iP5dz9XqwePbgnh7Bdrq5e1319JpCRKLyomUfHH1XVeXkIHmwIJdmTj1Upeo1J8L/5cLHmhXAN6CTN11bLo8SA==} + '@aws-sdk/credential-provider-sso@3.883.0': + resolution: {integrity: sha512-37ve9Tult08HLXrJFHJM/sGB/vO7wzI6v1RUUfeTiShqx8ZQ5fTzCTNY/duO96jCtCexmFNSycpQzh7lDIf0aA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.876.0': - resolution: {integrity: sha512-q/XSCP1uae5aB9veM8zcm6Gqu6A4ckX9ZbhHgCzURXVJDwp+nINW1hM9vppMjGw3ND9Ibx/adR+KfTI0TDMzqw==} + '@aws-sdk/credential-provider-web-identity@3.883.0': + resolution: {integrity: sha512-SL82K9Jb0vpuTadqTO4Fpdu7SKtebZ3Yo4LZvk/U0UauVMlJj5ZTos0mFx1QSMB9/4TpqifYrSZcdnxgYg8Eqw==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.873.0': @@ -134,8 +137,8 @@ packages: resolution: {integrity: sha512-GIqoc8WgRcf/opBOZXFLmplJQKwOMjiOMmDz9gQkaJ8FiVJoAp8EGVmK2TOWZMQUYsavvHYsHaor5R2xwPoGVg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.876.0': - resolution: {integrity: sha512-Xfb9/XP0WcQq/yJxUubfzMUF0AYSX10UUIRbCJog0/lnDNocEiGEIaarwuQzoxb9QW9TQ1l5dDc/5bOMa1YVGw==} + '@aws-sdk/middleware-flexible-checksums@3.883.0': + resolution: {integrity: sha512-EloU4ZjkH+CXCHJcYElXo5nZ1vK6Miam/S02YSHk5JTrJkm4RV478KXXO29TIIAwZXcLT/FEQOZ9ZH/JHFFCFQ==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.873.0': @@ -154,32 +157,32 @@ packages: resolution: {integrity: sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.876.0': - resolution: {integrity: sha512-h+TDs9EKAfXnrkogQpQz3o11zvs6Vh9+ehxyd35OcM7evnDeoV4GFjjnAKq+MxbBk/5Ewnvng+d6/WQDvMbj7Q==} + '@aws-sdk/middleware-sdk-s3@3.883.0': + resolution: {integrity: sha512-i4sGOj9xhSN6/LkYj3AJ2SRWENnpN9JySwNqIoRqO1Uon8gfyNLJd1yV+s43vXQsU5wbKWVXK8l9SRo+vNTQwg==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.873.0': resolution: {integrity: sha512-AF55J94BoiuzN7g3hahy0dXTVZahVi8XxRBLgzNp6yQf0KTng+hb/V9UQZVYY1GZaDczvvvnqC54RGe9OZZ9zQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.876.0': - resolution: {integrity: sha512-FR+8INfnbNv32QDQ5szxkWX6mB/QgezfNyx8LnAh1ErISZMmEFBxXXir+ZOfuV8vsmal1a6cy9qmnMNDaNnaNQ==} + '@aws-sdk/middleware-user-agent@3.883.0': + resolution: {integrity: sha512-q58uLYnGLg7hsnWpdj7Cd1Ulsq1/PUJOHvAfgcBuiDE/+Fwh0DZxZZyjrU+Cr+dbeowIdUaOO8BEDDJ0CUenJw==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.876.0': - resolution: {integrity: sha512-R4TZrkM2gUElTsotk8mt3y7iLG8TNi1LL1wgVdEEWSLOYTaFyglGdoNBMtEeP7lmXilaTy00AbYF6BakJvSTHg==} + '@aws-sdk/nested-clients@3.883.0': + resolution: {integrity: sha512-IhzDM+v0ga53GOOrZ9jmGNr7JU5OR6h6ZK9NgB7GXaa+gsDbqfUuXRwyKDYXldrTXf1sUR3vy1okWDXA7S2ejQ==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.873.0': resolution: {integrity: sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.876.0': - resolution: {integrity: sha512-OMDcuaVlC2rbze92w4QcNfuEA0IeT2GsT1ByZCwe+Y9tZwxzj7fCiOOU0UmJfa+juuQ/YBzVYxnkrkz3Rg6DEw==} + '@aws-sdk/signature-v4-multi-region@3.883.0': + resolution: {integrity: sha512-86PO7+xhuQ48cD3xlZgEpRxVP1lBarWAJy23sB6zZLHgZSbnYXYjRFuyxX4PlFzqllM3PDKJvq3WnXeqSXeNsg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.876.0': - resolution: {integrity: sha512-iU08kaQbhXnY0CC2TBcr7y/2PqPwZP2CTWX/Rbq0NvhOyteikfh7ASC+bRfLUp0XMSHKvSb+w2dh8a0lvx4oHg==} + '@aws-sdk/token-providers@3.883.0': + resolution: {integrity: sha512-tcj/Z5paGn9esxhmmkEW7gt39uNoIRbXG1UwJrfKu4zcTr89h86PDiIE2nxUO3CMQf1KgncPpr5WouPGzkh/QQ==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.862.0': @@ -190,8 +193,8 @@ packages: resolution: {integrity: sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.873.0': - resolution: {integrity: sha512-YByHrhjxYdjKRf/RQygRK1uh0As1FIi9+jXTcIEX/rBgN8mUByczr2u4QXBzw7ZdbdcOBMOkPnLRjNOWW1MkFg==} + '@aws-sdk/util-endpoints@3.879.0': + resolution: {integrity: sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.873.0': @@ -201,8 +204,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.873.0': resolution: {integrity: sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==} - '@aws-sdk/util-user-agent-node@3.876.0': - resolution: {integrity: sha512-/ZIaeUt60JBdI0mNc7sZ8v3Tuzp8Pbe4gIAYnppGyF4KV8QA+Yu8tp2bGHfkKn150t1uvQ6P/4CwFfoGF34dzg==} + '@aws-sdk/util-user-agent-node@3.883.0': + resolution: {integrity: sha512-28cQZqC+wsKUHGpTBr+afoIdjS6IoEJkMqcZsmo2Ag8LzmTa6BUWQenFYB0/9BmDy4PZFPUn+uX+rJgWKB+jzA==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -229,8 +232,8 @@ packages: '@borewit/text-codec@0.1.1': resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@cloudflare/workers-types@4.20250826.0': - resolution: {integrity: sha512-nAbTVI81wFSxbESRbfGRlfL4WYNvq8T46yr1ukypHL8O2xnbZfQnQhC7ftSBmDqov8HqQSdqcz9jCgLjVh61SQ==} + '@cloudflare/workers-types@4.20250906.0': + resolution: {integrity: sha512-CMRTupQpAdNZJrxRGaM2JzxmpWOnzgxcyTGmjAOcosRfi1ZsNUTAZ0kj1dzY+4bPDIdFwvvJL3t91DEpqitOJg==} '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} @@ -416,8 +419,8 @@ packages: cpu: [x64] os: [win32] - '@git.zone/tsbuild@2.6.7': - resolution: {integrity: sha512-nLRYk1V4gxdEAp5mbLYNdr/in9mFA26L4MPKBKqzASID4lXSYya5sDbLRdDTv+mD0ZRBgdn6e+WMylA0SU4hSw==} + '@git.zone/tsbuild@2.6.8': + resolution: {integrity: sha512-g1z7+MxiYD0xMfuqn8NSWitbfK1OaF0Qolmw7WOmUsHmNF60T1AR02Lo4DtNmnjSpchA+xzDFAQzL1xTcQA39w==} hasBin: true '@git.zone/tsbundle@2.5.1': @@ -432,8 +435,8 @@ packages: resolution: {integrity: sha512-DDzWunkxXLtXJTxBf4EioXLwhuqdA2VzdTmOzWrw4Z4Qnms/YM67q36yajwNohAajPYyRz5DayU0ikrceFXyVw==} hasBin: true - '@git.zone/tstest@2.3.5': - resolution: {integrity: sha512-XDzUqE2M9wmq3sUEDi/+SEg1h8N53I4ejyo9MtK5XCs8LgKtr8aQ/0/3E07uvJY6pwAvtW9iBm1LVTFjpKuAAg==} + '@git.zone/tstest@2.3.6': + resolution: {integrity: sha512-2dcVM1WvQj9FoLPRWbLgBCWnDK0auI2c2vJxUzrLe0bi/ci50yrXxyKb2FIToQ+kOVe234Yb6jhNyp/d/zyHMQ==} hasBin: true '@happy-dom/global-registrator@15.11.7': @@ -533,8 +536,8 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@puppeteer/browsers@2.10.7': - resolution: {integrity: sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==} + '@puppeteer/browsers@2.10.8': + resolution: {integrity: sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==} engines: {node: '>=18'} hasBin: true @@ -550,8 +553,8 @@ packages: '@push.rocks/isounique@1.0.5': resolution: {integrity: sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==} - '@push.rocks/levelcache@3.1.1': - resolution: {integrity: sha512-+JpDNEt+EuvmbtADGH9SkODxBy+slHDDzs43mAbuMbwpVvi6uNuMK0Mkhrfz9UFpxUSp+cJE/jl/OxdpD0xL1A==} + '@push.rocks/levelcache@3.2.0': + resolution: {integrity: sha512-Ch0Oguta2I0SVi704kHghhBcgfyfS92ua1elRu9d8X1/9LMRYuqvvBAnyXyFxQzI3S8q8QC6EkRdd8CAAYSzRg==} '@push.rocks/lik@6.2.2': resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} @@ -574,8 +577,8 @@ packages: '@push.rocks/smartbuffer@3.0.5': resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} - '@push.rocks/smartcache@1.0.17': - resolution: {integrity: sha512-SkHoWfEWatatmXPacHB4blhVz08csT9AAgyf8A7oiQa+xuqWplC+GGdeYPuvW/QIZhIXXclkEyzRUuKoevaKdQ==} + '@push.rocks/smartcache@1.0.18': + resolution: {integrity: sha512-3+cmLu9chbnmi4yD4kjlFP/Tn4NReaZIoicEcGTtwbcokTrSDMs3YPdJzIpDZkAs83PW7OcVSHa3Ak5KU5OWzA==} '@push.rocks/smartchok@1.1.1': resolution: {integrity: sha512-WmNigGmn1muBJMANVuJb4F8x3TzgYrnn6YZm6ixTsG+0WFbYevivEwp+J4S7npobLHsR7ynf+Ky8LxRYmsL50A==} @@ -634,8 +637,8 @@ packages: '@push.rocks/smartlog-interfaces@3.0.2': resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} - '@push.rocks/smartlog@3.1.8': - resolution: {integrity: sha512-j4H5x4/hEmiIO7q+/LKyX3N+AhRIOj1jDE4TvZDvujZkbT/9wEWfpO1bqeMe/EQbg1eOQMlAuyrcLXUcDICpQg==} + '@push.rocks/smartlog@3.1.9': + resolution: {integrity: sha512-Lix1pazMhvnSUyj4Bt+pO+SvImw3l0dm5A0LTTx/QaSlWP8bpAQNQ+8z7wfQy3pIKFHkApxvGM6WprgCCS2itQ==} '@push.rocks/smartmanifest@2.0.2': resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} @@ -739,8 +742,8 @@ packages: '@push.rocks/smartyaml@2.0.5': resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} - '@push.rocks/taskbuffer@3.1.7': - resolution: {integrity: sha512-QktGVJPucqQmW/QNGnscf4FAigT1H7JWKFGFdRuDEaOHKFh9qN+PXG3QY7DtZ4jfXdGLxPN4yAufDuPSAJYFnw==} + '@push.rocks/taskbuffer@3.2.0': + resolution: {integrity: sha512-O+zp9XIWKYswkASLzUPeRP8+APQEjfpIMDXCkr3DSiTcd3KRpeWRZw1FKh2F3T8lqrGKedbEtrf87HFB4/CQfQ==} '@push.rocks/webrequest@3.0.37': resolution: {integrity: sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==} @@ -931,216 +934,216 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@smithy/abort-controller@4.0.5': - resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} + '@smithy/abort-controller@4.1.0': + resolution: {integrity: sha512-wEhSYznxOmx7EdwK1tYEWJF5+/wmSFsff9BfTOn8oO/+KPl3gsmThrb6MJlWbOC391+Ya31s5JuHiC2RlT80Zg==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.0.0': - resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + '@smithy/chunked-blob-reader-native@4.1.0': + resolution: {integrity: sha512-Bnv0B3nSlfB2mPO0WgM49I/prl7+kamF042rrf3ezJ3Z4C7csPYvyYgZfXTGXwXfj1mAwDWjE/ybIf49PzFzvA==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.0.0': - resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + '@smithy/chunked-blob-reader@5.1.0': + resolution: {integrity: sha512-a36AtR7Q7XOhRPt6F/7HENmTWcB8kN7mDJcOFM/+FuKO6x88w8MQJfYCufMWh4fGyVkPjUh3Rrz/dnqFQdo6OQ==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.5': - resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==} + '@smithy/config-resolver@4.2.0': + resolution: {integrity: sha512-FA10YhPFLy23uxeWu7pOM2ctlw+gzbPMTZQwrZ8FRIfyJ/p8YIVz7AVTB5jjLD+QIerydyKcVMZur8qzzDILAQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.8.0': - resolution: {integrity: sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==} + '@smithy/core@3.10.0': + resolution: {integrity: sha512-bXyD3Ij6b1qDymEYlEcF+QIjwb9gObwZNaRjETJsUEvSIzxFdynSQ3E4ysY7lUFSBzeWBNaFvX+5A0smbC2q6A==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.7': - resolution: {integrity: sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==} + '@smithy/credential-provider-imds@4.1.0': + resolution: {integrity: sha512-iVwNhxTsCQTPdp++4C/d9xvaDmuEWhXi55qJobMp9QMaEHRGH3kErU4F8gohtdsawRqnUy/ANylCjKuhcR2mPw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.5': - resolution: {integrity: sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==} + '@smithy/eventstream-codec@4.1.0': + resolution: {integrity: sha512-MSOb6pwG3Tss1UwlZMHC+rYergWCo4fwep3Y1fJxwdLLxReSaKFfXxPQhEHi/8LSNQFEcBYBxybgjXjw4jJWqQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.5': - resolution: {integrity: sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==} + '@smithy/eventstream-serde-browser@4.1.0': + resolution: {integrity: sha512-VvHXoBoLos2OCdMtUvKWK7ckcvun6ZP4KBYhf38+kszk6BEuK9k8c3xbIMIpC6K4vTK72qHlHAdBoR9qU+F7xw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.1.3': - resolution: {integrity: sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==} + '@smithy/eventstream-serde-config-resolver@4.2.0': + resolution: {integrity: sha512-T7YlcU0cP2bjAC4eXo9E6puqrrmqv5VHBL8bPMOMgEE1p4m+bwkDWRQpeiXqn/idoKM1qwXq8PvRLYmpbYB6uw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.0.5': - resolution: {integrity: sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==} + '@smithy/eventstream-serde-node@4.1.0': + resolution: {integrity: sha512-WlIKVRkcPjwuN3x+e8+5KOI9nL6s93bxgWH+39VwwQMl+4FagKPtTM3VCumSoZJ9qn/CNl4W5mVdFFRkDF84lQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.5': - resolution: {integrity: sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==} + '@smithy/eventstream-serde-universal@4.1.0': + resolution: {integrity: sha512-GjMezHHd0xrjJcWLAcnXlVePe7PY8KsdxzKeXcMn7V3vfIScGUpKQJrlSmEXwzFH9Mjl0G0EdOS5GzewZEwtxg==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.1.1': - resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==} + '@smithy/fetch-http-handler@5.2.0': + resolution: {integrity: sha512-VZenjDdVaUGiy3hwQtxm75nhXZrhFG+3xyL93qCQAlYDyhT/jeDWM8/3r5uCFMlTmmyrIjiDyiOynVFchb0BSg==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.0.5': - resolution: {integrity: sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==} + '@smithy/hash-blob-browser@4.1.0': + resolution: {integrity: sha512-brRgh2qEYPHYImfqoQB/xfcT/CjSz9Z/dH2vURSS0lIw3bImFK5t15l4iypwRw4GtZlZTK/VsLqsR54OJWRerg==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.5': - resolution: {integrity: sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==} + '@smithy/hash-node@4.1.0': + resolution: {integrity: sha512-mXkJQ/6lAXTuoSsEH+d/fHa4ms4qV5LqYoPLYhmhCRTNcMMdg+4Ya8cMgU1W8+OR40eX0kzsExT7fAILqtTl2w==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.5': - resolution: {integrity: sha512-IJuDS3+VfWB67UC0GU0uYBG/TA30w+PlOaSo0GPm9UHS88A6rCP6uZxNjNYiyRtOcjv7TXn/60cW8ox1yuZsLg==} + '@smithy/hash-stream-node@4.1.0': + resolution: {integrity: sha512-9TToqq62msanK/L6pV1ZAOm2+1VgCz9gE6/TVJhZXV352DnAItaO9jx6FFGujUDXrRJV0lpwe4c0vymz/vXMUQ==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.0.5': - resolution: {integrity: sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==} + '@smithy/invalid-dependency@4.1.0': + resolution: {integrity: sha512-4/FcV6aCMzgpM4YyA/GRzTtG28G0RQJcWK722MmpIgzOyfSceWcI9T9c8matpHU9qYYLaWtk8pSGNCLn5kzDRw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + '@smithy/is-array-buffer@4.1.0': + resolution: {integrity: sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.0.5': - resolution: {integrity: sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==} + '@smithy/md5-js@4.1.0': + resolution: {integrity: sha512-RW1+/E3rv80254ekFqiUTM8ExtN0dG9dkUwU2x17rxS4Mn2ib3SrTCdayCiNbfj6xWHupzgOJB6iNoXiOzNe6g==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.5': - resolution: {integrity: sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==} + '@smithy/middleware-content-length@4.1.0': + resolution: {integrity: sha512-x3dgLFubk/ClKVniJu+ELeZGk4mq7Iv0HgCRUlxNUIcerHTLVmq7Q5eGJL0tOnUltY6KFw5YOKaYxwdcMwox/w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.18': - resolution: {integrity: sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==} + '@smithy/middleware-endpoint@4.2.0': + resolution: {integrity: sha512-J1eCF7pPDwgv7fGwRd2+Y+H9hlIolF3OZ2PjptonzzyOXXGh/1KGJAHpEcY1EX+WLlclKu2yC5k+9jWXdUG4YQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.19': - resolution: {integrity: sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==} + '@smithy/middleware-retry@4.2.0': + resolution: {integrity: sha512-raL5oWYf5ALl3jCJrajE8enKJEnV/2wZkKS6mb3ZRY2tg3nj66ssdWy5Ps8E6Yu8Wqh3Tt+Sb9LozjvwZupq+A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.9': - resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==} + '@smithy/middleware-serde@4.1.0': + resolution: {integrity: sha512-CtLFYlHt7c2VcztyVRc+25JLV4aGpmaSv9F1sPB0AGFL6S+RPythkqpGDa2XBQLJQooKkjLA1g7Xe4450knShg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.5': - resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==} + '@smithy/middleware-stack@4.1.0': + resolution: {integrity: sha512-91Fuw4IKp0eK8PNhMXrHRcYA1jvbZ9BJGT91wwPy3bTQT8mHTcQNius/EhSQTlT9QUI3Ki1wjHeNXbWK0tO8YQ==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.4': - resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==} + '@smithy/node-config-provider@4.2.0': + resolution: {integrity: sha512-8/fpilqKurQ+f8nFvoFkJ0lrymoMJ+5/CQV5IcTv/MyKhk2Q/EFYCAgTSWHD4nMi9ux9NyBBynkyE9SLg2uSLA==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.1.1': - resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==} + '@smithy/node-http-handler@4.2.0': + resolution: {integrity: sha512-G4NV70B4hF9vBrUkkvNfWO6+QR4jYjeO4tc+4XrKCb4nPYj49V9Hu8Ftio7Mb0/0IlFyEOORudHrm+isY29nCA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.5': - resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==} + '@smithy/property-provider@4.1.0': + resolution: {integrity: sha512-eksMjMHUlG5PwOUWO3k+rfLNOPVPJ70mUzyYNKb5lvyIuAwS4zpWGsxGiuT74DFWonW0xRNy+jgzGauUzX7SyA==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.3': - resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==} + '@smithy/protocol-http@5.2.0': + resolution: {integrity: sha512-bwjlh5JwdOQnA01be+5UvHK4HQz4iaRKlVG46hHSJuqi0Ribt3K06Z1oQ29i35Np4G9MCDgkOGcHVyLMreMcbg==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.5': - resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==} + '@smithy/querystring-builder@4.1.0': + resolution: {integrity: sha512-JqTWmVIq4AF8R8OK/2cCCiQo5ZJ0SRPsDkDgLO5/3z8xxuUp1oMIBBjfuueEe+11hGTZ6rRebzYikpKc6yQV9Q==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.5': - resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==} + '@smithy/querystring-parser@4.1.0': + resolution: {integrity: sha512-VgdHhr8YTRsjOl4hnKFm7xEMOCRTnKw3FJ1nU+dlWNhdt/7eEtxtkdrJdx7PlRTabdANTmvyjE4umUl9cK4awg==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.7': - resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==} + '@smithy/service-error-classification@4.1.0': + resolution: {integrity: sha512-UBpNFzBNmS20jJomuYn++Y+soF8rOK9AvIGjS9yGP6uRXF5rP18h4FDUsoNpWTlSsmiJ87e2DpZo9ywzSMH7PQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.5': - resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==} + '@smithy/shared-ini-file-loader@4.1.0': + resolution: {integrity: sha512-W0VMlz9yGdQ/0ZAgWICFjFHTVU0YSfGoCVpKaExRM/FDkTeP/yz8OKvjtGjs6oFokCRm0srgj/g4Cg0xuHu8Rw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.1.3': - resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==} + '@smithy/signature-v4@5.2.0': + resolution: {integrity: sha512-ObX1ZqG2DdZQlXx9mLD7yAR8AGb7yXurGm+iWx9x4l1fBZ8CZN2BRT09aSbcXVPZXWGdn5VtMuupjxhOTI2EjA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.10': - resolution: {integrity: sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==} + '@smithy/smithy-client@4.6.0': + resolution: {integrity: sha512-TvlIshqx5PIi0I0AiR+PluCpJ8olVG++xbYkAIGCUkByaMUlfOXLgjQTmYbr46k4wuDe8eHiTIlUflnjK2drPQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.3.2': - resolution: {integrity: sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==} + '@smithy/types@4.4.0': + resolution: {integrity: sha512-4jY91NgZz+ZnSFcVzWwngOW6VuK3gR/ihTwSU1R/0NENe9Jd8SfWgbhDCAGUWL3bI7DiDSW7XF6Ui6bBBjrqXw==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.5': - resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==} + '@smithy/url-parser@4.1.0': + resolution: {integrity: sha512-/LYEIOuO5B2u++tKr1NxNxhZTrr3A63jW8N73YTwVeUyAlbB/YM+hkftsvtKAcMt3ADYo0FsF1GY3anehffSVQ==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + '@smithy/util-base64@4.1.0': + resolution: {integrity: sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + '@smithy/util-body-length-browser@4.1.0': + resolution: {integrity: sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.0.0': - resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + '@smithy/util-body-length-node@4.1.0': + resolution: {integrity: sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + '@smithy/util-buffer-from@4.1.0': + resolution: {integrity: sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.0.0': - resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + '@smithy/util-config-provider@4.1.0': + resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.26': - resolution: {integrity: sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==} + '@smithy/util-defaults-mode-browser@4.1.0': + resolution: {integrity: sha512-D27cLtJtC4EEeERJXS+JPoogz2tE5zeE3zhWSSu6ER5/wJ5gihUxIzoarDX6K1U27IFTHit5YfHqU4Y9RSGE0w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.26': - resolution: {integrity: sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==} + '@smithy/util-defaults-mode-node@4.1.0': + resolution: {integrity: sha512-gnZo3u5dP1o87plKupg39alsbeIY1oFFnCyV2nI/++pL19vTtBLgOyftLEjPjuXmoKn2B2rskX8b7wtC/+3Okg==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.7': - resolution: {integrity: sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==} + '@smithy/util-endpoints@3.1.0': + resolution: {integrity: sha512-5LFg48KkunBVGrNs3dnQgLlMXJLVo7k9sdZV5su3rjO3c3DmQ2LwUZI0Zr49p89JWK6sB7KmzyI2fVcDsZkwuw==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + '@smithy/util-hex-encoding@4.1.0': + resolution: {integrity: sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.5': - resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==} + '@smithy/util-middleware@4.1.0': + resolution: {integrity: sha512-612onNcKyxhP7/YOTKFTb2F6sPYtMRddlT5mZvYf1zduzaGzkYhpYIPxIeeEwBZFjnvEqe53Ijl2cYEfJ9d6/Q==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.7': - resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==} + '@smithy/util-retry@4.1.0': + resolution: {integrity: sha512-5AGoBHb207xAKSVwaUnaER+L55WFY8o2RhlafELZR3mB0J91fpL+Qn+zgRkPzns3kccGaF2vy0HmNVBMWmN6dA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.4': - resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==} + '@smithy/util-stream@4.3.0': + resolution: {integrity: sha512-ZOYS94jksDwvsCJtppHprUhsIscRnCKGr6FXCo3SxgQ31ECbza3wqDBqSy6IsAak+h/oAXb1+UYEBmDdseAjUQ==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + '@smithy/util-uri-escape@4.1.0': + resolution: {integrity: sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + '@smithy/util-utf8@4.1.0': + resolution: {integrity: sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.7': - resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==} + '@smithy/util-waiter@4.1.0': + resolution: {integrity: sha512-IUuj2zpGdeKaY5OdGnU83BUJsv7OA9uw3rNVSOuvzLMXMpBTU+W6V0SsQh6iI32lKUJArlnEU4BIzp83hghR/g==} engines: {node: '>=18.0.0'} '@socket.io/component-emitter@3.1.2': @@ -1265,8 +1268,8 @@ packages: '@types/s3rver@3.7.4': resolution: {integrity: sha512-CMCmdNszxS2FsIznWvBMVCl6fpvr5ueaFCaY0iSoH7Ud5maGcLghukpDvsXBnIcp92cv2HeVnVqI1p8yPcab9Q==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} @@ -1394,8 +1397,8 @@ packages: bare-events@2.6.1: resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} - bare-fs@4.2.1: - resolution: {integrity: sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==} + bare-fs@4.2.3: + resolution: {integrity: sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -1735,8 +1738,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - devtools-protocol@0.0.1475386: - resolution: {integrity: sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==} + devtools-protocol@0.0.1495869: + resolution: {integrity: sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==} dicer@0.3.0: resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} @@ -1890,8 +1893,8 @@ packages: resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} engines: {node: '>=18'} - fake-indexeddb@6.1.0: - resolution: {integrity: sha512-gOzajWIhEug/CQHUIxigKT9Zilh5/I6WvUBez6/UdUtT/YVEHM9r572Os8wfvhp7TkmgBtRNdqSM7YoCXWMzZg==} + fake-indexeddb@6.2.2: + resolution: {integrity: sha512-SGbf7fzjeHz3+12NO1dYigcYn4ivviaeULV5yY5rdGihBvvgwMds4r4UBbNIUMwkze57KTDm32rq3j1Az8mzEw==} engines: {node: '>=18'} fast-deep-equal@3.1.3: @@ -2160,6 +2163,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2652,8 +2659,8 @@ packages: resolution: {integrity: sha512-FG4OVoXjBHC7f8Mdyj1TZ6JyTtMex+qniEzoY1Rsuo/FvHSOHYzGYVbuElamjHuam+HLxWTWEpc43fqke8WNGw==} engines: {node: '>=16.20.1'} - mongodb@6.18.0: - resolution: {integrity: sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==} + mongodb@6.19.0: + resolution: {integrity: sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -2661,7 +2668,7 @@ packages: gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' - snappy: ^7.2.2 + snappy: ^7.3.2 socks: ^2.7.1 peerDependenciesMeta: '@aws-sdk/credential-providers': @@ -2845,6 +2852,9 @@ packages: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + pdf-lib@1.17.1: resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} @@ -2915,12 +2925,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.17.0: - resolution: {integrity: sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==} + puppeteer-core@24.19.0: + resolution: {integrity: sha512-qsEys4OIb2VGC2tNWKAs4U0mnjkIAxueMOOzk2nEFM9g4Y8QuvYkEMtmwsEdvzNGsUFd7DprOQfABmlN7WBOlg==} engines: {node: '>=18'} - puppeteer@24.17.0: - resolution: {integrity: sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==} + puppeteer@24.19.0: + resolution: {integrity: sha512-gUWgHX36m9K6yUbvNBEA7CXElIL92yXMoAVFrO8OpZkItqrruLVqYA8ikmfgwcw/cNfYgkt0n2+yP9jd9RSETA==} engines: {node: '>=18'} hasBin: true @@ -2940,9 +2950,9 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -3541,12 +3551,12 @@ snapshots: '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstream': 1.0.10 - '@api.global/typedserver@3.0.77': + '@api.global/typedserver@3.0.79': dependencies: '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedsocket': 3.0.1 - '@cloudflare/workers-types': 4.20250826.0 + '@cloudflare/workers-types': 4.20250906.0 '@design.estate/dees-comms': 1.0.27 '@push.rocks/lik': 6.2.2 '@push.rocks/smartchok': 1.1.1 @@ -3555,7 +3565,7 @@ snapshots: '@push.rocks/smartfeed': 1.0.11 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartlog-destination-devtools': 1.0.12 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartmanifest': 2.0.2 @@ -3570,7 +3580,7 @@ snapshots: '@push.rocks/smartsitemap': 2.0.3 '@push.rocks/smartstream': 3.2.5 '@push.rocks/smarttime': 4.1.1 - '@push.rocks/taskbuffer': 3.1.7 + '@push.rocks/taskbuffer': 3.2.0 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstore': 2.0.20 '@tsclass/tsclass': 9.2.0 @@ -3653,215 +3663,215 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.876.0': + '@aws-sdk/client-s3@3.883.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.876.0 - '@aws-sdk/credential-provider-node': 3.876.0 + '@aws-sdk/core': 3.883.0 + '@aws-sdk/credential-provider-node': 3.883.0 '@aws-sdk/middleware-bucket-endpoint': 3.873.0 '@aws-sdk/middleware-expect-continue': 3.873.0 - '@aws-sdk/middleware-flexible-checksums': 3.876.0 + '@aws-sdk/middleware-flexible-checksums': 3.883.0 '@aws-sdk/middleware-host-header': 3.873.0 '@aws-sdk/middleware-location-constraint': 3.873.0 '@aws-sdk/middleware-logger': 3.876.0 '@aws-sdk/middleware-recursion-detection': 3.873.0 - '@aws-sdk/middleware-sdk-s3': 3.876.0 + '@aws-sdk/middleware-sdk-s3': 3.883.0 '@aws-sdk/middleware-ssec': 3.873.0 - '@aws-sdk/middleware-user-agent': 3.876.0 + '@aws-sdk/middleware-user-agent': 3.883.0 '@aws-sdk/region-config-resolver': 3.873.0 - '@aws-sdk/signature-v4-multi-region': 3.876.0 + '@aws-sdk/signature-v4-multi-region': 3.883.0 '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.873.0 + '@aws-sdk/util-endpoints': 3.879.0 '@aws-sdk/util-user-agent-browser': 3.873.0 - '@aws-sdk/util-user-agent-node': 3.876.0 + '@aws-sdk/util-user-agent-node': 3.883.0 '@aws-sdk/xml-builder': 3.873.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/eventstream-serde-browser': 4.0.5 - '@smithy/eventstream-serde-config-resolver': 4.1.3 - '@smithy/eventstream-serde-node': 4.0.5 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-blob-browser': 4.0.5 - '@smithy/hash-node': 4.0.5 - '@smithy/hash-stream-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/md5-js': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.7 + '@smithy/config-resolver': 4.2.0 + '@smithy/core': 3.10.0 + '@smithy/eventstream-serde-browser': 4.1.0 + '@smithy/eventstream-serde-config-resolver': 4.2.0 + '@smithy/eventstream-serde-node': 4.1.0 + '@smithy/fetch-http-handler': 5.2.0 + '@smithy/hash-blob-browser': 4.1.0 + '@smithy/hash-node': 4.1.0 + '@smithy/hash-stream-node': 4.1.0 + '@smithy/invalid-dependency': 4.1.0 + '@smithy/md5-js': 4.1.0 + '@smithy/middleware-content-length': 4.1.0 + '@smithy/middleware-endpoint': 4.2.0 + '@smithy/middleware-retry': 4.2.0 + '@smithy/middleware-serde': 4.1.0 + '@smithy/middleware-stack': 4.1.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/node-http-handler': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/url-parser': 4.1.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-body-length-node': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.0 + '@smithy/util-defaults-mode-node': 4.1.0 + '@smithy/util-endpoints': 3.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-retry': 4.1.0 + '@smithy/util-stream': 4.3.0 + '@smithy/util-utf8': 4.1.0 + '@smithy/util-waiter': 4.1.0 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.876.0': + '@aws-sdk/client-sso@3.883.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/middleware-host-header': 3.873.0 '@aws-sdk/middleware-logger': 3.876.0 '@aws-sdk/middleware-recursion-detection': 3.873.0 - '@aws-sdk/middleware-user-agent': 3.876.0 + '@aws-sdk/middleware-user-agent': 3.883.0 '@aws-sdk/region-config-resolver': 3.873.0 '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.873.0 + '@aws-sdk/util-endpoints': 3.879.0 '@aws-sdk/util-user-agent-browser': 3.873.0 - '@aws-sdk/util-user-agent-node': 3.876.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/util-user-agent-node': 3.883.0 + '@smithy/config-resolver': 4.2.0 + '@smithy/core': 3.10.0 + '@smithy/fetch-http-handler': 5.2.0 + '@smithy/hash-node': 4.1.0 + '@smithy/invalid-dependency': 4.1.0 + '@smithy/middleware-content-length': 4.1.0 + '@smithy/middleware-endpoint': 4.2.0 + '@smithy/middleware-retry': 4.2.0 + '@smithy/middleware-serde': 4.1.0 + '@smithy/middleware-stack': 4.1.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/node-http-handler': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/url-parser': 4.1.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-body-length-node': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.0 + '@smithy/util-defaults-mode-node': 4.1.0 + '@smithy/util-endpoints': 3.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-retry': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.876.0': + '@aws-sdk/core@3.883.0': dependencies: '@aws-sdk/types': 3.862.0 '@aws-sdk/xml-builder': 3.873.0 - '@smithy/core': 3.8.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-utf8': 4.0.0 + '@smithy/core': 3.10.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/property-provider': 4.1.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/signature-v4': 5.2.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-utf8': 4.1.0 fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.876.0': + '@aws-sdk/credential-provider-env@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.876.0': + '@aws-sdk/credential-provider-http@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/node-http-handler': 4.1.1 - '@smithy/property-provider': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-stream': 4.2.4 + '@smithy/fetch-http-handler': 5.2.0 + '@smithy/node-http-handler': 4.2.0 + '@smithy/property-provider': 4.1.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/util-stream': 4.3.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.876.0': + '@aws-sdk/credential-provider-ini@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 - '@aws-sdk/credential-provider-env': 3.876.0 - '@aws-sdk/credential-provider-http': 3.876.0 - '@aws-sdk/credential-provider-process': 3.876.0 - '@aws-sdk/credential-provider-sso': 3.876.0 - '@aws-sdk/credential-provider-web-identity': 3.876.0 - '@aws-sdk/nested-clients': 3.876.0 + '@aws-sdk/core': 3.883.0 + '@aws-sdk/credential-provider-env': 3.883.0 + '@aws-sdk/credential-provider-http': 3.883.0 + '@aws-sdk/credential-provider-process': 3.883.0 + '@aws-sdk/credential-provider-sso': 3.883.0 + '@aws-sdk/credential-provider-web-identity': 3.883.0 + '@aws-sdk/nested-clients': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/credential-provider-imds': 4.1.0 + '@smithy/property-provider': 4.1.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.876.0': + '@aws-sdk/credential-provider-node@3.883.0': dependencies: - '@aws-sdk/credential-provider-env': 3.876.0 - '@aws-sdk/credential-provider-http': 3.876.0 - '@aws-sdk/credential-provider-ini': 3.876.0 - '@aws-sdk/credential-provider-process': 3.876.0 - '@aws-sdk/credential-provider-sso': 3.876.0 - '@aws-sdk/credential-provider-web-identity': 3.876.0 + '@aws-sdk/credential-provider-env': 3.883.0 + '@aws-sdk/credential-provider-http': 3.883.0 + '@aws-sdk/credential-provider-ini': 3.883.0 + '@aws-sdk/credential-provider-process': 3.883.0 + '@aws-sdk/credential-provider-sso': 3.883.0 + '@aws-sdk/credential-provider-web-identity': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/credential-provider-imds': 4.1.0 + '@smithy/property-provider': 4.1.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.876.0': + '@aws-sdk/credential-provider-process@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.876.0': + '@aws-sdk/credential-provider-sso@3.883.0': dependencies: - '@aws-sdk/client-sso': 3.876.0 - '@aws-sdk/core': 3.876.0 - '@aws-sdk/token-providers': 3.876.0 + '@aws-sdk/client-sso': 3.883.0 + '@aws-sdk/core': 3.883.0 + '@aws-sdk/token-providers': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.876.0': + '@aws-sdk/credential-provider-web-identity@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 - '@aws-sdk/nested-clients': 3.876.0 + '@aws-sdk/core': 3.883.0 + '@aws-sdk/nested-clients': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -3870,133 +3880,133 @@ snapshots: dependencies: '@aws-sdk/types': 3.862.0 '@aws-sdk/util-arn-parser': 3.873.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-config-provider': 4.1.0 tslib: 2.8.1 '@aws-sdk/middleware-expect-continue@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.876.0': + '@aws-sdk/middleware-flexible-checksums@3.883.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 + '@smithy/is-array-buffer': 4.1.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-stream': 4.3.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@aws-sdk/middleware-location-constraint@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@aws-sdk/middleware-logger@3.876.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.876.0': + '@aws-sdk/middleware-sdk-s3@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/types': 3.862.0 '@aws-sdk/util-arn-parser': 3.873.0 - '@smithy/core': 3.8.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 + '@smithy/core': 3.10.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/signature-v4': 5.2.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/util-config-provider': 4.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-stream': 4.3.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 '@aws-sdk/middleware-ssec@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.876.0': + '@aws-sdk/middleware-user-agent@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.873.0 - '@smithy/core': 3.8.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/util-endpoints': 3.879.0 + '@smithy/core': 3.10.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.876.0': + '@aws-sdk/nested-clients@3.883.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.876.0 + '@aws-sdk/core': 3.883.0 '@aws-sdk/middleware-host-header': 3.873.0 '@aws-sdk/middleware-logger': 3.876.0 '@aws-sdk/middleware-recursion-detection': 3.873.0 - '@aws-sdk/middleware-user-agent': 3.876.0 + '@aws-sdk/middleware-user-agent': 3.883.0 '@aws-sdk/region-config-resolver': 3.873.0 '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.873.0 + '@aws-sdk/util-endpoints': 3.879.0 '@aws-sdk/util-user-agent-browser': 3.873.0 - '@aws-sdk/util-user-agent-node': 3.876.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/util-user-agent-node': 3.883.0 + '@smithy/config-resolver': 4.2.0 + '@smithy/core': 3.10.0 + '@smithy/fetch-http-handler': 5.2.0 + '@smithy/hash-node': 4.1.0 + '@smithy/invalid-dependency': 4.1.0 + '@smithy/middleware-content-length': 4.1.0 + '@smithy/middleware-endpoint': 4.2.0 + '@smithy/middleware-retry': 4.2.0 + '@smithy/middleware-serde': 4.1.0 + '@smithy/middleware-stack': 4.1.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/node-http-handler': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/url-parser': 4.1.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-body-length-node': 4.1.0 + '@smithy/util-defaults-mode-browser': 4.1.0 + '@smithy/util-defaults-mode-node': 4.1.0 + '@smithy/util-endpoints': 3.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-retry': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4004,48 +4014,48 @@ snapshots: '@aws-sdk/region-config-resolver@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 + '@smithy/node-config-provider': 4.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-config-provider': 4.1.0 + '@smithy/util-middleware': 4.1.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.876.0': + '@aws-sdk/signature-v4-multi-region@3.883.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.876.0 + '@aws-sdk/middleware-sdk-s3': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.0 + '@smithy/signature-v4': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.876.0': + '@aws-sdk/token-providers@3.883.0': dependencies: - '@aws-sdk/core': 3.876.0 - '@aws-sdk/nested-clients': 3.876.0 + '@aws-sdk/core': 3.883.0 + '@aws-sdk/nested-clients': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt '@aws-sdk/types@3.862.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.873.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.873.0': + '@aws-sdk/util-endpoints@3.879.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-endpoints': 3.0.7 + '@smithy/types': 4.4.0 + '@smithy/url-parser': 4.1.0 + '@smithy/util-endpoints': 3.1.0 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.873.0': @@ -4055,21 +4065,21 @@ snapshots: '@aws-sdk/util-user-agent-browser@3.873.0': dependencies: '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.876.0': + '@aws-sdk/util-user-agent-node@3.883.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.876.0 + '@aws-sdk/middleware-user-agent': 3.883.0 '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 + '@smithy/node-config-provider': 4.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@aws-sdk/xml-builder@3.873.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@babel/code-frame@7.27.1': @@ -4086,7 +4096,7 @@ snapshots: '@borewit/text-codec@0.1.1': {} - '@cloudflare/workers-types@4.20250826.0': {} + '@cloudflare/workers-types@4.20250906.0': {} '@colors/colors@1.6.0': {} @@ -4239,14 +4249,14 @@ snapshots: '@esbuild/win32-x64@0.25.9': optional: true - '@git.zone/tsbuild@2.6.7': + '@git.zone/tsbuild@2.6.8': dependencies: '@git.zone/tspublish': 1.10.3 '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 typescript: 5.9.2 @@ -4260,7 +4270,7 @@ snapshots: '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartlog-destination-local': 9.0.2 '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 @@ -4281,7 +4291,7 @@ snapshots: '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartnpm': 2.0.6 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartrequest': 4.3.1 @@ -4296,9 +4306,9 @@ snapshots: '@push.rocks/smartshell': 3.3.0 tsx: 4.20.5 - '@git.zone/tstest@2.3.5(socks@2.8.7)(typescript@5.9.2)': + '@git.zone/tstest@2.3.6(socks@2.8.7)(typescript@5.9.2)': dependencies: - '@api.global/typedserver': 3.0.77 + '@api.global/typedserver': 3.0.79 '@git.zone/tsbundle': 2.5.1 '@git.zone/tsrun': 1.3.3 '@push.rocks/consolecolor': 2.0.3 @@ -4311,7 +4321,7 @@ snapshots: '@push.rocks/smartexpect': 2.5.0 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartmongo': 2.0.12(socks@2.8.7) '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 @@ -4457,7 +4467,7 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@puppeteer/browsers@2.10.7': + '@puppeteer/browsers@2.10.8': dependencies: debug: 4.4.1 extract-zip: 2.0.1 @@ -4486,21 +4496,21 @@ snapshots: '@push.rocks/isounique@1.0.5': {} - '@push.rocks/levelcache@3.1.1': + '@push.rocks/levelcache@3.2.0': dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smartbucket': 3.3.10 - '@push.rocks/smartcache': 1.0.17 + '@push.rocks/smartcache': 1.0.18 '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartexit': 1.0.23 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartstring': 4.0.15 '@push.rocks/smartunique': 3.0.9 - '@push.rocks/taskbuffer': 3.1.7 - '@tsclass/tsclass': 4.4.4 + '@push.rocks/taskbuffer': 3.2.0 + '@tsclass/tsclass': 9.2.0 transitivePeerDependencies: - aws-crt @@ -4523,7 +4533,7 @@ snapshots: '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@tsclass/tsclass': 9.2.0 - mongodb: 6.18.0(socks@2.8.7) + mongodb: 6.19.0(socks@2.8.7) transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' @@ -4538,7 +4548,7 @@ snapshots: '@api.global/typedrequest': 3.1.10 '@configvault.io/interfaces': 1.0.17 '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartarchive@4.2.2': @@ -4575,7 +4585,7 @@ snapshots: '@push.rocks/smartbucket@3.3.10': dependencies: - '@aws-sdk/client-s3': 3.876.0 + '@aws-sdk/client-s3': 3.883.0 '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 @@ -4591,7 +4601,7 @@ snapshots: dependencies: uint8array-extras: 1.5.0 - '@push.rocks/smartcache@1.0.17': + '@push.rocks/smartcache@1.0.18': dependencies: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smarterror': 2.0.1 @@ -4610,7 +4620,7 @@ snapshots: '@push.rocks/smartcli@4.0.11': dependencies: '@push.rocks/lik': 6.2.2 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartobject': 1.0.12 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 @@ -4635,16 +4645,16 @@ snapshots: dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartmongo': 2.0.12(socks@2.8.7) '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartstring': 4.0.15 '@push.rocks/smarttime': 4.1.1 '@push.rocks/smartunique': 3.0.9 - '@push.rocks/taskbuffer': 3.1.7 + '@push.rocks/taskbuffer': 3.2.0 '@tsclass/tsclass': 9.2.0 - mongodb: 6.18.0(socks@2.8.7) + mongodb: 6.19.0(socks@2.8.7) transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' @@ -4742,7 +4752,7 @@ snapshots: '@api.global/typedrequest-interfaces': 2.0.2 '@tsclass/tsclass': 4.4.4 - '@push.rocks/smartlog@3.1.8': + '@push.rocks/smartlog@3.1.9': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/consolecolor': 2.0.3 @@ -4812,7 +4822,7 @@ snapshots: '@push.rocks/smartnpm@2.0.6': dependencies: '@push.rocks/consolecolor': 2.0.3 - '@push.rocks/levelcache': 3.1.1 + '@push.rocks/levelcache': 3.2.0 '@push.rocks/smartarchive': 4.2.2 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartpath': 6.0.0 @@ -4830,7 +4840,7 @@ snapshots: '@design.estate/dees-element': 2.1.2 '@happy-dom/global-registrator': 15.11.7 '@push.rocks/smartpromise': 4.2.3 - fake-indexeddb: 6.1.0 + fake-indexeddb: 6.2.2 transitivePeerDependencies: - '@nuxt/kit' - react @@ -4883,7 +4893,7 @@ snapshots: dependencies: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartshell': 3.3.0 - puppeteer: 24.17.0(typescript@5.9.2) + puppeteer: 24.19.0(typescript@5.9.2) tree-kill: 1.2.2 transitivePeerDependencies: - bare-buffer @@ -4942,7 +4952,7 @@ snapshots: '@push.rocks/smartsitemap@2.0.3': dependencies: - '@push.rocks/smartcache': 1.0.17 + '@push.rocks/smartcache': 1.0.18 '@push.rocks/smartfeed': 1.0.11 '@push.rocks/smartxml': 1.1.1 '@push.rocks/smartyaml': 2.0.5 @@ -4952,14 +4962,14 @@ snapshots: '@push.rocks/smartsocket@2.1.0': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedserver': 3.0.77 + '@api.global/typedserver': 3.0.79 '@push.rocks/isohash': 2.0.1 '@push.rocks/isounique': 1.0.5 '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smarttime': 4.1.1 @@ -5031,7 +5041,7 @@ snapshots: '@push.rocks/smartversion@3.0.5': dependencies: - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 semver: 7.7.2 '@push.rocks/smartxml@1.1.1': @@ -5044,11 +5054,11 @@ snapshots: '@types/js-yaml': 3.12.10 js-yaml: 3.14.1 - '@push.rocks/taskbuffer@3.1.7': + '@push.rocks/taskbuffer@3.2.0': dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.1.8 + '@push.rocks/smartlog': 3.1.9 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smarttime': 4.1.1 @@ -5228,255 +5238,255 @@ snapshots: '@sindresorhus/is@5.6.0': {} - '@smithy/abort-controller@4.0.5': + '@smithy/abort-controller@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.0.0': + '@smithy/chunked-blob-reader-native@4.1.0': dependencies: - '@smithy/util-base64': 4.0.0 + '@smithy/util-base64': 4.1.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.0.0': + '@smithy/chunked-blob-reader@5.1.0': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.5': + '@smithy/config-resolver@4.2.0': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 + '@smithy/node-config-provider': 4.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-config-provider': 4.1.0 + '@smithy/util-middleware': 4.1.0 tslib: 2.8.1 - '@smithy/core@3.8.0': + '@smithy/core@3.10.0': dependencies: - '@smithy/middleware-serde': 4.0.9 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 + '@smithy/middleware-serde': 4.1.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-body-length-browser': 4.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-stream': 4.3.0 + '@smithy/util-utf8': 4.1.0 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/credential-provider-imds@4.0.7': + '@smithy/credential-provider-imds@4.1.0': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 + '@smithy/node-config-provider': 4.2.0 + '@smithy/property-provider': 4.1.0 + '@smithy/types': 4.4.0 + '@smithy/url-parser': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.5': + '@smithy/eventstream-codec@4.1.0': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.2 - '@smithy/util-hex-encoding': 4.0.0 + '@smithy/types': 4.4.0 + '@smithy/util-hex-encoding': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.5': + '@smithy/eventstream-serde-browser@4.1.0': dependencies: - '@smithy/eventstream-serde-universal': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-serde-universal': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.3': + '@smithy/eventstream-serde-config-resolver@4.2.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.5': + '@smithy/eventstream-serde-node@4.1.0': dependencies: - '@smithy/eventstream-serde-universal': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-serde-universal': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.5': + '@smithy/eventstream-serde-universal@4.1.0': dependencies: - '@smithy/eventstream-codec': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-codec': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.1.1': + '@smithy/fetch-http-handler@5.2.0': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/querystring-builder': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/querystring-builder': 4.1.0 + '@smithy/types': 4.4.0 + '@smithy/util-base64': 4.1.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.0.5': + '@smithy/hash-blob-browser@4.1.0': dependencies: - '@smithy/chunked-blob-reader': 5.0.0 - '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.3.2 + '@smithy/chunked-blob-reader': 5.1.0 + '@smithy/chunked-blob-reader-native': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/hash-node@4.0.5': + '@smithy/hash-node@4.1.0': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.4.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.0.5': + '@smithy/hash-stream-node@4.1.0': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.4.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.5': + '@smithy/invalid-dependency@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.0.0': + '@smithy/is-array-buffer@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.0.5': + '@smithy/md5-js@4.1.0': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.4.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.5': + '@smithy/middleware-content-length@4.1.0': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.18': + '@smithy/middleware-endpoint@4.2.0': dependencies: - '@smithy/core': 3.8.0 - '@smithy/middleware-serde': 4.0.9 - '@smithy/node-config-provider': 4.1.4 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-middleware': 4.0.5 + '@smithy/core': 3.10.0 + '@smithy/middleware-serde': 4.1.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 + '@smithy/url-parser': 4.1.0 + '@smithy/util-middleware': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.19': + '@smithy/middleware-retry@4.2.0': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/service-error-classification': 4.0.7 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 + '@smithy/node-config-provider': 4.2.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/service-error-classification': 4.1.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-retry': 4.1.0 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.9': + '@smithy/middleware-serde@4.1.0': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.5': + '@smithy/middleware-stack@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.4': + '@smithy/node-config-provider@4.2.0': dependencies: - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/shared-ini-file-loader': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.1.1': + '@smithy/node-http-handler@4.2.0': dependencies: - '@smithy/abort-controller': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/querystring-builder': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/abort-controller': 4.1.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/querystring-builder': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/property-provider@4.0.5': + '@smithy/property-provider@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/protocol-http@5.1.3': + '@smithy/protocol-http@5.2.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.5': + '@smithy/querystring-builder@4.1.0': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-uri-escape': 4.0.0 + '@smithy/types': 4.4.0 + '@smithy/util-uri-escape': 4.1.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.5': + '@smithy/querystring-parser@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.7': + '@smithy/service-error-classification@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 - '@smithy/shared-ini-file-loader@4.0.5': + '@smithy/shared-ini-file-loader@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/signature-v4@5.1.3': + '@smithy/signature-v4@5.2.0': dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/is-array-buffer': 4.1.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-hex-encoding': 4.1.0 + '@smithy/util-middleware': 4.1.0 + '@smithy/util-uri-escape': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.4.10': + '@smithy/smithy-client@4.6.0': dependencies: - '@smithy/core': 3.8.0 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-stack': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-stream': 4.2.4 + '@smithy/core': 3.10.0 + '@smithy/middleware-endpoint': 4.2.0 + '@smithy/middleware-stack': 4.1.0 + '@smithy/protocol-http': 5.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-stream': 4.3.0 tslib: 2.8.1 - '@smithy/types@4.3.2': + '@smithy/types@4.4.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.5': + '@smithy/url-parser@4.1.0': dependencies: - '@smithy/querystring-parser': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/querystring-parser': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/util-base64@4.0.0': + '@smithy/util-base64@4.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.0.0': + '@smithy/util-body-length-browser@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.0.0': + '@smithy/util-body-length-node@4.1.0': dependencies: tslib: 2.8.1 @@ -5485,66 +5495,66 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.0.0': + '@smithy/util-buffer-from@4.1.0': dependencies: - '@smithy/is-array-buffer': 4.0.0 + '@smithy/is-array-buffer': 4.1.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.0.0': + '@smithy/util-config-provider@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.26': + '@smithy/util-defaults-mode-browser@4.1.0': dependencies: - '@smithy/property-provider': 4.0.5 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.26': + '@smithy/util-defaults-mode-node@4.1.0': dependencies: - '@smithy/config-resolver': 4.1.5 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 + '@smithy/config-resolver': 4.2.0 + '@smithy/credential-provider-imds': 4.1.0 + '@smithy/node-config-provider': 4.2.0 + '@smithy/property-provider': 4.1.0 + '@smithy/smithy-client': 4.6.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.7': + '@smithy/util-endpoints@3.1.0': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 + '@smithy/node-config-provider': 4.2.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.0.0': + '@smithy/util-hex-encoding@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.5': + '@smithy/util-middleware@4.1.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/util-retry@4.0.7': + '@smithy/util-retry@4.1.0': dependencies: - '@smithy/service-error-classification': 4.0.7 - '@smithy/types': 4.3.2 + '@smithy/service-error-classification': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 - '@smithy/util-stream@4.2.4': + '@smithy/util-stream@4.3.0': dependencies: - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/node-http-handler': 4.1.1 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/fetch-http-handler': 5.2.0 + '@smithy/node-http-handler': 4.2.0 + '@smithy/types': 4.4.0 + '@smithy/util-base64': 4.1.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-hex-encoding': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/util-uri-escape@4.0.0': + '@smithy/util-uri-escape@4.1.0': dependencies: tslib: 2.8.1 @@ -5553,15 +5563,15 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': + '@smithy/util-utf8@4.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-buffer-from': 4.1.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.7': + '@smithy/util-waiter@4.1.0': dependencies: - '@smithy/abort-controller': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/abort-controller': 4.1.0 + '@smithy/types': 4.4.0 tslib: 2.8.1 '@socket.io/component-emitter@3.1.2': {} @@ -5701,7 +5711,7 @@ snapshots: dependencies: '@types/node': 20.19.11 - '@types/semver@7.7.0': {} + '@types/semver@7.7.1': {} '@types/send@0.17.5': dependencies: @@ -5818,7 +5828,7 @@ snapshots: bare-events@2.6.1: optional: true - bare-fs@4.2.1: + bare-fs@4.2.3: dependencies: bare-events: 2.6.1 bare-path: 3.0.0 @@ -5855,7 +5865,7 @@ snapshots: iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.0 - raw-body: 3.0.0 + raw-body: 3.0.1 type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -5956,9 +5966,9 @@ snapshots: dependencies: readdirp: 4.1.2 - chromium-bidi@8.0.0(devtools-protocol@0.0.1475386): + chromium-bidi@8.0.0(devtools-protocol@0.0.1495869): dependencies: - devtools-protocol: 0.0.1475386 + devtools-protocol: 0.0.1495869 mitt: 3.0.1 zod: 3.25.76 @@ -6137,7 +6147,7 @@ snapshots: dependencies: dequal: 2.0.3 - devtools-protocol@0.0.1475386: {} + devtools-protocol@0.0.1495869: {} dicer@0.3.0: dependencies: @@ -6337,7 +6347,7 @@ snapshots: fake-indexeddb@5.0.2: {} - fake-indexeddb@6.1.0: {} + fake-indexeddb@6.2.2: {} fast-deep-equal@3.1.3: {} @@ -6677,6 +6687,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} import-fresh@3.3.1: @@ -7332,7 +7346,7 @@ snapshots: find-cache-dir: 3.3.2 follow-redirects: 1.15.11(debug@4.4.1) https-proxy-agent: 7.0.6 - mongodb: 6.18.0(socks@2.8.7) + mongodb: 6.19.0(socks@2.8.7) new-find-package-json: 2.0.0 semver: 7.7.2 tar-stream: 3.1.7 @@ -7362,7 +7376,7 @@ snapshots: - socks - supports-color - mongodb@6.18.0(socks@2.8.7): + mongodb@6.19.0(socks@2.8.7): dependencies: '@mongodb-js/saslprep': 1.3.0 bson: 6.10.4 @@ -7516,6 +7530,8 @@ snapshots: path-to-regexp@8.2.0: {} + path-to-regexp@8.3.0: {} + pdf-lib@1.17.1: dependencies: '@pdf-lib/standard-fonts': 1.0.0 @@ -7584,12 +7600,12 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.17.0: + puppeteer-core@24.19.0: dependencies: - '@puppeteer/browsers': 2.10.7 - chromium-bidi: 8.0.0(devtools-protocol@0.0.1475386) + '@puppeteer/browsers': 2.10.8 + chromium-bidi: 8.0.0(devtools-protocol@0.0.1495869) debug: 4.4.1 - devtools-protocol: 0.0.1475386 + devtools-protocol: 0.0.1495869 typed-query-selector: 2.12.0 ws: 8.18.3 transitivePeerDependencies: @@ -7598,13 +7614,13 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.17.0(typescript@5.9.2): + puppeteer@24.19.0(typescript@5.9.2): dependencies: - '@puppeteer/browsers': 2.10.7 - chromium-bidi: 8.0.0(devtools-protocol@0.0.1475386) + '@puppeteer/browsers': 2.10.8 + chromium-bidi: 8.0.0(devtools-protocol@0.0.1495869) cosmiconfig: 9.0.0(typescript@5.9.2) - devtools-protocol: 0.0.1475386 - puppeteer-core: 24.17.0 + devtools-protocol: 0.0.1495869 + puppeteer-core: 24.19.0 typed-query-selector: 2.12.0 transitivePeerDependencies: - bare-buffer @@ -7627,11 +7643,11 @@ snapshots: range-parser@1.2.1: {} - raw-body@3.0.0: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 rc@1.2.8: @@ -7750,7 +7766,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -8036,7 +8052,7 @@ snapshots: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.2.1 + bare-fs: 4.2.3 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer diff --git a/readme.md b/readme.md index d4e6297..515faf0 100644 --- a/readme.md +++ b/readme.md @@ -1,630 +1,121 @@ # @push.rocks/taskbuffer ๐Ÿš€ -A **powerful**, **flexible**, and **TypeScript-first** task management library for orchestrating asynchronous operations with style. From simple task execution to complex distributed workflows with real-time progress tracking, taskbuffer has got you covered. +> **Modern TypeScript task orchestration with smart buffering, scheduling, and real-time progress tracking** -## Install ๐Ÿ“ฆ - -```bash -npm install @push.rocks/taskbuffer --save -``` - -Or with **pnpm** (recommended): +[![npm version](https://img.shields.io/npm/v/@push.rocks/taskbuffer.svg)](https://www.npmjs.com/package/@push.rocks/taskbuffer) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)](https://www.typescriptlang.org/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +## ๐ŸŒŸ Features + +- **๐ŸŽฏ Type-Safe Task Management** - Full TypeScript support with generics and type inference +- **๐Ÿ“Š Real-Time Progress Tracking** - Step-based progress with percentage weights +- **โšก Smart Buffering** - Intelligent request debouncing and batching +- **โฐ Cron Scheduling** - Schedule tasks with cron expressions +- **๐Ÿ”„ Task Chains & Parallel Execution** - Sequential and parallel task orchestration +- **๐ŸŽจ Web Component Dashboard** - Real-time visualization of task execution +- **๐Ÿ“ˆ Comprehensive Metadata** - Track execution history, duration, and status +- **๐Ÿ”’ Thread-Safe Operations** - Concurrency control and execution limits +- **๐ŸŽญ Event-Driven Architecture** - Observable task lifecycle events + +## ๐Ÿ“ฆ Installation ```bash +npm install @push.rocks/taskbuffer +# or pnpm add @push.rocks/taskbuffer +# or +yarn add @push.rocks/taskbuffer ``` -## Why taskbuffer? ๐Ÿค” +## ๐Ÿš€ Quick Start -In the modern JavaScript ecosystem, managing asynchronous tasks efficiently is crucial. Whether you're building a data pipeline, managing API rate limits, or orchestrating complex workflows, **@push.rocks/taskbuffer** provides the tools you need: - -- **๐ŸŽฏ TypeScript-first**: Built with TypeScript for TypeScript - enjoy complete type safety and excellent IDE support -- **โšก Flexible execution**: From simple tasks to complex parallel workflows with dependencies -- **๐Ÿ”„ Smart buffering**: Control concurrent executions with intelligent buffer management -- **โฐ Built-in scheduling**: Cron-based task scheduling without additional dependencies -- **๐ŸŽญ Multiple paradigms**: Support for debounced, throttled, and one-time execution patterns -- **๐Ÿ“Š Progress tracking**: Real-time step-by-step progress monitoring for UI integration -- **๐Ÿ”Œ Extensible**: Clean architecture that's easy to extend and customize -- **๐Ÿƒ Zero dependencies on external schedulers**: Everything you need is included - -## Core Concepts ๐ŸŽ“ - -### Task -The fundamental unit of work. A task wraps an asynchronous function and provides powerful execution control, now with step-by-step progress tracking. - -### Taskchain -Sequential task execution - tasks run one after another, with results passed along the chain. - -### Taskparallel -Parallel task execution - multiple tasks run simultaneously for maximum performance. - -### TaskManager -Centralized task scheduling and management using cron expressions, with rich metadata collection. - -### TaskDebounced -Debounced task execution - prevents rapid repeated executions, only running after a quiet period. - -### TaskOnce -Singleton task execution - ensures a task runs exactly once, perfect for initialization routines. - -### TaskStep ๐Ÿ†• -Granular progress tracking - define named steps with percentage weights for real-time progress monitoring. - -## Quick Start ๐Ÿ - -### Basic Task Execution +### Basic Task Creation ```typescript -import { Task } from '@push.rocks/taskbuffer'; +import { Task, TaskManager } from '@push.rocks/taskbuffer'; // Create a simple task -const myTask = new Task({ - name: 'DataProcessor', - taskFunction: async () => { - const data = await fetchData(); - return processData(data); - }, +const dataProcessor = new Task({ + name: 'ProcessData', + taskFunction: async (data) => { + console.log(`Processing: ${data}`); + // Your async logic here + return `Processed: ${data}`; + } }); // Execute the task -const result = await myTask.trigger(); +const result = await dataProcessor.trigger('my-data'); +console.log(result); // "Processed: my-data" ``` -### Task with Progress Steps ๐Ÿ†• - -Track granular progress for complex operations - perfect for UI progress bars: +### Tasks with Progress Tracking ๐Ÿ“Š ```typescript -const dataProcessingTask = new Task({ - name: 'DataProcessor', +const deploymentTask = new Task({ + name: 'DeployApplication', steps: [ - { name: 'validate', description: 'Validating input data', percentage: 15 }, - { name: 'fetch', description: 'Fetching external resources', percentage: 25 }, - { name: 'transform', description: 'Transforming data', percentage: 35 }, - { name: 'save', description: 'Saving to database', percentage: 25 } - ] as const, // Use 'as const' for full type safety - taskFunction: async (inputData) => { + { name: 'build', description: 'Building application', percentage: 30 }, + { name: 'test', description: 'Running tests', percentage: 20 }, + { name: 'deploy', description: 'Deploying to server', percentage: 40 }, + { name: 'verify', description: 'Verifying deployment', percentage: 10 } + ] as const, // Use 'as const' for type inference + taskFunction: async function() { // TypeScript knows these step names! - dataProcessingTask.notifyStep('validate'); - const validated = await validateData(inputData); + this.notifyStep('build'); + await buildApplication(); - dataProcessingTask.notifyStep('fetch'); - const external = await fetchExternalData(); + this.notifyStep('test'); + await runTests(); - dataProcessingTask.notifyStep('transform'); - const transformed = await transformData(validated, external); + this.notifyStep('deploy'); + await deployToServer(); - dataProcessingTask.notifyStep('save'); - const result = await saveToDatabase(transformed); + this.notifyStep('verify'); + await verifyDeployment(); - return result; + return 'Deployment successful!'; } }); -// Monitor progress in real-time -const result = await dataProcessingTask.trigger(); -console.log(`Final progress: ${dataProcessingTask.getProgress()}%`); // 100% +// Monitor progress +console.log(deploymentTask.getProgress()); // 0-100 +console.log(deploymentTask.getStepsMetadata()); // Detailed step info ``` -## TypeScript Generics Support ๐Ÿ”ฌ +## ๐ŸŽฏ Core Concepts -TaskBuffer leverages TypeScript's powerful generics system for complete type safety across your task chains and workflows. +### Task Buffering - Intelligent Request Management -### Generic Task Functions - -Tasks support generic type parameters for both input and output types: +TaskBuffer's buffering system prevents overwhelming your system with rapid-fire requests: ```typescript -import { Task, ITaskFunction } from '@push.rocks/taskbuffer'; - -// Define typed interfaces -interface UserData { - id: string; - name: string; - email: string; -} - -interface ProcessedUser { - userId: string; - displayName: string; - normalized: boolean; -} - -// Create strongly typed tasks -const processUserTask = new Task({ - name: 'ProcessUser', - taskFunction: async (user: UserData): Promise => { - return { - userId: user.id, - displayName: user.name.toUpperCase(), - normalized: true - }; - } -}); - -// Type safety enforced at compile time -const result: ProcessedUser = await processUserTask.trigger({ - id: '123', - name: 'John Doe', - email: 'john@example.com' -}); -``` - -### Generic Setup Values - -Tasks can accept setup values through generics, perfect for configuration: - -```typescript -interface TaskConfig { - apiEndpoint: string; - retryCount: number; - timeout: number; -} - -const configuredTask = new Task({ - name: 'ConfiguredTask', - taskSetup: async (): Promise => ({ - apiEndpoint: 'https://api.example.com', - retryCount: 3, - timeout: 5000 - }), - taskFunction: async (data: any, setupValue: TaskConfig) => { - // setupValue is fully typed! - for (let i = 0; i < setupValue.retryCount; i++) { - try { - return await fetchWithTimeout( - setupValue.apiEndpoint, - setupValue.timeout - ); - } catch (error) { - if (i === setupValue.retryCount - 1) throw error; - } - } - } -}); -``` - -### Type-Safe Task Chains - -Chain tasks with preserved type flow: - -```typescript -// Each task knows its input and output types -const fetchTask = new Task({ - name: 'FetchUsers', - taskFunction: async (): Promise => { - return await api.getUsers(); - } -}); - -const filterTask = new Task({ - name: 'FilterActive', - taskFunction: async (users: UserData[]): Promise => { - return users.filter(user => user.isActive); - } -}); - -const mapTask = new Task({ - name: 'MapToProcessed', - taskFunction: async (users: UserData[]): Promise => { - return users.map(transformUser); - } -}); - -// Type safety flows through the chain -const chain = new Taskchain({ - name: 'UserPipeline', - taskArray: [fetchTask, filterTask, mapTask] -}); - -const finalResult: ProcessedUser[] = await chain.trigger(); -``` - -## Progress Tracking & Metadata ๐Ÿ“Š ๐Ÿ†• - -TaskBuffer now provides comprehensive progress tracking and metadata collection, perfect for building dashboards and monitoring systems. - -### Step-by-Step Progress - -Define weighted steps for accurate progress calculation: - -```typescript -const migrationTask = new Task({ - name: 'DatabaseMigration', - steps: [ - { name: 'backup', description: 'Backing up database', percentage: 20 }, - { name: 'schema', description: 'Updating schema', percentage: 30 }, - { name: 'data', description: 'Migrating data', percentage: 40 }, - { name: 'validate', description: 'Validating integrity', percentage: 10 } - ] as const, - taskFunction: async () => { - migrationTask.notifyStep('backup'); - await backupDatabase(); - console.log(`Progress: ${migrationTask.getProgress()}%`); // ~20% - - migrationTask.notifyStep('schema'); - await updateSchema(); - console.log(`Progress: ${migrationTask.getProgress()}%`); // ~50% - - migrationTask.notifyStep('data'); - await migrateData(); - console.log(`Progress: ${migrationTask.getProgress()}%`); // ~90% - - migrationTask.notifyStep('validate'); - await validateIntegrity(); - console.log(`Progress: ${migrationTask.getProgress()}%`); // 100% - } -}); - -// Get detailed step information -const steps = migrationTask.getStepsMetadata(); -steps.forEach(step => { - console.log(`${step.name}: ${step.status} (${step.percentage}%)`); - if (step.duration) { - console.log(` Duration: ${step.duration}ms`); - } -}); -``` - -### Task Metadata Collection - -Get comprehensive metadata about task execution: - -```typescript -const task = new Task({ - name: 'DataProcessor', - buffered: true, - bufferMax: 5, - steps: [ - { name: 'process', description: 'Processing', percentage: 100 } - ] as const, - taskFunction: async () => { - task.notifyStep('process'); - await processData(); - } -}); - -// Get complete task metadata -const metadata = task.getMetadata(); -console.log({ - name: metadata.name, - status: metadata.status, // 'idle' | 'running' | 'completed' | 'failed' - progress: metadata.currentProgress, // 0-100 - currentStep: metadata.currentStep, - runCount: metadata.runCount, - lastRun: metadata.lastRun, - buffered: metadata.buffered, - bufferMax: metadata.bufferMax -}); -``` - -### TaskManager Enhanced Metadata - -The TaskManager now provides rich metadata for monitoring and dashboards: - -```typescript -const manager = new TaskManager(); - -// Add tasks with step tracking -manager.addAndScheduleTask(backupTask, '0 2 * * *'); // 2 AM daily -manager.addAndScheduleTask(cleanupTask, '0 */6 * * *'); // Every 6 hours - -// Get metadata for all tasks -const allTasksMetadata = manager.getAllTasksMetadata(); -allTasksMetadata.forEach(task => { - console.log(`Task: ${task.name}`); - console.log(` Status: ${task.status}`); - console.log(` Progress: ${task.currentProgress}%`); - console.log(` Run count: ${task.runCount}`); - console.log(` Schedule: ${task.cronSchedule}`); -}); - -// Get scheduled tasks with next run times -const scheduledTasks = manager.getScheduledTasks(); -scheduledTasks.forEach(task => { - console.log(`${task.name}: Next run at ${task.nextRun}`); - if (task.steps) { - console.log(` Steps: ${task.steps.length}`); - } -}); - -// Get upcoming executions -const nextRuns = manager.getNextScheduledRuns(10); -console.log('Next 10 scheduled executions:', nextRuns); -``` - -### Execute and Track Tasks - -Execute tasks with full lifecycle tracking and automatic cleanup: - -```typescript -const manager = new TaskManager(); - -const analyticsTask = new Task({ - name: 'Analytics', - steps: [ - { name: 'collect', description: 'Collecting metrics', percentage: 30 }, - { name: 'analyze', description: 'Analyzing data', percentage: 50 }, - { name: 'report', description: 'Generating report', percentage: 20 } - ] as const, - taskFunction: async () => { - analyticsTask.notifyStep('collect'); - const metrics = await collectMetrics(); - - analyticsTask.notifyStep('analyze'); - const analysis = await analyzeData(metrics); - - analyticsTask.notifyStep('report'); - return await generateReport(analysis); - } -}); - -// Execute with automatic cleanup and metadata collection -const report = await manager.addExecuteRemoveTask(analyticsTask, { - trackProgress: true -}); - -console.log('Execution Report:', { - taskName: report.taskName, - duration: report.duration, - stepsCompleted: report.stepsCompleted, - finalProgress: report.progress, - result: report.result -}); -``` - -### Frontend Integration Example - -Perfect for building real-time progress UIs: - -```typescript -// WebSocket server for real-time updates -io.on('connection', (socket) => { - socket.on('startTask', async (taskId) => { - const task = new Task({ - name: taskId, - steps: [ - { name: 'start', description: 'Starting...', percentage: 10 }, - { name: 'process', description: 'Processing...', percentage: 70 }, - { name: 'finish', description: 'Finishing...', percentage: 20 } - ] as const, - taskFunction: async () => { - task.notifyStep('start'); - socket.emit('progress', { - step: 'start', - progress: task.getProgress(), - metadata: task.getStepsMetadata() - }); - - task.notifyStep('process'); - socket.emit('progress', { - step: 'process', - progress: task.getProgress(), - metadata: task.getStepsMetadata() - }); - - task.notifyStep('finish'); - socket.emit('progress', { - step: 'finish', - progress: task.getProgress(), - metadata: task.getStepsMetadata() - }); - } - }); - - await task.trigger(); - socket.emit('complete', task.getMetadata()); - }); -}); -``` - -## Buffer Behavior Deep Dive ๐ŸŒŠ - -The buffer system in TaskBuffer provides intelligent control over concurrent executions, preventing system overload while maximizing throughput. - -### How Buffering Works - -When a task is buffered, TaskBuffer manages a queue of executions: - -```typescript -const bufferedTask = new Task({ - name: 'BufferedOperation', - taskFunction: async (data) => { - console.log(`Processing: ${data}`); - await simulateWork(); - return `Processed: ${data}`; +const apiTask = new Task({ + name: 'APIRequest', + taskFunction: async (endpoint) => { + return await fetch(endpoint).then(r => r.json()); }, buffered: true, - bufferMax: 3 // Maximum 3 concurrent executions + bufferMax: 5, // Maximum 5 concurrent executions + execDelay: 100 // Minimum 100ms between executions }); -// Trigger 10 executions rapidly -for (let i = 0; i < 10; i++) { - bufferedTask.trigger(`Item ${i}`); -} - -// What happens: -// 1. First 3 tasks start immediately -// 2. Items 4-10 are queued -// 3. As each task completes, next queued item starts -// 4. Never more than 3 tasks running simultaneously -``` - -### Buffer Truncation Behavior - -When buffer limit is reached, new calls are intelligently managed: - -```typescript -const truncatingTask = new Task({ - name: 'TruncatingBuffer', - taskFunction: async (data) => { - await processData(data); - }, - buffered: true, - bufferMax: 5 // Maximum 5 in buffer -}); - -// Rapid fire 100 calls +// Rapid fire 100 calls - only 5 will execute concurrently for (let i = 0; i < 100; i++) { - truncatingTask.trigger(`Data ${i}`); -} - -// Buffer behavior: -// - First 5 calls: Added to buffer and start processing -// - Calls 6-100: Each overwrites the 5th buffer slot -// - Result: Only processes items 0,1,2,3, and 99 (last one) -// - This prevents memory overflow in high-frequency scenarios -``` - -### Advanced Buffer Strategies - -#### 1. **Sliding Window Buffer** -Perfect for real-time data processing where only recent items matter: - -```typescript -const slidingWindowTask = new Task({ - name: 'SlidingWindow', - taskFunction: async (data) => { - return await analyzeRecentData(data); - }, - buffered: true, - bufferMax: 10, // Keep last 10 items - execDelay: 100 // Process every 100ms -}); - -// In a real-time stream scenario -dataStream.on('data', (chunk) => { - slidingWindowTask.trigger(chunk); - // Older items automatically dropped when buffer full -}); -``` - -#### 2. **Throttled Buffer** -Combine buffering with execution delays for rate limiting: - -```typescript -const apiRateLimiter = new Task({ - name: 'RateLimitedAPI', - taskFunction: async (request) => { - return await api.call(request); - }, - buffered: true, - bufferMax: 10, // Max 10 queued requests - execDelay: 1000 // 1 second between executions -}); - -// Requests are queued and executed at 1/second -// Prevents API rate limit violations -``` - -#### 3. **Priority Buffer** (Custom Implementation) -Implement priority queuing with buffer management: - -```typescript -class PriorityBufferedTask extends Task { - private priorityQueue: Array<{data: any, priority: number}> = []; - - constructor(options) { - super({ - ...options, - taskFunction: async (item) => { - // Process based on priority - return await this.processByPriority(item); - } - }); - } - - triggerWithPriority(data: any, priority: number) { - if (this.priorityQueue.length >= this.bufferMax) { - // Remove lowest priority item if buffer full - this.priorityQueue.sort((a, b) => b.priority - a.priority); - this.priorityQueue.pop(); - } - this.priorityQueue.push({data, priority}); - this.priorityQueue.sort((a, b) => b.priority - a.priority); - return this.trigger(this.priorityQueue.shift()); - } + apiTask.trigger(`/api/data/${i}`); } ``` -### Buffer Monitoring - -Track buffer utilization and performance: - -```typescript -const monitoredTask = new Task({ - name: 'MonitoredBuffer', - taskFunction: async (data) => { - const startTime = Date.now(); - const result = await processData(data); - console.log(`Processing time: ${Date.now() - startTime}ms`); - console.log(`Buffer utilization: ${monitoredTask.bufferRunner.bufferCounter}/${monitoredTask.bufferMax}`); - return result; - }, - buffered: true, - bufferMax: 20 -}); - -// Monitor buffer saturation -setInterval(() => { - const utilization = (monitoredTask.bufferRunner.bufferCounter / monitoredTask.bufferMax) * 100; - if (utilization > 80) { - console.warn(`Buffer near capacity: ${utilization.toFixed(1)}%`); - } -}, 1000); -``` - -### Buffer Best Practices - -1. **Choose appropriate buffer sizes**: - - I/O operations: 5-10 concurrent - - CPU-intensive: Number of cores - - API calls: Based on rate limits - -2. **Handle buffer overflow gracefully**: - ```typescript - const task = new Task({ - taskFunction: async (data) => { - try { - return await process(data); - } catch (error) { - if (error.code === 'BUFFER_OVERFLOW') { - // Implement backoff strategy - await delay(1000); - return task.trigger(data); - } - throw error; - } - }, - buffered: true, - bufferMax: 10 - }); - ``` - -3. **Monitor and adjust dynamically**: - ```typescript - // Adjust buffer size based on system load - const adaptiveTask = new Task({ - name: 'AdaptiveBuffer', - taskFunction: async (data) => { - const cpuLoad = await getSystemLoad(); - if (cpuLoad > 0.8) { - adaptiveTask.bufferMax = Math.max(2, adaptiveTask.bufferMax - 1); - } else if (cpuLoad < 0.5) { - adaptiveTask.bufferMax = Math.min(20, adaptiveTask.bufferMax + 1); - } - return await process(data); - }, - buffered: true, - bufferMax: 10 - }); - ``` - -## Common Patterns ๐ŸŽจ +**Buffer Behavior:** +- First `bufferMax` calls execute immediately +- Additional calls are queued +- When buffer is full, new calls overwrite the last queued item +- Perfect for real-time data streams where only recent data matters ### Task Chains - Sequential Workflows -Build complex workflows where each step depends on the previous: +Build complex workflows with automatic data flow: ```typescript import { Task, Taskchain } from '@push.rocks/taskbuffer'; @@ -634,479 +125,462 @@ const fetchTask = new Task({ taskFunction: async () => { const response = await fetch('/api/data'); return response.json(); - }, + } }); const transformTask = new Task({ name: 'TransformData', taskFunction: async (data) => { - return data.map((item) => ({ + return data.map(item => ({ ...item, - processed: true, - timestamp: Date.now(), + transformed: true, + timestamp: Date.now() })); - }, + } }); const saveTask = new Task({ name: 'SaveData', taskFunction: async (transformedData) => { - await database.bulkInsert(transformedData); - return { saved: transformedData.length }; - }, + await database.save(transformedData); + return transformedData.length; + } }); -const workflow = new Taskchain({ +// Create and execute chain +const dataChain = new Taskchain({ name: 'DataPipeline', - taskArray: [fetchTask, transformTask, saveTask], + tasks: [fetchTask, transformTask, saveTask] }); -// Execute the entire chain -const result = await workflow.trigger(); -console.log(`Processed ${result.saved} items`); +const savedCount = await dataChain.trigger(); +console.log(`Saved ${savedCount} items`); ``` -### Parallel Execution - Maximum Performance +### Parallel Execution - Concurrent Processing -Execute multiple independent tasks simultaneously: +Execute multiple tasks simultaneously: ```typescript -import { Task, Taskparallel } from '@push.rocks/taskbuffer'; +import { TaskParallel } from '@push.rocks/taskbuffer'; -const tasks = ['user', 'posts', 'comments'].map( - (resource) => - new Task({ - name: `Fetch${resource}`, - taskFunction: async () => { - const data = await fetch(`/api/${resource}`); - return data.json(); - }, - }), -); - -const parallelFetch = new Taskparallel({ - taskArray: tasks, +const parallel = new TaskParallel({ + name: 'ParallelProcessor', + tasks: [ + emailTask, + smsTask, + pushNotificationTask, + webhookTask + ] }); -// All tasks execute simultaneously -const [users, posts, comments] = await parallelFetch.trigger(); +// All tasks execute concurrently +const results = await parallel.trigger(notificationData); +// results = [emailResult, smsResult, pushResult, webhookResult] ``` -### Scheduled Tasks with TaskManager +### TaskManager - Centralized Orchestration -Run tasks on a schedule using cron expressions: +Manage all your tasks from a single point: ```typescript -import { Task, TaskManager } from '@push.rocks/taskbuffer'; +const taskManager = new TaskManager(); -const backupTask = new Task({ - name: 'DatabaseBackup', - steps: [ - { name: 'dump', description: 'Creating dump', percentage: 70 }, - { name: 'upload', description: 'Uploading to S3', percentage: 30 } - ] as const, - taskFunction: async () => { - backupTask.notifyStep('dump'); - await performBackup(); +// Add tasks +taskManager.addTask(dataProcessor); +taskManager.addTask(deploymentTask); + +// Schedule tasks with cron +taskManager.addAndScheduleTask(backupTask, '0 2 * * *'); // Daily at 2 AM +taskManager.addAndScheduleTask(healthCheck, '*/5 * * * *'); // Every 5 minutes + +// Get task metadata +const metadata = taskManager.getTaskMetadata('DeployApplication'); +console.log(metadata); +// { +// name: 'DeployApplication', +// status: 'idle' | 'running' | 'completed' | 'failed', +// steps: [...], +// currentProgress: 75, +// runCount: 12, +// lastRun: Date, +// buffered: false, +// bufferMax: undefined, +// version: '1.0.0', +// timeout: 30000 +// } + +// Get all scheduled tasks +const scheduled = taskManager.getScheduledTasks(); +scheduled.forEach(task => { + console.log(`${task.name}: Next run at ${task.nextRun}`); +}); + +// Execute and remove pattern +const report = await taskManager.addExecuteRemoveTask(temporaryTask, { + trackProgress: true +}); +console.log(report); +// { +// taskName: 'TempTask', +// startTime: Date, +// endTime: Date, +// duration: 1523, +// steps: [...], +// stepsCompleted: ['step1', 'step2'], +// progress: 100, +// result: any, +// error?: Error +// } +``` + +## ๐ŸŽจ Web Component Dashboard + +Visualize your tasks in real-time with the included web component: + +```html + + + + + + + + + ``` -### Debounced Tasks - Smart Throttling +The dashboard provides: +- ๐Ÿ“Š Real-time progress bars with step indicators +- ๐Ÿ“ˆ Task execution history +- โฐ Scheduled task information +- ๐ŸŽฏ Interactive task controls +- ๐ŸŒ“ Light/dark theme support -Prevent task spam with intelligent debouncing: +## ๐Ÿงฉ Advanced Patterns + +### Dynamic Task Routing + +Route tasks based on conditions: ```typescript -import { TaskDebounced } from '@push.rocks/taskbuffer'; - -const saveTask = new TaskDebounced({ - name: 'AutoSave', - taskFunction: async (content: string) => { - await saveToDatabase(content); - console.log('Content saved'); - }, - debounceTimeInMillis: 2000, // Wait 2 seconds of inactivity -}); - -// Rapid calls will be debounced -input.addEventListener('input', (e) => { - saveTask.trigger(e.target.value); -}); -``` - -### One-Time Tasks - Initialize Once - -Ensure initialization code runs exactly once: - -```typescript -import { TaskOnce } from '@push.rocks/taskbuffer'; - -const initTask = new TaskOnce({ - name: 'SystemInitialization', - taskFunction: async () => { - await database.connect(); - await cache.initialize(); - await loadConfiguration(); - console.log('System initialized'); - }, -}); - -// Safe to call multiple times - only runs once -await initTask.trigger(); -await initTask.trigger(); // This won't run again -``` - -## Advanced Features ๐Ÿ”ฅ - -### Task Dependencies with Pre/Post Hooks - -Create sophisticated task relationships: - -```typescript -const validationTask = new Task({ - name: 'ValidateInput', - taskFunction: async (data) => { - if (!isValid(data)) { - throw new Error('Validation failed'); +const routerTask = new Task({ + name: 'Router', + taskFunction: async (request) => { + if (request.priority === 'high') { + return await expressProcessor.trigger(request); + } else if (request.size > 1000000) { + return await bulkProcessor.trigger(request); + } else { + return await standardProcessor.trigger(request); } - return data; - }, -}); - -const mainTask = new Task({ - name: 'ProcessData', - taskFunction: async (data) => { - return await complexProcessing(data); - }, - preTask: validationTask, // Runs before main task - afterTask: cleanupTask, // Runs after main task + } }); ``` -### Task Runners - Distributed Execution +### Task Pools -The TaskRunner system enables distributed task execution across multiple workers: +Create reusable task pools for load distribution: ```typescript -import { TaskRunner } from '@push.rocks/taskbuffer'; +class TaskPool { + private tasks: Task[] = []; + private currentIndex = 0; + + constructor(poolSize: number, taskConfig: any) { + for (let i = 0; i < poolSize; i++) { + this.tasks.push(new Task({ + ...taskConfig, + name: `${taskConfig.name}_${i}` + })); + } + } + + async execute(data: any) { + const task = this.tasks[this.currentIndex]; + this.currentIndex = (this.currentIndex + 1) % this.tasks.length; + return await task.trigger(data); + } +} -const runner = new TaskRunner({ - name: 'WorkerNode1', - maxConcurrentTasks: 5, +const processorPool = new TaskPool(5, { + name: 'DataProcessor', + taskFunction: async (data) => processData(data) }); - -// Register tasks this runner can handle -runner.registerTask(dataProcessingTask); -runner.registerTask(imageResizeTask); - -// Start processing -runner.start(); ``` -### Dynamic Task Creation +### Error Recovery & Retry -Create tasks on-the-fly based on runtime conditions: +Implement robust error handling: ```typescript -const dynamicWorkflow = async (config: Config) => { - const tasks = config.steps.map( - (step) => - new Task({ - name: step.name, - steps: step.substeps?.map(s => ({ - name: s.id, - description: s.label, - percentage: s.weight - })) as const, - taskFunction: async (input) => { - for (const substep of step.substeps || []) { - task.notifyStep(substep.id); - await processStep(substep, input); - } - return input; - }, - }), - ); - - const chain = new Taskchain({ - name: 'DynamicWorkflow', - taskArray: tasks, - }); - - return await chain.trigger(); -}; +const resilientTask = new Task({ + name: 'ResilientTask', + taskFunction: async (data, retryCount = 0) => { + try { + return await riskyOperation(data); + } catch (error) { + if (retryCount < 3) { + console.log(`Retry ${retryCount + 1}/3`); + await new Promise(r => setTimeout(r, 1000 * Math.pow(2, retryCount))); + return await resilientTask.trigger(data, retryCount + 1); + } + throw error; + } + } +}); ``` -## API Reference ๐Ÿ“š +### Task Composition + +Compose complex behaviors from simple tasks: + +```typescript +const compositeTask = new Task({ + name: 'CompositeOperation', + steps: [ + { name: 'validate', description: 'Validating input', percentage: 20 }, + { name: 'process', description: 'Processing data', percentage: 60 }, + { name: 'notify', description: 'Sending notifications', percentage: 20 } + ] as const, + taskFunction: async function(data) { + this.notifyStep('validate'); + const validated = await validationTask.trigger(data); + + this.notifyStep('process'); + const processed = await processingTask.trigger(validated); + + this.notifyStep('notify'); + await notificationTask.trigger(processed); + + return processed; + } +}); +``` + +## ๐Ÿ”ง Configuration ### Task Options -| Option | Type | Description | -| -------------- | ---------- | -------------------------------------- | -| `name` | `string` | Unique identifier for the task | -| `taskFunction` | `Function` | Async function to execute | -| `steps` | `Array` | Step definitions with name, description, percentage | -| `buffered` | `boolean` | Enable buffer management | -| `bufferMax` | `number` | Maximum concurrent executions | -| `execDelay` | `number` | Delay between executions (ms) | -| `timeout` | `number` | Task timeout (ms) | -| `preTask` | `Task` | Task to run before | -| `afterTask` | `Task` | Task to run after | +```typescript +interface TaskOptions { + name?: string; // Task identifier + taskFunction: Function; // Async function to execute + buffered?: boolean; // Enable buffering + bufferMax?: number; // Max concurrent executions + execDelay?: number; // Min delay between executions + timeout?: number; // Task timeout in ms + version?: string; // Task version + steps?: TSteps; // Progress steps configuration + taskSetup?: Function; // One-time setup function + beforeTask?: Function; // Runs before each execution + afterTask?: Function; // Runs after each execution +} +``` -### Task Methods - -| Method | Description | -| ------------------------- | ---------------------------------------------- | -| `trigger(x?)` | Execute the task | -| `notifyStep(stepName)` | Mark a step as active (typed step names!) | -| `getProgress()` | Get current progress percentage (0-100) | -| `getStepsMetadata()` | Get all steps with their current status | -| `getMetadata()` | Get complete task metadata | -| `resetSteps()` | Reset all steps to pending state | - -### TaskManager Methods - -| Method | Description | -| ----------------------------------- | -------------------------------------- | -| `addTask(task)` | Add a task to the manager | -| `addAndScheduleTask(task, cron)` | Add and schedule a task | -| `getTaskByName(name)` | Get a specific task by name | -| `getTaskMetadata(name)` | Get metadata for a specific task | -| `getAllTasksMetadata()` | Get metadata for all tasks | -| `getScheduledTasks()` | Get all scheduled tasks with info | -| `getNextScheduledRuns(limit)` | Get upcoming scheduled executions | -| `addExecuteRemoveTask(task, opts)` | Execute task with lifecycle tracking | -| `triggerTaskByName(name)` | Trigger a task by its name | -| `scheduleTaskByName(name, cron)` | Schedule a task using cron expression | -| `descheduleTaskByName(name)` | Remove task from schedule | -| `start()` | Start the scheduler | -| `stop()` | Stop the scheduler | - -### Taskchain Methods - -| Method | Description | -| ----------------------- | ---------------------- | -| `addTask(task)` | Add task to chain | -| `removeTask(taskName)` | Remove task from chain | -| `trigger(initialValue)` | Execute the chain | -| `reset()` | Reset chain state | - -## Performance Tips ๐ŸŽ๏ธ - -1. **Use buffering for I/O operations**: Prevents overwhelming external services -2. **Leverage parallel execution**: When tasks are independent, run them simultaneously -3. **Implement proper error handling**: Use try-catch in task functions -4. **Monitor task execution**: Use the built-in stats and logging -5. **Set appropriate timeouts**: Prevent hanging tasks from blocking your system -6. **Use step tracking wisely**: Don't create too many granular steps - aim for meaningful progress points - -## Error Handling ๐Ÿ›ก๏ธ +### TaskManager Options ```typescript -const robustTask = new Task({ - name: 'RobustOperation', - steps: [ - { name: 'try', description: 'Attempting operation', percentage: 80 }, - { name: 'retry', description: 'Retrying on failure', percentage: 20 } - ] as const, - taskFunction: async (input) => { - try { - robustTask.notifyStep('try'); - return await riskyOperation(input); - } catch (error) { - // Log error - console.error(`Task failed: ${error.message}`); +const taskManager = new TaskManager({ + maxConcurrentTasks: 10, // Global concurrency limit + defaultTimeout: 30000, // Default task timeout + logLevel: 'info' // Logging verbosity +}); +``` - // Optionally retry - if (error.retryable) { - robustTask.notifyStep('retry'); - return await riskyOperation(input); - } +## ๐Ÿ“Š Monitoring & Observability - // Or return default value - return defaultValue; +### Task Events + +```typescript +task.on('started', () => console.log('Task started')); +task.on('completed', (result) => console.log('Task completed:', result)); +task.on('failed', (error) => console.error('Task failed:', error)); +task.on('stepChange', (step) => console.log('Step:', step.name)); +``` + +### Execution Metrics + +```typescript +const metrics = task.getMetrics(); +console.log({ + totalRuns: metrics.runCount, + averageDuration: metrics.avgDuration, + successRate: metrics.successRate, + lastError: metrics.lastError +}); +``` + +## ๐Ÿงช Testing + +```typescript +import { expect, tap } from '@git.zone/tstest'; +import { Task } from '@push.rocks/taskbuffer'; + +tap.test('Task should execute with progress tracking', async () => { + const task = new Task({ + name: 'TestTask', + steps: [ + { name: 'step1', description: 'Step 1', percentage: 50 }, + { name: 'step2', description: 'Step 2', percentage: 50 } + ] as const, + taskFunction: async function() { + this.notifyStep('step1'); + await new Promise(r => setTimeout(r, 100)); + this.notifyStep('step2'); + return 'done'; } - }, - timeout: 5000, // Fail if takes longer than 5 seconds + }); + + const result = await task.trigger(); + expect(result).toEqual('done'); + expect(task.getProgress()).toEqual(100); }); ``` -## Real-World Examples ๐ŸŒ +## ๐ŸŒ Real-World Examples -### API Rate Limiting with Progress +### API Rate Limiter ```typescript -const apiClient = new Task({ - name: 'RateLimitedAPI', - steps: [ - { name: 'wait', description: 'Rate limit delay', percentage: 10 }, - { name: 'call', description: 'API call', percentage: 90 } - ] as const, - taskFunction: async (endpoint: string) => { - apiClient.notifyStep('wait'); - await delay(100); // Rate limiting - - apiClient.notifyStep('call'); - return await fetch(`https://api.example.com${endpoint}`); - }, +const apiLimiter = new Task({ + name: 'APIRateLimiter', buffered: true, - bufferMax: 10, // 10 requests - execDelay: 100, // Per 100ms = 100 req/s max + bufferMax: 10, // Max 10 requests per second + execDelay: 100, // 100ms between requests + taskFunction: async (endpoint, data) => { + return await fetch(endpoint, { + method: 'POST', + body: JSON.stringify(data) + }); + } }); ``` -### Database Migration Pipeline with Progress +### Database Migration Pipeline ```typescript const migrationChain = new Taskchain({ name: 'DatabaseMigration', - taskArray: [ - new Task({ - name: 'Backup', - steps: [{ name: 'backup', description: 'Creating backup', percentage: 100 }] as const, - taskFunction: async () => { - backupTask.notifyStep('backup'); - return await createBackup(); - } - }), - new Task({ - name: 'SchemaUpdate', - steps: [ - { name: 'analyze', description: 'Analyzing changes', percentage: 30 }, - { name: 'apply', description: 'Applying migrations', percentage: 70 } - ] as const, - taskFunction: async () => { - schemaTask.notifyStep('analyze'); - const changes = await analyzeSchema(); - - schemaTask.notifyStep('apply'); - return await applyMigrations(changes); - } - }), - // ... more tasks - ], + tasks: [ + backupDatabaseTask, + validateSchemaTask, + runMigrationsTask, + verifyIntegrityTask, + updateIndexesTask + ] }); -// Execute with progress monitoring -const result = await migrationChain.trigger(); +// Execute with rollback on failure +try { + await migrationChain.trigger(); + console.log('Migration successful!'); +} catch (error) { + await rollbackTask.trigger(); + throw error; +} ``` -### Microservice Health Monitoring Dashboard +### Distributed Job Queue ```typescript -const healthMonitor = new TaskManager(); +const jobQueue = new TaskManager(); -services.forEach((service) => { - const healthCheck = new Task({ - name: `HealthCheck:${service.name}`, - steps: [ - { name: 'ping', description: 'Pinging service', percentage: 30 }, - { name: 'check', description: 'Checking health', percentage: 50 }, - { name: 'report', description: 'Reporting status', percentage: 20 } - ] as const, - taskFunction: async () => { - healthCheck.notifyStep('ping'); - const responsive = await ping(service.url); - - healthCheck.notifyStep('check'); - const healthy = await checkHealth(service.url); - - healthCheck.notifyStep('report'); - if (!healthy) { - await alertOps(service); - } - - return { service: service.name, healthy, timestamp: Date.now() }; - }, - }); - - healthMonitor.addAndScheduleTask(healthCheck, '*/1 * * * *'); // Every minute +// Worker tasks +const imageProcessor = new Task({ + name: 'ImageProcessor', + buffered: true, + bufferMax: 5, + steps: [ + { name: 'download', description: 'Downloading', percentage: 20 }, + { name: 'resize', description: 'Resizing', percentage: 40 }, + { name: 'optimize', description: 'Optimizing', percentage: 30 }, + { name: 'upload', description: 'Uploading', percentage: 10 } + ] as const, + taskFunction: async function(job) { + this.notifyStep('download'); + const image = await downloadImage(job.url); + + this.notifyStep('resize'); + const resized = await resizeImage(image, job.dimensions); + + this.notifyStep('optimize'); + const optimized = await optimizeImage(resized); + + this.notifyStep('upload'); + return await uploadToCDN(optimized); + } }); -// Dashboard endpoint -app.get('/api/health/dashboard', (req, res) => { - const metadata = healthMonitor.getAllTasksMetadata(); - res.json({ - services: metadata.map(task => ({ - name: task.name.replace('HealthCheck:', ''), - status: task.status, - lastCheck: task.lastRun, - nextCheck: healthMonitor.getScheduledTasks() - .find(s => s.name === task.name)?.nextRun, - progress: task.currentProgress, - currentStep: task.currentStep - })) - }); +jobQueue.addTask(imageProcessor); + +// Process incoming jobs +messageQueue.on('job', async (job) => { + const result = await jobQueue.getTaskByName('ImageProcessor').trigger(job); + await messageQueue.ack(job.id, result); }); ``` -## Testing ๐Ÿงช +## ๐Ÿš€ Performance Tips + +1. **Use Buffering Wisely** - Enable buffering for I/O-bound tasks +2. **Set Appropriate Delays** - Use `execDelay` to prevent API rate limits +3. **Leverage Task Pools** - Distribute load across multiple task instances +4. **Monitor Progress** - Use step tracking for long-running operations +5. **Clean Up** - Use `addExecuteRemoveTask` for one-time operations + +## ๐Ÿ” Debugging + +Enable detailed logging: ```typescript -import { expect, tap } from '@git.zone/tstest'; -import { Task, TaskStep } from '@push.rocks/taskbuffer'; +import { logger } from '@push.rocks/smartlog'; -tap.test('should track task progress through steps', async () => { - const task = new Task({ - name: 'TestTask', - steps: [ - { name: 'step1', description: 'First step', percentage: 50 }, - { name: 'step2', description: 'Second step', percentage: 50 } - ] as const, - taskFunction: async () => { - task.notifyStep('step1'); - expect(task.getProgress()).toBeLessThanOrEqual(50); - - task.notifyStep('step2'); - expect(task.getProgress()).toBeLessThanOrEqual(100); - } - }); - - await task.trigger(); - expect(task.getProgress()).toEqual(100); -}); +logger.enableConsole(); +logger.level = 'debug'; -tap.test('should collect execution metadata', async () => { - const manager = new TaskManager(); - const task = new Task({ - name: 'MetadataTest', - taskFunction: async () => 'result' - }); - - const report = await manager.addExecuteRemoveTask(task); - expect(report.taskName).toEqual('MetadataTest'); - expect(report.result).toEqual('result'); - expect(report.duration).toBeGreaterThan(0); -}); - -tap.start(); +// Tasks will now output detailed execution logs ``` -## Support ๐Ÿ’ฌ +## ๐Ÿ“š API Reference -- ๐Ÿ“ง Email: [hello@task.vc](mailto:hello@task.vc) -- ๐Ÿ› Issues: [GitHub Issues](https://github.com/push-rocks/taskbuffer/issues) -- ๐Ÿ“– Docs: [Documentation](https://code.foss.global/push.rocks/taskbuffer) +### Core Classes + +- **`Task`** - Basic task unit with optional step tracking +- **`TaskManager`** - Central orchestrator for task management +- **`Taskchain`** - Sequential task executor +- **`TaskParallel`** - Concurrent task executor +- **`TaskOnce`** - Single-execution task +- **`TaskLoop`** - Repeating task with conditions + +### Key Methods + +#### Task Methods +- `trigger(input?: T): Promise` - Execute the task +- `notifyStep(stepName: StepNames): void` - Update current step +- `getProgress(): number` - Get progress percentage (0-100) +- `getStepsMetadata(): ITaskStep[]` - Get detailed step information +- `getMetadata(): ITaskMetadata` - Get complete task metadata + +#### TaskManager Methods +- `addTask(task: Task): void` - Register a task +- `getTaskByName(name: string): Task | undefined` - Retrieve task by name +- `addAndScheduleTask(task: Task, cronExpression: string): void` - Schedule task +- `descheduleTaskByName(name: string): void` - Remove scheduling +- `getTaskMetadata(name: string): ITaskMetadata | null` - Get task metadata +- `getAllTasksMetadata(): ITaskMetadata[]` - Get all tasks metadata +- `getScheduledTasks(): IScheduledTaskInfo[]` - List scheduled tasks +- `addExecuteRemoveTask(task, options?): Promise` - Execute once ## License and Legal Information diff --git a/test/test.10.webcomponent.browser.ts b/test/test.10.webcomponent.browser.ts new file mode 100644 index 0000000..e0224dc --- /dev/null +++ b/test/test.10.webcomponent.browser.ts @@ -0,0 +1,141 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import * as taskbuffer from '../ts/index.js'; + +// Note: Web components can't be tested directly in Node.js environment +// These tests verify the data structures that the web component will consume + +// Test that TaskManager can provide data for web component +tap.test('TaskManager should provide metadata for web visualization', async () => { + const taskManager = new taskbuffer.TaskManager(); + + // Add a task with steps + const visualTask = new taskbuffer.Task({ + name: 'VisualizationTest', + steps: [ + { name: 'load', description: 'Loading data', percentage: 30 }, + { name: 'process', description: 'Processing', percentage: 50 }, + { name: 'render', description: 'Rendering', percentage: 20 }, + ] as const, + taskFunction: async () => { + visualTask.notifyStep('load'); + await new Promise(resolve => setTimeout(resolve, 50)); + visualTask.notifyStep('process'); + await new Promise(resolve => setTimeout(resolve, 50)); + visualTask.notifyStep('render'); + return 'Visualization complete'; + }, + }); + + taskManager.addTask(visualTask); + + // Get metadata before execution + let metadata = taskManager.getTaskMetadata('VisualizationTest'); + expect(metadata).toBeDefined(); + expect(metadata!.name).toEqual('VisualizationTest'); + expect(metadata!.steps).toHaveLength(3); + expect(metadata!.currentProgress).toEqual(0); + + // Execute task + await visualTask.trigger(); + + // Get metadata after execution + metadata = taskManager.getTaskMetadata('VisualizationTest'); + expect(metadata!.currentProgress).toEqual(100); + expect(metadata!.steps.every(s => s.status === 'completed')).toBeTrue(); +}); + +// Test scheduled task metadata for web display +tap.test('Scheduled tasks should provide next run information', async () => { + const taskManager = new taskbuffer.TaskManager(); + + const scheduledTask = new taskbuffer.Task({ + name: 'WebScheduledTask', + steps: [ + { name: 'run', description: 'Running scheduled task', percentage: 100 }, + ] as const, + taskFunction: async () => { + scheduledTask.notifyStep('run'); + }, + }); + + // Schedule task for every hour + taskManager.addAndScheduleTask(scheduledTask, '0 * * * *'); + + // Get scheduled tasks info + const scheduledTasks = taskManager.getScheduledTasks(); + expect(scheduledTasks).toHaveLength(1); + expect(scheduledTasks[0].name).toEqual('WebScheduledTask'); + expect(scheduledTasks[0].schedule).toEqual('0 * * * *'); + expect(scheduledTasks[0].nextRun).toBeInstanceOf(Date); + expect(scheduledTasks[0].steps).toHaveLength(1); + + // Clean up + taskManager.descheduleTaskByName('WebScheduledTask'); + taskManager.stop(); +}); + +// Test data structure compatibility +tap.test('Task metadata should be suitable for web component display', async () => { + const taskManager = new taskbuffer.TaskManager(); + + // Add various types of tasks + const simpleTask = new taskbuffer.Task({ + name: 'SimpleWebTask', + taskFunction: async () => 'done', + }); + + const bufferedTask = new taskbuffer.Task({ + name: 'BufferedWebTask', + buffered: true, + bufferMax: 3, + taskFunction: async () => 'buffered', + }); + + const steppedTask = new taskbuffer.Task({ + name: 'SteppedWebTask', + steps: [ + { name: 'step1', description: 'First step', percentage: 50 }, + { name: 'step2', description: 'Second step', percentage: 50 }, + ] as const, + taskFunction: async () => { + steppedTask.notifyStep('step1'); + steppedTask.notifyStep('step2'); + }, + }); + + taskManager.addTask(simpleTask); + taskManager.addTask(bufferedTask); + taskManager.addTask(steppedTask); + + // Get all metadata + const allMetadata = taskManager.getAllTasksMetadata(); + expect(allMetadata).toHaveLength(3); + + // Verify metadata structure + allMetadata.forEach(meta => { + expect(meta.name).toBeDefined(); + expect(meta.status).toBeDefined(); + expect(meta.runCount).toBeDefined(); + expect(meta.steps).toBeDefined(); + expect(Array.isArray(meta.steps)).toBeTrue(); + expect(meta.currentProgress).toBeDefined(); + expect(typeof meta.currentProgress).toEqual('number'); + }); + + // Verify buffered task metadata + const bufferedMeta = allMetadata.find(m => m.name === 'BufferedWebTask'); + expect(bufferedMeta!.buffered).toBeTrue(); + expect(bufferedMeta!.bufferMax).toEqual(3); + + // Verify stepped task metadata + const steppedMeta = allMetadata.find(m => m.name === 'SteppedWebTask'); + expect(steppedMeta!.steps).toHaveLength(2); + steppedMeta!.steps.forEach(step => { + expect(step.name).toBeDefined(); + expect(step.description).toBeDefined(); + expect(step.percentage).toBeDefined(); + expect(step.status).toBeDefined(); + }); +}); + +export default tap.start(); \ No newline at end of file diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 082bf4c..6b0b8d5 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/taskbuffer', - version: '3.2.0', + version: '3.4.0', description: 'A flexible task management library supporting TypeScript, allowing for task buffering, scheduling, and execution with dependency management.' } diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index 082bf4c..6b0b8d5 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/taskbuffer', - version: '3.2.0', + version: '3.4.0', description: 'A flexible task management library supporting TypeScript, allowing for task buffering, scheduling, and execution with dependency management.' } diff --git a/ts_web/elements/taskbuffer-dashboard.demo.ts b/ts_web/elements/taskbuffer-dashboard.demo.ts new file mode 100644 index 0000000..31ec771 --- /dev/null +++ b/ts_web/elements/taskbuffer-dashboard.demo.ts @@ -0,0 +1,311 @@ +import { html, css, cssManager } from '@design.estate/dees-element'; +import { TaskManager, Task } from '../../ts/index.js'; +import '../taskbuffer-dashboard.js'; + +export const demoFunc = () => html` + + +
+

TaskBuffer Dashboard Demo

+

Real-time visualization of task execution, progress tracking, and scheduling

+ + { + // Create TaskManager instance + const taskManager = new TaskManager(); + + // Get dashboard element + const dashboard = element.querySelector('taskbuffer-dashboard'); + dashboard.taskManager = taskManager; + dashboard.refreshInterval = 500; + + // Task counter for unique names + let taskCounter = 0; + + // Helper to create random delay + const randomDelay = () => new Promise(resolve => + setTimeout(resolve, Math.random() * 2000 + 500) + ); + + // Add initial demo tasks + const addDemoTasks = () => { + // Add simple task + const simpleTask = new Task({ + name: `SimpleTask_${++taskCounter}`, + taskFunction: async () => { + console.log(`Executing SimpleTask_${taskCounter}`); + await randomDelay(); + return `Result from SimpleTask_${taskCounter}`; + } + }); + taskManager.addTask(simpleTask); + + // Add task with steps + const steppedTask = new Task({ + name: `SteppedTask_${++taskCounter}`, + steps: [ + { name: 'init', description: 'Initializing', percentage: 20 }, + { name: 'fetch', description: 'Fetching data', percentage: 30 }, + { name: 'process', description: 'Processing', percentage: 35 }, + { name: 'save', description: 'Saving results', percentage: 15 } + ], + taskFunction: async function() { + this.notifyStep('init'); + await randomDelay(); + this.notifyStep('fetch'); + await randomDelay(); + this.notifyStep('process'); + await randomDelay(); + this.notifyStep('save'); + await randomDelay(); + return `Completed SteppedTask_${taskCounter}`; + } + }); + taskManager.addTask(steppedTask); + + // Add buffered task + const bufferedTask = new Task({ + name: `BufferedTask_${++taskCounter}`, + buffered: true, + bufferMax: 3, + steps: [ + { name: 'buffer', description: 'Processing buffered item', percentage: 100 } + ], + taskFunction: async function(item) { + this.notifyStep('buffer'); + console.log(`Processing buffered item: ${item}`); + await randomDelay(); + return `Buffered task ${taskCounter} processed: ${item}`; + } + }); + taskManager.addTask(bufferedTask); + }; + + // Add initial tasks + addDemoTasks(); + + // Automatically trigger some tasks + setTimeout(() => { + const tasks = taskManager.getAllTasksMetadata(); + tasks.forEach(taskMeta => { + const task = taskManager.getTaskByName(taskMeta.name); + if (task && !taskMeta.name.includes('Scheduled')) { + if (taskMeta.buffered) { + // Trigger buffered task multiple times + for (let i = 0; i < 5; i++) { + task.trigger(`Data_${i}`); + } + } else { + task.trigger(); + } + } + }); + }, 2000); + }} + > + + + + { + // Create TaskManager instance + const taskManager = new TaskManager(); + + // Get dashboard element + const dashboard = element.querySelector('taskbuffer-dashboard'); + dashboard.taskManager = taskManager; + dashboard.refreshInterval = 1000; + + // Add scheduled tasks + const scheduledTask1 = new Task({ + name: 'HourlyBackup', + steps: [ + { name: 'prepare', description: 'Preparing backup', percentage: 30 }, + { name: 'backup', description: 'Creating backup', percentage: 50 }, + { name: 'verify', description: 'Verifying backup', percentage: 20 } + ], + taskFunction: async function() { + this.notifyStep('prepare'); + await new Promise(resolve => setTimeout(resolve, 1000)); + this.notifyStep('backup'); + await new Promise(resolve => setTimeout(resolve, 2000)); + this.notifyStep('verify'); + await new Promise(resolve => setTimeout(resolve, 500)); + return 'Backup completed'; + } + }); + + const scheduledTask2 = new Task({ + name: 'DailyReport', + steps: [ + { name: 'collect', description: 'Collecting data', percentage: 40 }, + { name: 'analyze', description: 'Analyzing data', percentage: 40 }, + { name: 'send', description: 'Sending report', percentage: 20 } + ], + taskFunction: async function() { + this.notifyStep('collect'); + await new Promise(resolve => setTimeout(resolve, 1500)); + this.notifyStep('analyze'); + await new Promise(resolve => setTimeout(resolve, 1500)); + this.notifyStep('send'); + await new Promise(resolve => setTimeout(resolve, 500)); + return 'Report sent'; + } + }); + + // Schedule tasks + taskManager.addAndScheduleTask(scheduledTask1, '0 * * * *'); // Every hour + taskManager.addAndScheduleTask(scheduledTask2, '0 0 * * *'); // Daily at midnight + + // Also add them as regular tasks for demo + const demoTask = new Task({ + name: 'DemoScheduledExecution', + steps: [ + { name: 'execute', description: 'Simulating scheduled execution', percentage: 100 } + ], + taskFunction: async function() { + this.notifyStep('execute'); + await new Promise(resolve => setTimeout(resolve, 1000)); + + // Trigger scheduled tasks for demo + scheduledTask1.trigger(); + scheduledTask2.trigger(); + + return 'Triggered scheduled tasks for demo'; + } + }); + taskManager.addTask(demoTask); + + // Trigger demo after 2 seconds + setTimeout(() => { + demoTask.trigger(); + }, 2000); + }} + > + + + + { + // Create TaskManager instance + const taskManager = new TaskManager(); + + // Get dashboard element + const dashboard = element.querySelector('taskbuffer-dashboard'); + dashboard.taskManager = taskManager; + dashboard.refreshInterval = 300; + + // Add control buttons + const controlsDiv = document.createElement('div'); + controlsDiv.style.cssText = ` + display: flex; + gap: 8px; + margin-bottom: 16px; + flex-wrap: wrap; + `; + + const createButton = (text, onClick, style = '') => { + const button = document.createElement('button'); + button.textContent = text; + button.style.cssText = ` + padding: 8px 16px; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 14px; + transition: all 0.2s; + ${style} + `; + button.onclick = onClick; + return button; + }; + + let taskCounter = 0; + + // Add task button + controlsDiv.appendChild(createButton('Add Task', () => { + const task = new Task({ + name: `Task_${++taskCounter}`, + steps: [ + { name: 'step1', description: 'Step 1', percentage: 33 }, + { name: 'step2', description: 'Step 2', percentage: 33 }, + { name: 'step3', description: 'Step 3', percentage: 34 } + ], + taskFunction: async function() { + for (const step of ['step1', 'step2', 'step3']) { + this.notifyStep(step); + await new Promise(resolve => setTimeout(resolve, 1000)); + } + return `Task_${taskCounter} completed`; + } + }); + taskManager.addTask(task); + }, 'background: #3b82f6; color: white;')); + + // Trigger all button + controlsDiv.appendChild(createButton('Trigger All', () => { + const tasks = taskManager.getAllTasksMetadata(); + tasks.forEach(taskMeta => { + const task = taskManager.getTaskByName(taskMeta.name); + if (task) { + task.trigger(); + } + }); + }, 'background: #22c55e; color: white;')); + + // Clear all button + controlsDiv.appendChild(createButton('Clear All', () => { + const tasks = taskManager.getAllTasksMetadata(); + tasks.forEach(taskMeta => { + const task = taskManager.getTaskByName(taskMeta.name); + if (task) { + taskManager.taskMap.remove(task); + taskManager.descheduleTaskByName(taskMeta.name); + } + }); + }, 'background: #ef4444; color: white;')); + + element.insertBefore(controlsDiv, dashboard); + + // Add some initial tasks + for (let i = 0; i < 3; i++) { + controlsDiv.querySelector('button').click(); + } + }} + > + + +
+`; \ No newline at end of file diff --git a/ts_web/index.ts b/ts_web/index.ts new file mode 100644 index 0000000..5d6c696 --- /dev/null +++ b/ts_web/index.ts @@ -0,0 +1,12 @@ +// Export web components +export * from './taskbuffer-dashboard.js'; + +// Export types from main module for web usage +export type { + TaskManager, + Task, + ITaskMetadata, + ITaskExecutionReport, + IScheduledTaskInfo, + ITaskStep +} from '../ts/index.js'; \ No newline at end of file diff --git a/ts_web/taskbuffer-dashboard.ts b/ts_web/taskbuffer-dashboard.ts new file mode 100644 index 0000000..407613d --- /dev/null +++ b/ts_web/taskbuffer-dashboard.ts @@ -0,0 +1,541 @@ +import { DeesElement, customElement, html, css, property, state, cssManager } from '@design.estate/dees-element'; +import type { TaskManager, ITaskMetadata, IScheduledTaskInfo } from '../ts/index.js'; + +/** + * A web component that displays TaskManager tasks with progress visualization + */ +@customElement('taskbuffer-dashboard') +export class TaskbufferDashboard extends DeesElement { + // Properties + @property({ type: Object }) + public taskManager: TaskManager | null = null; + + @property({ type: Number }) + public refreshInterval: number = 1000; // milliseconds + + // Internal state + @state() + private tasks: ITaskMetadata[] = []; + + @state() + private scheduledTasks: IScheduledTaskInfo[] = []; + + @state() + private isRunning: boolean = false; + + private refreshTimer: any; + + // Styles + static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + } + + .dashboard-container { + padding: 24px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + min-height: 100vh; + } + + .dashboard-header { + margin-bottom: 32px; + } + + .dashboard-title { + font-size: 28px; + font-weight: 700; + color: ${cssManager.bdTheme('#09090b', '#fafafa')}; + margin-bottom: 8px; + display: flex; + align-items: center; + gap: 12px; + } + + .status-indicator { + width: 12px; + height: 12px; + border-radius: 50%; + background: ${cssManager.bdTheme('#22c55e', '#22c55e')}; + animation: pulse 2s infinite; + } + + .status-indicator.inactive { + background: ${cssManager.bdTheme('#94a3b8', '#475569')}; + animation: none; + } + + @keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + } + + .dashboard-subtitle { + font-size: 14px; + color: ${cssManager.bdTheme('#71717a', '#a1a1aa')}; + } + + .tasks-section { + margin-bottom: 48px; + } + + .section-title { + font-size: 20px; + font-weight: 600; + color: ${cssManager.bdTheme('#18181b', '#e4e4e7')}; + margin-bottom: 16px; + } + + .tasks-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 16px; + } + + .task-card { + background: ${cssManager.bdTheme('#f8fafc', '#18181b')}; + border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')}; + border-radius: 12px; + padding: 20px; + transition: all 0.2s ease; + } + + .task-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px ${cssManager.bdTheme('rgba(0,0,0,0.1)', 'rgba(0,0,0,0.3)')}; + } + + .task-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 12px; + } + + .task-name { + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')}; + } + + .task-status { + display: inline-block; + padding: 4px 8px; + border-radius: 6px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + } + + .task-status.idle { + background: ${cssManager.bdTheme('#f1f5f9', '#27272a')}; + color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; + } + + .task-status.running { + background: ${cssManager.bdTheme('#dbeafe', '#1e3a8a')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + + .task-status.completed { + background: ${cssManager.bdTheme('#dcfce7', '#14532d')}; + color: ${cssManager.bdTheme('#15803d', '#86efac')}; + } + + .task-status.failed { + background: ${cssManager.bdTheme('#fee2e2', '#7f1d1d')}; + color: ${cssManager.bdTheme('#dc2626', '#fca5a5')}; + } + + .task-info { + display: flex; + gap: 16px; + margin-bottom: 16px; + font-size: 13px; + color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; + } + + .task-info-item { + display: flex; + align-items: center; + gap: 4px; + } + + .task-info-icon { + width: 14px; + height: 14px; + opacity: 0.7; + } + + .progress-container { + margin-bottom: 16px; + } + + .progress-label { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 13px; + color: ${cssManager.bdTheme('#475569', '#cbd5e1')}; + } + + .progress-bar { + height: 8px; + background: ${cssManager.bdTheme('#e2e8f0', '#27272a')}; + border-radius: 4px; + overflow: hidden; + position: relative; + } + + .progress-fill { + height: 100%; + background: linear-gradient(90deg, #3b82f6, #6366f1); + border-radius: 4px; + transition: width 0.3s ease; + position: relative; + overflow: hidden; + } + + .progress-fill::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient( + 90deg, + transparent, + rgba(255, 255, 255, 0.3), + transparent + ); + animation: shimmer 2s infinite; + } + + @keyframes shimmer { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } + } + + .steps-container { + border-top: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')}; + padding-top: 12px; + } + + .steps-title { + font-size: 12px; + font-weight: 600; + color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; + margin-bottom: 8px; + text-transform: uppercase; + letter-spacing: 0.5px; + } + + .step-item { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 0; + font-size: 13px; + } + + .step-indicator { + width: 20px; + height: 20px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 600; + flex-shrink: 0; + } + + .step-indicator.pending { + background: ${cssManager.bdTheme('#f1f5f9', '#27272a')}; + color: ${cssManager.bdTheme('#94a3b8', '#64748b')}; + border: 2px solid ${cssManager.bdTheme('#cbd5e1', '#3f3f46')}; + } + + .step-indicator.active { + background: linear-gradient(135deg, #3b82f6, #6366f1); + color: white; + animation: pulse 1.5s infinite; + } + + .step-indicator.completed { + background: ${cssManager.bdTheme('#22c55e', '#22c55e')}; + color: white; + } + + .step-details { + flex: 1; + } + + .step-name { + font-weight: 500; + color: ${cssManager.bdTheme('#1e293b', '#e2e8f0')}; + } + + .step-description { + font-size: 11px; + color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; + margin-top: 2px; + } + + .step-percentage { + font-size: 11px; + font-weight: 600; + color: ${cssManager.bdTheme('#94a3b8', '#64748b')}; + } + + .empty-state { + text-align: center; + padding: 48px; + color: ${cssManager.bdTheme('#94a3b8', '#64748b')}; + } + + .empty-state-icon { + width: 64px; + height: 64px; + margin: 0 auto 16px; + opacity: 0.3; + } + + .empty-state-text { + font-size: 16px; + margin-bottom: 8px; + } + + .empty-state-subtext { + font-size: 14px; + color: ${cssManager.bdTheme('#cbd5e1', '#475569')}; + } + + .scheduled-section { + margin-top: 32px; + } + + .schedule-info { + display: flex; + align-items: center; + gap: 8px; + margin-top: 8px; + font-size: 12px; + color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; + } + + .schedule-icon { + width: 14px; + height: 14px; + } + `, + ]; + + // Lifecycle + async connectedCallback() { + await super.connectedCallback(); + this.startRefreshing(); + } + + async disconnectedCallback() { + await super.disconnectedCallback(); + this.stopRefreshing(); + } + + // Methods + private startRefreshing() { + if (this.refreshTimer) { + clearInterval(this.refreshTimer); + } + + this.updateData(); + this.refreshTimer = setInterval(() => { + this.updateData(); + }, this.refreshInterval); + this.isRunning = true; + } + + private stopRefreshing() { + if (this.refreshTimer) { + clearInterval(this.refreshTimer); + this.refreshTimer = null; + } + this.isRunning = false; + } + + private updateData() { + if (!this.taskManager) { + this.tasks = []; + this.scheduledTasks = []; + return; + } + + this.tasks = this.taskManager.getAllTasksMetadata(); + this.scheduledTasks = this.taskManager.getScheduledTasks(); + } + + private formatNextRun(date: Date): string { + const now = new Date(); + const diff = date.getTime() - now.getTime(); + + if (diff < 0) return 'Past due'; + if (diff < 60000) return 'Less than a minute'; + if (diff < 3600000) return `${Math.floor(diff / 60000)} minutes`; + if (diff < 86400000) return `${Math.floor(diff / 3600000)} hours`; + return `${Math.floor(diff / 86400000)} days`; + } + + private formatDuration(ms?: number): string { + if (!ms) return '-'; + if (ms < 1000) return `${ms}ms`; + if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; + return `${(ms / 60000).toFixed(1)}m`; + } + + // Render + render() { + return html` +
+
+
+ TaskBuffer Dashboard + +
+
+ ${this.tasks.length} task${this.tasks.length !== 1 ? 's' : ''} registered + ${this.scheduledTasks.length > 0 ? ` โ€ข ${this.scheduledTasks.length} scheduled` : ''} +
+
+ +
+

Active Tasks

+ + ${this.tasks.length > 0 ? html` +
+ ${this.tasks.map(task => this.renderTaskCard(task))} +
+ ` : html` +
+ + + +
No tasks registered
+
Tasks will appear here when added to the TaskManager
+
+ `} +
+ + ${this.scheduledTasks.length > 0 ? html` +
+

Scheduled Tasks

+
+ ${this.scheduledTasks.map(task => this.renderScheduledTaskCard(task))} +
+
+ ` : ''} +
+ `; + } + + private renderTaskCard(task: ITaskMetadata) { + return html` +
+
+
${task.name || 'Unnamed Task'}
+
${task.status}
+
+ +
+
+ + + + Run ${task.runCount || 0} times +
+ ${task.buffered ? html` +
+ + + + Buffer: ${task.bufferMax || 0} +
+ ` : ''} +
+ + ${task.steps && task.steps.length > 0 ? html` +
+
+ Progress + ${task.currentProgress || 0}% +
+
+
+
+
+ +
+
Steps
+ ${task.steps.map(step => html` +
+
+ ${step.status === 'completed' ? 'โœ“' : + step.status === 'active' ? 'โ€ข' : + ''} +
+
+
${step.name}
+ ${step.description ? html` +
${step.description}
+ ` : ''} +
+
${step.percentage}%
+
+ `)} +
+ ` : ''} +
+ `; + } + + private renderScheduledTaskCard(task: IScheduledTaskInfo) { + return html` +
+
+
${task.name}
+
scheduled
+
+ +
+ + + + Next run: ${this.formatNextRun(task.nextRun)} +
+ +
+ + + + Schedule: ${task.schedule} +
+
+ `; + } +} \ No newline at end of file