karajan-code 3.2.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/node_modules/@karajan/core/README.md +42 -0
- package/node_modules/@karajan/core/package.json +38 -0
- package/node_modules/@karajan/core/src/atomic-write.js +43 -0
- package/node_modules/@karajan/core/src/cost/index.js +102 -0
- package/node_modules/@karajan/core/src/hu-snapshot.js +105 -0
- package/node_modules/@karajan/core/src/index.js +18 -0
- package/node_modules/@karajan/core/src/paths.js +123 -0
- package/node_modules/@karajan/core/src/plan-hu-ops.js +338 -0
- package/node_modules/@karajan/core/src/plan-id.js +45 -0
- package/node_modules/@karajan/core/src/plan-validation.js +82 -0
- package/node_modules/@karajan/core/src/port-check.js +45 -0
- package/node_modules/@karajan/core/src/pricing/index.js +64 -0
- package/node_modules/@karajan/core/src/pricing/model-pricing.json +28 -0
- package/node_modules/@karajan/core/src/process.js +188 -0
- package/node_modules/@karajan/core/src/run-registry.js +115 -0
- package/node_modules/@karajan/core/src/shared-paths.js +41 -0
- package/node_modules/@karajan/core/src/standby-scheduler.js +92 -0
- package/node_modules/@karajan/core/src/standby-store.js +168 -0
- package/node_modules/@karajan/core/src/vec-store.js +253 -0
- package/node_modules/@karajan/core/tests/atomic-write.test.js +30 -0
- package/node_modules/@karajan/core/tests/cost/index.test.js +89 -0
- package/node_modules/@karajan/core/tests/hu-snapshot.test.js +39 -0
- package/node_modules/@karajan/core/tests/paths.test.js +51 -0
- package/node_modules/@karajan/core/tests/plan-hu-ops.test.js +68 -0
- package/node_modules/@karajan/core/tests/plan-id.test.js +21 -0
- package/node_modules/@karajan/core/tests/plan-validation.test.js +39 -0
- package/node_modules/@karajan/core/tests/port-check.test.js +47 -0
- package/node_modules/@karajan/core/tests/pricing/index.test.js +95 -0
- package/node_modules/@karajan/core/tests/process.test.js +22 -0
- package/node_modules/@karajan/core/tests/run-registry.test.js +71 -0
- package/node_modules/@karajan/core/tests/shared-paths.test.js +30 -0
- package/node_modules/@karajan/core/tests/standby.test.js +66 -0
- package/node_modules/@karajan/core/tests/vec-store.test.js +98 -0
- package/node_modules/@karajan/core/vitest.config.js +12 -0
- package/node_modules/@sec-ant/readable-stream/LICENSE +21 -0
- package/node_modules/@sec-ant/readable-stream/README.md +230 -0
- package/node_modules/@sec-ant/readable-stream/dist/core/asyncIterablePrototype.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/core/asyncIterator.d.ts +27 -0
- package/node_modules/@sec-ant/readable-stream/dist/core/fromAnyIterable.d.ts +6 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/asyncIterator.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/asyncIterator.js +5 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/fromAnyIterable.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/fromAnyIterable.js +5 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/index.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/index.js +8 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/asyncIterator.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/asyncIterator.js +3 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/fromAnyIterable.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/fromAnyIterable.js +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/index.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/index.js +4 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/asyncIterator.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/asyncIterator.js +89 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/fromAnyIterable.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/fromAnyIterable.js +34 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/index.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/index.js +6 -0
- package/node_modules/@sec-ant/readable-stream/dist/types/async-iterator.d.ts +11 -0
- package/node_modules/@sec-ant/readable-stream/package.json +96 -0
- package/node_modules/@sindresorhus/merge-streams/index.d.ts +44 -0
- package/node_modules/@sindresorhus/merge-streams/index.js +265 -0
- package/node_modules/@sindresorhus/merge-streams/license +9 -0
- package/node_modules/@sindresorhus/merge-streams/package.json +49 -0
- package/node_modules/@sindresorhus/merge-streams/readme.md +53 -0
- package/node_modules/base64-js/LICENSE +21 -0
- package/node_modules/base64-js/README.md +34 -0
- package/node_modules/base64-js/base64js.min.js +1 -0
- package/node_modules/base64-js/index.d.ts +3 -0
- package/node_modules/base64-js/index.js +150 -0
- package/node_modules/base64-js/package.json +47 -0
- package/node_modules/better-sqlite3/LICENSE +21 -0
- package/node_modules/better-sqlite3/README.md +99 -0
- package/node_modules/better-sqlite3/binding.gyp +38 -0
- package/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
- package/node_modules/better-sqlite3/deps/common.gypi +68 -0
- package/node_modules/better-sqlite3/deps/copy.js +31 -0
- package/node_modules/better-sqlite3/deps/defines.gypi +42 -0
- package/node_modules/better-sqlite3/deps/download.sh +123 -0
- package/node_modules/better-sqlite3/deps/patches/1208.patch +15 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +268879 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +14335 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +739 -0
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +80 -0
- package/node_modules/better-sqlite3/deps/test_extension.c +21 -0
- package/node_modules/better-sqlite3/lib/database.js +90 -0
- package/node_modules/better-sqlite3/lib/index.js +3 -0
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
- package/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
- package/node_modules/better-sqlite3/lib/methods/function.js +31 -0
- package/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
- package/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
- package/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
- package/node_modules/better-sqlite3/lib/methods/table.js +189 -0
- package/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
- package/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
- package/node_modules/better-sqlite3/lib/util.js +12 -0
- package/node_modules/better-sqlite3/package.json +59 -0
- package/node_modules/better-sqlite3/src/addon.cpp +47 -0
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +74 -0
- package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
- package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
- package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
- package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
- package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
- package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
- package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
- package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
- package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
- package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
- package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
- package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
- package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
- package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
- package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
- package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
- package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
- package/node_modules/better-sqlite3/src/util/macros.cpp +83 -0
- package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
- package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
- package/node_modules/bindings/LICENSE.md +22 -0
- package/node_modules/bindings/README.md +98 -0
- package/node_modules/bindings/bindings.js +221 -0
- package/node_modules/bindings/package.json +28 -0
- package/node_modules/bl/.travis.yml +17 -0
- package/node_modules/bl/BufferList.js +396 -0
- package/node_modules/bl/LICENSE.md +13 -0
- package/node_modules/bl/README.md +247 -0
- package/node_modules/bl/bl.js +84 -0
- package/node_modules/bl/package.json +37 -0
- package/node_modules/bl/test/convert.js +21 -0
- package/node_modules/bl/test/indexOf.js +492 -0
- package/node_modules/bl/test/isBufferList.js +32 -0
- package/node_modules/bl/test/test.js +869 -0
- package/node_modules/buffer/AUTHORS.md +70 -0
- package/node_modules/buffer/LICENSE +21 -0
- package/node_modules/buffer/README.md +410 -0
- package/node_modules/buffer/index.d.ts +186 -0
- package/node_modules/buffer/index.js +1817 -0
- package/node_modules/buffer/package.json +96 -0
- package/node_modules/chownr/LICENSE +15 -0
- package/node_modules/chownr/README.md +3 -0
- package/node_modules/chownr/chownr.js +167 -0
- package/node_modules/chownr/package.json +29 -0
- package/node_modules/cross-spawn/LICENSE +21 -0
- package/node_modules/cross-spawn/README.md +89 -0
- package/node_modules/cross-spawn/index.js +39 -0
- package/node_modules/cross-spawn/lib/enoent.js +59 -0
- package/node_modules/cross-spawn/lib/parse.js +91 -0
- package/node_modules/cross-spawn/lib/util/escape.js +47 -0
- package/node_modules/cross-spawn/lib/util/readShebang.js +23 -0
- package/node_modules/cross-spawn/lib/util/resolveCommand.js +52 -0
- package/node_modules/cross-spawn/package.json +73 -0
- package/node_modules/decompress-response/index.d.ts +22 -0
- package/node_modules/decompress-response/index.js +58 -0
- package/node_modules/decompress-response/license +9 -0
- package/node_modules/decompress-response/package.json +56 -0
- package/node_modules/decompress-response/readme.md +48 -0
- package/node_modules/deep-extend/CHANGELOG.md +46 -0
- package/node_modules/deep-extend/LICENSE +20 -0
- package/node_modules/deep-extend/README.md +91 -0
- package/node_modules/deep-extend/index.js +1 -0
- package/node_modules/deep-extend/lib/deep-extend.js +150 -0
- package/node_modules/deep-extend/package.json +62 -0
- package/node_modules/detect-libc/LICENSE +201 -0
- package/node_modules/detect-libc/README.md +163 -0
- package/node_modules/detect-libc/index.d.ts +14 -0
- package/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/node_modules/detect-libc/lib/elf.js +39 -0
- package/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/node_modules/detect-libc/lib/process.js +24 -0
- package/node_modules/detect-libc/package.json +44 -0
- package/node_modules/end-of-stream/LICENSE +21 -0
- package/node_modules/end-of-stream/README.md +54 -0
- package/node_modules/end-of-stream/index.js +96 -0
- package/node_modules/end-of-stream/package.json +37 -0
- package/node_modules/execa/index.d.ts +27 -0
- package/node_modules/execa/index.js +28 -0
- package/node_modules/execa/lib/arguments/command.js +20 -0
- package/node_modules/execa/lib/arguments/cwd.js +39 -0
- package/node_modules/execa/lib/arguments/encoding-option.js +50 -0
- package/node_modules/execa/lib/arguments/escape.js +88 -0
- package/node_modules/execa/lib/arguments/fd-options.js +108 -0
- package/node_modules/execa/lib/arguments/file-url.js +25 -0
- package/node_modules/execa/lib/arguments/options.js +96 -0
- package/node_modules/execa/lib/arguments/shell.js +11 -0
- package/node_modules/execa/lib/arguments/specific.js +111 -0
- package/node_modules/execa/lib/convert/add.js +15 -0
- package/node_modules/execa/lib/convert/concurrent.js +33 -0
- package/node_modules/execa/lib/convert/duplex.js +69 -0
- package/node_modules/execa/lib/convert/iterable.js +34 -0
- package/node_modules/execa/lib/convert/readable.js +113 -0
- package/node_modules/execa/lib/convert/shared.js +46 -0
- package/node_modules/execa/lib/convert/writable.js +90 -0
- package/node_modules/execa/lib/io/contents.js +116 -0
- package/node_modules/execa/lib/io/input-sync.js +44 -0
- package/node_modules/execa/lib/io/iterate.js +110 -0
- package/node_modules/execa/lib/io/max-buffer.js +89 -0
- package/node_modules/execa/lib/io/output-async.js +80 -0
- package/node_modules/execa/lib/io/output-sync.js +135 -0
- package/node_modules/execa/lib/io/pipeline.js +48 -0
- package/node_modules/execa/lib/io/strip-newline.js +12 -0
- package/node_modules/execa/lib/ipc/array.js +4 -0
- package/node_modules/execa/lib/ipc/buffer-messages.js +47 -0
- package/node_modules/execa/lib/ipc/forward.js +56 -0
- package/node_modules/execa/lib/ipc/get-each.js +89 -0
- package/node_modules/execa/lib/ipc/get-one.js +69 -0
- package/node_modules/execa/lib/ipc/graceful.js +72 -0
- package/node_modules/execa/lib/ipc/incoming.js +79 -0
- package/node_modules/execa/lib/ipc/ipc-input.js +44 -0
- package/node_modules/execa/lib/ipc/methods.js +49 -0
- package/node_modules/execa/lib/ipc/outgoing.js +47 -0
- package/node_modules/execa/lib/ipc/reference.js +44 -0
- package/node_modules/execa/lib/ipc/send.js +91 -0
- package/node_modules/execa/lib/ipc/strict.js +113 -0
- package/node_modules/execa/lib/ipc/validation.js +111 -0
- package/node_modules/execa/lib/methods/bind.js +23 -0
- package/node_modules/execa/lib/methods/command.js +43 -0
- package/node_modules/execa/lib/methods/create.js +65 -0
- package/node_modules/execa/lib/methods/main-async.js +194 -0
- package/node_modules/execa/lib/methods/main-sync.js +163 -0
- package/node_modules/execa/lib/methods/node.js +51 -0
- package/node_modules/execa/lib/methods/parameters.js +31 -0
- package/node_modules/execa/lib/methods/promise.js +15 -0
- package/node_modules/execa/lib/methods/script.js +22 -0
- package/node_modules/execa/lib/methods/template.js +153 -0
- package/node_modules/execa/lib/pipe/abort.js +20 -0
- package/node_modules/execa/lib/pipe/pipe-arguments.js +91 -0
- package/node_modules/execa/lib/pipe/sequence.js +24 -0
- package/node_modules/execa/lib/pipe/setup.js +72 -0
- package/node_modules/execa/lib/pipe/streaming.js +51 -0
- package/node_modules/execa/lib/pipe/throw.js +58 -0
- package/node_modules/execa/lib/resolve/all-async.js +46 -0
- package/node_modules/execa/lib/resolve/all-sync.js +33 -0
- package/node_modules/execa/lib/resolve/exit-async.js +54 -0
- package/node_modules/execa/lib/resolve/exit-sync.js +25 -0
- package/node_modules/execa/lib/resolve/stdio.js +47 -0
- package/node_modules/execa/lib/resolve/wait-stream.js +96 -0
- package/node_modules/execa/lib/resolve/wait-subprocess.js +146 -0
- package/node_modules/execa/lib/return/duration.js +8 -0
- package/node_modules/execa/lib/return/early-error.js +60 -0
- package/node_modules/execa/lib/return/final-error.js +40 -0
- package/node_modules/execa/lib/return/message.js +157 -0
- package/node_modules/execa/lib/return/reject.js +13 -0
- package/node_modules/execa/lib/return/result.js +186 -0
- package/node_modules/execa/lib/stdio/direction.js +76 -0
- package/node_modules/execa/lib/stdio/duplicate.js +116 -0
- package/node_modules/execa/lib/stdio/handle-async.js +52 -0
- package/node_modules/execa/lib/stdio/handle-sync.js +57 -0
- package/node_modules/execa/lib/stdio/handle.js +214 -0
- package/node_modules/execa/lib/stdio/input-option.js +50 -0
- package/node_modules/execa/lib/stdio/native.js +106 -0
- package/node_modules/execa/lib/stdio/stdio-option.js +60 -0
- package/node_modules/execa/lib/stdio/type.js +173 -0
- package/node_modules/execa/lib/terminate/cancel.js +20 -0
- package/node_modules/execa/lib/terminate/cleanup.js +16 -0
- package/node_modules/execa/lib/terminate/graceful.js +71 -0
- package/node_modules/execa/lib/terminate/kill.js +93 -0
- package/node_modules/execa/lib/terminate/signal.js +70 -0
- package/node_modules/execa/lib/terminate/timeout.js +21 -0
- package/node_modules/execa/lib/transform/encoding-transform.js +51 -0
- package/node_modules/execa/lib/transform/generator.js +107 -0
- package/node_modules/execa/lib/transform/normalize.js +111 -0
- package/node_modules/execa/lib/transform/object-mode.js +41 -0
- package/node_modules/execa/lib/transform/run-async.js +60 -0
- package/node_modules/execa/lib/transform/run-sync.js +50 -0
- package/node_modules/execa/lib/transform/split.js +110 -0
- package/node_modules/execa/lib/transform/validate.js +43 -0
- package/node_modules/execa/lib/utils/abort-signal.js +8 -0
- package/node_modules/execa/lib/utils/deferred.js +7 -0
- package/node_modules/execa/lib/utils/max-listeners.js +14 -0
- package/node_modules/execa/lib/utils/standard-stream.js +6 -0
- package/node_modules/execa/lib/utils/uint-array.js +69 -0
- package/node_modules/execa/lib/verbose/complete.js +24 -0
- package/node_modules/execa/lib/verbose/custom.js +26 -0
- package/node_modules/execa/lib/verbose/default.js +54 -0
- package/node_modules/execa/lib/verbose/error.js +13 -0
- package/node_modules/execa/lib/verbose/info.js +39 -0
- package/node_modules/execa/lib/verbose/ipc.js +15 -0
- package/node_modules/execa/lib/verbose/log.js +54 -0
- package/node_modules/execa/lib/verbose/output.js +60 -0
- package/node_modules/execa/lib/verbose/start.js +15 -0
- package/node_modules/execa/lib/verbose/values.js +33 -0
- package/node_modules/execa/license +9 -0
- package/node_modules/execa/package.json +105 -0
- package/node_modules/execa/readme.md +461 -0
- package/node_modules/execa/types/arguments/encoding-option.d.ts +19 -0
- package/node_modules/execa/types/arguments/fd-options.d.ts +8 -0
- package/node_modules/execa/types/arguments/options.d.ts +400 -0
- package/node_modules/execa/types/arguments/specific.d.ts +52 -0
- package/node_modules/execa/types/convert.d.ts +58 -0
- package/node_modules/execa/types/ipc.d.ts +156 -0
- package/node_modules/execa/types/methods/command.d.ts +114 -0
- package/node_modules/execa/types/methods/main-async.d.ts +379 -0
- package/node_modules/execa/types/methods/main-sync.d.ts +59 -0
- package/node_modules/execa/types/methods/node.d.ts +62 -0
- package/node_modules/execa/types/methods/script.d.ts +115 -0
- package/node_modules/execa/types/methods/template.d.ts +18 -0
- package/node_modules/execa/types/pipe.d.ts +58 -0
- package/node_modules/execa/types/return/final-error.d.ts +51 -0
- package/node_modules/execa/types/return/ignore.d.ts +26 -0
- package/node_modules/execa/types/return/result-all.d.ts +30 -0
- package/node_modules/execa/types/return/result-ipc.d.ts +27 -0
- package/node_modules/execa/types/return/result-stdio.d.ts +17 -0
- package/node_modules/execa/types/return/result-stdout.d.ts +50 -0
- package/node_modules/execa/types/return/result.d.ts +203 -0
- package/node_modules/execa/types/stdio/array.d.ts +16 -0
- package/node_modules/execa/types/stdio/direction.d.ts +12 -0
- package/node_modules/execa/types/stdio/option.d.ts +40 -0
- package/node_modules/execa/types/stdio/type.d.ts +170 -0
- package/node_modules/execa/types/subprocess/all.d.ts +17 -0
- package/node_modules/execa/types/subprocess/stdio.d.ts +18 -0
- package/node_modules/execa/types/subprocess/stdout.d.ts +22 -0
- package/node_modules/execa/types/subprocess/subprocess.d.ts +117 -0
- package/node_modules/execa/types/transform/normalize.d.ts +57 -0
- package/node_modules/execa/types/transform/object-mode.d.ts +21 -0
- package/node_modules/execa/types/utils.d.ts +13 -0
- package/node_modules/execa/types/verbose.d.ts +98 -0
- package/node_modules/expand-template/.travis.yml +6 -0
- package/node_modules/expand-template/LICENSE +21 -0
- package/node_modules/expand-template/README.md +43 -0
- package/node_modules/expand-template/index.js +26 -0
- package/node_modules/expand-template/package.json +29 -0
- package/node_modules/expand-template/test.js +67 -0
- package/node_modules/figures/index.d.ts +279 -0
- package/node_modules/figures/index.js +292 -0
- package/node_modules/figures/license +9 -0
- package/node_modules/figures/package.json +49 -0
- package/node_modules/figures/readme.md +337 -0
- package/node_modules/file-uri-to-path/.npmignore +1 -0
- package/node_modules/file-uri-to-path/.travis.yml +30 -0
- package/node_modules/file-uri-to-path/History.md +21 -0
- package/node_modules/file-uri-to-path/LICENSE +20 -0
- package/node_modules/file-uri-to-path/README.md +74 -0
- package/node_modules/file-uri-to-path/index.d.ts +2 -0
- package/node_modules/file-uri-to-path/index.js +66 -0
- package/node_modules/file-uri-to-path/package.json +32 -0
- package/node_modules/file-uri-to-path/test/test.js +24 -0
- package/node_modules/file-uri-to-path/test/tests.json +13 -0
- package/node_modules/fs-constants/LICENSE +21 -0
- package/node_modules/fs-constants/README.md +26 -0
- package/node_modules/fs-constants/browser.js +1 -0
- package/node_modules/fs-constants/index.js +1 -0
- package/node_modules/fs-constants/package.json +19 -0
- package/node_modules/get-stream/license +9 -0
- package/node_modules/get-stream/package.json +60 -0
- package/node_modules/get-stream/readme.md +303 -0
- package/node_modules/get-stream/source/array-buffer.js +84 -0
- package/node_modules/get-stream/source/array.js +32 -0
- package/node_modules/get-stream/source/buffer.js +19 -0
- package/node_modules/get-stream/source/contents.js +121 -0
- package/node_modules/get-stream/source/exports.js +5 -0
- package/node_modules/get-stream/source/index.d.ts +121 -0
- package/node_modules/get-stream/source/index.js +13 -0
- package/node_modules/get-stream/source/stream.js +65 -0
- package/node_modules/get-stream/source/string.js +41 -0
- package/node_modules/get-stream/source/utils.js +11 -0
- package/node_modules/github-from-package/.travis.yml +4 -0
- package/node_modules/github-from-package/LICENSE +18 -0
- package/node_modules/github-from-package/example/package.json +8 -0
- package/node_modules/github-from-package/example/url.js +3 -0
- package/node_modules/github-from-package/index.js +17 -0
- package/node_modules/github-from-package/package.json +30 -0
- package/node_modules/github-from-package/readme.markdown +53 -0
- package/node_modules/github-from-package/test/a.json +8 -0
- package/node_modules/github-from-package/test/b.json +5 -0
- package/node_modules/github-from-package/test/c.json +5 -0
- package/node_modules/github-from-package/test/d.json +7 -0
- package/node_modules/github-from-package/test/e.json +5 -0
- package/node_modules/github-from-package/test/url.js +19 -0
- package/node_modules/human-signals/LICENSE +201 -0
- package/node_modules/human-signals/README.md +171 -0
- package/node_modules/human-signals/build/src/core.js +273 -0
- package/node_modules/human-signals/build/src/main.d.ts +206 -0
- package/node_modules/human-signals/build/src/main.js +70 -0
- package/node_modules/human-signals/build/src/realtime.js +16 -0
- package/node_modules/human-signals/build/src/signals.js +34 -0
- package/node_modules/human-signals/package.json +66 -0
- package/node_modules/ieee754/LICENSE +11 -0
- package/node_modules/ieee754/README.md +51 -0
- package/node_modules/ieee754/index.d.ts +10 -0
- package/node_modules/ieee754/index.js +85 -0
- package/node_modules/ieee754/package.json +52 -0
- package/node_modules/inherits/LICENSE +16 -0
- package/node_modules/inherits/README.md +42 -0
- package/node_modules/inherits/inherits.js +9 -0
- package/node_modules/inherits/inherits_browser.js +27 -0
- package/node_modules/inherits/package.json +29 -0
- package/node_modules/ini/LICENSE +15 -0
- package/node_modules/ini/README.md +102 -0
- package/node_modules/ini/ini.js +206 -0
- package/node_modules/ini/package.json +33 -0
- package/node_modules/is-plain-obj/index.d.ts +35 -0
- package/node_modules/is-plain-obj/index.js +8 -0
- package/node_modules/is-plain-obj/license +9 -0
- package/node_modules/is-plain-obj/package.json +41 -0
- package/node_modules/is-plain-obj/readme.md +58 -0
- package/node_modules/is-stream/index.d.ts +90 -0
- package/node_modules/is-stream/index.js +37 -0
- package/node_modules/is-stream/license +9 -0
- package/node_modules/is-stream/package.json +48 -0
- package/node_modules/is-stream/readme.md +57 -0
- package/node_modules/is-unicode-supported/index.d.ts +12 -0
- package/node_modules/is-unicode-supported/index.js +21 -0
- package/node_modules/is-unicode-supported/license +9 -0
- package/node_modules/is-unicode-supported/package.json +47 -0
- package/node_modules/is-unicode-supported/readme.md +35 -0
- package/node_modules/isexe/.npmignore +2 -0
- package/node_modules/isexe/LICENSE +15 -0
- package/node_modules/isexe/README.md +51 -0
- package/node_modules/isexe/index.js +57 -0
- package/node_modules/isexe/mode.js +41 -0
- package/node_modules/isexe/package.json +31 -0
- package/node_modules/isexe/test/basic.js +221 -0
- package/node_modules/isexe/windows.js +42 -0
- package/node_modules/mimic-response/index.d.ts +17 -0
- package/node_modules/mimic-response/index.js +77 -0
- package/node_modules/mimic-response/license +9 -0
- package/node_modules/mimic-response/package.json +42 -0
- package/node_modules/mimic-response/readme.md +78 -0
- package/node_modules/minimist/.eslintrc +29 -0
- package/node_modules/minimist/.github/FUNDING.yml +12 -0
- package/node_modules/minimist/.nycrc +14 -0
- package/node_modules/minimist/CHANGELOG.md +298 -0
- package/node_modules/minimist/LICENSE +18 -0
- package/node_modules/minimist/README.md +121 -0
- package/node_modules/minimist/example/parse.js +4 -0
- package/node_modules/minimist/index.js +263 -0
- package/node_modules/minimist/package.json +75 -0
- package/node_modules/minimist/test/all_bool.js +34 -0
- package/node_modules/minimist/test/bool.js +177 -0
- package/node_modules/minimist/test/dash.js +43 -0
- package/node_modules/minimist/test/default_bool.js +37 -0
- package/node_modules/minimist/test/dotted.js +24 -0
- package/node_modules/minimist/test/kv_short.js +32 -0
- package/node_modules/minimist/test/long.js +33 -0
- package/node_modules/minimist/test/num.js +38 -0
- package/node_modules/minimist/test/parse.js +209 -0
- package/node_modules/minimist/test/parse_modified.js +11 -0
- package/node_modules/minimist/test/proto.js +64 -0
- package/node_modules/minimist/test/short.js +69 -0
- package/node_modules/minimist/test/stop_early.js +17 -0
- package/node_modules/minimist/test/unknown.js +104 -0
- package/node_modules/minimist/test/whitespace.js +10 -0
- package/node_modules/mkdirp-classic/LICENSE +21 -0
- package/node_modules/mkdirp-classic/README.md +18 -0
- package/node_modules/mkdirp-classic/index.js +98 -0
- package/node_modules/mkdirp-classic/package.json +18 -0
- package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +31 -0
- package/node_modules/napi-build-utils/LICENSE +21 -0
- package/node_modules/napi-build-utils/README.md +52 -0
- package/node_modules/napi-build-utils/index.js +214 -0
- package/node_modules/napi-build-utils/index.md +0 -0
- package/node_modules/napi-build-utils/package.json +42 -0
- package/node_modules/node-abi/LICENSE +21 -0
- package/node_modules/node-abi/README.md +54 -0
- package/node_modules/node-abi/abi_registry.json +446 -0
- package/node_modules/node-abi/index.js +179 -0
- package/node_modules/node-abi/package.json +45 -0
- package/node_modules/npm-run-path/index.d.ts +90 -0
- package/node_modules/npm-run-path/index.js +55 -0
- package/node_modules/npm-run-path/license +9 -0
- package/node_modules/npm-run-path/node_modules/path-key/index.d.ts +31 -0
- package/node_modules/npm-run-path/node_modules/path-key/index.js +12 -0
- package/node_modules/npm-run-path/node_modules/path-key/license +9 -0
- package/node_modules/npm-run-path/node_modules/path-key/package.json +41 -0
- package/node_modules/npm-run-path/node_modules/path-key/readme.md +57 -0
- package/node_modules/npm-run-path/package.json +52 -0
- package/node_modules/npm-run-path/readme.md +104 -0
- package/node_modules/once/LICENSE +15 -0
- package/node_modules/once/README.md +79 -0
- package/node_modules/once/once.js +42 -0
- package/node_modules/once/package.json +33 -0
- package/node_modules/parse-ms/index.d.ts +30 -0
- package/node_modules/parse-ms/index.js +45 -0
- package/node_modules/parse-ms/license +9 -0
- package/node_modules/parse-ms/package.json +47 -0
- package/node_modules/parse-ms/readme.md +46 -0
- package/node_modules/path-key/index.d.ts +40 -0
- package/node_modules/path-key/index.js +16 -0
- package/node_modules/path-key/license +9 -0
- package/node_modules/path-key/package.json +39 -0
- package/node_modules/path-key/readme.md +61 -0
- package/node_modules/prebuild-install/CHANGELOG.md +131 -0
- package/node_modules/prebuild-install/CONTRIBUTING.md +6 -0
- package/node_modules/prebuild-install/LICENSE +21 -0
- package/node_modules/prebuild-install/README.md +163 -0
- package/node_modules/prebuild-install/asset.js +44 -0
- package/node_modules/prebuild-install/bin.js +78 -0
- package/node_modules/prebuild-install/download.js +142 -0
- package/node_modules/prebuild-install/error.js +14 -0
- package/node_modules/prebuild-install/help.txt +16 -0
- package/node_modules/prebuild-install/index.js +1 -0
- package/node_modules/prebuild-install/log.js +33 -0
- package/node_modules/prebuild-install/package.json +67 -0
- package/node_modules/prebuild-install/proxy.js +35 -0
- package/node_modules/prebuild-install/rc.js +64 -0
- package/node_modules/prebuild-install/util.js +143 -0
- package/node_modules/pretty-ms/index.d.ts +157 -0
- package/node_modules/pretty-ms/index.js +149 -0
- package/node_modules/pretty-ms/license +9 -0
- package/node_modules/pretty-ms/package.json +55 -0
- package/node_modules/pretty-ms/readme.md +179 -0
- package/node_modules/pump/.github/FUNDING.yml +2 -0
- package/node_modules/pump/.travis.yml +5 -0
- package/node_modules/pump/LICENSE +21 -0
- package/node_modules/pump/README.md +74 -0
- package/node_modules/pump/SECURITY.md +5 -0
- package/node_modules/pump/empty.js +1 -0
- package/node_modules/pump/index.js +86 -0
- package/node_modules/pump/package.json +30 -0
- package/node_modules/pump/test-browser.js +66 -0
- package/node_modules/pump/test-node.js +53 -0
- package/node_modules/rc/LICENSE.APACHE2 +15 -0
- package/node_modules/rc/LICENSE.BSD +26 -0
- package/node_modules/rc/LICENSE.MIT +24 -0
- package/node_modules/rc/README.md +227 -0
- package/node_modules/rc/browser.js +7 -0
- package/node_modules/rc/cli.js +4 -0
- package/node_modules/rc/index.js +53 -0
- package/node_modules/rc/lib/utils.js +104 -0
- package/node_modules/rc/package.json +29 -0
- package/node_modules/rc/test/ini.js +16 -0
- package/node_modules/rc/test/nested-env-vars.js +50 -0
- package/node_modules/rc/test/test.js +59 -0
- package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
- package/node_modules/readable-stream/GOVERNANCE.md +136 -0
- package/node_modules/readable-stream/LICENSE +47 -0
- package/node_modules/readable-stream/README.md +106 -0
- package/node_modules/readable-stream/errors-browser.js +127 -0
- package/node_modules/readable-stream/errors.js +116 -0
- package/node_modules/readable-stream/experimentalWarning.js +17 -0
- package/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
- package/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
- package/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
- package/node_modules/readable-stream/lib/_stream_transform.js +190 -0
- package/node_modules/readable-stream/lib/_stream_writable.js +641 -0
- package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
- package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
- package/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
- package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
- package/node_modules/readable-stream/package.json +68 -0
- package/node_modules/readable-stream/readable-browser.js +9 -0
- package/node_modules/readable-stream/readable.js +16 -0
- package/node_modules/safe-buffer/LICENSE +21 -0
- package/node_modules/safe-buffer/README.md +584 -0
- package/node_modules/safe-buffer/index.d.ts +187 -0
- package/node_modules/safe-buffer/index.js +65 -0
- package/node_modules/safe-buffer/package.json +51 -0
- package/node_modules/semver/LICENSE +15 -0
- package/node_modules/semver/README.md +665 -0
- package/node_modules/semver/bin/semver.js +191 -0
- package/node_modules/semver/classes/comparator.js +143 -0
- package/node_modules/semver/classes/index.js +7 -0
- package/node_modules/semver/classes/range.js +557 -0
- package/node_modules/semver/classes/semver.js +333 -0
- package/node_modules/semver/functions/clean.js +8 -0
- package/node_modules/semver/functions/cmp.js +54 -0
- package/node_modules/semver/functions/coerce.js +62 -0
- package/node_modules/semver/functions/compare-build.js +9 -0
- package/node_modules/semver/functions/compare-loose.js +5 -0
- package/node_modules/semver/functions/compare.js +7 -0
- package/node_modules/semver/functions/diff.js +60 -0
- package/node_modules/semver/functions/eq.js +5 -0
- package/node_modules/semver/functions/gt.js +5 -0
- package/node_modules/semver/functions/gte.js +5 -0
- package/node_modules/semver/functions/inc.js +21 -0
- package/node_modules/semver/functions/lt.js +5 -0
- package/node_modules/semver/functions/lte.js +5 -0
- package/node_modules/semver/functions/major.js +5 -0
- package/node_modules/semver/functions/minor.js +5 -0
- package/node_modules/semver/functions/neq.js +5 -0
- package/node_modules/semver/functions/parse.js +18 -0
- package/node_modules/semver/functions/patch.js +5 -0
- package/node_modules/semver/functions/prerelease.js +8 -0
- package/node_modules/semver/functions/rcompare.js +5 -0
- package/node_modules/semver/functions/rsort.js +5 -0
- package/node_modules/semver/functions/satisfies.js +12 -0
- package/node_modules/semver/functions/sort.js +5 -0
- package/node_modules/semver/functions/valid.js +8 -0
- package/node_modules/semver/index.js +91 -0
- package/node_modules/semver/internal/constants.js +37 -0
- package/node_modules/semver/internal/debug.js +11 -0
- package/node_modules/semver/internal/identifiers.js +29 -0
- package/node_modules/semver/internal/lrucache.js +42 -0
- package/node_modules/semver/internal/parse-options.js +17 -0
- package/node_modules/semver/internal/re.js +223 -0
- package/node_modules/semver/package.json +78 -0
- package/node_modules/semver/preload.js +4 -0
- package/node_modules/semver/range.bnf +16 -0
- package/node_modules/semver/ranges/gtr.js +6 -0
- package/node_modules/semver/ranges/intersects.js +9 -0
- package/node_modules/semver/ranges/ltr.js +6 -0
- package/node_modules/semver/ranges/max-satisfying.js +27 -0
- package/node_modules/semver/ranges/min-satisfying.js +26 -0
- package/node_modules/semver/ranges/min-version.js +63 -0
- package/node_modules/semver/ranges/outside.js +82 -0
- package/node_modules/semver/ranges/simplify.js +49 -0
- package/node_modules/semver/ranges/subset.js +249 -0
- package/node_modules/semver/ranges/to-comparators.js +10 -0
- package/node_modules/semver/ranges/valid.js +13 -0
- package/node_modules/shebang-command/index.js +19 -0
- package/node_modules/shebang-command/license +9 -0
- package/node_modules/shebang-command/package.json +34 -0
- package/node_modules/shebang-command/readme.md +34 -0
- package/node_modules/shebang-regex/index.d.ts +22 -0
- package/node_modules/shebang-regex/index.js +2 -0
- package/node_modules/shebang-regex/license +9 -0
- package/node_modules/shebang-regex/package.json +35 -0
- package/node_modules/shebang-regex/readme.md +33 -0
- package/node_modules/signal-exit/LICENSE.txt +16 -0
- package/node_modules/signal-exit/README.md +74 -0
- package/node_modules/signal-exit/dist/cjs/browser.d.ts +12 -0
- package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/cjs/browser.js +10 -0
- package/node_modules/signal-exit/dist/cjs/browser.js.map +1 -0
- package/node_modules/signal-exit/dist/cjs/index.d.ts +48 -0
- package/node_modules/signal-exit/dist/cjs/index.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/cjs/index.js +279 -0
- package/node_modules/signal-exit/dist/cjs/index.js.map +1 -0
- package/node_modules/signal-exit/dist/cjs/package.json +3 -0
- package/node_modules/signal-exit/dist/cjs/signals.d.ts +29 -0
- package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/cjs/signals.js +42 -0
- package/node_modules/signal-exit/dist/cjs/signals.js.map +1 -0
- package/node_modules/signal-exit/dist/mjs/browser.d.ts +12 -0
- package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/mjs/browser.js +4 -0
- package/node_modules/signal-exit/dist/mjs/browser.js.map +1 -0
- package/node_modules/signal-exit/dist/mjs/index.d.ts +48 -0
- package/node_modules/signal-exit/dist/mjs/index.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/mjs/index.js +275 -0
- package/node_modules/signal-exit/dist/mjs/index.js.map +1 -0
- package/node_modules/signal-exit/dist/mjs/package.json +3 -0
- package/node_modules/signal-exit/dist/mjs/signals.d.ts +29 -0
- package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/mjs/signals.js +39 -0
- package/node_modules/signal-exit/dist/mjs/signals.js.map +1 -0
- package/node_modules/signal-exit/package.json +106 -0
- package/node_modules/simple-concat/.travis.yml +3 -0
- package/node_modules/simple-concat/LICENSE +20 -0
- package/node_modules/simple-concat/README.md +44 -0
- package/node_modules/simple-concat/index.js +15 -0
- package/node_modules/simple-concat/package.json +47 -0
- package/node_modules/simple-concat/test/basic.js +41 -0
- package/node_modules/simple-get/.github/dependabot.yml +15 -0
- package/node_modules/simple-get/.github/workflows/ci.yml +23 -0
- package/node_modules/simple-get/LICENSE +20 -0
- package/node_modules/simple-get/README.md +333 -0
- package/node_modules/simple-get/index.js +108 -0
- package/node_modules/simple-get/package.json +67 -0
- package/node_modules/sqlite-vec/README.md +1 -0
- package/node_modules/sqlite-vec/index.cjs +46 -0
- package/node_modules/sqlite-vec/index.d.ts +17 -0
- package/node_modules/sqlite-vec/index.mjs +47 -0
- package/node_modules/sqlite-vec/package.json +1 -0
- package/node_modules/sqlite-vec-linux-x64/README.md +1 -0
- package/node_modules/sqlite-vec-linux-x64/package.json +1 -0
- package/node_modules/sqlite-vec-linux-x64/vec0.so +0 -0
- package/node_modules/string_decoder/LICENSE +48 -0
- package/node_modules/string_decoder/README.md +47 -0
- package/node_modules/string_decoder/lib/string_decoder.js +296 -0
- package/node_modules/string_decoder/package.json +34 -0
- package/node_modules/strip-final-newline/index.d.ts +18 -0
- package/node_modules/strip-final-newline/index.js +26 -0
- package/node_modules/strip-final-newline/license +9 -0
- package/node_modules/strip-final-newline/package.json +49 -0
- package/node_modules/strip-final-newline/readme.md +34 -0
- package/node_modules/strip-json-comments/index.js +70 -0
- package/node_modules/strip-json-comments/license +21 -0
- package/node_modules/strip-json-comments/package.json +42 -0
- package/node_modules/strip-json-comments/readme.md +64 -0
- package/node_modules/tar-fs/.travis.yml +6 -0
- package/node_modules/tar-fs/LICENSE +21 -0
- package/node_modules/tar-fs/README.md +165 -0
- package/node_modules/tar-fs/index.js +363 -0
- package/node_modules/tar-fs/package.json +41 -0
- package/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/node_modules/tar-fs/test/index.js +346 -0
- package/node_modules/tar-stream/LICENSE +21 -0
- package/node_modules/tar-stream/README.md +168 -0
- package/node_modules/tar-stream/extract.js +257 -0
- package/node_modules/tar-stream/headers.js +295 -0
- package/node_modules/tar-stream/index.js +2 -0
- package/node_modules/tar-stream/pack.js +255 -0
- package/node_modules/tar-stream/package.json +58 -0
- package/node_modules/tar-stream/sandbox.js +11 -0
- package/node_modules/tunnel-agent/LICENSE +55 -0
- package/node_modules/tunnel-agent/README.md +4 -0
- package/node_modules/tunnel-agent/index.js +244 -0
- package/node_modules/tunnel-agent/package.json +22 -0
- package/node_modules/unicorn-magic/default.d.ts +13 -0
- package/node_modules/unicorn-magic/default.js +14 -0
- package/node_modules/unicorn-magic/license +9 -0
- package/node_modules/unicorn-magic/node.d.ts +125 -0
- package/node_modules/unicorn-magic/node.js +49 -0
- package/node_modules/unicorn-magic/package.json +62 -0
- package/node_modules/unicorn-magic/readme.md +25 -0
- package/node_modules/util-deprecate/History.md +16 -0
- package/node_modules/util-deprecate/LICENSE +24 -0
- package/node_modules/util-deprecate/README.md +53 -0
- package/node_modules/util-deprecate/browser.js +67 -0
- package/node_modules/util-deprecate/node.js +6 -0
- package/node_modules/util-deprecate/package.json +27 -0
- package/node_modules/which/CHANGELOG.md +166 -0
- package/node_modules/which/LICENSE +15 -0
- package/node_modules/which/README.md +54 -0
- package/node_modules/which/bin/node-which +52 -0
- package/node_modules/which/package.json +43 -0
- package/node_modules/which/which.js +125 -0
- package/node_modules/wrappy/LICENSE +15 -0
- package/node_modules/wrappy/README.md +36 -0
- package/node_modules/wrappy/package.json +29 -0
- package/node_modules/wrappy/wrappy.js +33 -0
- package/node_modules/yoctocolors/base.d.ts +47 -0
- package/node_modules/yoctocolors/base.js +94 -0
- package/node_modules/yoctocolors/index.d.ts +2 -0
- package/node_modules/yoctocolors/index.js +2 -0
- package/node_modules/yoctocolors/license +9 -0
- package/node_modules/yoctocolors/package.json +69 -0
- package/node_modules/yoctocolors/readme.md +138 -0
- package/package.json +5 -1
- package/packages/hu-board/public/utils/board-view.js +11 -0
- package/packages/hu-board/public/utils/formatters.js +28 -1
- package/packages/hu-board/src/db.js +62 -3
- package/packages/hu-board/src/format.js +46 -1
- package/src/agents/aider-agent.js +42 -1
- package/src/agents/claude-agent.js +31 -5
- package/src/agents/codex-agent.js +44 -7
- package/src/agents/gemini-agent.js +37 -1
- package/src/agents/opencode-agent.js +34 -1
- package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +12 -1
- package/src/orchestrator/flow-runner.js +10 -2
- package/src/orchestrator/hu-sub-pipeline.js +30 -0
- package/src/prompts/architect.js +32 -37
- package/src/prompts/coder.js +71 -96
- package/src/prompts/hu-reviewer.js +23 -29
- package/src/prompts/prompt-layout.js +80 -0
- package/src/prompts/reviewer.js +34 -39
- package/src/roles/agent-role.js +9 -1
- package/src/roles/coder-role.js +6 -3
- package/src/roles/reviewer-role.js +20 -23
- package/src/session/journal/summary-writer.js +55 -1
- package/src/utils/budget.js +38 -9
- package/src/utils/telemetry.js +43 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
<sup>yoctocolors 🌈</sup>
|
|
2
|
+
|
|
3
|
+
> The smallest and fastest command-line coloring package on the internet
|
|
4
|
+
|
|
5
|
+
*Check out [Chalk](https://github.com/chalk/chalk) if you want something more mature and comprehensive.*
|
|
6
|
+
|
|
7
|
+
## Highlights
|
|
8
|
+
|
|
9
|
+
- Tiny
|
|
10
|
+
- Fast
|
|
11
|
+
- Handles nested colors
|
|
12
|
+
- Tree-shakeable
|
|
13
|
+
- No dependencies
|
|
14
|
+
- Actively maintained
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
ESM:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npm install yoctocolors
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Or CommonJS:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
npm install yoctocolors-cjs
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
```js
|
|
33
|
+
import colors from 'yoctocolors';
|
|
34
|
+
|
|
35
|
+
console.log(colors.red('Yo!'));
|
|
36
|
+
|
|
37
|
+
console.log(colors.blue(`Welcome to the ${colors.green('yoctocolors')} package!`));
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
You can also import colors as named imports:
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
import {red, blue, green} from 'yoctocolors';
|
|
44
|
+
|
|
45
|
+
console.log(red('Yo!'));
|
|
46
|
+
|
|
47
|
+
console.log(blue(`Welcome to the ${green('yoctocolors')} package!`));
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
*This package supports [basic color detection](https://nodejs.org/api/tty.html#writestreamhascolorscount-env). Colors can be forcefully enabled by setting the `FORCE_COLOR` environment variable to `1` and can be forcefully disabled by setting `NO_COLOR` or `NODE_DISABLE_COLORS` to any value. [More info.](https://nodejs.org/api/tty.html#writestreamgetcolordepthenv)*
|
|
51
|
+
|
|
52
|
+
## Styles
|
|
53
|
+
|
|
54
|
+
### Modifiers
|
|
55
|
+
|
|
56
|
+
- `reset` - Reset the current style.
|
|
57
|
+
- `bold` - Make the text bold.
|
|
58
|
+
- `dim` - Make the text have lower opacity.
|
|
59
|
+
- `italic` - Make the text italic. *(Not widely supported)*
|
|
60
|
+
- `underline` - Put a horizontal line above the text. *(Not widely supported)*
|
|
61
|
+
- `overline` - Put a horizontal line below the text. *(Not widely supported)*
|
|
62
|
+
- `inverse`- Invert background and foreground colors.
|
|
63
|
+
- `hidden` - Print the text but make it invisible.
|
|
64
|
+
- `strikethrough` - Put a horizontal line through the center of the text. *(Not widely supported)*
|
|
65
|
+
|
|
66
|
+
### Colors
|
|
67
|
+
|
|
68
|
+
- `black`
|
|
69
|
+
- `red`
|
|
70
|
+
- `green`
|
|
71
|
+
- `yellow`
|
|
72
|
+
- `blue`
|
|
73
|
+
- `magenta`
|
|
74
|
+
- `cyan`
|
|
75
|
+
- `white`
|
|
76
|
+
- `gray`
|
|
77
|
+
- `redBright`
|
|
78
|
+
- `greenBright`
|
|
79
|
+
- `yellowBright`
|
|
80
|
+
- `blueBright`
|
|
81
|
+
- `magentaBright`
|
|
82
|
+
- `cyanBright`
|
|
83
|
+
- `whiteBright`
|
|
84
|
+
|
|
85
|
+
### Background colors
|
|
86
|
+
|
|
87
|
+
- `bgBlack`
|
|
88
|
+
- `bgRed`
|
|
89
|
+
- `bgGreen`
|
|
90
|
+
- `bgYellow`
|
|
91
|
+
- `bgBlue`
|
|
92
|
+
- `bgMagenta`
|
|
93
|
+
- `bgCyan`
|
|
94
|
+
- `bgWhite`
|
|
95
|
+
- `bgGray`
|
|
96
|
+
- `bgRedBright`
|
|
97
|
+
- `bgGreenBright`
|
|
98
|
+
- `bgYellowBright`
|
|
99
|
+
- `bgBlueBright`
|
|
100
|
+
- `bgMagentaBright`
|
|
101
|
+
- `bgCyanBright`
|
|
102
|
+
- `bgWhiteBright`
|
|
103
|
+
|
|
104
|
+
## Prior art
|
|
105
|
+
|
|
106
|
+
Yes
|
|
107
|
+
|
|
108
|
+
## Benchmark
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
$ ./benchmark.js
|
|
112
|
+
┌─────────┬────────────────┬─────────────┐
|
|
113
|
+
│ (index) │ library │ ops/sec │
|
|
114
|
+
├─────────┼────────────────┼─────────────┤
|
|
115
|
+
│ 0 │ 'yoctocolors' │ '8,000,000' │
|
|
116
|
+
│ 1 │ 'colorette' │ '8,000,000' │
|
|
117
|
+
│ 2 │ 'picocolors' │ '8,000,000' │
|
|
118
|
+
│ 3 │ 'nanocolors' │ '5,988,024' │
|
|
119
|
+
│ 4 │ 'chalk' │ '4,807,692' │
|
|
120
|
+
│ 5 │ 'kleur/colors' │ '4,807,692' │
|
|
121
|
+
│ 6 │ 'kleur' │ '4,784,689' │
|
|
122
|
+
│ 7 │ 'ansi-colors' │ '2,178,649' │
|
|
123
|
+
│ 8 │ 'cli-color' │ '585,138' │
|
|
124
|
+
└─────────┴────────────────┴─────────────┘
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
*See [benchmark.js](benchmark.js).*
|
|
128
|
+
|
|
129
|
+
## FAQ
|
|
130
|
+
|
|
131
|
+
### What is yocto?
|
|
132
|
+
|
|
133
|
+
[It was the smallest official unit prefix in the metric system until 2022.](https://en.wikipedia.org/wiki/Yocto-) Much smaller than nano.
|
|
134
|
+
|
|
135
|
+
## Related
|
|
136
|
+
|
|
137
|
+
- [yoctodelay](https://github.com/sindresorhus/yoctodelay) - Delay a promise a given amount of time
|
|
138
|
+
- [chalk](https://github.com/chalk/chalk) - Terminal string styling
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "karajan-code",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "Local multi-agent coding orchestrator with TDD, SonarQube, and code review pipeline",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
@@ -84,6 +84,7 @@
|
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
86
|
"@babel/parser": "^7.29.7",
|
|
87
|
+
"@karajan/core": "*",
|
|
87
88
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
88
89
|
"better-sqlite3": "^12.10.0",
|
|
89
90
|
"chokidar": "^5.0.0",
|
|
@@ -99,6 +100,9 @@
|
|
|
99
100
|
"valibot": "^1.4.1",
|
|
100
101
|
"web-tree-sitter": "^0.26.9"
|
|
101
102
|
},
|
|
103
|
+
"bundleDependencies": [
|
|
104
|
+
"@karajan/core"
|
|
105
|
+
],
|
|
102
106
|
"devDependencies": {
|
|
103
107
|
"@eslint/js": "^10.0.1",
|
|
104
108
|
"@vitest/coverage-v8": "^4.1.8",
|
|
@@ -40,6 +40,9 @@ async function renderBoard() {
|
|
|
40
40
|
api(`/api/projects/${encodeURIComponent(selectedProject)}/cost`).catch(() => null),
|
|
41
41
|
]);
|
|
42
42
|
const costSummary = projectCost ? formatProjectCostSummary(projectCost) : null;
|
|
43
|
+
// Φ0-G (KJC-TSK-0525): aggregated cache-hit badge at the project
|
|
44
|
+
// header, rendered alongside the project cost chip.
|
|
45
|
+
const cacheSummary = projectCost ? formatCacheRatio(projectCost.cachedTokens, projectCost.tokensIn) : null;
|
|
43
46
|
|
|
44
47
|
// Pre-resolve project initials + name for every distinct project_id in
|
|
45
48
|
// the fetched stories so `renderStoryCard` is synchronous and the header
|
|
@@ -101,6 +104,7 @@ async function renderBoard() {
|
|
|
101
104
|
` : ''}
|
|
102
105
|
<span class="section-header__count">${stories.length} stories</span>
|
|
103
106
|
${costSummary ? `<span class="section-header__cost" title="${esc(costSummary.tooltip)}">💵 ${esc(costSummary.label)}</span>` : ''}
|
|
107
|
+
${cacheSummary ? `<span class="section-header__cache" title="${esc(cacheSummary.tooltip)}">${esc(cacheSummary.label)}</span>` : ''}
|
|
104
108
|
${isRunning ? `
|
|
105
109
|
<button id="running-badge-btn" class="section-header__badge"
|
|
106
110
|
style="margin-left:auto;padding:4px 10px;font-size:0.8rem;background:var(--color-yellow,#eab308);color:#000;border-radius:var(--radius-sm);font-weight:600;border:none;cursor:pointer;"
|
|
@@ -381,6 +385,13 @@ function renderStoryCard(story) {
|
|
|
381
385
|
const c = formatCost(story.cost_usd);
|
|
382
386
|
return c ? `<span class="story-card__cost" title="${esc(c.tooltip)}">💵 ${esc(c.label)}</span>` : '';
|
|
383
387
|
})()}
|
|
388
|
+
${(() => {
|
|
389
|
+
// Φ0-G (KJC-TSK-0525): per-HU cache hit badge. Rendered next to
|
|
390
|
+
// the cost so users can correlate "this run cost $X and 73% of
|
|
391
|
+
// input was served from cache" in one glance.
|
|
392
|
+
const r = formatCacheRatio(story.cached_tokens, story.tokens_in);
|
|
393
|
+
return r ? `<span class="story-card__cache" title="${esc(r.tooltip)}">${esc(r.label)}</span>` : '';
|
|
394
|
+
})()}
|
|
384
395
|
</div>
|
|
385
396
|
${missingTestContract ? `
|
|
386
397
|
<div class="story-card__meta" style="margin-top:4px;font-size:0.75rem;color:var(--color-yellow,#eab308);font-weight:600" title="This HU has no acceptance_tests declared — Run plan will reject it until you add at least one.">
|
|
@@ -55,6 +55,26 @@ function formatCost(costUsd) {
|
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// Φ0-G (KJC-TSK-0525): mirror of formatCacheRatio in src/format.js.
|
|
59
|
+
// Kept duplicated because this file is a classic script loaded into
|
|
60
|
+
// the browser, while src/format.js uses ES modules and is consumed by
|
|
61
|
+
// Node tests. See KJC-TSK-0501 header notes above.
|
|
62
|
+
function formatCacheRatio(cachedTokens, tokensIn) {
|
|
63
|
+
if (cachedTokens === null || cachedTokens === undefined) return null;
|
|
64
|
+
if (tokensIn === null || tokensIn === undefined) return null;
|
|
65
|
+
const c = Number(cachedTokens);
|
|
66
|
+
const t = Number(tokensIn);
|
|
67
|
+
if (!Number.isFinite(c) || !Number.isFinite(t)) return null;
|
|
68
|
+
if (t <= 0 || c < 0) return null;
|
|
69
|
+
const pct = Math.round((c / t) * 1000) / 10;
|
|
70
|
+
const num = c.toLocaleString("en-US");
|
|
71
|
+
const den = t.toLocaleString("en-US");
|
|
72
|
+
return {
|
|
73
|
+
label: `🎯 ${pct}%`,
|
|
74
|
+
tooltip: `Cache hits: ${num} / ${den} input tokens (${pct}%)`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
58
78
|
function formatProjectCostSummary(cost) {
|
|
59
79
|
if (!cost || typeof cost !== "object") return null;
|
|
60
80
|
const total = Number(cost.totalUsd);
|
|
@@ -63,6 +83,9 @@ function formatProjectCostSummary(cost) {
|
|
|
63
83
|
if (total === 0 && byPlan.length === 0) return null;
|
|
64
84
|
|
|
65
85
|
const lines = [`Total: $${total.toFixed(4)}`];
|
|
86
|
+
// Φ0-G (KJC-TSK-0525): aggregate cache hits line + per-plan suffix.
|
|
87
|
+
const projCache = formatCacheRatio(cost.cachedTokens, cost.tokensIn);
|
|
88
|
+
if (projCache) lines.push(`Cache: ${projCache.tooltip.split(": ")[1]}`);
|
|
66
89
|
if (byPlan.length > 0) {
|
|
67
90
|
lines.push("By plan:");
|
|
68
91
|
for (const p of byPlan) {
|
|
@@ -70,7 +93,11 @@ function formatProjectCostSummary(cost) {
|
|
|
70
93
|
if (!Number.isFinite(planTotal)) continue;
|
|
71
94
|
const huCount = Number.isFinite(p?.huCount) ? p.huCount : 0;
|
|
72
95
|
const planLabel = p?.planId || "unassigned";
|
|
73
|
-
|
|
96
|
+
const cachePct = p?.cachedRatioPct;
|
|
97
|
+
const cacheSuffix = (cachePct !== null && cachePct !== undefined && Number.isFinite(Number(cachePct)))
|
|
98
|
+
? ` 🎯 ${cachePct}%`
|
|
99
|
+
: "";
|
|
100
|
+
lines.push(` ${planLabel}: $${planTotal.toFixed(2)} (${huCount} HU${huCount === 1 ? "" : "s"})${cacheSuffix}`);
|
|
74
101
|
}
|
|
75
102
|
}
|
|
76
103
|
const unk = cost.unknownModelTokens;
|
|
@@ -328,6 +328,13 @@ export function initDb() {
|
|
|
328
328
|
// renders "—" while NULL. Stored as REAL so the SQL aggregations in
|
|
329
329
|
// Cost E (/api/projects/:id/cost) can SUM directly without parsing.
|
|
330
330
|
try { db.exec('ALTER TABLE stories ADD COLUMN cost_usd REAL'); } catch { /* already migrated */ }
|
|
331
|
+
// KJC-TSK-0525 (Φ0-G): persisted cached/input tokens per HU so the
|
|
332
|
+
// board can render the "🎯 N% cached" badge without re-parsing the
|
|
333
|
+
// session summary. NULL = unmeasured (older runs, cold runs without
|
|
334
|
+
// cache support). INTEGER because providers report token counts as
|
|
335
|
+
// ints. Ratio is computed at read time as cached_tokens / tokens_in.
|
|
336
|
+
try { db.exec('ALTER TABLE stories ADD COLUMN cached_tokens INTEGER'); } catch { /* already migrated */ }
|
|
337
|
+
try { db.exec('ALTER TABLE stories ADD COLUMN tokens_in INTEGER'); } catch { /* already migrated */ }
|
|
331
338
|
try { db.exec('CREATE INDEX IF NOT EXISTS idx_stories_plan ON stories(plan_id)'); } catch { /* ignore */ }
|
|
332
339
|
|
|
333
340
|
// is_test (KJC-TSK-0371 — board polish #3): per-project flag that
|
|
@@ -530,6 +537,35 @@ export function setStoryCost(storyId, costUsd) {
|
|
|
530
537
|
return res.changes > 0;
|
|
531
538
|
}
|
|
532
539
|
|
|
540
|
+
/**
|
|
541
|
+
* Persist cached/input tokens for a HU (KJC-TSK-0525, Φ0-G). Called by
|
|
542
|
+
* the orchestrator alongside `setStoryCost` once the HU finishes. Both
|
|
543
|
+
* values come from `BudgetTracker.since(huCursor)` (Φ0-E). Pass `null`
|
|
544
|
+
* to clear either cell. Non-finite numbers throw so callers don't
|
|
545
|
+
* silently null-out real telemetry.
|
|
546
|
+
*
|
|
547
|
+
* @param {string} storyId
|
|
548
|
+
* @param {number|null} cachedTokens
|
|
549
|
+
* @param {number|null} tokensIn
|
|
550
|
+
* @returns {boolean} true when the row existed and was updated
|
|
551
|
+
*/
|
|
552
|
+
export function setStoryCachedTokens(storyId, cachedTokens, tokensIn) {
|
|
553
|
+
const coerce = (v, name) => {
|
|
554
|
+
if (v === null || v === undefined) return null;
|
|
555
|
+
const n = Number(v);
|
|
556
|
+
if (!Number.isFinite(n) || n < 0) {
|
|
557
|
+
throw new Error(`setStoryCachedTokens: ${name} must be a non-negative finite number or null (got ${v})`);
|
|
558
|
+
}
|
|
559
|
+
return Math.round(n);
|
|
560
|
+
};
|
|
561
|
+
const cached = coerce(cachedTokens, 'cachedTokens');
|
|
562
|
+
const tin = coerce(tokensIn, 'tokensIn');
|
|
563
|
+
const res = getDb()
|
|
564
|
+
.prepare('UPDATE stories SET cached_tokens = ?, tokens_in = ?, updated_at = ? WHERE id = ?')
|
|
565
|
+
.run(cached, tin, new Date().toISOString(), storyId);
|
|
566
|
+
return res.changes > 0;
|
|
567
|
+
}
|
|
568
|
+
|
|
533
569
|
/**
|
|
534
570
|
* List every distinct `plan_id` stamped on the stories of a given project.
|
|
535
571
|
* Used by "mark plan ready" so the board can act on each plan of a project
|
|
@@ -643,9 +679,13 @@ export function getProjectCost(projectId) {
|
|
|
643
679
|
.get(projectId);
|
|
644
680
|
if (!project) return null;
|
|
645
681
|
|
|
682
|
+
// Φ0-G: cached_tokens / tokens_in are nullable independently of
|
|
683
|
+
// cost_usd, so we read all three columns but keep cost as the
|
|
684
|
+
// primary filter (a row with only cache telemetry but no $ should
|
|
685
|
+
// not appear in the per-plan totals — cost rules the byPlan list).
|
|
646
686
|
const rows = getDb()
|
|
647
687
|
.prepare(
|
|
648
|
-
`SELECT plan_id, cost_usd FROM stories
|
|
688
|
+
`SELECT plan_id, cost_usd, cached_tokens, tokens_in FROM stories
|
|
649
689
|
WHERE project_id = ? AND cost_usd IS NOT NULL`
|
|
650
690
|
)
|
|
651
691
|
.all(projectId);
|
|
@@ -653,24 +693,43 @@ export function getProjectCost(projectId) {
|
|
|
653
693
|
const round4 = (n) => Math.round(n * 10000) / 10000;
|
|
654
694
|
const byPlanMap = new Map();
|
|
655
695
|
let totalUsd = 0;
|
|
696
|
+
let totalCached = 0;
|
|
697
|
+
let totalTokensIn = 0;
|
|
656
698
|
for (const r of rows) {
|
|
657
699
|
const planId = r.plan_id || 'unassigned';
|
|
658
700
|
const cost = Number(r.cost_usd);
|
|
659
701
|
if (!Number.isFinite(cost)) continue;
|
|
660
702
|
totalUsd += cost;
|
|
661
|
-
const
|
|
703
|
+
const cached = Number(r.cached_tokens);
|
|
704
|
+
const tin = Number(r.tokens_in);
|
|
705
|
+
if (Number.isFinite(cached) && cached >= 0) totalCached += cached;
|
|
706
|
+
if (Number.isFinite(tin) && tin >= 0) totalTokensIn += tin;
|
|
707
|
+
const cur = byPlanMap.get(planId) || { planId, totalUsd: 0, huCount: 0, cachedTokens: 0, tokensIn: 0 };
|
|
662
708
|
cur.totalUsd += cost;
|
|
663
709
|
cur.huCount += 1;
|
|
710
|
+
if (Number.isFinite(cached) && cached >= 0) cur.cachedTokens += cached;
|
|
711
|
+
if (Number.isFinite(tin) && tin >= 0) cur.tokensIn += tin;
|
|
664
712
|
byPlanMap.set(planId, cur);
|
|
665
713
|
}
|
|
666
714
|
|
|
715
|
+
const ratio = (cached, tin) => tin > 0 ? Math.round((cached / tin) * 1000) / 10 : null;
|
|
667
716
|
const byPlan = Array.from(byPlanMap.values())
|
|
668
|
-
.map((p) => ({
|
|
717
|
+
.map((p) => ({
|
|
718
|
+
planId: p.planId,
|
|
719
|
+
totalUsd: round4(p.totalUsd),
|
|
720
|
+
huCount: p.huCount,
|
|
721
|
+
cachedTokens: p.cachedTokens,
|
|
722
|
+
tokensIn: p.tokensIn,
|
|
723
|
+
cachedRatioPct: ratio(p.cachedTokens, p.tokensIn),
|
|
724
|
+
}))
|
|
669
725
|
.sort((a, b) => b.totalUsd - a.totalUsd);
|
|
670
726
|
|
|
671
727
|
return {
|
|
672
728
|
totalUsd: round4(totalUsd),
|
|
673
729
|
byPlan,
|
|
730
|
+
cachedTokens: totalCached,
|
|
731
|
+
tokensIn: totalTokensIn,
|
|
732
|
+
cachedRatioPct: ratio(totalCached, totalTokensIn),
|
|
674
733
|
unknownModelTokens: { tokensIn: 0, tokensOut: 0, models: [] },
|
|
675
734
|
currency: 'USD',
|
|
676
735
|
};
|
|
@@ -87,6 +87,42 @@ export function formatCost(costUsd) {
|
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Φ0-G (KJC-TSK-0525): per-HU and per-plan cached-tokens badge.
|
|
92
|
+
*
|
|
93
|
+
* Returns `{ label, tooltip }` for "🎯 23%" with a tooltip showing the
|
|
94
|
+
* exact numerator/denominator. Same "don't render 0% when there is no
|
|
95
|
+
* data" stance as formatCost — returns null when:
|
|
96
|
+
* - either arg is null/undefined/non-finite,
|
|
97
|
+
* - tokens_in is 0 (no input → ratio undefined, not zero),
|
|
98
|
+
* - cached is negative (would only happen from corrupted telemetry).
|
|
99
|
+
*
|
|
100
|
+
* The badge intentionally shows 1 decimal to keep narrow runs (e.g.
|
|
101
|
+
* a 73-token cache out of 1 200) readable without rounding to 0%.
|
|
102
|
+
*
|
|
103
|
+
* @param {number|null|undefined} cachedTokens
|
|
104
|
+
* @param {number|null|undefined} tokensIn
|
|
105
|
+
* @returns {{ label: string, tooltip: string } | null}
|
|
106
|
+
*/
|
|
107
|
+
export function formatCacheRatio(cachedTokens, tokensIn) {
|
|
108
|
+
// Reject null/undefined explicitly — Number(null) coerces to 0,
|
|
109
|
+
// which would otherwise render an honest-looking "🎯 0%" badge for
|
|
110
|
+
// runs where we simply have no telemetry. Same stance as formatCost.
|
|
111
|
+
if (cachedTokens === null || cachedTokens === undefined) return null;
|
|
112
|
+
if (tokensIn === null || tokensIn === undefined) return null;
|
|
113
|
+
const c = Number(cachedTokens);
|
|
114
|
+
const t = Number(tokensIn);
|
|
115
|
+
if (!Number.isFinite(c) || !Number.isFinite(t)) return null;
|
|
116
|
+
if (t <= 0 || c < 0) return null;
|
|
117
|
+
const pct = Math.round((c / t) * 1000) / 10;
|
|
118
|
+
const num = c.toLocaleString("en-US");
|
|
119
|
+
const den = t.toLocaleString("en-US");
|
|
120
|
+
return {
|
|
121
|
+
label: `🎯 ${pct}%`,
|
|
122
|
+
tooltip: `Cache hits: ${num} / ${den} input tokens (${pct}%)`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
90
126
|
/**
|
|
91
127
|
* Format the aggregated project-level cost chip rendered in the board
|
|
92
128
|
* header. Cost G (KJC-TSK-0518). Consumes the shape returned by
|
|
@@ -116,6 +152,11 @@ export function formatProjectCostSummary(cost) {
|
|
|
116
152
|
if (total === 0 && byPlan.length === 0) return null;
|
|
117
153
|
|
|
118
154
|
const lines = [`Total: $${total.toFixed(4)}`];
|
|
155
|
+
// Φ0-G (KJC-TSK-0525): when the API includes project-level cache
|
|
156
|
+
// counters, show the aggregate cached% line right under the total
|
|
157
|
+
// so users can see at a glance how much was served from cache.
|
|
158
|
+
const projCache = formatCacheRatio(cost.cachedTokens, cost.tokensIn);
|
|
159
|
+
if (projCache) lines.push(`Cache: ${projCache.tooltip.split(": ")[1]}`);
|
|
119
160
|
if (byPlan.length > 0) {
|
|
120
161
|
lines.push("By plan:");
|
|
121
162
|
for (const p of byPlan) {
|
|
@@ -123,7 +164,11 @@ export function formatProjectCostSummary(cost) {
|
|
|
123
164
|
if (!Number.isFinite(planTotal)) continue;
|
|
124
165
|
const huCount = Number.isFinite(p?.huCount) ? p.huCount : 0;
|
|
125
166
|
const planLabel = p?.planId || "unassigned";
|
|
126
|
-
|
|
167
|
+
const cachePct = p?.cachedRatioPct;
|
|
168
|
+
const cacheSuffix = (cachePct !== null && cachePct !== undefined && Number.isFinite(Number(cachePct)))
|
|
169
|
+
? ` 🎯 ${cachePct}%`
|
|
170
|
+
: "";
|
|
171
|
+
lines.push(` ${planLabel}: $${planTotal.toFixed(2)} (${huCount} HU${huCount === 1 ? "" : "s"})${cacheSuffix}`);
|
|
127
172
|
}
|
|
128
173
|
}
|
|
129
174
|
const unk = cost.unknownModelTokens;
|
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
import { BaseAgent } from "./base-agent.js";
|
|
2
2
|
import { resolveBin } from "./resolve-bin.js";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Extract token usage from Aider's stdout. Two shapes are supported:
|
|
6
|
+
*
|
|
7
|
+
* 1. LiteLLM passthrough — an OpenAI-style JSON `usage` block surfaces
|
|
8
|
+
* `prompt_tokens_details.cached_tokens` for prompt-cache hits.
|
|
9
|
+
* 2. Aider's native footer "Tokens: <sent> sent, <received> received
|
|
10
|
+
* [, <cached> cache hit]." (supports comma-separated and `k` suffix).
|
|
11
|
+
*
|
|
12
|
+
* Returns `{tokens_in, tokens_out, cached_tokens}` or null when no usage
|
|
13
|
+
* is found (= unmeasured; callers leave the fields undefined).
|
|
14
|
+
*/
|
|
15
|
+
export function extractAiderUsage(text) {
|
|
16
|
+
if (!text) return null;
|
|
17
|
+
for (const line of text.split("\n")) {
|
|
18
|
+
const t = line.trim();
|
|
19
|
+
if (!t.startsWith("{")) continue;
|
|
20
|
+
let obj;
|
|
21
|
+
try { obj = JSON.parse(t); } catch { continue; }
|
|
22
|
+
const u = obj?.usage ?? (typeof obj?.prompt_tokens === "number" ? obj : null);
|
|
23
|
+
if (!u || typeof u.prompt_tokens !== "number") continue;
|
|
24
|
+
return {
|
|
25
|
+
tokens_in: u.prompt_tokens,
|
|
26
|
+
tokens_out: u.completion_tokens ?? 0,
|
|
27
|
+
cached_tokens: u.prompt_tokens_details?.cached_tokens ?? 0
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const m = text.match(/Tokens:\s*([\d.,]+k?)\s*sent,\s*([\d.,]+k?)\s*received(?:,\s*([\d.,]+k?)\s*cache\s*hit)?/i);
|
|
31
|
+
if (!m) return null;
|
|
32
|
+
const parse = (s) => {
|
|
33
|
+
const c = s.replaceAll(",", "");
|
|
34
|
+
return c.toLowerCase().endsWith("k")
|
|
35
|
+
? Math.round(parseFloat(c.slice(0, -1)) * 1000)
|
|
36
|
+
: Number(c);
|
|
37
|
+
};
|
|
38
|
+
const sent = parse(m[1]);
|
|
39
|
+
const recv = parse(m[2]);
|
|
40
|
+
if (!Number.isFinite(sent) || !Number.isFinite(recv)) return null;
|
|
41
|
+
return { tokens_in: sent, tokens_out: recv, cached_tokens: m[3] ? parse(m[3]) : 0 };
|
|
42
|
+
}
|
|
43
|
+
|
|
4
44
|
export class AiderAgent extends BaseAgent {
|
|
5
45
|
async runTask(task) {
|
|
6
46
|
const role = task.role || "coder";
|
|
@@ -32,6 +72,7 @@ export class AiderAgent extends BaseAgent {
|
|
|
32
72
|
silenceTimeoutMs: task.silenceTimeoutMs,
|
|
33
73
|
timeout: task.timeoutMs
|
|
34
74
|
});
|
|
35
|
-
|
|
75
|
+
const usage = extractAiderUsage(res.stdout) ?? extractAiderUsage(res.stderr);
|
|
76
|
+
return { ok: res.exitCode === 0, output: res.stdout, error: res.stderr, exitCode: res.exitCode, ...usage };
|
|
36
77
|
}
|
|
37
78
|
}
|
|
@@ -68,8 +68,16 @@ function collectAssistantText(obj) {
|
|
|
68
68
|
/**
|
|
69
69
|
* Extract usage metrics from stream-json/json NDJSON output.
|
|
70
70
|
* Looks for the "result" line which contains total_cost_usd,
|
|
71
|
-
* usage.input_tokens/output_tokens,
|
|
72
|
-
*
|
|
71
|
+
* usage.input_tokens/output_tokens, cache_read_input_tokens,
|
|
72
|
+
* cache_creation_input_tokens, and modelUsage.
|
|
73
|
+
*
|
|
74
|
+
* `cached_tokens` aggregates both cache_read_input_tokens (tokens served
|
|
75
|
+
* from Anthropic's automatic prompt cache) and cache_creation_input_tokens
|
|
76
|
+
* (tokens just written to the cache during this call). The sum represents
|
|
77
|
+
* the total volume of input that benefited from prompt-caching machinery.
|
|
78
|
+
*
|
|
79
|
+
* Returns an object with tokens_in, tokens_out, cached_tokens, cost_usd,
|
|
80
|
+
* model or null if not found.
|
|
73
81
|
*/
|
|
74
82
|
function extractUsageFromStreamJson(raw) {
|
|
75
83
|
const events = parseClaudeEvents(raw);
|
|
@@ -79,11 +87,14 @@ function extractUsageFromStreamJson(raw) {
|
|
|
79
87
|
|
|
80
88
|
const tokens_in = obj.usage?.input_tokens ?? 0;
|
|
81
89
|
const tokens_out = obj.usage?.output_tokens ?? 0;
|
|
90
|
+
const cache_read = obj.usage?.cache_read_input_tokens ?? 0;
|
|
91
|
+
const cache_creation = obj.usage?.cache_creation_input_tokens ?? 0;
|
|
92
|
+
const cached_tokens = cache_read + cache_creation;
|
|
82
93
|
const cost_usd = obj.total_cost_usd ?? undefined;
|
|
83
94
|
const modelUsage = obj.modelUsage;
|
|
84
95
|
const model = modelUsage ? Object.keys(modelUsage)[0] || null : null;
|
|
85
96
|
|
|
86
|
-
return { tokens_in, tokens_out, cost_usd, model };
|
|
97
|
+
return { tokens_in, tokens_out, cached_tokens, cost_usd, model };
|
|
87
98
|
}
|
|
88
99
|
return null;
|
|
89
100
|
}
|
|
@@ -310,6 +321,21 @@ const ALLOWED_TOOLS = [
|
|
|
310
321
|
"Read", "Write", "Edit", "Bash", "Glob", "Grep"
|
|
311
322
|
];
|
|
312
323
|
|
|
324
|
+
/**
|
|
325
|
+
* Base CLI args for a task (Φ1-D, KJC-PCS-0057). When the role provides the
|
|
326
|
+
* prompt split in stable/volatile buckets, the stable block travels via
|
|
327
|
+
* --append-system-prompt — the CLI places cache breakpoints on the system
|
|
328
|
+
* block, so Anthropic's prompt cache hits on it across iterations — and only
|
|
329
|
+
* the volatile block goes in the -p message. Without the split, legacy
|
|
330
|
+
* single-prompt behavior is unchanged.
|
|
331
|
+
*/
|
|
332
|
+
function buildPromptArgs(task) {
|
|
333
|
+
if (task.stablePrompt && task.volatilePrompt) {
|
|
334
|
+
return ["-p", task.volatilePrompt, "--append-system-prompt", task.stablePrompt, "--allowedTools", ...ALLOWED_TOOLS];
|
|
335
|
+
}
|
|
336
|
+
return ["-p", task.prompt, "--allowedTools", ...ALLOWED_TOOLS];
|
|
337
|
+
}
|
|
338
|
+
|
|
313
339
|
export class ClaudeAgent extends BaseAgent {
|
|
314
340
|
async runTask(task) {
|
|
315
341
|
const role = task.role || "coder";
|
|
@@ -334,7 +360,7 @@ export class ClaudeAgent extends BaseAgent {
|
|
|
334
360
|
}
|
|
335
361
|
|
|
336
362
|
async _runTaskExec(task, model, _role) {
|
|
337
|
-
const args =
|
|
363
|
+
const args = buildPromptArgs(task);
|
|
338
364
|
if (model) args.push("--model", model);
|
|
339
365
|
|
|
340
366
|
// Use stream-json when onOutput is provided to get real-time feedback
|
|
@@ -362,7 +388,7 @@ export class ClaudeAgent extends BaseAgent {
|
|
|
362
388
|
}
|
|
363
389
|
|
|
364
390
|
async _reviewTaskExec(task, model) {
|
|
365
|
-
const args = [
|
|
391
|
+
const args = [...buildPromptArgs(task), "--output-format", "stream-json", "--verbose"];
|
|
366
392
|
if (model) args.push("--model", model);
|
|
367
393
|
const res = await this.runCommand(resolveBin("claude"), args, cleanExecaOpts({
|
|
368
394
|
onOutput: task.onOutput,
|
|
@@ -2,18 +2,55 @@ import { BaseAgent } from "./base-agent.js";
|
|
|
2
2
|
import { resolveBin } from "./resolve-bin.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Try to extract an OpenAI-style `usage` JSON block from codex stdout.
|
|
6
|
+
*
|
|
7
|
+
* OpenAI's Chat Completions API exposes prompt-cache hits via
|
|
8
|
+
* `usage.prompt_tokens_details.cached_tokens` (since Aug 2024). Codex
|
|
9
|
+
* CLI doesn't surface this in its default footer, but newer flags or a
|
|
10
|
+
* wrapper may emit a JSON `usage` line. We scan stdout line-by-line and
|
|
11
|
+
* accept the first parseable object that carries `prompt_tokens`.
|
|
12
|
+
*
|
|
13
|
+
* Returns `{tokens_in, tokens_out, cached_tokens}` or null when absent.
|
|
14
|
+
*/
|
|
15
|
+
function extractJsonUsage(stdout) {
|
|
16
|
+
for (const line of stdout.split("\n")) {
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
if (!trimmed.startsWith("{")) continue;
|
|
19
|
+
let obj;
|
|
20
|
+
try { obj = JSON.parse(trimmed); } catch { continue; }
|
|
21
|
+
const usage = obj?.usage ?? (typeof obj?.prompt_tokens === "number" ? obj : null);
|
|
22
|
+
if (!usage || typeof usage.prompt_tokens !== "number") continue;
|
|
23
|
+
return {
|
|
24
|
+
tokens_in: usage.prompt_tokens,
|
|
25
|
+
tokens_out: usage.completion_tokens ?? 0,
|
|
26
|
+
cached_tokens: usage.prompt_tokens_details?.cached_tokens ?? 0
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Extract token usage from Codex CLI stdout. Two shapes are supported:
|
|
34
|
+
*
|
|
35
|
+
* 1. OpenAI-style JSON `usage` block (preferred):
|
|
36
|
+
* `{"usage":{"prompt_tokens":N,"completion_tokens":M,
|
|
37
|
+
* "prompt_tokens_details":{"cached_tokens":C}}}`
|
|
38
|
+
* → `{tokens_in:N, tokens_out:M, cached_tokens:C}`.
|
|
39
|
+
*
|
|
40
|
+
* 2. Legacy "tokens used\n<number>" footer (codex's default total,
|
|
41
|
+
* no cache visibility) → `{tokens_in:0, tokens_out, cached_tokens:0}`.
|
|
42
|
+
*
|
|
43
|
+
* Returns null when neither shape is found.
|
|
10
44
|
*/
|
|
11
45
|
function extractCodexTokens(stdout) {
|
|
12
|
-
|
|
46
|
+
if (!stdout) return null;
|
|
47
|
+
const json = extractJsonUsage(stdout);
|
|
48
|
+
if (json) return json;
|
|
49
|
+
const match = stdout.match(/tokens?\s+used\s*\n\s*([\d,]+)/i);
|
|
13
50
|
if (!match) return null;
|
|
14
51
|
const total = Number(match[1].replaceAll(/,/g, ""));
|
|
15
52
|
if (!Number.isFinite(total) || total <= 0) return null;
|
|
16
|
-
return { tokens_in: 0, tokens_out: total };
|
|
53
|
+
return { tokens_in: 0, tokens_out: total, cached_tokens: 0 };
|
|
17
54
|
}
|
|
18
55
|
|
|
19
56
|
export class CodexAgent extends BaseAgent {
|
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
import { BaseAgent } from "./base-agent.js";
|
|
2
2
|
import { resolveBin } from "./resolve-bin.js";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Extract Gemini's `usageMetadata` from stdout, including
|
|
6
|
+
* `cachedContentTokenCount` (Gemini's context-caching API metric,
|
|
7
|
+
* https://ai.google.dev/api/caching).
|
|
8
|
+
*
|
|
9
|
+
* The gemini CLI emits `usageMetadata` as part of its JSON response
|
|
10
|
+
* shape (today: only `--output-format json`, used in reviewTask; in
|
|
11
|
+
* plain runTask mode no usage is surfaced). When absent, returns null
|
|
12
|
+
* so the caller leaves `cached_tokens` undefined (= unmeasured,
|
|
13
|
+
* distinct from a measured 0).
|
|
14
|
+
*/
|
|
15
|
+
export function extractGeminiUsage(text) {
|
|
16
|
+
if (!text) return null;
|
|
17
|
+
const candidates = [];
|
|
18
|
+
for (const line of text.split("\n")) {
|
|
19
|
+
const t = line.trim();
|
|
20
|
+
if (t.startsWith("{") || t.startsWith("[")) candidates.push(t);
|
|
21
|
+
}
|
|
22
|
+
candidates.push(text.trim());
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
let obj;
|
|
25
|
+
try { obj = JSON.parse(candidate); } catch { continue; }
|
|
26
|
+
const meta = obj?.usageMetadata
|
|
27
|
+
?? obj?.usage_metadata
|
|
28
|
+
?? obj?.response?.usageMetadata;
|
|
29
|
+
if (!meta || typeof meta.promptTokenCount !== "number") continue;
|
|
30
|
+
return {
|
|
31
|
+
tokens_in: meta.promptTokenCount,
|
|
32
|
+
tokens_out: meta.candidatesTokenCount ?? 0,
|
|
33
|
+
cached_tokens: meta.cachedContentTokenCount ?? 0
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
4
39
|
export class GeminiAgent extends BaseAgent {
|
|
5
40
|
async runTask(task) {
|
|
6
41
|
const role = task.role || "coder";
|
|
@@ -33,6 +68,7 @@ export class GeminiAgent extends BaseAgent {
|
|
|
33
68
|
silenceTimeoutMs: task.silenceTimeoutMs,
|
|
34
69
|
timeout: task.timeoutMs
|
|
35
70
|
});
|
|
36
|
-
|
|
71
|
+
const usage = extractGeminiUsage(res.stdout) ?? extractGeminiUsage(res.stderr);
|
|
72
|
+
return { ok: res.exitCode === 0, output: res.stdout, error: res.stderr, exitCode: res.exitCode, ...usage };
|
|
37
73
|
}
|
|
38
74
|
}
|