@vellumai/assistant 0.4.55 → 0.4.57
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/ARCHITECTURE.md +161 -167
- package/Dockerfile +9 -9
- package/README.md +12 -12
- package/bun.lock +145 -112
- package/docs/architecture/integrations.md +24 -24
- package/docs/architecture/memory.md +53 -54
- package/docs/architecture/security.md +2 -2
- package/docs/credential-execution-service.md +404 -0
- package/knip.json +5 -1
- package/node_modules/@vellumai/ces-contracts/bun.lock +29 -0
- package/node_modules/@vellumai/ces-contracts/package.json +24 -0
- package/node_modules/@vellumai/ces-contracts/src/__tests__/contracts.test.ts +293 -0
- package/node_modules/@vellumai/ces-contracts/src/__tests__/grants.test.ts +686 -0
- package/node_modules/@vellumai/ces-contracts/src/error.ts +26 -0
- package/node_modules/@vellumai/ces-contracts/src/grants.ts +184 -0
- package/node_modules/@vellumai/ces-contracts/src/handles.ts +213 -0
- package/node_modules/@vellumai/ces-contracts/src/index.ts +147 -0
- package/node_modules/@vellumai/ces-contracts/src/rendering.ts +135 -0
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +511 -0
- package/node_modules/@vellumai/ces-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/credential-storage/bun.lock +24 -0
- package/node_modules/@vellumai/credential-storage/package.json +17 -0
- package/node_modules/@vellumai/credential-storage/src/__tests__/package-boundary.test.ts +151 -0
- package/node_modules/@vellumai/credential-storage/src/index.ts +213 -0
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +340 -0
- package/node_modules/@vellumai/credential-storage/src/static-credentials.ts +365 -0
- package/node_modules/@vellumai/credential-storage/tsconfig.json +20 -0
- package/node_modules/@vellumai/egress-proxy/bun.lock +24 -0
- package/node_modules/@vellumai/egress-proxy/package.json +17 -0
- package/node_modules/@vellumai/egress-proxy/src/__tests__/package-boundary.test.ts +131 -0
- package/node_modules/@vellumai/egress-proxy/src/index.ts +54 -0
- package/node_modules/@vellumai/egress-proxy/src/session-core.ts +466 -0
- package/node_modules/@vellumai/egress-proxy/src/types.ts +227 -0
- package/node_modules/@vellumai/egress-proxy/tsconfig.json +20 -0
- package/node_modules/zod/LICENSE +21 -0
- package/node_modules/zod/README.md +208 -0
- package/node_modules/zod/index.cjs +33 -0
- package/node_modules/zod/index.d.cts +4 -0
- package/node_modules/zod/index.d.ts +4 -0
- package/node_modules/zod/index.js +4 -0
- package/node_modules/zod/locales/index.cjs +17 -0
- package/node_modules/zod/locales/index.d.cts +1 -0
- package/node_modules/zod/locales/index.d.ts +1 -0
- package/node_modules/zod/locales/index.js +1 -0
- package/node_modules/zod/locales/package.json +6 -0
- package/node_modules/zod/mini/index.cjs +32 -0
- package/node_modules/zod/mini/index.d.cts +3 -0
- package/node_modules/zod/mini/index.d.ts +3 -0
- package/node_modules/zod/mini/index.js +3 -0
- package/node_modules/zod/mini/package.json +6 -0
- package/node_modules/zod/package.json +135 -0
- package/node_modules/zod/src/index.ts +4 -0
- package/node_modules/zod/src/locales/index.ts +1 -0
- package/node_modules/zod/src/mini/index.ts +3 -0
- package/node_modules/zod/src/v3/ZodError.ts +330 -0
- package/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
- package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
- package/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
- package/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
- package/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
- package/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
- package/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
- package/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
- package/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
- package/node_modules/zod/src/v3/errors.ts +13 -0
- package/node_modules/zod/src/v3/external.ts +6 -0
- package/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
- package/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
- package/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
- package/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
- package/node_modules/zod/src/v3/helpers/util.ts +224 -0
- package/node_modules/zod/src/v3/index.ts +4 -0
- package/node_modules/zod/src/v3/locales/en.ts +124 -0
- package/node_modules/zod/src/v3/standard-schema.ts +113 -0
- package/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
- package/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
- package/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
- package/node_modules/zod/src/v3/tests/array.test.ts +71 -0
- package/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
- package/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
- package/node_modules/zod/src/v3/tests/base.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
- package/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
- package/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
- package/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/complex.test.ts +70 -0
- package/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
- package/node_modules/zod/src/v3/tests/date.test.ts +32 -0
- package/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/default.test.ts +112 -0
- package/node_modules/zod/src/v3/tests/description.test.ts +33 -0
- package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
- package/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
- package/node_modules/zod/src/v3/tests/error.test.ts +551 -0
- package/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
- package/node_modules/zod/src/v3/tests/function.test.ts +261 -0
- package/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
- package/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
- package/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
- package/node_modules/zod/src/v3/tests/map.test.ts +110 -0
- package/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
- package/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
- package/node_modules/zod/src/v3/tests/nan.test.ts +24 -0
- package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
- package/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/number.test.ts +176 -0
- package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/object.test.ts +434 -0
- package/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
- package/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
- package/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
- package/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
- package/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
- package/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
- package/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
- package/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
- package/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
- package/node_modules/zod/src/v3/tests/record.test.ts +171 -0
- package/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
- package/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
- package/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
- package/node_modules/zod/src/v3/tests/set.test.ts +142 -0
- package/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
- package/node_modules/zod/src/v3/tests/string.test.ts +916 -0
- package/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
- package/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
- package/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
- package/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
- package/node_modules/zod/src/v3/tests/void.test.ts +15 -0
- package/node_modules/zod/src/v3/types.ts +5138 -0
- package/node_modules/zod/src/v4/classic/checks.ts +32 -0
- package/node_modules/zod/src/v4/classic/coerce.ts +27 -0
- package/node_modules/zod/src/v4/classic/compat.ts +70 -0
- package/node_modules/zod/src/v4/classic/errors.ts +82 -0
- package/node_modules/zod/src/v4/classic/external.ts +51 -0
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +643 -0
- package/node_modules/zod/src/v4/classic/index.ts +5 -0
- package/node_modules/zod/src/v4/classic/iso.ts +90 -0
- package/node_modules/zod/src/v4/classic/parse.ts +82 -0
- package/node_modules/zod/src/v4/classic/schemas.ts +2409 -0
- package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
- package/node_modules/zod/src/v4/classic/tests/apply.test.ts +59 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +210 -0
- package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
- package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
- package/node_modules/zod/src/v4/classic/tests/brand.test.ts +106 -0
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +276 -0
- package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
- package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +573 -0
- package/node_modules/zod/src/v4/classic/tests/codec.test.ts +562 -0
- package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +374 -0
- package/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +62 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +302 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +365 -0
- package/node_modules/zod/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +661 -0
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +595 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
- package/node_modules/zod/src/v4/classic/tests/file.test.ts +96 -0
- package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +179 -0
- package/node_modules/zod/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +734 -0
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +360 -0
- package/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
- package/node_modules/zod/src/v4/classic/tests/hash.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +939 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +60 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +198 -0
- package/node_modules/zod/src/v4/classic/tests/json.test.ts +109 -0
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +117 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +330 -0
- package/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
- package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
- package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +101 -0
- package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +270 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +640 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +223 -0
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +427 -0
- package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +211 -0
- package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +101 -0
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +74 -0
- package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +282 -0
- package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
- package/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +632 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +582 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +570 -0
- package/node_modules/zod/src/v4/classic/tests/registries.test.ts +243 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +181 -0
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +134 -0
- package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +125 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +1175 -0
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +106 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +771 -0
- package/node_modules/zod/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +2990 -0
- package/node_modules/zod/src/v4/classic/tests/transform.test.ts +361 -0
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +183 -0
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +219 -0
- package/node_modules/zod/src/v4/classic/tests/url.test.ts +13 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
- package/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
- package/node_modules/zod/src/v4/core/api.ts +1798 -0
- package/node_modules/zod/src/v4/core/checks.ts +1293 -0
- package/node_modules/zod/src/v4/core/config.ts +15 -0
- package/node_modules/zod/src/v4/core/core.ts +138 -0
- package/node_modules/zod/src/v4/core/doc.ts +44 -0
- package/node_modules/zod/src/v4/core/errors.ts +448 -0
- package/node_modules/zod/src/v4/core/index.ts +16 -0
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +126 -0
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +667 -0
- package/node_modules/zod/src/v4/core/json-schema.ts +147 -0
- package/node_modules/zod/src/v4/core/parse.ts +195 -0
- package/node_modules/zod/src/v4/core/regexes.ts +183 -0
- package/node_modules/zod/src/v4/core/registries.ts +105 -0
- package/node_modules/zod/src/v4/core/schemas.ts +4538 -0
- package/node_modules/zod/src/v4/core/standard-schema.ts +159 -0
- package/node_modules/zod/src/v4/core/tests/extend.test.ts +59 -0
- package/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
- package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
- package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +181 -0
- package/node_modules/zod/src/v4/core/tests/locales/he.test.ts +379 -0
- package/node_modules/zod/src/v4/core/tests/locales/nl.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
- package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
- package/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +83 -0
- package/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +67 -0
- package/node_modules/zod/src/v4/core/tests/recursive-tuples.test.ts +45 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +613 -0
- package/node_modules/zod/src/v4/core/util.ts +966 -0
- package/node_modules/zod/src/v4/core/versions.ts +5 -0
- package/node_modules/zod/src/v4/core/zsf.ts +323 -0
- package/node_modules/zod/src/v4/index.ts +4 -0
- package/node_modules/zod/src/v4/locales/ar.ts +115 -0
- package/node_modules/zod/src/v4/locales/az.ts +111 -0
- package/node_modules/zod/src/v4/locales/be.ts +176 -0
- package/node_modules/zod/src/v4/locales/bg.ts +128 -0
- package/node_modules/zod/src/v4/locales/ca.ts +116 -0
- package/node_modules/zod/src/v4/locales/cs.ts +118 -0
- package/node_modules/zod/src/v4/locales/da.ts +123 -0
- package/node_modules/zod/src/v4/locales/de.ts +116 -0
- package/node_modules/zod/src/v4/locales/en.ts +119 -0
- package/node_modules/zod/src/v4/locales/eo.ts +118 -0
- package/node_modules/zod/src/v4/locales/es.ts +141 -0
- package/node_modules/zod/src/v4/locales/fa.ts +126 -0
- package/node_modules/zod/src/v4/locales/fi.ts +121 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +116 -0
- package/node_modules/zod/src/v4/locales/fr.ts +116 -0
- package/node_modules/zod/src/v4/locales/he.ts +246 -0
- package/node_modules/zod/src/v4/locales/hu.ts +117 -0
- package/node_modules/zod/src/v4/locales/hy.ts +164 -0
- package/node_modules/zod/src/v4/locales/id.ts +115 -0
- package/node_modules/zod/src/v4/locales/index.ts +49 -0
- package/node_modules/zod/src/v4/locales/is.ts +119 -0
- package/node_modules/zod/src/v4/locales/it.ts +116 -0
- package/node_modules/zod/src/v4/locales/ja.ts +114 -0
- package/node_modules/zod/src/v4/locales/ka.ts +123 -0
- package/node_modules/zod/src/v4/locales/kh.ts +7 -0
- package/node_modules/zod/src/v4/locales/km.ts +119 -0
- package/node_modules/zod/src/v4/locales/ko.ts +121 -0
- package/node_modules/zod/src/v4/locales/lt.ts +239 -0
- package/node_modules/zod/src/v4/locales/mk.ts +118 -0
- package/node_modules/zod/src/v4/locales/ms.ts +115 -0
- package/node_modules/zod/src/v4/locales/nl.ts +121 -0
- package/node_modules/zod/src/v4/locales/no.ts +116 -0
- package/node_modules/zod/src/v4/locales/ota.ts +117 -0
- package/node_modules/zod/src/v4/locales/pl.ts +118 -0
- package/node_modules/zod/src/v4/locales/ps.ts +126 -0
- package/node_modules/zod/src/v4/locales/pt.ts +116 -0
- package/node_modules/zod/src/v4/locales/ru.ts +176 -0
- package/node_modules/zod/src/v4/locales/sl.ts +118 -0
- package/node_modules/zod/src/v4/locales/sv.ts +119 -0
- package/node_modules/zod/src/v4/locales/ta.ts +118 -0
- package/node_modules/zod/src/v4/locales/th.ts +119 -0
- package/node_modules/zod/src/v4/locales/tr.ts +111 -0
- package/node_modules/zod/src/v4/locales/ua.ts +7 -0
- package/node_modules/zod/src/v4/locales/uk.ts +117 -0
- package/node_modules/zod/src/v4/locales/ur.ts +119 -0
- package/node_modules/zod/src/v4/locales/uz.ts +116 -0
- package/node_modules/zod/src/v4/locales/vi.ts +117 -0
- package/node_modules/zod/src/v4/locales/yo.ts +124 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +116 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +115 -0
- package/node_modules/zod/src/v4/mini/checks.ts +32 -0
- package/node_modules/zod/src/v4/mini/coerce.ts +27 -0
- package/node_modules/zod/src/v4/mini/external.ts +40 -0
- package/node_modules/zod/src/v4/mini/index.ts +3 -0
- package/node_modules/zod/src/v4/mini/iso.ts +66 -0
- package/node_modules/zod/src/v4/mini/parse.ts +14 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +1916 -0
- package/node_modules/zod/src/v4/mini/tests/apply.test.ts +24 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
- package/node_modules/zod/src/v4/mini/tests/brand.test.ts +94 -0
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
- package/node_modules/zod/src/v4/mini/tests/codec.test.ts +529 -0
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +5 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +963 -0
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +227 -0
- package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +275 -0
- package/node_modules/zod/src/v4/mini/tests/standard-schema.test.ts +50 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +347 -0
- package/node_modules/zod/src/v4-mini/index.ts +3 -0
- package/node_modules/zod/v3/ZodError.cjs +138 -0
- package/node_modules/zod/v3/ZodError.d.cts +164 -0
- package/node_modules/zod/v3/ZodError.d.ts +164 -0
- package/node_modules/zod/v3/ZodError.js +133 -0
- package/node_modules/zod/v3/errors.cjs +17 -0
- package/node_modules/zod/v3/errors.d.cts +5 -0
- package/node_modules/zod/v3/errors.d.ts +5 -0
- package/node_modules/zod/v3/errors.js +9 -0
- package/node_modules/zod/v3/external.cjs +22 -0
- package/node_modules/zod/v3/external.d.cts +6 -0
- package/node_modules/zod/v3/external.d.ts +6 -0
- package/node_modules/zod/v3/external.js +6 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/enumUtil.js +1 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.cts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.d.ts +9 -0
- package/node_modules/zod/v3/helpers/errorUtil.js +6 -0
- package/node_modules/zod/v3/helpers/parseUtil.cjs +124 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.cts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.d.ts +78 -0
- package/node_modules/zod/v3/helpers/parseUtil.js +109 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +2 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.cts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.d.ts +8 -0
- package/node_modules/zod/v3/helpers/partialUtil.js +1 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.cts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.d.ts +2 -0
- package/node_modules/zod/v3/helpers/typeAliases.js +1 -0
- package/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/node_modules/zod/v3/helpers/util.d.cts +85 -0
- package/node_modules/zod/v3/helpers/util.d.ts +85 -0
- package/node_modules/zod/v3/helpers/util.js +133 -0
- package/node_modules/zod/v3/index.cjs +33 -0
- package/node_modules/zod/v3/index.d.cts +4 -0
- package/node_modules/zod/v3/index.d.ts +4 -0
- package/node_modules/zod/v3/index.js +4 -0
- package/node_modules/zod/v3/locales/en.cjs +112 -0
- package/node_modules/zod/v3/locales/en.d.cts +3 -0
- package/node_modules/zod/v3/locales/en.d.ts +3 -0
- package/node_modules/zod/v3/locales/en.js +109 -0
- package/node_modules/zod/v3/package.json +6 -0
- package/node_modules/zod/v3/standard-schema.cjs +2 -0
- package/node_modules/zod/v3/standard-schema.d.cts +102 -0
- package/node_modules/zod/v3/standard-schema.d.ts +102 -0
- package/node_modules/zod/v3/standard-schema.js +1 -0
- package/node_modules/zod/v3/types.cjs +3777 -0
- package/node_modules/zod/v3/types.d.cts +1034 -0
- package/node_modules/zod/v3/types.d.ts +1034 -0
- package/node_modules/zod/v3/types.js +3695 -0
- package/node_modules/zod/v4/classic/checks.cjs +33 -0
- package/node_modules/zod/v4/classic/checks.d.cts +1 -0
- package/node_modules/zod/v4/classic/checks.d.ts +1 -0
- package/node_modules/zod/v4/classic/checks.js +1 -0
- package/node_modules/zod/v4/classic/coerce.cjs +47 -0
- package/node_modules/zod/v4/classic/coerce.d.cts +17 -0
- package/node_modules/zod/v4/classic/coerce.d.ts +17 -0
- package/node_modules/zod/v4/classic/coerce.js +17 -0
- package/node_modules/zod/v4/classic/compat.cjs +61 -0
- package/node_modules/zod/v4/classic/compat.d.cts +50 -0
- package/node_modules/zod/v4/classic/compat.d.ts +50 -0
- package/node_modules/zod/v4/classic/compat.js +31 -0
- package/node_modules/zod/v4/classic/errors.cjs +74 -0
- package/node_modules/zod/v4/classic/errors.d.cts +30 -0
- package/node_modules/zod/v4/classic/errors.d.ts +30 -0
- package/node_modules/zod/v4/classic/errors.js +48 -0
- package/node_modules/zod/v4/classic/external.cjs +73 -0
- package/node_modules/zod/v4/classic/external.d.cts +15 -0
- package/node_modules/zod/v4/classic/external.d.ts +15 -0
- package/node_modules/zod/v4/classic/external.js +20 -0
- package/node_modules/zod/v4/classic/from-json-schema.cjs +610 -0
- package/node_modules/zod/v4/classic/from-json-schema.d.cts +12 -0
- package/node_modules/zod/v4/classic/from-json-schema.d.ts +12 -0
- package/node_modules/zod/v4/classic/from-json-schema.js +584 -0
- package/node_modules/zod/v4/classic/index.cjs +33 -0
- package/node_modules/zod/v4/classic/index.d.cts +4 -0
- package/node_modules/zod/v4/classic/index.d.ts +4 -0
- package/node_modules/zod/v4/classic/index.js +4 -0
- package/node_modules/zod/v4/classic/iso.cjs +60 -0
- package/node_modules/zod/v4/classic/iso.d.cts +22 -0
- package/node_modules/zod/v4/classic/iso.d.ts +22 -0
- package/node_modules/zod/v4/classic/iso.js +30 -0
- package/node_modules/zod/v4/classic/package.json +6 -0
- package/node_modules/zod/v4/classic/parse.cjs +41 -0
- package/node_modules/zod/v4/classic/parse.d.cts +31 -0
- package/node_modules/zod/v4/classic/parse.d.ts +31 -0
- package/node_modules/zod/v4/classic/parse.js +15 -0
- package/node_modules/zod/v4/classic/schemas.cjs +1272 -0
- package/node_modules/zod/v4/classic/schemas.d.cts +739 -0
- package/node_modules/zod/v4/classic/schemas.d.ts +739 -0
- package/node_modules/zod/v4/classic/schemas.js +1157 -0
- package/node_modules/zod/v4/core/api.cjs +1222 -0
- package/node_modules/zod/v4/core/api.d.cts +304 -0
- package/node_modules/zod/v4/core/api.d.ts +304 -0
- package/node_modules/zod/v4/core/api.js +1082 -0
- package/node_modules/zod/v4/core/checks.cjs +601 -0
- package/node_modules/zod/v4/core/checks.d.cts +278 -0
- package/node_modules/zod/v4/core/checks.d.ts +278 -0
- package/node_modules/zod/v4/core/checks.js +575 -0
- package/node_modules/zod/v4/core/core.cjs +83 -0
- package/node_modules/zod/v4/core/core.d.cts +70 -0
- package/node_modules/zod/v4/core/core.d.ts +70 -0
- package/node_modules/zod/v4/core/core.js +76 -0
- package/node_modules/zod/v4/core/doc.cjs +39 -0
- package/node_modules/zod/v4/core/doc.d.cts +14 -0
- package/node_modules/zod/v4/core/doc.d.ts +14 -0
- package/node_modules/zod/v4/core/doc.js +35 -0
- package/node_modules/zod/v4/core/errors.cjs +213 -0
- package/node_modules/zod/v4/core/errors.d.cts +220 -0
- package/node_modules/zod/v4/core/errors.d.ts +220 -0
- package/node_modules/zod/v4/core/errors.js +182 -0
- package/node_modules/zod/v4/core/index.cjs +47 -0
- package/node_modules/zod/v4/core/index.d.cts +16 -0
- package/node_modules/zod/v4/core/index.d.ts +16 -0
- package/node_modules/zod/v4/core/index.js +16 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +99 -0
- package/node_modules/zod/v4/core/json-schema-generator.d.cts +65 -0
- package/node_modules/zod/v4/core/json-schema-generator.d.ts +65 -0
- package/node_modules/zod/v4/core/json-schema-generator.js +95 -0
- package/node_modules/zod/v4/core/json-schema-processors.cjs +648 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +49 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +49 -0
- package/node_modules/zod/v4/core/json-schema-processors.js +605 -0
- package/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/node_modules/zod/v4/core/json-schema.d.cts +88 -0
- package/node_modules/zod/v4/core/json-schema.d.ts +88 -0
- package/node_modules/zod/v4/core/json-schema.js +1 -0
- package/node_modules/zod/v4/core/package.json +6 -0
- package/node_modules/zod/v4/core/parse.cjs +131 -0
- package/node_modules/zod/v4/core/parse.d.cts +49 -0
- package/node_modules/zod/v4/core/parse.d.ts +49 -0
- package/node_modules/zod/v4/core/parse.js +93 -0
- package/node_modules/zod/v4/core/regexes.cjs +166 -0
- package/node_modules/zod/v4/core/regexes.d.cts +79 -0
- package/node_modules/zod/v4/core/regexes.d.ts +79 -0
- package/node_modules/zod/v4/core/regexes.js +133 -0
- package/node_modules/zod/v4/core/registries.cjs +56 -0
- package/node_modules/zod/v4/core/registries.d.cts +35 -0
- package/node_modules/zod/v4/core/registries.d.ts +35 -0
- package/node_modules/zod/v4/core/registries.js +51 -0
- package/node_modules/zod/v4/core/schemas.cjs +2124 -0
- package/node_modules/zod/v4/core/schemas.d.cts +1146 -0
- package/node_modules/zod/v4/core/schemas.d.ts +1146 -0
- package/node_modules/zod/v4/core/schemas.js +2093 -0
- package/node_modules/zod/v4/core/standard-schema.cjs +2 -0
- package/node_modules/zod/v4/core/standard-schema.d.cts +126 -0
- package/node_modules/zod/v4/core/standard-schema.d.ts +126 -0
- package/node_modules/zod/v4/core/standard-schema.js +1 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +446 -0
- package/node_modules/zod/v4/core/to-json-schema.d.cts +114 -0
- package/node_modules/zod/v4/core/to-json-schema.d.ts +114 -0
- package/node_modules/zod/v4/core/to-json-schema.js +437 -0
- package/node_modules/zod/v4/core/util.cjs +710 -0
- package/node_modules/zod/v4/core/util.d.cts +199 -0
- package/node_modules/zod/v4/core/util.d.ts +199 -0
- package/node_modules/zod/v4/core/util.js +651 -0
- package/node_modules/zod/v4/core/versions.cjs +8 -0
- package/node_modules/zod/v4/core/versions.d.cts +5 -0
- package/node_modules/zod/v4/core/versions.d.ts +5 -0
- package/node_modules/zod/v4/core/versions.js +5 -0
- package/node_modules/zod/v4/index.cjs +22 -0
- package/node_modules/zod/v4/index.d.cts +3 -0
- package/node_modules/zod/v4/index.d.ts +3 -0
- package/node_modules/zod/v4/index.js +3 -0
- package/node_modules/zod/v4/locales/ar.cjs +133 -0
- package/node_modules/zod/v4/locales/ar.d.cts +5 -0
- package/node_modules/zod/v4/locales/ar.d.ts +4 -0
- package/node_modules/zod/v4/locales/ar.js +106 -0
- package/node_modules/zod/v4/locales/az.cjs +132 -0
- package/node_modules/zod/v4/locales/az.d.cts +5 -0
- package/node_modules/zod/v4/locales/az.d.ts +4 -0
- package/node_modules/zod/v4/locales/az.js +105 -0
- package/node_modules/zod/v4/locales/be.cjs +183 -0
- package/node_modules/zod/v4/locales/be.d.cts +5 -0
- package/node_modules/zod/v4/locales/be.d.ts +4 -0
- package/node_modules/zod/v4/locales/be.js +156 -0
- package/node_modules/zod/v4/locales/bg.cjs +147 -0
- package/node_modules/zod/v4/locales/bg.d.cts +5 -0
- package/node_modules/zod/v4/locales/bg.d.ts +4 -0
- package/node_modules/zod/v4/locales/bg.js +120 -0
- package/node_modules/zod/v4/locales/ca.cjs +134 -0
- package/node_modules/zod/v4/locales/ca.d.cts +5 -0
- package/node_modules/zod/v4/locales/ca.d.ts +4 -0
- package/node_modules/zod/v4/locales/ca.js +107 -0
- package/node_modules/zod/v4/locales/cs.cjs +138 -0
- package/node_modules/zod/v4/locales/cs.d.cts +5 -0
- package/node_modules/zod/v4/locales/cs.d.ts +4 -0
- package/node_modules/zod/v4/locales/cs.js +111 -0
- package/node_modules/zod/v4/locales/da.cjs +142 -0
- package/node_modules/zod/v4/locales/da.d.cts +5 -0
- package/node_modules/zod/v4/locales/da.d.ts +4 -0
- package/node_modules/zod/v4/locales/da.js +115 -0
- package/node_modules/zod/v4/locales/de.cjs +135 -0
- package/node_modules/zod/v4/locales/de.d.cts +5 -0
- package/node_modules/zod/v4/locales/de.d.ts +4 -0
- package/node_modules/zod/v4/locales/de.js +108 -0
- package/node_modules/zod/v4/locales/en.cjs +136 -0
- package/node_modules/zod/v4/locales/en.d.cts +5 -0
- package/node_modules/zod/v4/locales/en.d.ts +4 -0
- package/node_modules/zod/v4/locales/en.js +109 -0
- package/node_modules/zod/v4/locales/eo.cjs +136 -0
- package/node_modules/zod/v4/locales/eo.d.cts +5 -0
- package/node_modules/zod/v4/locales/eo.d.ts +4 -0
- package/node_modules/zod/v4/locales/eo.js +109 -0
- package/node_modules/zod/v4/locales/es.cjs +159 -0
- package/node_modules/zod/v4/locales/es.d.cts +5 -0
- package/node_modules/zod/v4/locales/es.d.ts +4 -0
- package/node_modules/zod/v4/locales/es.js +132 -0
- package/node_modules/zod/v4/locales/fa.cjs +141 -0
- package/node_modules/zod/v4/locales/fa.d.cts +5 -0
- package/node_modules/zod/v4/locales/fa.d.ts +4 -0
- package/node_modules/zod/v4/locales/fa.js +114 -0
- package/node_modules/zod/v4/locales/fi.cjs +139 -0
- package/node_modules/zod/v4/locales/fi.d.cts +5 -0
- package/node_modules/zod/v4/locales/fi.d.ts +4 -0
- package/node_modules/zod/v4/locales/fi.js +112 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +134 -0
- package/node_modules/zod/v4/locales/fr-CA.d.cts +5 -0
- package/node_modules/zod/v4/locales/fr-CA.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr-CA.js +107 -0
- package/node_modules/zod/v4/locales/fr.cjs +135 -0
- package/node_modules/zod/v4/locales/fr.d.cts +5 -0
- package/node_modules/zod/v4/locales/fr.d.ts +4 -0
- package/node_modules/zod/v4/locales/fr.js +108 -0
- package/node_modules/zod/v4/locales/he.cjs +241 -0
- package/node_modules/zod/v4/locales/he.d.cts +5 -0
- package/node_modules/zod/v4/locales/he.d.ts +4 -0
- package/node_modules/zod/v4/locales/he.js +214 -0
- package/node_modules/zod/v4/locales/hu.cjs +135 -0
- package/node_modules/zod/v4/locales/hu.d.cts +5 -0
- package/node_modules/zod/v4/locales/hu.d.ts +4 -0
- package/node_modules/zod/v4/locales/hu.js +108 -0
- package/node_modules/zod/v4/locales/hy.cjs +174 -0
- package/node_modules/zod/v4/locales/hy.d.cts +5 -0
- package/node_modules/zod/v4/locales/hy.d.ts +4 -0
- package/node_modules/zod/v4/locales/hy.js +147 -0
- package/node_modules/zod/v4/locales/id.cjs +133 -0
- package/node_modules/zod/v4/locales/id.d.cts +5 -0
- package/node_modules/zod/v4/locales/id.d.ts +4 -0
- package/node_modules/zod/v4/locales/id.js +106 -0
- package/node_modules/zod/v4/locales/index.cjs +104 -0
- package/node_modules/zod/v4/locales/index.d.cts +49 -0
- package/node_modules/zod/v4/locales/index.d.ts +49 -0
- package/node_modules/zod/v4/locales/index.js +49 -0
- package/node_modules/zod/v4/locales/is.cjs +136 -0
- package/node_modules/zod/v4/locales/is.d.cts +5 -0
- package/node_modules/zod/v4/locales/is.d.ts +4 -0
- package/node_modules/zod/v4/locales/is.js +109 -0
- package/node_modules/zod/v4/locales/it.cjs +135 -0
- package/node_modules/zod/v4/locales/it.d.cts +5 -0
- package/node_modules/zod/v4/locales/it.d.ts +4 -0
- package/node_modules/zod/v4/locales/it.js +108 -0
- package/node_modules/zod/v4/locales/ja.cjs +134 -0
- package/node_modules/zod/v4/locales/ja.d.cts +5 -0
- package/node_modules/zod/v4/locales/ja.d.ts +4 -0
- package/node_modules/zod/v4/locales/ja.js +107 -0
- package/node_modules/zod/v4/locales/ka.cjs +139 -0
- package/node_modules/zod/v4/locales/ka.d.cts +5 -0
- package/node_modules/zod/v4/locales/ka.d.ts +4 -0
- package/node_modules/zod/v4/locales/ka.js +112 -0
- package/node_modules/zod/v4/locales/kh.cjs +12 -0
- package/node_modules/zod/v4/locales/kh.d.cts +5 -0
- package/node_modules/zod/v4/locales/kh.d.ts +5 -0
- package/node_modules/zod/v4/locales/kh.js +5 -0
- package/node_modules/zod/v4/locales/km.cjs +137 -0
- package/node_modules/zod/v4/locales/km.d.cts +5 -0
- package/node_modules/zod/v4/locales/km.d.ts +4 -0
- package/node_modules/zod/v4/locales/km.js +110 -0
- package/node_modules/zod/v4/locales/ko.cjs +138 -0
- package/node_modules/zod/v4/locales/ko.d.cts +5 -0
- package/node_modules/zod/v4/locales/ko.d.ts +4 -0
- package/node_modules/zod/v4/locales/ko.js +111 -0
- package/node_modules/zod/v4/locales/lt.cjs +230 -0
- package/node_modules/zod/v4/locales/lt.d.cts +5 -0
- package/node_modules/zod/v4/locales/lt.d.ts +4 -0
- package/node_modules/zod/v4/locales/lt.js +203 -0
- package/node_modules/zod/v4/locales/mk.cjs +136 -0
- package/node_modules/zod/v4/locales/mk.d.cts +5 -0
- package/node_modules/zod/v4/locales/mk.d.ts +4 -0
- package/node_modules/zod/v4/locales/mk.js +109 -0
- package/node_modules/zod/v4/locales/ms.cjs +134 -0
- package/node_modules/zod/v4/locales/ms.d.cts +5 -0
- package/node_modules/zod/v4/locales/ms.d.ts +4 -0
- package/node_modules/zod/v4/locales/ms.js +107 -0
- package/node_modules/zod/v4/locales/nl.cjs +137 -0
- package/node_modules/zod/v4/locales/nl.d.cts +5 -0
- package/node_modules/zod/v4/locales/nl.d.ts +4 -0
- package/node_modules/zod/v4/locales/nl.js +110 -0
- package/node_modules/zod/v4/locales/no.cjs +135 -0
- package/node_modules/zod/v4/locales/no.d.cts +5 -0
- package/node_modules/zod/v4/locales/no.d.ts +4 -0
- package/node_modules/zod/v4/locales/no.js +108 -0
- package/node_modules/zod/v4/locales/ota.cjs +136 -0
- package/node_modules/zod/v4/locales/ota.d.cts +5 -0
- package/node_modules/zod/v4/locales/ota.d.ts +4 -0
- package/node_modules/zod/v4/locales/ota.js +109 -0
- package/node_modules/zod/v4/locales/package.json +6 -0
- package/node_modules/zod/v4/locales/pl.cjs +136 -0
- package/node_modules/zod/v4/locales/pl.d.cts +5 -0
- package/node_modules/zod/v4/locales/pl.d.ts +4 -0
- package/node_modules/zod/v4/locales/pl.js +109 -0
- package/node_modules/zod/v4/locales/ps.cjs +141 -0
- package/node_modules/zod/v4/locales/ps.d.cts +5 -0
- package/node_modules/zod/v4/locales/ps.d.ts +4 -0
- package/node_modules/zod/v4/locales/ps.js +114 -0
- package/node_modules/zod/v4/locales/pt.cjs +135 -0
- package/node_modules/zod/v4/locales/pt.d.cts +5 -0
- package/node_modules/zod/v4/locales/pt.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt.js +108 -0
- package/node_modules/zod/v4/locales/ru.cjs +183 -0
- package/node_modules/zod/v4/locales/ru.d.cts +5 -0
- package/node_modules/zod/v4/locales/ru.d.ts +4 -0
- package/node_modules/zod/v4/locales/ru.js +156 -0
- package/node_modules/zod/v4/locales/sl.cjs +136 -0
- package/node_modules/zod/v4/locales/sl.d.cts +5 -0
- package/node_modules/zod/v4/locales/sl.d.ts +4 -0
- package/node_modules/zod/v4/locales/sl.js +109 -0
- package/node_modules/zod/v4/locales/sv.cjs +137 -0
- package/node_modules/zod/v4/locales/sv.d.cts +5 -0
- package/node_modules/zod/v4/locales/sv.d.ts +4 -0
- package/node_modules/zod/v4/locales/sv.js +110 -0
- package/node_modules/zod/v4/locales/ta.cjs +137 -0
- package/node_modules/zod/v4/locales/ta.d.cts +5 -0
- package/node_modules/zod/v4/locales/ta.d.ts +4 -0
- package/node_modules/zod/v4/locales/ta.js +110 -0
- package/node_modules/zod/v4/locales/th.cjs +137 -0
- package/node_modules/zod/v4/locales/th.d.cts +5 -0
- package/node_modules/zod/v4/locales/th.d.ts +4 -0
- package/node_modules/zod/v4/locales/th.js +110 -0
- package/node_modules/zod/v4/locales/tr.cjs +132 -0
- package/node_modules/zod/v4/locales/tr.d.cts +5 -0
- package/node_modules/zod/v4/locales/tr.d.ts +4 -0
- package/node_modules/zod/v4/locales/tr.js +105 -0
- package/node_modules/zod/v4/locales/ua.cjs +12 -0
- package/node_modules/zod/v4/locales/ua.d.cts +5 -0
- package/node_modules/zod/v4/locales/ua.d.ts +5 -0
- package/node_modules/zod/v4/locales/ua.js +5 -0
- package/node_modules/zod/v4/locales/uk.cjs +135 -0
- package/node_modules/zod/v4/locales/uk.d.cts +5 -0
- package/node_modules/zod/v4/locales/uk.d.ts +4 -0
- package/node_modules/zod/v4/locales/uk.js +108 -0
- package/node_modules/zod/v4/locales/ur.cjs +137 -0
- package/node_modules/zod/v4/locales/ur.d.cts +5 -0
- package/node_modules/zod/v4/locales/ur.d.ts +4 -0
- package/node_modules/zod/v4/locales/ur.js +110 -0
- package/node_modules/zod/v4/locales/uz.cjs +136 -0
- package/node_modules/zod/v4/locales/uz.d.cts +5 -0
- package/node_modules/zod/v4/locales/uz.d.ts +4 -0
- package/node_modules/zod/v4/locales/uz.js +109 -0
- package/node_modules/zod/v4/locales/vi.cjs +135 -0
- package/node_modules/zod/v4/locales/vi.d.cts +5 -0
- package/node_modules/zod/v4/locales/vi.d.ts +4 -0
- package/node_modules/zod/v4/locales/vi.js +108 -0
- package/node_modules/zod/v4/locales/yo.cjs +134 -0
- package/node_modules/zod/v4/locales/yo.d.cts +5 -0
- package/node_modules/zod/v4/locales/yo.d.ts +4 -0
- package/node_modules/zod/v4/locales/yo.js +107 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +136 -0
- package/node_modules/zod/v4/locales/zh-CN.d.cts +5 -0
- package/node_modules/zod/v4/locales/zh-CN.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-CN.js +109 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +134 -0
- package/node_modules/zod/v4/locales/zh-TW.d.cts +5 -0
- package/node_modules/zod/v4/locales/zh-TW.d.ts +4 -0
- package/node_modules/zod/v4/locales/zh-TW.js +107 -0
- package/node_modules/zod/v4/mini/checks.cjs +34 -0
- package/node_modules/zod/v4/mini/checks.d.cts +1 -0
- package/node_modules/zod/v4/mini/checks.d.ts +1 -0
- package/node_modules/zod/v4/mini/checks.js +1 -0
- package/node_modules/zod/v4/mini/coerce.cjs +52 -0
- package/node_modules/zod/v4/mini/coerce.d.cts +7 -0
- package/node_modules/zod/v4/mini/coerce.d.ts +7 -0
- package/node_modules/zod/v4/mini/coerce.js +22 -0
- package/node_modules/zod/v4/mini/external.cjs +63 -0
- package/node_modules/zod/v4/mini/external.d.cts +12 -0
- package/node_modules/zod/v4/mini/external.d.ts +12 -0
- package/node_modules/zod/v4/mini/external.js +14 -0
- package/node_modules/zod/v4/mini/index.cjs +32 -0
- package/node_modules/zod/v4/mini/index.d.cts +3 -0
- package/node_modules/zod/v4/mini/index.d.ts +3 -0
- package/node_modules/zod/v4/mini/index.js +3 -0
- package/node_modules/zod/v4/mini/iso.cjs +64 -0
- package/node_modules/zod/v4/mini/iso.d.cts +22 -0
- package/node_modules/zod/v4/mini/iso.d.ts +22 -0
- package/node_modules/zod/v4/mini/iso.js +34 -0
- package/node_modules/zod/v4/mini/package.json +6 -0
- package/node_modules/zod/v4/mini/parse.cjs +16 -0
- package/node_modules/zod/v4/mini/parse.d.cts +1 -0
- package/node_modules/zod/v4/mini/parse.d.ts +1 -0
- package/node_modules/zod/v4/mini/parse.js +1 -0
- package/node_modules/zod/v4/mini/schemas.cjs +1046 -0
- package/node_modules/zod/v4/mini/schemas.d.cts +427 -0
- package/node_modules/zod/v4/mini/schemas.d.ts +427 -0
- package/node_modules/zod/v4/mini/schemas.js +925 -0
- package/node_modules/zod/v4/package.json +6 -0
- package/node_modules/zod/v4-mini/index.cjs +32 -0
- package/node_modules/zod/v4-mini/index.d.cts +3 -0
- package/node_modules/zod/v4-mini/index.d.ts +3 -0
- package/node_modules/zod/v4-mini/index.js +3 -0
- package/node_modules/zod/v4-mini/package.json +6 -0
- package/package.json +13 -2
- package/src/__tests__/acp-session.test.ts +292 -0
- package/src/__tests__/actor-token-service.test.ts +10 -10
- package/src/__tests__/always-loaded-tools-guard.test.ts +1 -1
- package/src/__tests__/anthropic-provider.test.ts +340 -46
- package/src/__tests__/app-builder-tool-scripts.test.ts +15 -2
- package/src/__tests__/approval-cascade.test.ts +123 -97
- package/src/__tests__/approval-primitive.test.ts +2 -2
- package/src/__tests__/approval-routes-http.test.ts +42 -28
- package/src/__tests__/asset-materialize-tool.test.ts +14 -21
- package/src/__tests__/asset-search-tool.test.ts +6 -13
- package/src/__tests__/assistant-attachments.test.ts +27 -0
- package/src/__tests__/assistant-event-hub.test.ts +14 -10
- package/src/__tests__/assistant-event.test.ts +9 -9
- package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +6 -1
- package/src/__tests__/assistant-feature-flags-integration.test.ts +169 -40
- package/src/__tests__/attachments-store.test.ts +2 -2
- package/src/__tests__/avatar-e2e.test.ts +19 -7
- package/src/__tests__/avatar-generator.test.ts +4 -7
- package/src/__tests__/browser-fill-credential.test.ts +17 -18
- package/src/__tests__/browser-skill-endstate.test.ts +1 -2
- package/src/__tests__/btw-routes.test.ts +21 -9
- package/src/__tests__/call-controller.test.ts +229 -202
- package/src/__tests__/call-pointer-messages.test.ts +12 -10
- package/src/__tests__/call-routes-http.test.ts +4 -4
- package/src/__tests__/call-start-guardian-guard.test.ts +0 -1
- package/src/__tests__/callback-handoff-copy.test.ts +1 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +158 -0
- package/src/__tests__/canonical-guardian-store.test.ts +8 -10
- package/src/__tests__/channel-approval-routes.test.ts +5 -5
- package/src/__tests__/channel-approval.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +13 -13
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/channel-invite-transport.test.ts +5 -1
- package/src/__tests__/channel-readiness-routes.test.ts +4 -1
- package/src/__tests__/channel-readiness-service.test.ts +0 -1
- package/src/__tests__/channel-reply-delivery.test.ts +1 -1
- package/src/__tests__/checker.test.ts +32 -33
- package/src/__tests__/chrome-cdp.test.ts +47 -18
- package/src/__tests__/claude-code-skill-regression.test.ts +67 -1
- package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
- package/src/__tests__/clipboard.test.ts +6 -6
- package/src/__tests__/commit-guarantee.test.ts +9 -9
- package/src/__tests__/commit-message-enrichment-service.test.ts +37 -6
- package/src/__tests__/computer-use-tools.test.ts +0 -1
- package/src/__tests__/config-loader-backfill.test.ts +6 -4
- package/src/__tests__/config-schema-cmd.test.ts +258 -0
- package/src/__tests__/config-schema.test.ts +45 -46
- package/src/__tests__/config-watcher.test.ts +25 -24
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +17 -15
- package/src/__tests__/contacts-tools.test.ts +0 -1
- package/src/__tests__/context-overflow-approval.test.ts +2 -2
- package/src/__tests__/{session-abort-tool-results.test.ts → conversation-abort-tool-results.test.ts} +26 -13
- package/src/__tests__/{session-agent-loop-overflow.test.ts → conversation-agent-loop-overflow.test.ts} +236 -61
- package/src/__tests__/{session-agent-loop.test.ts → conversation-agent-loop.test.ts} +88 -65
- package/src/__tests__/{session-approval-overrides.test.ts → conversation-approval-overrides.test.ts} +23 -23
- package/src/__tests__/conversation-attachments.test.ts +227 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +2 -2
- package/src/__tests__/{session-confirmation-signals.test.ts → conversation-confirmation-signals.test.ts} +64 -54
- package/src/__tests__/{session-error.test.ts → conversation-error.test.ts} +98 -57
- package/src/__tests__/{session-evictor.test.ts → conversation-evictor.test.ts} +21 -17
- package/src/__tests__/{session-history-web-search.test.ts → conversation-history-web-search.test.ts} +34 -10
- package/src/__tests__/{session-init.benchmark.test.ts → conversation-init.benchmark.test.ts} +23 -24
- package/src/__tests__/{session-load-history-repair.test.ts → conversation-load-history-repair.test.ts} +39 -39
- package/src/__tests__/{session-media-retry.test.ts → conversation-media-retry.test.ts} +1 -1
- package/src/__tests__/{session-messaging-secret-redirect.test.ts → conversation-messaging-secret-redirect.test.ts} +1 -1
- package/src/__tests__/conversation-pairing.test.ts +47 -47
- package/src/__tests__/{session-pre-run-repair.test.ts → conversation-pre-run-repair.test.ts} +26 -13
- package/src/__tests__/{session-provider-retry-repair.test.ts → conversation-provider-retry-repair.test.ts} +61 -48
- package/src/__tests__/{session-queue.test.ts → conversation-queue.test.ts} +260 -230
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +26 -26
- package/src/__tests__/conversation-routes-slash-commands.test.ts +34 -57
- package/src/__tests__/{session-runtime-assembly.test.ts → conversation-runtime-assembly.test.ts} +187 -175
- package/src/__tests__/{session-runtime-workspace.test.ts → conversation-runtime-workspace.test.ts} +1 -1
- package/src/__tests__/{thread-seed-composer.test.ts → conversation-seed-composer.test.ts} +51 -49
- package/src/__tests__/{session-skill-tools.test.ts → conversation-skill-tools.test.ts} +11 -13
- package/src/__tests__/{session-slash-queue.test.ts → conversation-slash-queue.test.ts} +57 -48
- package/src/__tests__/{session-slash-unknown.test.ts → conversation-slash-unknown.test.ts} +33 -77
- package/src/__tests__/conversation-starter-routes.test.ts +291 -0
- package/src/__tests__/conversation-store.test.ts +61 -55
- package/src/__tests__/{session-surfaces-deselection.test.ts → conversation-surfaces-deselection.test.ts} +5 -5
- package/src/__tests__/{session-surfaces-task-progress.test.ts → conversation-surfaces-task-progress.test.ts} +7 -7
- package/src/__tests__/{session-tool-setup-app-refresh.test.ts → conversation-tool-setup-app-refresh.test.ts} +5 -5
- package/src/__tests__/{session-tool-setup-memory-scope.test.ts → conversation-tool-setup-memory-scope.test.ts} +4 -4
- package/src/__tests__/{session-tool-setup-side-effect-flag.test.ts → conversation-tool-setup-side-effect-flag.test.ts} +4 -4
- package/src/__tests__/{session-tool-setup-tools-disabled.test.ts → conversation-tool-setup-tools-disabled.test.ts} +3 -3
- package/src/__tests__/{session-undo.test.ts → conversation-undo.test.ts} +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +4 -0
- package/src/__tests__/{session-usage.test.ts → conversation-usage.test.ts} +1 -1
- package/src/__tests__/conversation-wipe.test.ts +438 -0
- package/src/__tests__/{session-workspace-cache-state.test.ts → conversation-workspace-cache-state.test.ts} +31 -39
- package/src/__tests__/{session-workspace-injection.test.ts → conversation-workspace-injection.test.ts} +60 -54
- package/src/__tests__/{session-workspace-tool-tracking.test.ts → conversation-workspace-tool-tracking.test.ts} +56 -50
- package/src/__tests__/credential-execution-admin-cli.test.ts +504 -0
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +309 -0
- package/src/__tests__/credential-execution-approval-bridge.test.ts +535 -0
- package/src/__tests__/credential-execution-client.test.ts +380 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +169 -0
- package/src/__tests__/credential-execution-managed-contract.test.ts +526 -0
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +149 -0
- package/src/__tests__/credential-execution-tools.test.ts +279 -0
- package/src/__tests__/credential-security-e2e.test.ts +20 -1
- package/src/__tests__/credential-security-invariants.test.ts +5 -8
- package/src/__tests__/credential-storage-oauth-compat.test.ts +606 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +396 -0
- package/src/__tests__/credential-vault-unit.test.ts +227 -1
- package/src/__tests__/credential-vault.test.ts +0 -1
- package/src/__tests__/credentials-cli.test.ts +13 -22
- package/src/__tests__/cu-unified-flow.test.ts +8 -6
- package/src/__tests__/daemon-assistant-events.test.ts +15 -12
- package/src/__tests__/date-context.test.ts +59 -377
- package/src/__tests__/delete-managed-skill-tool.test.ts +0 -1
- package/src/__tests__/diagnostics-export.test.ts +30 -0
- package/src/__tests__/drop-capability-card-state-migration.test.ts +169 -0
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +23 -43
- package/src/__tests__/emit-signal-routing-intent.test.ts +4 -4
- package/src/__tests__/encrypted-store.test.ts +237 -15
- package/src/__tests__/ephemeral-permissions.test.ts +4 -5
- package/src/__tests__/event-bus.test.ts +5 -9
- package/src/__tests__/file-edit-tool.test.ts +0 -1
- package/src/__tests__/file-read-tool.test.ts +0 -1
- package/src/__tests__/file-write-tool.test.ts +0 -1
- package/src/__tests__/fixtures/mock-signup-server.ts +2 -2
- package/src/__tests__/followup-tools.test.ts +25 -26
- package/src/__tests__/frontmatter.test.ts +12 -10
- package/src/__tests__/gateway-only-enforcement.test.ts +2 -2
- package/src/__tests__/gateway-only-guard.test.ts +1 -0
- package/src/__tests__/gemini-image-service.test.ts +4 -4
- package/src/__tests__/gemini-provider.test.ts +6 -9
- package/src/__tests__/guardian-action-late-reply.test.ts +1 -1
- package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +1 -1
- package/src/__tests__/guardian-binding-drift-heal.test.ts +128 -0
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +15 -15
- package/src/__tests__/guardian-dispatch.test.ts +9 -10
- package/src/__tests__/guardian-grant-minting.test.ts +5 -5
- package/src/__tests__/guardian-question-copy.test.ts +10 -8
- package/src/__tests__/guardian-routing-invariants.test.ts +61 -61
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +20 -16
- package/src/__tests__/headless-browser-interactions.test.ts +18 -17
- package/src/__tests__/headless-browser-navigate.test.ts +0 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +5 -6
- package/src/__tests__/headless-browser-snapshot.test.ts +12 -9
- package/src/__tests__/heartbeat-service.test.ts +5 -4
- package/src/__tests__/hooks-ts-runner.test.ts +10 -4
- package/src/__tests__/host-bash-proxy.test.ts +50 -1
- package/src/__tests__/host-cu-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +0 -1
- package/src/__tests__/host-file-proxy.test.ts +1 -1
- package/src/__tests__/host-file-read-tool.test.ts +0 -1
- package/src/__tests__/host-file-write-tool.test.ts +0 -1
- package/src/__tests__/host-shell-tool.test.ts +70 -11
- package/src/__tests__/http-user-message-parity.test.ts +32 -19
- package/src/__tests__/intent-routing.test.ts +68 -129
- package/src/__tests__/invite-redemption-service.test.ts +35 -0
- package/src/__tests__/invite-routes-http.test.ts +5 -0
- package/src/__tests__/keychain-broker-client.test.ts +150 -0
- package/src/__tests__/list-messages-attachments.test.ts +1 -1
- package/src/__tests__/log-export-workspace.test.ts +133 -60
- package/src/__tests__/managed-credential-catalog-cli.test.ts +349 -0
- package/src/__tests__/managed-proxy-context.test.ts +2 -5
- package/src/__tests__/managed-skill-lifecycle.test.ts +20 -8
- package/src/__tests__/managed-store.test.ts +0 -38
- package/src/__tests__/media-generate-image.test.ts +48 -14
- package/src/__tests__/media-reuse-story.e2e.test.ts +83 -71
- package/src/__tests__/media-visibility-policy.test.ts +10 -10
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +1 -1
- package/src/__tests__/memory-lifecycle-e2e.test.ts +24 -18
- package/src/__tests__/memory-query-builder.test.ts +2 -2
- package/src/__tests__/memory-recall-quality.test.ts +4 -3
- package/src/__tests__/memory-regressions.test.ts +153 -120
- package/src/__tests__/messaging-send-tool.test.ts +0 -2
- package/src/__tests__/migration-cross-version-compatibility.test.ts +32 -32
- package/src/__tests__/migration-export-http.test.ts +26 -27
- package/src/__tests__/migration-import-commit-http.test.ts +165 -37
- package/src/__tests__/migration-import-preflight-http.test.ts +81 -20
- package/src/__tests__/migration-validate-http.test.ts +16 -16
- package/src/__tests__/model-intents.test.ts +1 -1
- package/src/__tests__/no-domain-routing-in-prompt-guard.test.ts +51 -0
- package/src/__tests__/notification-broadcaster.test.ts +43 -41
- package/src/__tests__/{notification-thread-candidate-validation.test.ts → notification-conversation-candidate-validation.test.ts} +26 -24
- package/src/__tests__/{notification-thread-candidates.test.ts → notification-conversation-candidates.test.ts} +15 -15
- package/src/__tests__/notification-decision-fallback.test.ts +8 -8
- package/src/__tests__/notification-decision-identity.test.ts +208 -0
- package/src/__tests__/notification-decision-strategy.test.ts +41 -39
- package/src/__tests__/notification-deep-link.test.ts +19 -19
- package/src/__tests__/notification-guardian-path.test.ts +13 -11
- package/src/__tests__/notification-schedule-dedup.test.ts +7 -7
- package/src/__tests__/notification-telegram-adapter.test.ts +5 -5
- package/src/__tests__/oauth-store.test.ts +2 -8
- package/src/__tests__/oauth2-gateway-transport.test.ts +6 -1
- package/src/__tests__/onboarding-template-contract.test.ts +23 -59
- package/src/__tests__/permission-types.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +0 -1
- package/src/__tests__/playbook-tools.test.ts +0 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +7 -6
- package/src/__tests__/provider-error-scenarios.test.ts +154 -0
- package/src/__tests__/provider-fail-open-selection.test.ts +22 -28
- package/src/__tests__/provider-managed-proxy-integration.test.ts +41 -63
- package/src/__tests__/provider-registry-ollama.test.ts +16 -2
- package/src/__tests__/proxy-approval-callback.test.ts +2 -2
- package/src/__tests__/qdrant-manager.test.ts +7 -7
- package/src/__tests__/ratelimit.test.ts +0 -74
- package/src/__tests__/recording-handler.test.ts +20 -21
- package/src/__tests__/relay-server.test.ts +8 -5
- package/src/__tests__/require-fresh-approval.test.ts +532 -0
- package/src/__tests__/resolve-trust-class.test.ts +2 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +22 -22
- package/src/__tests__/runtime-events-sse.test.ts +16 -8
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -4
- package/src/__tests__/schedule-tools.test.ts +0 -1
- package/src/__tests__/scheduler-recurrence.test.ts +46 -2
- package/src/__tests__/schema-transforms.test.ts +114 -54
- package/src/__tests__/scoped-approval-grants.test.ts +6 -6
- package/src/__tests__/scoped-grant-security-matrix.test.ts +1 -1
- package/src/__tests__/{script-proxy-session-manager.test.ts → script-proxy-conversation-manager.test.ts} +4 -1
- package/src/__tests__/secret-onetime-send.test.ts +20 -4
- package/src/__tests__/secret-response-routing.test.ts +1 -1
- package/src/__tests__/secret-routes-managed-proxy.test.ts +82 -2
- package/src/__tests__/secret-scanner-executor.test.ts +1 -4
- package/src/__tests__/send-endpoint-busy.test.ts +134 -62
- package/src/__tests__/send-notification-tool.test.ts +2 -4
- package/src/__tests__/sequence-store.test.ts +5 -5
- package/src/__tests__/shell-credential-ref.test.ts +1 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +3 -5
- package/src/__tests__/skill-feature-flags-integration.test.ts +1 -2
- package/src/__tests__/skill-feature-flags.test.ts +7 -8
- package/src/__tests__/skill-include-graph.test.ts +1 -2
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -11
- package/src/__tests__/skill-load-tool.test.ts +19 -15
- package/src/__tests__/skill-memory.test.ts +547 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -6
- package/src/__tests__/skill-projection.benchmark.test.ts +3 -5
- package/src/__tests__/skill-script-runner-host.test.ts +3 -4
- package/src/__tests__/skill-script-runner-sandbox.test.ts +4 -6
- package/src/__tests__/skill-script-runner.test.ts +0 -1
- package/src/__tests__/skill-tool-factory.test.ts +0 -1
- package/src/__tests__/skills.test.ts +0 -37
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -0
- package/src/__tests__/slack-channel-config.test.ts +109 -94
- package/src/__tests__/slack-skill.test.ts +0 -4
- package/src/__tests__/starter-task-flow.test.ts +3 -3
- package/src/__tests__/subagent-manager-notify.test.ts +45 -40
- package/src/__tests__/subagent-tools.test.ts +78 -69
- package/src/__tests__/subagent-types.test.ts +3 -3
- package/src/__tests__/surface-mutex-cleanup.test.ts +1 -1
- package/src/__tests__/{swarm-session-integration.test.ts → swarm-conversation-integration.test.ts} +13 -1
- package/src/__tests__/swarm-recursion.test.ts +21 -9
- package/src/__tests__/swarm-tool.test.ts +14 -1
- package/src/__tests__/system-prompt.test.ts +50 -79
- package/src/__tests__/task-compiler.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -2
- package/src/__tests__/telegram-config.test.ts +121 -0
- package/src/__tests__/terminal-sandbox.test.ts +6 -0
- package/src/__tests__/terminal-tools.test.ts +2 -2
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +2 -2
- package/src/__tests__/tool-approval-handler.test.ts +2 -3
- package/src/__tests__/tool-audit-listener.test.ts +0 -6
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -11
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +68 -16
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -2
- package/src/__tests__/tool-executor.test.ts +21 -21
- package/src/__tests__/tool-grant-request-escalation.test.ts +8 -9
- package/src/__tests__/tool-metrics-listener.test.ts +0 -9
- package/src/__tests__/tool-notification-listener.test.ts +0 -2
- package/src/__tests__/tool-preview-lifecycle.test.ts +6 -6
- package/src/__tests__/tool-profiling-listener.test.ts +0 -7
- package/src/__tests__/tool-trace-listener.test.ts +0 -11
- package/src/__tests__/trace-emitter.test.ts +9 -2
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trust-store.test.ts +7 -8
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +9 -10
- package/src/__tests__/turn-commit.test.ts +3 -3
- package/src/__tests__/twilio-routes.test.ts +1 -18
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/user-reference.test.ts +82 -2
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +196 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +4 -4
- package/src/__tests__/voice-session-bridge.test.ts +31 -31
- package/src/__tests__/workspace-git-service.test.ts +49 -2
- package/src/__tests__/workspace-lifecycle.test.ts +6 -6
- package/src/__tests__/workspace-migration-add-send-diagnostics.test.ts +59 -0
- package/src/__tests__/workspace-migration-avatar-rename.test.ts +128 -0
- package/src/__tests__/workspace-migration-extract-collect-usage-data.test.ts +179 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +328 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +293 -0
- package/src/acp/agent-process.ts +201 -0
- package/src/acp/client-handler.ts +361 -0
- package/src/acp/index.ts +44 -0
- package/src/acp/session-manager.ts +348 -0
- package/src/acp/types.ts +79 -0
- package/src/approvals/AGENTS.md +2 -2
- package/src/approvals/approval-primitive.ts +4 -4
- package/src/approvals/guardian-decision-primitive.ts +7 -7
- package/src/approvals/guardian-request-resolvers.ts +4 -4
- package/src/avatar/ascii-renderer.ts +63 -0
- package/src/avatar/character-components.ts +454 -0
- package/src/avatar/png-renderer.ts +17 -0
- package/src/avatar/resvg-lazy.ts +21 -0
- package/src/avatar/svg-compositor.ts +90 -0
- package/src/avatar/traits-png-sync.ts +133 -0
- package/src/calls/call-controller.ts +8 -8
- package/src/calls/call-conversation-messages.ts +1 -1
- package/src/calls/call-domain.ts +4 -4
- package/src/calls/call-pointer-message-composer.ts +2 -2
- package/src/calls/call-pointer-messages.ts +10 -10
- package/src/calls/guardian-action-sweep.ts +3 -3
- package/src/calls/guardian-dispatch.ts +8 -8
- package/src/calls/guardian-question-copy.ts +7 -7
- package/src/calls/relay-access-wait.ts +2 -2
- package/src/calls/relay-server.ts +4 -4
- package/src/calls/twilio-rest.ts +0 -248
- package/src/calls/twilio-routes.ts +1 -1
- package/src/calls/voice-session-bridge.ts +59 -56
- package/src/cli/AGENTS.md +6 -9
- package/src/cli/__tests__/notifications.test.ts +5 -5
- package/src/cli/commands/avatar.ts +343 -0
- package/src/cli/commands/bash.ts +3 -3
- package/src/cli/commands/channel-verification-sessions.ts +7 -4
- package/src/cli/commands/completions.ts +4 -4
- package/src/cli/commands/config.ts +52 -7
- package/src/cli/commands/conversations.ts +386 -0
- package/src/cli/commands/credential-execution.ts +345 -0
- package/src/cli/commands/credentials.ts +108 -6
- package/src/cli/commands/doctor.ts +9 -3
- package/src/cli/commands/keys.ts +30 -0
- package/src/cli/commands/mcp.ts +2 -2
- package/src/cli/commands/memory.ts +8 -8
- package/src/cli/commands/notifications.ts +4 -4
- package/src/cli/commands/oauth/connections.ts +98 -17
- package/src/cli/commands/oauth/providers.ts +45 -8
- package/src/cli/commands/shotgun.ts +250 -0
- package/src/cli/main-screen.tsx +3 -29
- package/src/cli/program.ts +13 -3
- package/src/cli.ts +169 -235
- package/src/config/acp-schema.ts +47 -0
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +14 -12
- package/src/config/bundled-skills/acp/SKILL.md +58 -0
- package/src/config/bundled-skills/acp/TOOLS.json +79 -0
- package/src/config/bundled-skills/{settings/tools/set-avatar.ts → acp/tools/acp-abort.ts} +2 -2
- package/src/config/bundled-skills/acp/tools/acp-spawn.ts +12 -0
- package/src/config/bundled-skills/acp/tools/acp-status.ts +12 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +63 -47
- package/src/config/bundled-skills/app-builder/TOOLS.json +10 -10
- package/src/config/bundled-skills/browser/SKILL.md +17 -16
- package/src/config/bundled-skills/browser/TOOLS.json +16 -16
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +1 -1
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +2 -3
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +1 -1
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +6 -7
- package/src/config/bundled-skills/claude-code/TOOLS.json +1 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +3 -5
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -15
- package/src/config/bundled-skills/contacts/SKILL.md +3 -4
- package/src/config/bundled-skills/contacts/TOOLS.json +8 -4
- package/src/config/bundled-skills/contacts/tools/google-contacts.ts +5 -1
- package/src/config/bundled-skills/document/SKILL.md +4 -4
- package/src/config/bundled-skills/document/TOOLS.json +2 -2
- package/src/config/bundled-skills/followups/SKILL.md +1 -1
- package/src/config/bundled-skills/followups/TOOLS.json +10 -10
- package/src/config/bundled-skills/gmail/SKILL.md +32 -33
- package/src/config/bundled-skills/gmail/TOOLS.json +16 -16
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +1 -1
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +1 -1
- package/src/config/bundled-skills/google-calendar/SKILL.md +1 -2
- package/src/config/bundled-skills/google-calendar/TOOLS.json +5 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +1 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +1 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +1 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +1 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +1 -1
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +1 -5
- package/src/config/bundled-skills/google-calendar/types.ts +1 -1
- package/src/config/bundled-skills/heartbeat/SKILL.md +43 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +3 -4
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -3
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +44 -23
- package/src/config/bundled-skills/media-processing/SKILL.md +40 -40
- package/src/config/bundled-skills/media-processing/TOOLS.json +8 -8
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +2 -2
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +5 -5
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +2 -2
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +7 -3
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +2 -2
- package/src/config/bundled-skills/media-processing/services/reduce.ts +3 -3
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +3 -3
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +39 -37
- package/src/config/bundled-skills/messaging/TOOLS.json +11 -15
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
- package/src/config/bundled-skills/notifications/SKILL.md +5 -6
- package/src/config/bundled-skills/notifications/TOOLS.json +3 -3
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +3 -3
- package/src/config/bundled-skills/orchestration/SKILL.md +5 -2
- package/src/config/bundled-skills/orchestration/TOOLS.json +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +37 -21
- package/src/config/bundled-skills/phone-calls/TOOLS.json +3 -3
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +1 -1
- package/src/config/bundled-skills/playbooks/TOOLS.json +4 -4
- package/src/config/bundled-skills/schedule/SKILL.md +26 -26
- package/src/config/bundled-skills/schedule/TOOLS.json +5 -5
- package/src/config/bundled-skills/screen-watch/SKILL.md +3 -4
- package/src/config/bundled-skills/screen-watch/TOOLS.json +1 -1
- package/src/config/bundled-skills/sequences/SKILL.md +2 -3
- package/src/config/bundled-skills/sequences/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/tools/sequence-analytics.ts +2 -2
- package/src/config/bundled-skills/sequences/tools/sequence-create.ts +2 -1
- package/src/config/bundled-skills/sequences/tools/sequence-enroll.ts +2 -2
- package/src/config/bundled-skills/sequences/tools/sequence-enrollment-list.ts +1 -1
- package/src/config/bundled-skills/sequences/tools/sequence-get.ts +1 -1
- package/src/config/bundled-skills/sequences/tools/sequence-import.ts +3 -3
- package/src/config/bundled-skills/sequences/tools/sequence-list.ts +1 -1
- package/src/config/bundled-skills/sequences/tools/sequence-update.ts +3 -2
- package/src/config/bundled-skills/settings/SKILL.md +2 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -25
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/bundled-skills/skill-management/SKILL.md +0 -1
- package/src/config/bundled-skills/skill-management/TOOLS.json +5 -13
- package/src/config/bundled-skills/skills-catalog/SKILL.md +84 -0
- package/src/config/bundled-skills/slack/SKILL.md +2 -3
- package/src/config/bundled-skills/slack/TOOLS.json +8 -8
- package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +3 -3
- package/src/config/bundled-skills/subagent/SKILL.md +2 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +7 -7
- package/src/config/bundled-skills/tasks/SKILL.md +1 -1
- package/src/config/bundled-skills/tasks/TOOLS.json +9 -9
- package/src/config/bundled-skills/transcribe/SKILL.md +5 -5
- package/src/config/bundled-skills/transcribe/TOOLS.json +1 -1
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +43 -13
- package/src/config/bundled-skills/watcher/SKILL.md +4 -4
- package/src/config/bundled-skills/watcher/TOOLS.json +5 -5
- package/src/config/bundled-tool-registry.ts +9 -2
- package/src/config/env.ts +44 -2
- package/src/config/feature-flag-registry.json +185 -33
- package/src/config/loader.ts +3 -0
- package/src/config/raw-config-utils.ts +30 -0
- package/src/config/schema-utils.ts +27 -0
- package/src/config/schema.ts +54 -39
- package/src/config/schemas/calls.ts +219 -152
- package/src/config/schemas/channels.ts +118 -71
- package/src/config/schemas/elevenlabs.ts +39 -24
- package/src/config/schemas/heartbeat.ts +13 -4
- package/src/config/schemas/inference.ts +155 -99
- package/src/config/schemas/ingress.ts +100 -64
- package/src/config/schemas/logging.ts +24 -15
- package/src/config/schemas/mcp.ts +95 -44
- package/src/config/schemas/memory-lifecycle.ts +70 -50
- package/src/config/schemas/memory-processing.ts +46 -25
- package/src/config/schemas/memory-retrieval.ts +206 -139
- package/src/config/schemas/memory-storage.ts +113 -79
- package/src/config/schemas/memory.ts +33 -28
- package/src/config/schemas/notifications.ts +12 -7
- package/src/config/schemas/platform.ts +62 -39
- package/src/config/schemas/sandbox.ts +10 -5
- package/src/config/schemas/security.ts +72 -41
- package/src/config/schemas/services.ts +64 -0
- package/src/config/schemas/skills.ts +131 -81
- package/src/config/schemas/swarm.ts +78 -46
- package/src/config/schemas/timeouts.ts +54 -41
- package/src/config/schemas/workspace-git.ts +219 -162
- package/src/config/skill-state.ts +6 -47
- package/src/config/skills.ts +66 -271
- package/src/config/types.ts +5 -0
- package/src/contacts/contact-store.ts +82 -7
- package/src/contacts/contacts-write.ts +13 -2
- package/src/context/window-manager.ts +1 -1
- package/src/credential-execution/approval-bridge.ts +350 -0
- package/src/credential-execution/client.ts +414 -0
- package/src/credential-execution/executable-discovery.ts +169 -0
- package/src/credential-execution/feature-gates.ts +75 -0
- package/src/credential-execution/managed-catalog.ts +155 -0
- package/src/credential-execution/process-manager.ts +451 -0
- package/src/daemon/approval-generators.ts +13 -7
- package/src/daemon/assistant-attachments.ts +3 -3
- package/src/daemon/config-watcher.ts +23 -15
- package/src/daemon/context-overflow-policy.ts +5 -5
- package/src/daemon/context-overflow-reducer.ts +2 -2
- package/src/daemon/{session-agent-loop-handlers.ts → conversation-agent-loop-handlers.ts} +23 -23
- package/src/daemon/{session-agent-loop.ts → conversation-agent-loop.ts} +99 -101
- package/src/daemon/{session-attachments.ts → conversation-attachments.ts} +35 -9
- package/src/daemon/{session-error.ts → conversation-error.ts} +58 -24
- package/src/daemon/conversation-evictor.ts +204 -0
- package/src/daemon/{session-history.ts → conversation-history.ts} +37 -33
- package/src/daemon/{session-lifecycle.ts → conversation-lifecycle.ts} +16 -16
- package/src/daemon/{session-memory.ts → conversation-memory.ts} +9 -8
- package/src/daemon/{session-messaging.ts → conversation-messaging.ts} +9 -9
- package/src/daemon/{session-notifiers.ts → conversation-notifiers.ts} +25 -25
- package/src/daemon/{session-process.ts → conversation-process.ts} +128 -131
- package/src/daemon/{session-queue-manager.ts → conversation-queue-manager.ts} +11 -8
- package/src/daemon/{session-runtime-assembly.ts → conversation-runtime-assembly.ts} +156 -285
- package/src/daemon/{session-skill-tools.ts → conversation-skill-tools.ts} +18 -18
- package/src/daemon/{session-slash.ts → conversation-slash.ts} +42 -88
- package/src/daemon/{session-surfaces.ts → conversation-surfaces.ts} +48 -34
- package/src/daemon/{session-tool-setup.ts → conversation-tool-setup.ts} +50 -44
- package/src/daemon/{session-usage.ts → conversation-usage.ts} +1 -1
- package/src/daemon/{session-workspace.ts → conversation-workspace.ts} +3 -3
- package/src/daemon/{session.ts → conversation.ts} +98 -73
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/date-context.ts +10 -83
- package/src/daemon/doordash-steps.ts +9 -8
- package/src/daemon/guardian-action-generators.ts +8 -2
- package/src/daemon/handlers/config-channels.ts +19 -6
- package/src/daemon/handlers/config-model.ts +33 -32
- package/src/daemon/handlers/config-slack-channel.ts +35 -7
- package/src/daemon/handlers/config-telegram.ts +6 -1
- package/src/daemon/handlers/config-voice.ts +1 -2
- package/src/daemon/handlers/{session-history.ts → conversation-history.ts} +4 -4
- package/src/daemon/handlers/{sessions.ts → conversations.ts} +165 -185
- package/src/daemon/handlers/recording.ts +20 -20
- package/src/daemon/handlers/shared.ts +17 -17
- package/src/daemon/handlers/skills.ts +168 -21
- package/src/daemon/history-repair.ts +1 -1
- package/src/daemon/host-bash-proxy.ts +11 -3
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/host-file-proxy.ts +3 -3
- package/src/daemon/lifecycle.ts +131 -82
- package/src/daemon/main.ts +4 -0
- package/src/daemon/media-visibility-policy.ts +10 -10
- package/src/daemon/message-protocol.ts +11 -8
- package/src/daemon/message-types/acp.ts +66 -0
- package/src/daemon/message-types/computer-use.ts +4 -4
- package/src/daemon/message-types/{sessions.ts → conversations.ts} +74 -80
- package/src/daemon/message-types/documents.ts +2 -2
- package/src/daemon/message-types/host-bash.ts +3 -1
- package/src/daemon/message-types/host-cu.ts +1 -1
- package/src/daemon/message-types/host-file.ts +3 -3
- package/src/daemon/message-types/integrations.ts +2 -2
- package/src/daemon/message-types/messages.ts +23 -23
- package/src/daemon/message-types/notifications.ts +5 -5
- package/src/daemon/message-types/settings.ts +1 -1
- package/src/daemon/message-types/shared.ts +5 -3
- package/src/daemon/message-types/skills.ts +1 -10
- package/src/daemon/message-types/subagents.ts +2 -2
- package/src/daemon/message-types/surfaces.ts +7 -7
- package/src/daemon/message-types/work-items.ts +4 -4
- package/src/daemon/parse-actual-tokens-from-error.test.ts +3 -7
- package/src/daemon/providers-setup.ts +79 -0
- package/src/daemon/seed-files.ts +7 -26
- package/src/daemon/server.ts +452 -214
- package/src/daemon/shutdown-handlers.ts +9 -3
- package/src/daemon/startup-error.ts +126 -0
- package/src/daemon/tool-side-effects.ts +42 -18
- package/src/daemon/trace-emitter.ts +28 -5
- package/src/daemon/verification-session-intent.ts +1 -1
- package/src/daemon/watch-handler.ts +23 -21
- package/src/email/feature-gate.ts +23 -0
- package/src/events/domain-events.ts +3 -9
- package/src/events/tool-domain-event-publisher.ts +0 -8
- package/src/events/tool-metrics-listener.ts +0 -7
- package/src/events/tool-permission-telemetry-listener.ts +46 -0
- package/src/export/formatter.ts +1 -1
- package/src/followups/followup-store.ts +8 -5
- package/src/followups/types.ts +2 -2
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/hooks/discovery.ts +3 -0
- package/src/hooks/manager.ts +27 -2
- package/src/hooks/types.ts +4 -1
- package/src/inbound/platform-callback-registration.ts +6 -2
- package/src/instrument.ts +37 -19
- package/src/media/app-icon-generator.ts +17 -10
- package/src/media/avatar-router.ts +17 -10
- package/src/media/gemini-image-service.ts +125 -21
- package/src/memory/app-git-service.ts +3 -3
- package/src/memory/attachments-store.ts +92 -27
- package/src/memory/canonical-guardian-store.ts +37 -27
- package/src/memory/channel-verification-sessions.ts +6 -6
- package/src/memory/checkpoints.ts +5 -0
- package/src/memory/conversation-bootstrap.ts +2 -2
- package/src/memory/conversation-crud.ts +343 -23
- package/src/memory/conversation-key-store.ts +40 -4
- package/src/memory/conversation-queries.ts +8 -6
- package/src/memory/conversation-starters-cadence.ts +74 -0
- package/src/memory/conversation-title-service.ts +2 -3
- package/src/memory/db-init.ts +70 -2
- package/src/memory/embedding-backend.ts +71 -11
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/guardian-action-store.ts +3 -3
- package/src/memory/indexer.ts +20 -9
- package/src/memory/invite-store.ts +4 -4
- package/src/memory/items-extractor.ts +48 -4
- package/src/memory/job-handlers/backfill.ts +15 -8
- package/src/memory/job-handlers/cleanup.ts +1 -1
- package/src/memory/job-handlers/conversation-starters.ts +433 -0
- package/src/memory/jobs-store.ts +5 -7
- package/src/memory/jobs-worker.ts +10 -0
- package/src/memory/lifecycle-events-store.ts +63 -0
- package/src/memory/migrations/033-scoped-approval-grants.ts +4 -4
- package/src/memory/migrations/102-alter-table-columns.ts +5 -0
- package/src/memory/migrations/105-contacts-and-triage.ts +3 -3
- package/src/memory/migrations/111-media-assets.ts +1 -106
- package/src/memory/migrations/121-canonical-guardian-requests.ts +5 -5
- package/src/memory/migrations/159-drop-contact-interaction-columns.ts +5 -0
- package/src/memory/migrations/161-drop-orphaned-media-tables.ts +18 -0
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +283 -0
- package/src/memory/migrations/163-rename-notification-thread-columns.ts +35 -0
- package/src/memory/migrations/164-rename-conversation-type-column.ts +19 -0
- package/src/memory/migrations/165-rename-inbox-thread-state-table.ts +15 -0
- package/src/memory/migrations/166-rename-followups-thread-id.ts +20 -0
- package/src/memory/migrations/167-rename-sequence-enrollments-thread-id.ts +20 -0
- package/src/memory/migrations/168-rename-sequence-steps-reply-key.ts +17 -0
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +64 -0
- package/src/memory/migrations/170-thread-starters-table.ts +32 -0
- package/src/memory/migrations/171-capability-card-columns.ts +43 -0
- package/src/memory/migrations/172-rename-created-by-session-id.ts +27 -0
- package/src/memory/migrations/173-rename-source-session-id.ts +16 -0
- package/src/memory/migrations/174-rename-thread-starters-table.ts +52 -0
- package/src/memory/migrations/175-create-lifecycle-events.ts +15 -0
- package/src/memory/migrations/176-drop-capability-card-state.ts +36 -0
- package/src/memory/migrations/177-create-trace-events-table.ts +40 -0
- package/src/memory/migrations/index.ts +17 -0
- package/src/memory/migrations/registry.ts +32 -0
- package/src/memory/retriever.test.ts +223 -96
- package/src/memory/retriever.ts +115 -138
- package/src/memory/schema/calls.ts +1 -1
- package/src/memory/schema/contacts.ts +3 -3
- package/src/memory/schema/conversations.ts +2 -2
- package/src/memory/schema/guardian.ts +9 -9
- package/src/memory/schema/infrastructure.ts +29 -0
- package/src/memory/schema/memory-core.ts +27 -0
- package/src/memory/schema/notifications.ts +5 -5
- package/src/memory/schema/tasks.ts +1 -1
- package/src/memory/scoped-approval-grants.ts +14 -14
- package/src/memory/search/formatting.ts +23 -6
- package/src/memory/search/lexical.ts +2 -0
- package/src/memory/search/semantic.ts +2 -0
- package/src/memory/search/staleness.ts +1 -0
- package/src/memory/search/types.ts +7 -3
- package/src/memory/task-memory-cleanup.ts +96 -6
- package/src/memory/trace-event-store.ts +148 -0
- package/src/memory/turn-events-store.ts +48 -0
- package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
- package/src/notifications/AGENTS.md +1 -1
- package/src/notifications/README.md +103 -103
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +3 -3
- package/src/notifications/broadcaster.ts +40 -40
- package/src/notifications/{thread-candidates.ts → conversation-candidates.ts} +18 -18
- package/src/notifications/conversation-pairing.ts +35 -31
- package/src/notifications/{thread-seed-composer.ts → conversation-seed-composer.ts} +9 -9
- package/src/notifications/decision-engine.ts +107 -84
- package/src/notifications/deliveries-store.ts +14 -14
- package/src/notifications/emit-signal.ts +16 -16
- package/src/notifications/events-store.ts +4 -4
- package/src/notifications/signal.ts +3 -3
- package/src/notifications/types.ts +16 -12
- package/src/oauth/byo-connection.test.ts +1 -1
- package/src/oauth/manual-token-connection.ts +49 -25
- package/src/oauth/oauth-store.ts +37 -15
- package/src/oauth/platform-connection.test.ts +2 -2
- package/src/oauth/provider-behaviors.ts +2 -1
- package/src/oauth/seed-providers.ts +3 -11
- package/src/oauth/token-persistence.ts +41 -25
- package/src/outbound-proxy/index.ts +27 -3
- package/src/permissions/checker.ts +21 -7
- package/src/permissions/defaults.ts +4 -4
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/permissions/types.ts +2 -2
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +10 -40
- package/src/prompts/cache-boundary.ts +8 -0
- package/src/prompts/system-prompt.ts +155 -743
- package/src/prompts/templates/BOOTSTRAP.md +166 -33
- package/src/prompts/templates/IDENTITY.md +8 -23
- package/src/prompts/templates/SOUL.md +20 -41
- package/src/prompts/templates/UPDATES.md +0 -12
- package/src/prompts/templates/USER.md +3 -19
- package/src/prompts/update-bulletin-format.ts +16 -0
- package/src/prompts/update-bulletin.ts +18 -6
- package/src/prompts/user-reference.ts +14 -16
- package/src/providers/anthropic/client.ts +181 -13
- package/src/providers/gemini/client.ts +6 -9
- package/src/providers/managed-proxy/constants.ts +1 -7
- package/src/providers/managed-proxy/context.ts +26 -1
- package/src/providers/model-intents.ts +5 -5
- package/src/providers/openai/client.ts +10 -1
- package/src/providers/openrouter/client.ts +1 -0
- package/src/providers/provider-availability.ts +39 -0
- package/src/providers/provider-send-message.ts +20 -6
- package/src/providers/ratelimit.ts +0 -35
- package/src/providers/registry.ts +119 -82
- package/src/providers/retry.ts +18 -1
- package/src/runtime/AGENTS.md +5 -5
- package/src/runtime/access-request-helper.ts +3 -3
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/approval-conversation-turn.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +9 -9
- package/src/runtime/assistant-event.ts +5 -5
- package/src/runtime/auth/__tests__/context.test.ts +2 -2
- package/src/runtime/auth/__tests__/external-assistant-id.test.ts +88 -0
- package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -5
- package/src/runtime/auth/__tests__/local-auth-context.test.ts +4 -4
- package/src/runtime/auth/__tests__/middleware.test.ts +2 -2
- package/src/runtime/auth/__tests__/subject.test.ts +6 -6
- package/src/runtime/auth/context.ts +1 -1
- package/src/runtime/auth/credential-service.ts +1 -1
- package/src/runtime/auth/external-assistant-id.ts +36 -17
- package/src/runtime/auth/route-policy.ts +24 -0
- package/src/runtime/auth/subject.ts +7 -7
- package/src/runtime/auth/types.ts +1 -1
- package/src/runtime/channel-approval-types.ts +1 -1
- package/src/runtime/channel-approvals.ts +9 -6
- package/src/runtime/channel-invite-transport.ts +10 -7
- package/src/runtime/channel-readiness-service.ts +5 -2
- package/src/runtime/channel-retry-sweep.ts +1 -1
- package/src/runtime/channel-verification-service.ts +2 -2
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -4
- package/src/runtime/{session-approval-overrides.ts → conversation-approval-overrides.ts} +6 -6
- package/src/runtime/guardian-action-grant-minter.ts +2 -4
- package/src/runtime/guardian-action-service.ts +2 -2
- package/src/runtime/guardian-decision-types.ts +13 -8
- package/src/runtime/guardian-reply-router.ts +4 -4
- package/src/runtime/guardian-vellum-migration.ts +63 -1
- package/src/runtime/http-server.ts +76 -35
- package/src/runtime/http-types.ts +19 -15
- package/src/runtime/invite-redemption-service.ts +8 -3
- package/src/runtime/local-actor-identity.ts +9 -7
- package/src/runtime/migrations/vbundle-builder.ts +212 -32
- package/src/runtime/migrations/vbundle-import-analyzer.ts +74 -8
- package/src/runtime/migrations/vbundle-importer.ts +66 -1
- package/src/runtime/migrations/vbundle-validator.ts +17 -3
- package/src/runtime/pending-interactions.ts +8 -8
- package/src/runtime/routes/acp-routes.ts +170 -0
- package/src/runtime/routes/approval-routes.ts +3 -3
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +5 -5
- package/src/runtime/routes/attachment-routes.ts +2 -2
- package/src/runtime/routes/avatar-routes.ts +83 -0
- package/src/runtime/routes/btw-routes.ts +36 -13
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-route-shared.ts +5 -3
- package/src/runtime/routes/channel-verification-routes.ts +22 -5
- package/src/runtime/routes/conversation-management-routes.ts +298 -0
- package/src/runtime/routes/{session-query-routes.ts → conversation-query-routes.ts} +23 -20
- package/src/runtime/routes/conversation-routes.ts +196 -169
- package/src/runtime/routes/conversation-starter-routes.ts +207 -0
- package/src/runtime/routes/debug-routes.ts +8 -2
- package/src/runtime/routes/diagnostics-routes.ts +16 -17
- package/src/runtime/routes/events-routes.ts +1 -1
- package/src/runtime/routes/guardian-action-routes.ts +4 -4
- package/src/runtime/routes/guardian-approval-interception.ts +1 -1
- package/src/runtime/routes/guardian-bootstrap-routes.ts +13 -9
- package/src/runtime/routes/host-bash-routes.ts +1 -1
- package/src/runtime/routes/host-cu-routes.ts +1 -1
- package/src/runtime/routes/host-file-routes.ts +1 -1
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +1 -1
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +2 -2
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +1 -1
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +360 -40
- package/src/runtime/routes/migration-routes.ts +25 -13
- package/src/runtime/routes/recording-routes.ts +5 -5
- package/src/runtime/routes/schedule-routes.ts +13 -7
- package/src/runtime/routes/secret-routes.ts +196 -18
- package/src/runtime/routes/settings-routes.ts +31 -18
- package/src/runtime/routes/skills-routes.ts +38 -0
- package/src/runtime/routes/subagents-routes.ts +10 -10
- package/src/runtime/routes/surface-action-routes.ts +45 -45
- package/src/runtime/routes/surface-content-routes.ts +18 -18
- package/src/runtime/routes/telemetry-routes.ts +53 -0
- package/src/runtime/routes/trace-event-routes.ts +62 -0
- package/src/runtime/routes/watch-routes.ts +6 -6
- package/src/runtime/routes/work-items-routes.test.ts +109 -0
- package/src/runtime/routes/work-items-routes.ts +47 -46
- package/src/runtime/tool-grant-request-helper.ts +4 -4
- package/src/runtime/trust-context-resolver.ts +1 -1
- package/src/runtime/verification-outbound-actions.ts +47 -31
- package/src/schedule/scheduler.ts +14 -12
- package/src/security/credential-backend.ts +29 -5
- package/src/security/encrypted-store.ts +292 -48
- package/src/security/keychain-broker-client.ts +45 -12
- package/src/security/secure-keys.ts +46 -0
- package/src/security/token-manager.ts +67 -167
- package/src/sequence/engine.ts +12 -11
- package/src/sequence/reply-matcher.ts +16 -13
- package/src/sequence/store.ts +10 -7
- package/src/sequence/types.ts +2 -2
- package/src/signals/bash.ts +4 -4
- package/src/signals/cancel.ts +14 -17
- package/src/signals/confirm.ts +4 -7
- package/src/signals/conversation-undo.ts +16 -20
- package/src/signals/event-stream.ts +187 -0
- package/src/signals/shotgun.ts +200 -0
- package/src/signals/trust-rule.ts +3 -6
- package/src/signals/user-message.ts +146 -0
- package/src/skills/catalog-install.ts +11 -1
- package/src/skills/managed-store.ts +2 -13
- package/src/skills/skill-memory.ts +220 -0
- package/src/subagent/manager.ts +83 -75
- package/src/subagent/types.ts +5 -5
- package/src/swarm/backend-claude-code.ts +1 -1
- package/src/tasks/SPEC.md +5 -5
- package/src/tasks/task-runner.ts +1 -1
- package/src/telemetry/types.ts +35 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +145 -24
- package/src/telemetry/usage-telemetry-reporter.ts +126 -42
- package/src/tools/AGENTS.md +32 -6
- package/src/tools/acp/abort.ts +32 -0
- package/src/tools/acp/spawn.ts +70 -0
- package/src/tools/acp/status.ts +31 -0
- package/src/tools/apps/executors.ts +8 -8
- package/src/tools/apps/registry.ts +1 -1
- package/src/tools/assets/materialize.ts +39 -24
- package/src/tools/assets/search.ts +21 -21
- package/src/tools/browser/__tests__/auth-cache.test.ts +2 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +4 -4
- package/src/tools/browser/auth-detector.ts +6 -6
- package/src/tools/browser/browser-execution.ts +76 -46
- package/src/tools/browser/browser-handoff.ts +12 -9
- package/src/tools/browser/browser-manager.ts +91 -81
- package/src/tools/browser/browser-screencast.ts +30 -28
- package/src/tools/browser/chrome-cdp.ts +5 -5
- package/src/tools/browser/jit-auth.ts +2 -2
- package/src/tools/browser/network-recorder.test.ts +2 -2
- package/src/tools/browser/network-recorder.ts +3 -3
- package/src/tools/browser/runtime-check.ts +3 -3
- package/src/tools/calls/call-start.ts +1 -1
- package/src/tools/calls/call-status.ts +1 -1
- package/src/tools/claude-code/claude-code.ts +11 -11
- package/src/tools/computer-use/definitions.ts +18 -18
- package/src/tools/credential-execution/make-authenticated-request.ts +198 -0
- package/src/tools/credential-execution/manage-secure-command-tool.ts +372 -0
- package/src/tools/credential-execution/run-authenticated-command.ts +261 -0
- package/src/tools/credentials/broker-types.ts +5 -5
- package/src/tools/credentials/broker.ts +16 -16
- package/src/tools/credentials/metadata-store.ts +46 -227
- package/src/tools/credentials/resolve.ts +3 -2
- package/src/tools/credentials/selection.ts +1 -1
- package/src/tools/credentials/tool-policy.ts +1 -1
- package/src/tools/credentials/vault.ts +115 -25
- package/src/tools/document/document-tool.ts +3 -3
- package/src/tools/execution-target.ts +2 -2
- package/src/tools/executor.ts +147 -12
- package/src/tools/filesystem/edit.ts +2 -2
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/followups/followup_create.ts +8 -7
- package/src/tools/followups/followup_list.ts +3 -1
- package/src/tools/followups/followup_resolve.ts +8 -7
- package/src/tools/host-filesystem/edit.ts +3 -2
- package/src/tools/host-filesystem/read.ts +3 -2
- package/src/tools/host-filesystem/write.ts +2 -2
- package/src/tools/host-terminal/host-shell.ts +60 -12
- package/src/tools/mcp/mcp-tool-factory.ts +7 -6
- package/src/tools/memory/definitions.ts +6 -5
- package/src/tools/memory/handlers.test.ts +1 -1
- package/src/tools/memory/handlers.ts +1 -1
- package/src/tools/network/__tests__/web-search.test.ts +3 -3
- package/src/tools/network/domain-normalize.ts +2 -2
- package/src/tools/network/script-proxy/session-manager.ts +292 -517
- package/src/tools/network/web-fetch.ts +2 -2
- package/src/tools/network/web-search.ts +7 -7
- package/src/tools/permission-checker.ts +43 -28
- package/src/tools/registry.ts +20 -8
- package/src/tools/schedule/list.ts +2 -2
- package/src/tools/schema-transforms.ts +31 -21
- package/src/tools/secret-detection-handler.ts +4 -9
- package/src/tools/sensitive-output-placeholders.ts +1 -1
- package/src/tools/shared/filesystem/edit-engine.ts +1 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +3 -3
- package/src/tools/shared/filesystem/image-read.ts +25 -5
- package/src/tools/shared/filesystem/path-policy.ts +2 -2
- package/src/tools/shared/shell-output.ts +1 -1
- package/src/tools/side-effects.ts +3 -2
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/load.ts +18 -4
- package/src/tools/skills/sandbox-runner.ts +3 -4
- package/src/tools/skills/scaffold-managed.ts +0 -8
- package/src/tools/subagent/abort.ts +1 -1
- package/src/tools/subagent/message.ts +2 -2
- package/src/tools/subagent/read.ts +3 -3
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/subagent/status.ts +10 -4
- package/src/tools/swarm/delegate.ts +13 -13
- package/src/tools/system/avatar-generator.ts +52 -79
- package/src/tools/system/request-permission.ts +5 -4
- package/src/tools/terminal/backends/native.ts +51 -11
- package/src/tools/terminal/backends/types.ts +7 -0
- package/src/tools/terminal/parser.ts +6 -6
- package/src/tools/terminal/safe-env.ts +4 -1
- package/src/tools/terminal/sandbox-diagnostics.ts +1 -1
- package/src/tools/terminal/shell.ts +114 -10
- package/src/tools/tool-approval-handler.ts +23 -29
- package/src/tools/tool-manifest.ts +45 -2
- package/src/tools/types.ts +30 -7
- package/src/tools/ui-surface/definitions.ts +9 -37
- package/src/tools/watch/screen-watch.ts +6 -6
- package/src/tools/watch/watch-state.ts +33 -26
- package/src/tools/watcher/list.ts +1 -1
- package/src/util/clipboard.ts +1 -1
- package/src/util/device-id.ts +101 -0
- package/src/util/logger.ts +7 -2
- package/src/util/platform.ts +10 -0
- package/src/util/retry.ts +29 -1
- package/src/util/silently.ts +7 -8
- package/src/watcher/engine.ts +1 -1
- package/src/work-items/resolve-required-tools.test.ts +37 -0
- package/src/work-items/resolve-required-tools.ts +26 -0
- package/src/work-items/work-item-runner.ts +29 -27
- package/src/workspace/commit-message-enrichment-service.ts +1 -1
- package/src/workspace/commit-message-provider.ts +2 -2
- package/src/workspace/git-service.ts +27 -14
- package/src/workspace/migrations/001-avatar-rename.ts +25 -0
- package/src/workspace/migrations/002-backfill-installation-id.ts +75 -0
- package/src/workspace/migrations/003-seed-device-id.ts +101 -0
- package/src/workspace/migrations/004-extract-collect-usage-data.ts +50 -0
- package/src/workspace/migrations/005-add-send-diagnostics.ts +12 -0
- package/src/workspace/migrations/006-services-config.ts +132 -0
- package/src/workspace/migrations/007-web-search-provider-rename.ts +37 -0
- package/src/workspace/migrations/registry.ts +22 -0
- package/src/workspace/migrations/runner.ts +117 -0
- package/src/workspace/migrations/types.ts +11 -0
- package/src/workspace/provider-commit-message-generator.ts +7 -4
- package/src/workspace/turn-commit.ts +13 -13
- package/tsconfig.json +0 -1
- package/src/__tests__/cli-help-reference-sync.test.ts +0 -26
- package/src/__tests__/handlers-task-submit-slash.test.ts +0 -39
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -190
- package/src/__tests__/session-slash-known.test.ts +0 -477
- package/src/__tests__/slash-commands-catalog.test.ts +0 -94
- package/src/__tests__/slash-commands-parser.test.ts +0 -127
- package/src/__tests__/slash-commands-resolver.test.ts +0 -231
- package/src/__tests__/slash-commands-rewrite.test.ts +0 -40
- package/src/cli/commands/sessions.ts +0 -253
- package/src/cli/http-client.ts +0 -76
- package/src/cli/reference.ts +0 -36
- package/src/daemon/install-cli-launchers.ts +0 -170
- package/src/daemon/session-evictor.ts +0 -203
- package/src/runtime/routes/session-management-routes.ts +0 -190
- package/src/skills/slash-commands.ts +0 -203
- /package/src/__tests__/{script-proxy-session-runtime.test.ts → script-proxy-conversation-runtime.test.ts} +0 -0
- /package/src/daemon/{session-media-retry.ts → conversation-media-retry.ts} +0 -0
|
@@ -10,7 +10,7 @@ import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
|
10
10
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
11
11
|
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
|
-
// Mocks — must precede the
|
|
13
|
+
// Mocks — must precede the Conversation import so Bun applies them at load time.
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
15
15
|
|
|
16
16
|
function makeLoggerStub(): Record<string, unknown> {
|
|
@@ -69,11 +69,10 @@ mock.module("../config/loader.js", () => ({
|
|
|
69
69
|
nonInteractiveLatestTurnCompression: "truncate",
|
|
70
70
|
},
|
|
71
71
|
},
|
|
72
|
-
rateLimit: { maxRequestsPerMinute: 0
|
|
72
|
+
rateLimit: { maxRequestsPerMinute: 0 },
|
|
73
73
|
timeouts: { permissionTimeoutSec: 1 },
|
|
74
74
|
skills: { entries: {}, allowBundled: true },
|
|
75
75
|
permissions: { mode: "workspace" },
|
|
76
|
-
sandbox: { enabled: false },
|
|
77
76
|
daemon: {
|
|
78
77
|
startupSocketWaitMs: 5000,
|
|
79
78
|
stopTimeoutMs: 5000,
|
|
@@ -81,6 +80,19 @@ mock.module("../config/loader.js", () => ({
|
|
|
81
80
|
titleGenerationMaxTokens: 30,
|
|
82
81
|
standaloneRecording: true,
|
|
83
82
|
},
|
|
83
|
+
services: {
|
|
84
|
+
inference: {
|
|
85
|
+
mode: "your-own",
|
|
86
|
+
provider: "anthropic",
|
|
87
|
+
model: "claude-opus-4-6",
|
|
88
|
+
},
|
|
89
|
+
"image-generation": {
|
|
90
|
+
mode: "your-own",
|
|
91
|
+
provider: "gemini",
|
|
92
|
+
model: "gemini-3.1-flash-image-preview",
|
|
93
|
+
},
|
|
94
|
+
"web-search": { mode: "your-own", provider: "inference-provider-native" },
|
|
95
|
+
},
|
|
84
96
|
}),
|
|
85
97
|
loadRawConfig: () => ({}),
|
|
86
98
|
saveRawConfig: () => {},
|
|
@@ -101,13 +113,6 @@ mock.module("../config/skill-state.js", () => ({
|
|
|
101
113
|
resolveSkillStates: () => [],
|
|
102
114
|
}));
|
|
103
115
|
|
|
104
|
-
mock.module("../skills/slash-commands.js", () => ({
|
|
105
|
-
buildInvocableSlashCatalog: () => new Map(),
|
|
106
|
-
resolveSlashSkillCommand: () => ({ kind: "not_slash" }),
|
|
107
|
-
rewriteKnownSlashCommandPrompt: () => "",
|
|
108
|
-
parseSlashCandidate: () => ({ kind: "not_slash" }),
|
|
109
|
-
}));
|
|
110
|
-
|
|
111
116
|
mock.module("../permissions/trust-store.js", () => ({
|
|
112
117
|
addRule: () => {},
|
|
113
118
|
findHighestPriorityRule: () => null,
|
|
@@ -119,7 +124,7 @@ mock.module("../security/secret-allowlist.js", () => ({
|
|
|
119
124
|
}));
|
|
120
125
|
|
|
121
126
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
122
|
-
|
|
127
|
+
getConversationType: () => "default",
|
|
123
128
|
setConversationOriginChannelIfUnset: () => {},
|
|
124
129
|
updateConversationContextWindow: () => {},
|
|
125
130
|
deleteMessageById: () => {},
|
|
@@ -172,7 +177,7 @@ mock.module("../memory/retriever.js", () => ({
|
|
|
172
177
|
injectedTokens: 0,
|
|
173
178
|
latencyMs: 0,
|
|
174
179
|
}),
|
|
175
|
-
|
|
180
|
+
injectMemoryRecallAsUserBlock: (msgs: Message[]) => msgs,
|
|
176
181
|
}));
|
|
177
182
|
|
|
178
183
|
mock.module("../context/window-manager.js", () => ({
|
|
@@ -198,7 +203,7 @@ mock.module("../context/window-manager.js", () => ({
|
|
|
198
203
|
|
|
199
204
|
const turnCommitCalls: Array<{
|
|
200
205
|
workspaceDir: string;
|
|
201
|
-
|
|
206
|
+
conversationId: string;
|
|
202
207
|
turnNumber: number;
|
|
203
208
|
}> = [];
|
|
204
209
|
let turnCommitHangForever = false;
|
|
@@ -284,27 +289,29 @@ mock.module("../memory/canonical-guardian-store.js", () => ({
|
|
|
284
289
|
}));
|
|
285
290
|
|
|
286
291
|
// ---------------------------------------------------------------------------
|
|
287
|
-
// Import
|
|
292
|
+
// Import Conversation AFTER mocks are registered.
|
|
288
293
|
// ---------------------------------------------------------------------------
|
|
289
294
|
|
|
290
|
-
import type { QueueDrainReason, QueuePolicy } from "../daemon/
|
|
291
|
-
import {
|
|
292
|
-
import { MessageQueue } from "../daemon/
|
|
295
|
+
import type { QueueDrainReason, QueuePolicy } from "../daemon/conversation.js";
|
|
296
|
+
import { Conversation } from "../daemon/conversation.js";
|
|
297
|
+
import { MessageQueue } from "../daemon/conversation-queue-manager.js";
|
|
293
298
|
|
|
294
|
-
type
|
|
299
|
+
type ConversationWithWorkspaceDeps = Conversation & {
|
|
295
300
|
getWorkspaceGitService?: (_workspaceDir: string) => {
|
|
296
301
|
ensureInitialized: () => Promise<void>;
|
|
297
302
|
};
|
|
298
303
|
commitTurnChanges?: (
|
|
299
304
|
workspaceDir: string,
|
|
300
|
-
|
|
305
|
+
conversationId: string,
|
|
301
306
|
turnNumber: number,
|
|
302
307
|
provider?: unknown,
|
|
303
308
|
deadlineMs?: number,
|
|
304
309
|
) => Promise<void>;
|
|
305
310
|
};
|
|
306
311
|
|
|
307
|
-
function
|
|
312
|
+
function makeConversation(
|
|
313
|
+
sendToClient?: (msg: ServerMessage) => void,
|
|
314
|
+
): Conversation {
|
|
308
315
|
const provider = {
|
|
309
316
|
name: "mock",
|
|
310
317
|
async sendMessage(): Promise<ProviderResponse> {
|
|
@@ -316,7 +323,7 @@ function makeSession(sendToClient?: (msg: ServerMessage) => void): Session {
|
|
|
316
323
|
};
|
|
317
324
|
},
|
|
318
325
|
};
|
|
319
|
-
const
|
|
326
|
+
const conversationObj = new Conversation(
|
|
320
327
|
"conv-1",
|
|
321
328
|
provider,
|
|
322
329
|
"system prompt",
|
|
@@ -324,22 +331,23 @@ function makeSession(sendToClient?: (msg: ServerMessage) => void): Session {
|
|
|
324
331
|
sendToClient ?? (() => {}),
|
|
325
332
|
"/tmp",
|
|
326
333
|
);
|
|
327
|
-
const
|
|
328
|
-
|
|
334
|
+
const conversationWithWorkspaceDeps =
|
|
335
|
+
conversationObj as ConversationWithWorkspaceDeps;
|
|
336
|
+
conversationWithWorkspaceDeps.getWorkspaceGitService = () => ({
|
|
329
337
|
ensureInitialized: async () => {},
|
|
330
338
|
});
|
|
331
|
-
|
|
339
|
+
conversationWithWorkspaceDeps.commitTurnChanges = async (
|
|
332
340
|
workspaceDir: string,
|
|
333
|
-
|
|
341
|
+
conversationId: string,
|
|
334
342
|
turnNumber: number,
|
|
335
343
|
) => {
|
|
336
|
-
turnCommitCalls.push({ workspaceDir,
|
|
344
|
+
turnCommitCalls.push({ workspaceDir, conversationId, turnNumber });
|
|
337
345
|
if (turnCommitHangForever) {
|
|
338
346
|
// Simulate a commit that never resolves within the timeout budget
|
|
339
347
|
await new Promise<void>(() => {});
|
|
340
348
|
}
|
|
341
349
|
};
|
|
342
|
-
return
|
|
350
|
+
return conversationObj;
|
|
343
351
|
}
|
|
344
352
|
|
|
345
353
|
/**
|
|
@@ -378,7 +386,7 @@ async function waitForCondition(
|
|
|
378
386
|
|
|
379
387
|
/**
|
|
380
388
|
* Resolve the Nth pending AgentLoop.run() call. Fires the minimal events
|
|
381
|
-
* that `runAgentLoop` expects (usage + message_complete) so the
|
|
389
|
+
* that `runAgentLoop` expects (usage + message_complete) so the conversation
|
|
382
390
|
* cleanly transitions out of its processing state.
|
|
383
391
|
*/
|
|
384
392
|
function resolveRun(index: number) {
|
|
@@ -415,20 +423,20 @@ afterAll(() => {
|
|
|
415
423
|
// Tests
|
|
416
424
|
// ---------------------------------------------------------------------------
|
|
417
425
|
|
|
418
|
-
describe("
|
|
426
|
+
describe("Conversation message queue", () => {
|
|
419
427
|
beforeEach(() => {
|
|
420
428
|
pendingRuns = [];
|
|
421
429
|
});
|
|
422
430
|
|
|
423
|
-
test("second message is queued when
|
|
424
|
-
const
|
|
425
|
-
await
|
|
431
|
+
test("second message is queued when conversation is busy (does not throw)", async () => {
|
|
432
|
+
const conversation = makeConversation();
|
|
433
|
+
await conversation.loadFromDb();
|
|
426
434
|
|
|
427
435
|
const events1: ServerMessage[] = [];
|
|
428
436
|
const events2: ServerMessage[] = [];
|
|
429
437
|
|
|
430
438
|
// Start first message — this will block on AgentLoop.run
|
|
431
|
-
const p1 =
|
|
439
|
+
const p1 = conversation.processMessage(
|
|
432
440
|
"msg-1",
|
|
433
441
|
[],
|
|
434
442
|
(e) => events1.push(e),
|
|
@@ -438,11 +446,11 @@ describe("Session message queue", () => {
|
|
|
438
446
|
// Wait for the first AgentLoop.run to be registered
|
|
439
447
|
await waitForPendingRun(1);
|
|
440
448
|
|
|
441
|
-
//
|
|
442
|
-
expect(
|
|
449
|
+
// Conversation should now be processing
|
|
450
|
+
expect(conversation.isProcessing()).toBe(true);
|
|
443
451
|
|
|
444
452
|
// Enqueue second message — should NOT throw
|
|
445
|
-
const result =
|
|
453
|
+
const result = conversation.enqueueMessage(
|
|
446
454
|
"msg-2",
|
|
447
455
|
[],
|
|
448
456
|
(e) => events2.push(e),
|
|
@@ -450,7 +458,7 @@ describe("Session message queue", () => {
|
|
|
450
458
|
);
|
|
451
459
|
expect(result.queued).toBe(true);
|
|
452
460
|
expect(result.requestId).toBe("req-2");
|
|
453
|
-
expect(
|
|
461
|
+
expect(conversation.getQueueDepth()).toBe(1);
|
|
454
462
|
|
|
455
463
|
// Complete the first message
|
|
456
464
|
resolveRun(0);
|
|
@@ -471,8 +479,8 @@ describe("Session message queue", () => {
|
|
|
471
479
|
});
|
|
472
480
|
|
|
473
481
|
test("[experimental] queued messages are processed in FIFO order", async () => {
|
|
474
|
-
const
|
|
475
|
-
await
|
|
482
|
+
const conversation = makeConversation();
|
|
483
|
+
await conversation.loadFromDb();
|
|
476
484
|
|
|
477
485
|
const processedOrder: string[] = [];
|
|
478
486
|
|
|
@@ -481,7 +489,7 @@ describe("Session message queue", () => {
|
|
|
481
489
|
};
|
|
482
490
|
|
|
483
491
|
// Start first message
|
|
484
|
-
const p1 =
|
|
492
|
+
const p1 = conversation.processMessage(
|
|
485
493
|
"msg-1",
|
|
486
494
|
[],
|
|
487
495
|
makeHandler("msg-1"),
|
|
@@ -490,9 +498,9 @@ describe("Session message queue", () => {
|
|
|
490
498
|
await waitForPendingRun(1);
|
|
491
499
|
|
|
492
500
|
// Enqueue two more
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
expect(
|
|
501
|
+
conversation.enqueueMessage("msg-2", [], makeHandler("msg-2"), "req-2");
|
|
502
|
+
conversation.enqueueMessage("msg-3", [], makeHandler("msg-3"), "req-3");
|
|
503
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
496
504
|
|
|
497
505
|
// Complete first → triggers second
|
|
498
506
|
resolveRun(0);
|
|
@@ -511,17 +519,17 @@ describe("Session message queue", () => {
|
|
|
511
519
|
});
|
|
512
520
|
|
|
513
521
|
test("message_queued and message_dequeued events are emitted", async () => {
|
|
514
|
-
const
|
|
515
|
-
await
|
|
522
|
+
const conversation = makeConversation();
|
|
523
|
+
await conversation.loadFromDb();
|
|
516
524
|
|
|
517
525
|
const events2: ServerMessage[] = [];
|
|
518
526
|
|
|
519
527
|
// Start first message
|
|
520
|
-
const p1 =
|
|
528
|
+
const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
521
529
|
await waitForPendingRun(1);
|
|
522
530
|
|
|
523
531
|
// Enqueue second — simulating what handleUserMessage does
|
|
524
|
-
const result =
|
|
532
|
+
const result = conversation.enqueueMessage(
|
|
525
533
|
"msg-2",
|
|
526
534
|
[],
|
|
527
535
|
(e) => events2.push(e),
|
|
@@ -539,71 +547,75 @@ describe("Session message queue", () => {
|
|
|
539
547
|
expect(dequeued).toBeDefined();
|
|
540
548
|
expect(dequeued).toEqual({
|
|
541
549
|
type: "message_dequeued",
|
|
542
|
-
|
|
550
|
+
conversationId: "conv-1",
|
|
543
551
|
requestId: "req-2",
|
|
544
552
|
});
|
|
545
553
|
|
|
546
|
-
// Complete second run so the
|
|
554
|
+
// Complete second run so the conversation finishes cleanly
|
|
547
555
|
resolveRun(1);
|
|
548
556
|
await new Promise((r) => setTimeout(r, 10));
|
|
549
557
|
});
|
|
550
558
|
|
|
551
559
|
test("abort() clears the queue and sends generation_cancelled for each queued message", async () => {
|
|
552
|
-
const
|
|
553
|
-
await
|
|
560
|
+
const conversation = makeConversation();
|
|
561
|
+
await conversation.loadFromDb();
|
|
554
562
|
|
|
555
563
|
const events2: ServerMessage[] = [];
|
|
556
564
|
const events3: ServerMessage[] = [];
|
|
557
565
|
|
|
558
566
|
// Start first message
|
|
559
|
-
|
|
567
|
+
conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
560
568
|
await waitForPendingRun(1);
|
|
561
569
|
|
|
562
570
|
// Enqueue two more
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
expect(
|
|
571
|
+
conversation.enqueueMessage("msg-2", [], (e) => events2.push(e), "req-2");
|
|
572
|
+
conversation.enqueueMessage("msg-3", [], (e) => events3.push(e), "req-3");
|
|
573
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
566
574
|
|
|
567
575
|
// Abort
|
|
568
|
-
|
|
576
|
+
conversation.abort();
|
|
569
577
|
|
|
570
578
|
// Queue should be empty
|
|
571
|
-
expect(
|
|
579
|
+
expect(conversation.getQueueDepth()).toBe(0);
|
|
572
580
|
|
|
573
|
-
// Both queued messages should receive
|
|
581
|
+
// Both queued messages should receive conversation-scoped cancellation events.
|
|
574
582
|
const cancel2 = events2.find((e) => e.type === "generation_cancelled");
|
|
575
583
|
expect(cancel2).toEqual({
|
|
576
584
|
type: "generation_cancelled",
|
|
577
|
-
|
|
585
|
+
conversationId: "conv-1",
|
|
578
586
|
});
|
|
579
587
|
|
|
580
588
|
const cancel3 = events3.find((e) => e.type === "generation_cancelled");
|
|
581
589
|
expect(cancel3).toEqual({
|
|
582
590
|
type: "generation_cancelled",
|
|
583
|
-
|
|
591
|
+
conversationId: "conv-1",
|
|
584
592
|
});
|
|
585
593
|
|
|
586
|
-
// abort() must NOT emit
|
|
594
|
+
// abort() must NOT emit conversation_error or generic error for queued discards.
|
|
587
595
|
const err2 = events2.find((e) => e.type === "error");
|
|
588
596
|
expect(err2).toBeUndefined();
|
|
589
597
|
const err3 = events3.find((e) => e.type === "error");
|
|
590
598
|
expect(err3).toBeUndefined();
|
|
591
599
|
|
|
592
|
-
const
|
|
593
|
-
|
|
600
|
+
const conversationErr2 = events2.find(
|
|
601
|
+
(e) => e.type === "conversation_error",
|
|
602
|
+
);
|
|
603
|
+
expect(conversationErr2).toBeUndefined();
|
|
594
604
|
|
|
595
|
-
const
|
|
596
|
-
|
|
605
|
+
const conversationErr3 = events3.find(
|
|
606
|
+
(e) => e.type === "conversation_error",
|
|
607
|
+
);
|
|
608
|
+
expect(conversationErr3).toBeUndefined();
|
|
597
609
|
});
|
|
598
610
|
|
|
599
|
-
test("
|
|
600
|
-
const
|
|
601
|
-
await
|
|
611
|
+
test("conversation-scoped errors emit both conversation_error and generic error", async () => {
|
|
612
|
+
const conversation = makeConversation();
|
|
613
|
+
await conversation.loadFromDb();
|
|
602
614
|
|
|
603
615
|
const events: ServerMessage[] = [];
|
|
604
616
|
|
|
605
617
|
// Start a message — blocks on AgentLoop.run
|
|
606
|
-
const p1 =
|
|
618
|
+
const p1 = conversation.processMessage(
|
|
607
619
|
"msg-1",
|
|
608
620
|
[],
|
|
609
621
|
(e) => events.push(e),
|
|
@@ -616,9 +628,9 @@ describe("Session message queue", () => {
|
|
|
616
628
|
pendingRuns[0].reject(new Error("Provider returned 500"));
|
|
617
629
|
await p1;
|
|
618
630
|
|
|
619
|
-
// Should emit
|
|
620
|
-
const
|
|
621
|
-
expect(
|
|
631
|
+
// Should emit conversation_error (typed, structured)
|
|
632
|
+
const conversationErr = events.find((e) => e.type === "conversation_error");
|
|
633
|
+
expect(conversationErr).toBeDefined();
|
|
622
634
|
|
|
623
635
|
// Should also emit generic error (callers rely on error events to detect failures)
|
|
624
636
|
const genericErr = events.find((e) => e.type === "error");
|
|
@@ -626,42 +638,42 @@ describe("Session message queue", () => {
|
|
|
626
638
|
});
|
|
627
639
|
|
|
628
640
|
test("queue depth is reported correctly as messages are added and drained", async () => {
|
|
629
|
-
const
|
|
630
|
-
await
|
|
641
|
+
const conversation = makeConversation();
|
|
642
|
+
await conversation.loadFromDb();
|
|
631
643
|
|
|
632
644
|
// Start first message
|
|
633
|
-
const p1 =
|
|
645
|
+
const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
634
646
|
await waitForPendingRun(1);
|
|
635
647
|
|
|
636
|
-
expect(
|
|
648
|
+
expect(conversation.getQueueDepth()).toBe(0);
|
|
637
649
|
|
|
638
|
-
|
|
639
|
-
expect(
|
|
650
|
+
conversation.enqueueMessage("msg-2", [], () => {}, "req-2");
|
|
651
|
+
expect(conversation.getQueueDepth()).toBe(1);
|
|
640
652
|
|
|
641
|
-
|
|
642
|
-
expect(
|
|
653
|
+
conversation.enqueueMessage("msg-3", [], () => {}, "req-3");
|
|
654
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
643
655
|
|
|
644
|
-
|
|
645
|
-
expect(
|
|
656
|
+
conversation.enqueueMessage("msg-4", [], () => {}, "req-4");
|
|
657
|
+
expect(conversation.getQueueDepth()).toBe(3);
|
|
646
658
|
|
|
647
659
|
// Complete first → drains one from queue
|
|
648
660
|
resolveRun(0);
|
|
649
661
|
await p1;
|
|
650
662
|
await waitForPendingRun(2);
|
|
651
663
|
|
|
652
|
-
expect(
|
|
664
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
653
665
|
|
|
654
666
|
// Complete second → drains another
|
|
655
667
|
resolveRun(1);
|
|
656
668
|
await waitForPendingRun(3);
|
|
657
669
|
|
|
658
|
-
expect(
|
|
670
|
+
expect(conversation.getQueueDepth()).toBe(1);
|
|
659
671
|
|
|
660
672
|
// Complete third → drains last
|
|
661
673
|
resolveRun(2);
|
|
662
674
|
await waitForPendingRun(4);
|
|
663
675
|
|
|
664
|
-
expect(
|
|
676
|
+
expect(conversation.getQueueDepth()).toBe(0);
|
|
665
677
|
|
|
666
678
|
// Complete fourth (final queued message)
|
|
667
679
|
resolveRun(3);
|
|
@@ -669,15 +681,15 @@ describe("Session message queue", () => {
|
|
|
669
681
|
});
|
|
670
682
|
|
|
671
683
|
test("[experimental] drain continues after a queued message fails to persist", async () => {
|
|
672
|
-
const
|
|
673
|
-
await
|
|
684
|
+
const conversation = makeConversation();
|
|
685
|
+
await conversation.loadFromDb();
|
|
674
686
|
|
|
675
687
|
const events1: ServerMessage[] = [];
|
|
676
688
|
const events2: ServerMessage[] = [];
|
|
677
689
|
const events3: ServerMessage[] = [];
|
|
678
690
|
|
|
679
691
|
// Start first message — blocks on AgentLoop.run
|
|
680
|
-
const p1 =
|
|
692
|
+
const p1 = conversation.processMessage(
|
|
681
693
|
"msg-1",
|
|
682
694
|
[],
|
|
683
695
|
(e) => events1.push(e),
|
|
@@ -686,10 +698,10 @@ describe("Session message queue", () => {
|
|
|
686
698
|
await waitForPendingRun(1);
|
|
687
699
|
|
|
688
700
|
// Enqueue a message with empty content (will fail persistUserMessage)
|
|
689
|
-
|
|
701
|
+
conversation.enqueueMessage("", [], (e) => events2.push(e), "req-2");
|
|
690
702
|
// Enqueue a valid message after the bad one
|
|
691
|
-
|
|
692
|
-
expect(
|
|
703
|
+
conversation.enqueueMessage("msg-3", [], (e) => events3.push(e), "req-3");
|
|
704
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
693
705
|
|
|
694
706
|
// Complete first message — triggers drain. The empty message should fail
|
|
695
707
|
// to persist, but the drain should continue to msg-3.
|
|
@@ -722,28 +734,28 @@ describe("Session message queue", () => {
|
|
|
722
734
|
// Queue policy primitives
|
|
723
735
|
// ---------------------------------------------------------------------------
|
|
724
736
|
|
|
725
|
-
describe("
|
|
737
|
+
describe("Conversation queue policy helpers", () => {
|
|
726
738
|
beforeEach(() => {
|
|
727
739
|
pendingRuns = [];
|
|
728
740
|
});
|
|
729
741
|
|
|
730
|
-
test("hasQueuedMessages() returns false on a fresh
|
|
731
|
-
const
|
|
732
|
-
await
|
|
733
|
-
expect(
|
|
742
|
+
test("hasQueuedMessages() returns false on a fresh conversation", async () => {
|
|
743
|
+
const conversation = makeConversation();
|
|
744
|
+
await conversation.loadFromDb();
|
|
745
|
+
expect(conversation.hasQueuedMessages()).toBe(false);
|
|
734
746
|
});
|
|
735
747
|
|
|
736
748
|
test("hasQueuedMessages() returns true after enqueuing while processing", async () => {
|
|
737
|
-
const
|
|
738
|
-
await
|
|
749
|
+
const conversation = makeConversation();
|
|
750
|
+
await conversation.loadFromDb();
|
|
739
751
|
|
|
740
752
|
// Start processing to make the session busy
|
|
741
|
-
|
|
753
|
+
conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
742
754
|
await waitForPendingRun(1);
|
|
743
755
|
|
|
744
756
|
// Enqueue a message while processing
|
|
745
|
-
|
|
746
|
-
expect(
|
|
757
|
+
conversation.enqueueMessage("msg-2", [], () => {}, "req-2");
|
|
758
|
+
expect(conversation.hasQueuedMessages()).toBe(true);
|
|
747
759
|
|
|
748
760
|
// Cleanup: resolve the pending run
|
|
749
761
|
resolveRun(0);
|
|
@@ -753,24 +765,24 @@ describe("Session queue policy helpers", () => {
|
|
|
753
765
|
});
|
|
754
766
|
|
|
755
767
|
test("canHandoffAtCheckpoint() returns false when not processing", async () => {
|
|
756
|
-
const
|
|
757
|
-
await
|
|
768
|
+
const conversation = makeConversation();
|
|
769
|
+
await conversation.loadFromDb();
|
|
758
770
|
|
|
759
771
|
// Not processing, no queued messages
|
|
760
|
-
expect(
|
|
772
|
+
expect(conversation.canHandoffAtCheckpoint()).toBe(false);
|
|
761
773
|
});
|
|
762
774
|
|
|
763
775
|
test("canHandoffAtCheckpoint() returns false when processing but no queued messages", async () => {
|
|
764
|
-
const
|
|
765
|
-
await
|
|
776
|
+
const conversation = makeConversation();
|
|
777
|
+
await conversation.loadFromDb();
|
|
766
778
|
|
|
767
779
|
// Start processing — but don't enqueue anything
|
|
768
|
-
|
|
780
|
+
conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
769
781
|
await waitForPendingRun(1);
|
|
770
782
|
|
|
771
|
-
expect(
|
|
772
|
-
expect(
|
|
773
|
-
expect(
|
|
783
|
+
expect(conversation.isProcessing()).toBe(true);
|
|
784
|
+
expect(conversation.hasQueuedMessages()).toBe(false);
|
|
785
|
+
expect(conversation.canHandoffAtCheckpoint()).toBe(false);
|
|
774
786
|
|
|
775
787
|
// Cleanup
|
|
776
788
|
resolveRun(0);
|
|
@@ -778,19 +790,19 @@ describe("Session queue policy helpers", () => {
|
|
|
778
790
|
});
|
|
779
791
|
|
|
780
792
|
test("canHandoffAtCheckpoint() returns true when processing and queue has messages", async () => {
|
|
781
|
-
const
|
|
782
|
-
await
|
|
793
|
+
const conversation = makeConversation();
|
|
794
|
+
await conversation.loadFromDb();
|
|
783
795
|
|
|
784
796
|
// Start processing
|
|
785
|
-
|
|
797
|
+
conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
786
798
|
await waitForPendingRun(1);
|
|
787
799
|
|
|
788
800
|
// Enqueue a message
|
|
789
|
-
|
|
801
|
+
conversation.enqueueMessage("msg-2", [], () => {}, "req-2");
|
|
790
802
|
|
|
791
|
-
expect(
|
|
792
|
-
expect(
|
|
793
|
-
expect(
|
|
803
|
+
expect(conversation.isProcessing()).toBe(true);
|
|
804
|
+
expect(conversation.hasQueuedMessages()).toBe(true);
|
|
805
|
+
expect(conversation.canHandoffAtCheckpoint()).toBe(true);
|
|
794
806
|
|
|
795
807
|
// Cleanup
|
|
796
808
|
resolveRun(0);
|
|
@@ -821,19 +833,19 @@ describe("Session queue policy helpers", () => {
|
|
|
821
833
|
// Checkpoint handoff tests
|
|
822
834
|
// ---------------------------------------------------------------------------
|
|
823
835
|
|
|
824
|
-
describe("
|
|
836
|
+
describe("Conversation checkpoint handoff", () => {
|
|
825
837
|
beforeEach(() => {
|
|
826
838
|
pendingRuns = [];
|
|
827
839
|
});
|
|
828
840
|
|
|
829
841
|
test("[experimental] onCheckpoint yields when there is a queued message", async () => {
|
|
830
|
-
const
|
|
831
|
-
await
|
|
842
|
+
const conversation = makeConversation();
|
|
843
|
+
await conversation.loadFromDb();
|
|
832
844
|
|
|
833
845
|
const events1: ServerMessage[] = [];
|
|
834
846
|
|
|
835
847
|
// Start processing first message
|
|
836
|
-
const p1 =
|
|
848
|
+
const p1 = conversation.processMessage(
|
|
837
849
|
"msg-1",
|
|
838
850
|
[],
|
|
839
851
|
(e) => events1.push(e),
|
|
@@ -842,8 +854,8 @@ describe("Session checkpoint handoff", () => {
|
|
|
842
854
|
await waitForPendingRun(1);
|
|
843
855
|
|
|
844
856
|
// Enqueue a second message while the first is processing
|
|
845
|
-
|
|
846
|
-
expect(
|
|
857
|
+
conversation.enqueueMessage("msg-2", [], () => {}, "req-2");
|
|
858
|
+
expect(conversation.hasQueuedMessages()).toBe(true);
|
|
847
859
|
|
|
848
860
|
// The pending run should have received an onCheckpoint callback.
|
|
849
861
|
// Simulate the agent loop calling it at a turn boundary.
|
|
@@ -859,7 +871,7 @@ describe("Session checkpoint handoff", () => {
|
|
|
859
871
|
// Because there is a queued message, the callback should return 'yield'
|
|
860
872
|
expect(decision).toBe("yield");
|
|
861
873
|
|
|
862
|
-
// Complete the run so the
|
|
874
|
+
// Complete the run so the conversation finishes cleanly
|
|
863
875
|
resolveRun(0);
|
|
864
876
|
await p1;
|
|
865
877
|
|
|
@@ -868,7 +880,7 @@ describe("Session checkpoint handoff", () => {
|
|
|
868
880
|
expect(handoff).toBeDefined();
|
|
869
881
|
expect(handoff).toMatchObject({
|
|
870
882
|
type: "generation_handoff",
|
|
871
|
-
|
|
883
|
+
conversationId: "conv-1",
|
|
872
884
|
requestId: "req-1",
|
|
873
885
|
queuedCount: 1,
|
|
874
886
|
});
|
|
@@ -880,14 +892,14 @@ describe("Session checkpoint handoff", () => {
|
|
|
880
892
|
});
|
|
881
893
|
|
|
882
894
|
test("onCheckpoint returns continue when queue is empty", async () => {
|
|
883
|
-
const
|
|
884
|
-
await
|
|
895
|
+
const conversation = makeConversation();
|
|
896
|
+
await conversation.loadFromDb();
|
|
885
897
|
|
|
886
898
|
// Start processing — no enqueued messages
|
|
887
|
-
const p1 =
|
|
899
|
+
const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
888
900
|
await waitForPendingRun(1);
|
|
889
901
|
|
|
890
|
-
expect(
|
|
902
|
+
expect(conversation.hasQueuedMessages()).toBe(false);
|
|
891
903
|
|
|
892
904
|
// The pending run should have an onCheckpoint callback
|
|
893
905
|
const run = pendingRuns[0];
|
|
@@ -908,8 +920,8 @@ describe("Session checkpoint handoff", () => {
|
|
|
908
920
|
});
|
|
909
921
|
|
|
910
922
|
test("[experimental] FIFO ordering is preserved through checkpoint handoff", async () => {
|
|
911
|
-
const
|
|
912
|
-
await
|
|
923
|
+
const conversation = makeConversation();
|
|
924
|
+
await conversation.loadFromDb();
|
|
913
925
|
|
|
914
926
|
const processedOrder: string[] = [];
|
|
915
927
|
|
|
@@ -919,7 +931,7 @@ describe("Session checkpoint handoff", () => {
|
|
|
919
931
|
};
|
|
920
932
|
|
|
921
933
|
// Start first message
|
|
922
|
-
const p1 =
|
|
934
|
+
const p1 = conversation.processMessage(
|
|
923
935
|
"msg-1",
|
|
924
936
|
[],
|
|
925
937
|
makeHandler("msg-1"),
|
|
@@ -928,9 +940,9 @@ describe("Session checkpoint handoff", () => {
|
|
|
928
940
|
await waitForPendingRun(1);
|
|
929
941
|
|
|
930
942
|
// Enqueue two messages
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
expect(
|
|
943
|
+
conversation.enqueueMessage("msg-2", [], makeHandler("msg-2"), "req-2");
|
|
944
|
+
conversation.enqueueMessage("msg-3", [], makeHandler("msg-3"), "req-3");
|
|
945
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
934
946
|
|
|
935
947
|
// Simulate the agent loop yielding at the checkpoint (first run)
|
|
936
948
|
const run0 = pendingRuns[0];
|
|
@@ -963,14 +975,14 @@ describe("Session checkpoint handoff", () => {
|
|
|
963
975
|
});
|
|
964
976
|
|
|
965
977
|
test("[experimental] active run with repeated tool turns + queued message triggers checkpoint handoff", async () => {
|
|
966
|
-
const
|
|
967
|
-
await
|
|
978
|
+
const conversation = makeConversation();
|
|
979
|
+
await conversation.loadFromDb();
|
|
968
980
|
|
|
969
981
|
const events1: ServerMessage[] = [];
|
|
970
982
|
const events2: ServerMessage[] = [];
|
|
971
983
|
|
|
972
984
|
// Start processing first message
|
|
973
|
-
const p1 =
|
|
985
|
+
const p1 = conversation.processMessage(
|
|
974
986
|
"msg-1",
|
|
975
987
|
[],
|
|
976
988
|
(e) => events1.push(e),
|
|
@@ -979,8 +991,8 @@ describe("Session checkpoint handoff", () => {
|
|
|
979
991
|
await waitForPendingRun(1);
|
|
980
992
|
|
|
981
993
|
// Enqueue a second message while the first is processing
|
|
982
|
-
|
|
983
|
-
expect(
|
|
994
|
+
conversation.enqueueMessage("msg-2", [], (e) => events2.push(e), "req-2");
|
|
995
|
+
expect(conversation.hasQueuedMessages()).toBe(true);
|
|
984
996
|
|
|
985
997
|
// Simulate tool-use turns: the agent loop calls onCheckpoint at each turn boundary.
|
|
986
998
|
// Because there is a queued message, the callback should return 'yield'.
|
|
@@ -1006,13 +1018,13 @@ describe("Session checkpoint handoff", () => {
|
|
|
1006
1018
|
expect(handoff).toBeDefined();
|
|
1007
1019
|
expect(handoff).toMatchObject({
|
|
1008
1020
|
type: "generation_handoff",
|
|
1009
|
-
|
|
1021
|
+
conversationId: "conv-1",
|
|
1010
1022
|
requestId: "req-1",
|
|
1011
1023
|
queuedCount: 1,
|
|
1012
1024
|
});
|
|
1013
1025
|
// message_complete should NOT be in events1 (handoff replaces it)
|
|
1014
1026
|
const messageComplete = events1.find(
|
|
1015
|
-
(e) => e.type === "message_complete" && "
|
|
1027
|
+
(e) => e.type === "message_complete" && "conversationId" in e,
|
|
1016
1028
|
);
|
|
1017
1029
|
expect(messageComplete).toBeUndefined();
|
|
1018
1030
|
|
|
@@ -1026,8 +1038,8 @@ describe("Session checkpoint handoff", () => {
|
|
|
1026
1038
|
});
|
|
1027
1039
|
|
|
1028
1040
|
test("queued messages still drain FIFO under multiple handoffs", async () => {
|
|
1029
|
-
const
|
|
1030
|
-
await
|
|
1041
|
+
const conversation = makeConversation();
|
|
1042
|
+
await conversation.loadFromDb();
|
|
1031
1043
|
|
|
1032
1044
|
const dequeueOrder: string[] = [];
|
|
1033
1045
|
|
|
@@ -1037,7 +1049,7 @@ describe("Session checkpoint handoff", () => {
|
|
|
1037
1049
|
};
|
|
1038
1050
|
|
|
1039
1051
|
// Start processing message A
|
|
1040
|
-
const pA =
|
|
1052
|
+
const pA = conversation.processMessage(
|
|
1041
1053
|
"msg-A",
|
|
1042
1054
|
[],
|
|
1043
1055
|
(e) => eventsA.push(e),
|
|
@@ -1046,10 +1058,10 @@ describe("Session checkpoint handoff", () => {
|
|
|
1046
1058
|
await waitForPendingRun(1);
|
|
1047
1059
|
|
|
1048
1060
|
// Enqueue messages B, C, D
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
expect(
|
|
1061
|
+
conversation.enqueueMessage("msg-B", [], makeHandler("B"), "req-B");
|
|
1062
|
+
conversation.enqueueMessage("msg-C", [], makeHandler("C"), "req-C");
|
|
1063
|
+
conversation.enqueueMessage("msg-D", [], makeHandler("D"), "req-D");
|
|
1064
|
+
expect(conversation.getQueueDepth()).toBe(3);
|
|
1053
1065
|
|
|
1054
1066
|
// Handoff from A -> B
|
|
1055
1067
|
const runA = pendingRuns[0];
|
|
@@ -1117,15 +1129,15 @@ describe("Session checkpoint handoff", () => {
|
|
|
1117
1129
|
});
|
|
1118
1130
|
|
|
1119
1131
|
test("[experimental] queued persistence failure does not strand later messages", async () => {
|
|
1120
|
-
const
|
|
1121
|
-
await
|
|
1132
|
+
const conversation = makeConversation();
|
|
1133
|
+
await conversation.loadFromDb();
|
|
1122
1134
|
|
|
1123
1135
|
const eventsA: ServerMessage[] = [];
|
|
1124
1136
|
const eventsB: ServerMessage[] = [];
|
|
1125
1137
|
const eventsC: ServerMessage[] = [];
|
|
1126
1138
|
|
|
1127
1139
|
// Start processing message A
|
|
1128
|
-
const pA =
|
|
1140
|
+
const pA = conversation.processMessage(
|
|
1129
1141
|
"msg-A",
|
|
1130
1142
|
[],
|
|
1131
1143
|
(e) => eventsA.push(e),
|
|
@@ -1134,9 +1146,9 @@ describe("Session checkpoint handoff", () => {
|
|
|
1134
1146
|
await waitForPendingRun(1);
|
|
1135
1147
|
|
|
1136
1148
|
// Enqueue B (empty content — will fail to persist) and C (valid)
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
expect(
|
|
1149
|
+
conversation.enqueueMessage("", [], (e) => eventsB.push(e), "req-B");
|
|
1150
|
+
conversation.enqueueMessage("msg-C", [], (e) => eventsC.push(e), "req-C");
|
|
1151
|
+
expect(conversation.getQueueDepth()).toBe(2);
|
|
1140
1152
|
|
|
1141
1153
|
// Complete message A — triggers drain. B should fail, C should proceed.
|
|
1142
1154
|
resolveRun(0);
|
|
@@ -1164,11 +1176,11 @@ describe("Session checkpoint handoff", () => {
|
|
|
1164
1176
|
});
|
|
1165
1177
|
|
|
1166
1178
|
test("onCheckpoint callback is passed to both initial and retry runs", async () => {
|
|
1167
|
-
const
|
|
1168
|
-
await
|
|
1179
|
+
const conversation = makeConversation();
|
|
1180
|
+
await conversation.loadFromDb();
|
|
1169
1181
|
|
|
1170
1182
|
// Start processing
|
|
1171
|
-
const p1 =
|
|
1183
|
+
const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
1172
1184
|
await waitForPendingRun(1);
|
|
1173
1185
|
|
|
1174
1186
|
// The first run should have onCheckpoint
|
|
@@ -1202,17 +1214,17 @@ describe("Session checkpoint handoff", () => {
|
|
|
1202
1214
|
// Usage requestId correlation
|
|
1203
1215
|
// ---------------------------------------------------------------------------
|
|
1204
1216
|
|
|
1205
|
-
describe("
|
|
1217
|
+
describe("Conversation usage requestId correlation", () => {
|
|
1206
1218
|
beforeEach(() => {
|
|
1207
1219
|
pendingRuns = [];
|
|
1208
1220
|
capturedUsageEvents = [];
|
|
1209
1221
|
});
|
|
1210
1222
|
|
|
1211
1223
|
test("usage events recorded during a request carry that request ID", async () => {
|
|
1212
|
-
const
|
|
1213
|
-
await
|
|
1224
|
+
const conversation = makeConversation();
|
|
1225
|
+
await conversation.loadFromDb();
|
|
1214
1226
|
|
|
1215
|
-
const p1 =
|
|
1227
|
+
const p1 = conversation.processMessage("msg-1", [], () => {}, "req-42");
|
|
1216
1228
|
await waitForPendingRun(1);
|
|
1217
1229
|
|
|
1218
1230
|
// Complete the run — this triggers recordUsage with the request's ID
|
|
@@ -1239,19 +1251,19 @@ describe("Terminal trace events on rejection/failure", () => {
|
|
|
1239
1251
|
|
|
1240
1252
|
test("queued persist failure emits request_error trace", async () => {
|
|
1241
1253
|
const traceEvents: ServerMessage[] = [];
|
|
1242
|
-
const
|
|
1254
|
+
const conversation = makeConversation((msg) => {
|
|
1243
1255
|
if ("type" in msg && msg.type === "trace_event") traceEvents.push(msg);
|
|
1244
1256
|
});
|
|
1245
|
-
await
|
|
1257
|
+
await conversation.loadFromDb();
|
|
1246
1258
|
|
|
1247
1259
|
// Start first message
|
|
1248
|
-
const p1 =
|
|
1260
|
+
const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
|
|
1249
1261
|
await waitForPendingRun(1);
|
|
1250
1262
|
|
|
1251
1263
|
// Enqueue empty content (will fail persistUserMessage)
|
|
1252
|
-
|
|
1264
|
+
conversation.enqueueMessage("", [], () => {}, "req-bad");
|
|
1253
1265
|
// Enqueue valid message so drain continues
|
|
1254
|
-
|
|
1266
|
+
conversation.enqueueMessage("msg-3", [], () => {}, "req-3");
|
|
1255
1267
|
|
|
1256
1268
|
// Complete first — triggers drain, empty msg fails persist
|
|
1257
1269
|
resolveRun(0);
|
|
@@ -1278,7 +1290,7 @@ describe("Terminal trace events on rejection/failure", () => {
|
|
|
1278
1290
|
// Host attachment approval tests
|
|
1279
1291
|
// ---------------------------------------------------------------------------
|
|
1280
1292
|
|
|
1281
|
-
describe("
|
|
1293
|
+
describe("Conversation host attachment directives", () => {
|
|
1282
1294
|
beforeEach(() => {
|
|
1283
1295
|
pendingRuns = [];
|
|
1284
1296
|
});
|
|
@@ -1290,10 +1302,10 @@ describe("Session host attachment directives", () => {
|
|
|
1290
1302
|
try {
|
|
1291
1303
|
const clientEvents: ServerMessage[] = [];
|
|
1292
1304
|
const events: ServerMessage[] = [];
|
|
1293
|
-
const
|
|
1294
|
-
await
|
|
1305
|
+
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
1306
|
+
await conversation.loadFromDb();
|
|
1295
1307
|
|
|
1296
|
-
const p1 =
|
|
1308
|
+
const p1 = conversation.processMessage(
|
|
1297
1309
|
"msg-1",
|
|
1298
1310
|
[],
|
|
1299
1311
|
(e) => events.push(e),
|
|
@@ -1328,16 +1340,18 @@ describe("Session host attachment directives", () => {
|
|
|
1328
1340
|
(e) => e.type === "confirmation_request",
|
|
1329
1341
|
);
|
|
1330
1342
|
expect(confirmation).toBeDefined();
|
|
1331
|
-
|
|
1343
|
+
conversation.handleConfirmationResponse(
|
|
1332
1344
|
(confirmation as { requestId: string }).requestId,
|
|
1333
1345
|
"allow",
|
|
1334
1346
|
);
|
|
1335
1347
|
|
|
1336
1348
|
await p1;
|
|
1337
1349
|
|
|
1338
|
-
expect(
|
|
1339
|
-
expect(
|
|
1340
|
-
|
|
1350
|
+
expect(conversation.lastAssistantAttachments).toHaveLength(1);
|
|
1351
|
+
expect(conversation.lastAssistantAttachments[0].sourceType).toBe(
|
|
1352
|
+
"host_file",
|
|
1353
|
+
);
|
|
1354
|
+
expect(conversation.lastAttachmentWarnings).toHaveLength(0);
|
|
1341
1355
|
|
|
1342
1356
|
const completion = events.find((e) => e.type === "message_complete");
|
|
1343
1357
|
expect(completion).toBeDefined();
|
|
@@ -1353,10 +1367,10 @@ describe("Session host attachment directives", () => {
|
|
|
1353
1367
|
try {
|
|
1354
1368
|
const clientEvents: ServerMessage[] = [];
|
|
1355
1369
|
const events: ServerMessage[] = [];
|
|
1356
|
-
const
|
|
1357
|
-
await
|
|
1370
|
+
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
1371
|
+
await conversation.loadFromDb();
|
|
1358
1372
|
|
|
1359
|
-
const p1 =
|
|
1373
|
+
const p1 = conversation.processMessage(
|
|
1360
1374
|
"msg-1",
|
|
1361
1375
|
[],
|
|
1362
1376
|
(e) => events.push(e),
|
|
@@ -1391,16 +1405,16 @@ describe("Session host attachment directives", () => {
|
|
|
1391
1405
|
(e) => e.type === "confirmation_request",
|
|
1392
1406
|
);
|
|
1393
1407
|
expect(confirmation).toBeDefined();
|
|
1394
|
-
|
|
1408
|
+
conversation.handleConfirmationResponse(
|
|
1395
1409
|
(confirmation as { requestId: string }).requestId,
|
|
1396
1410
|
"deny",
|
|
1397
1411
|
);
|
|
1398
1412
|
|
|
1399
1413
|
await p1;
|
|
1400
1414
|
|
|
1401
|
-
expect(
|
|
1415
|
+
expect(conversation.lastAssistantAttachments).toHaveLength(0);
|
|
1402
1416
|
expect(
|
|
1403
|
-
|
|
1417
|
+
conversation.lastAttachmentWarnings.some((w) =>
|
|
1404
1418
|
w.includes("access denied by user"),
|
|
1405
1419
|
),
|
|
1406
1420
|
).toBe(true);
|
|
@@ -1423,17 +1437,17 @@ describe("Session host attachment directives", () => {
|
|
|
1423
1437
|
// Attachment payload emission tests
|
|
1424
1438
|
// ---------------------------------------------------------------------------
|
|
1425
1439
|
|
|
1426
|
-
describe("
|
|
1440
|
+
describe("Conversation attachment event payloads", () => {
|
|
1427
1441
|
beforeEach(() => {
|
|
1428
1442
|
pendingRuns = [];
|
|
1429
1443
|
});
|
|
1430
1444
|
|
|
1431
1445
|
test("message_complete includes assistant attachments", async () => {
|
|
1432
1446
|
const events: ServerMessage[] = [];
|
|
1433
|
-
const
|
|
1434
|
-
await
|
|
1447
|
+
const conversation = makeConversation();
|
|
1448
|
+
await conversation.loadFromDb();
|
|
1435
1449
|
|
|
1436
|
-
const p1 =
|
|
1450
|
+
const p1 = conversation.processMessage(
|
|
1437
1451
|
"msg-1",
|
|
1438
1452
|
[],
|
|
1439
1453
|
(e) => events.push(e),
|
|
@@ -1487,10 +1501,10 @@ describe("Session attachment event payloads", () => {
|
|
|
1487
1501
|
|
|
1488
1502
|
test("generation_handoff includes assistant attachments", async () => {
|
|
1489
1503
|
const events1: ServerMessage[] = [];
|
|
1490
|
-
const
|
|
1491
|
-
await
|
|
1504
|
+
const conversation = makeConversation();
|
|
1505
|
+
await conversation.loadFromDb();
|
|
1492
1506
|
|
|
1493
|
-
const p1 =
|
|
1507
|
+
const p1 = conversation.processMessage(
|
|
1494
1508
|
"msg-1",
|
|
1495
1509
|
[],
|
|
1496
1510
|
(e) => events1.push(e),
|
|
@@ -1499,7 +1513,7 @@ describe("Session attachment event payloads", () => {
|
|
|
1499
1513
|
await waitForPendingRun(1);
|
|
1500
1514
|
|
|
1501
1515
|
// Queue a second message so the first run yields via checkpoint handoff.
|
|
1502
|
-
|
|
1516
|
+
conversation.enqueueMessage("msg-2", [], () => {}, "req-2");
|
|
1503
1517
|
|
|
1504
1518
|
const run = pendingRuns[0];
|
|
1505
1519
|
expect(run.onCheckpoint).toBeDefined();
|
|
@@ -1560,7 +1574,7 @@ describe("Session attachment event payloads", () => {
|
|
|
1560
1574
|
});
|
|
1561
1575
|
|
|
1562
1576
|
// ---------------------------------------------------------------------------
|
|
1563
|
-
// Regression: cancel semantics +
|
|
1577
|
+
// Regression: cancel semantics + conversation/global error channel split
|
|
1564
1578
|
// ---------------------------------------------------------------------------
|
|
1565
1579
|
|
|
1566
1580
|
describe("Regression: cancel semantics and error channel split", () => {
|
|
@@ -1568,13 +1582,13 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1568
1582
|
pendingRuns = [];
|
|
1569
1583
|
});
|
|
1570
1584
|
|
|
1571
|
-
test("user cancellation emits generation_cancelled, never
|
|
1585
|
+
test("user cancellation emits generation_cancelled, never conversation_error", async () => {
|
|
1572
1586
|
const msgEvents: ServerMessage[] = [];
|
|
1573
|
-
const
|
|
1574
|
-
await
|
|
1587
|
+
const conversation = makeConversation();
|
|
1588
|
+
await conversation.loadFromDb();
|
|
1575
1589
|
|
|
1576
1590
|
// Start processing a message — collect events from the per-message callback
|
|
1577
|
-
const p1 =
|
|
1591
|
+
const p1 = conversation.processMessage(
|
|
1578
1592
|
"msg-1",
|
|
1579
1593
|
[],
|
|
1580
1594
|
(e) => msgEvents.push(e),
|
|
@@ -1583,7 +1597,7 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1583
1597
|
await waitForPendingRun(1);
|
|
1584
1598
|
|
|
1585
1599
|
// User cancels — sets the abort signal
|
|
1586
|
-
|
|
1600
|
+
conversation.abort();
|
|
1587
1601
|
|
|
1588
1602
|
// Resolve the pending run so the abort-check path fires
|
|
1589
1603
|
resolveRun(0);
|
|
@@ -1595,18 +1609,20 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1595
1609
|
);
|
|
1596
1610
|
expect(cancelEvent).toBeDefined();
|
|
1597
1611
|
|
|
1598
|
-
//
|
|
1599
|
-
const
|
|
1600
|
-
|
|
1612
|
+
// conversation_error must never appear on cancel
|
|
1613
|
+
const conversationErr = msgEvents.find(
|
|
1614
|
+
(e) => e.type === "conversation_error",
|
|
1615
|
+
);
|
|
1616
|
+
expect(conversationErr).toBeUndefined();
|
|
1601
1617
|
});
|
|
1602
1618
|
|
|
1603
1619
|
test("post-processing failure still attempts turn-boundary commit", async () => {
|
|
1604
1620
|
const events: ServerMessage[] = [];
|
|
1605
|
-
const
|
|
1606
|
-
await
|
|
1621
|
+
const conversation = makeConversation();
|
|
1622
|
+
await conversation.loadFromDb();
|
|
1607
1623
|
linkAttachmentShouldThrow = true;
|
|
1608
1624
|
|
|
1609
|
-
const p1 =
|
|
1625
|
+
const p1 = conversation.processMessage(
|
|
1610
1626
|
"msg-1",
|
|
1611
1627
|
[],
|
|
1612
1628
|
(e) => events.push(e),
|
|
@@ -1644,19 +1660,19 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1644
1660
|
expect(turnCommitCalls).toHaveLength(1);
|
|
1645
1661
|
expect(turnCommitCalls[0]).toEqual({
|
|
1646
1662
|
workspaceDir: "/tmp",
|
|
1647
|
-
|
|
1663
|
+
conversationId: "conv-1",
|
|
1648
1664
|
turnNumber: 1,
|
|
1649
1665
|
});
|
|
1650
1666
|
const err = events.find((e) => e.type === "error");
|
|
1651
1667
|
expect(err).toBeDefined();
|
|
1652
1668
|
});
|
|
1653
1669
|
|
|
1654
|
-
test("provider failure during processing emits both
|
|
1670
|
+
test("provider failure during processing emits both conversation_error and generic error", async () => {
|
|
1655
1671
|
const allEvents: ServerMessage[] = [];
|
|
1656
|
-
const
|
|
1657
|
-
await
|
|
1672
|
+
const conversation = makeConversation();
|
|
1673
|
+
await conversation.loadFromDb();
|
|
1658
1674
|
|
|
1659
|
-
const p1 =
|
|
1675
|
+
const p1 = conversation.processMessage(
|
|
1660
1676
|
"msg-1",
|
|
1661
1677
|
[],
|
|
1662
1678
|
(e) => allEvents.push(e),
|
|
@@ -1668,22 +1684,24 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1668
1684
|
pendingRuns[0].reject(new Error("Connection refused"));
|
|
1669
1685
|
await p1;
|
|
1670
1686
|
|
|
1671
|
-
// Should get
|
|
1672
|
-
const
|
|
1673
|
-
|
|
1687
|
+
// Should get conversation_error (structured)
|
|
1688
|
+
const conversationErr = allEvents.find(
|
|
1689
|
+
(e) => e.type === "conversation_error",
|
|
1690
|
+
);
|
|
1691
|
+
expect(conversationErr).toBeDefined();
|
|
1674
1692
|
|
|
1675
1693
|
// Should also get generic error
|
|
1676
1694
|
const genericErr = allEvents.find((e) => e.type === "error");
|
|
1677
1695
|
expect(genericErr).toBeDefined();
|
|
1678
1696
|
});
|
|
1679
1697
|
|
|
1680
|
-
test("cancel after queued messages produces no
|
|
1681
|
-
const
|
|
1682
|
-
await
|
|
1698
|
+
test("cancel after queued messages produces no conversation_error for any queued entry", async () => {
|
|
1699
|
+
const conversation = makeConversation();
|
|
1700
|
+
await conversation.loadFromDb();
|
|
1683
1701
|
|
|
1684
1702
|
const eventsPerMsg: ServerMessage[][] = [[], [], []];
|
|
1685
1703
|
|
|
1686
|
-
|
|
1704
|
+
conversation.processMessage(
|
|
1687
1705
|
"msg-1",
|
|
1688
1706
|
[],
|
|
1689
1707
|
(e) => eventsPerMsg[0].push(e),
|
|
@@ -1691,40 +1709,53 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1691
1709
|
);
|
|
1692
1710
|
await waitForPendingRun(1);
|
|
1693
1711
|
|
|
1694
|
-
|
|
1712
|
+
conversation.enqueueMessage(
|
|
1695
1713
|
"msg-2",
|
|
1696
1714
|
[],
|
|
1697
1715
|
(e) => eventsPerMsg[1].push(e),
|
|
1698
1716
|
"req-2",
|
|
1699
1717
|
);
|
|
1700
|
-
|
|
1718
|
+
conversation.enqueueMessage(
|
|
1701
1719
|
"msg-3",
|
|
1702
1720
|
[],
|
|
1703
1721
|
(e) => eventsPerMsg[2].push(e),
|
|
1704
1722
|
"req-3",
|
|
1705
1723
|
);
|
|
1706
1724
|
|
|
1707
|
-
|
|
1725
|
+
conversation.abort();
|
|
1708
1726
|
|
|
1709
|
-
// No queued message should have received
|
|
1727
|
+
// No queued message should have received conversation_error
|
|
1710
1728
|
for (const events of eventsPerMsg) {
|
|
1711
|
-
const
|
|
1712
|
-
|
|
1729
|
+
const conversationErr = events.find(
|
|
1730
|
+
(e) => e.type === "conversation_error",
|
|
1731
|
+
);
|
|
1732
|
+
expect(conversationErr).toBeUndefined();
|
|
1713
1733
|
}
|
|
1714
1734
|
});
|
|
1715
1735
|
|
|
1716
1736
|
test("commitTurnChanges never resolving within budget -> turn still completes and drains queue", async () => {
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1737
|
+
// Replace setTimeout with a zero-delay version so the 4000ms
|
|
1738
|
+
// raceWithTimeout fires instantly instead of waiting real time.
|
|
1739
|
+
const origSetTimeout = globalThis.setTimeout;
|
|
1740
|
+
globalThis.setTimeout = ((
|
|
1741
|
+
fn: TimerHandler,
|
|
1742
|
+
_ms?: number,
|
|
1743
|
+
...args: unknown[]
|
|
1744
|
+
) => {
|
|
1745
|
+
return origSetTimeout(fn, 0, ...args);
|
|
1746
|
+
}) as typeof setTimeout;
|
|
1721
1747
|
|
|
1722
1748
|
try {
|
|
1749
|
+
const conversation = makeConversation();
|
|
1750
|
+
await conversation.loadFromDb();
|
|
1751
|
+
|
|
1752
|
+
turnCommitHangForever = true;
|
|
1753
|
+
|
|
1723
1754
|
const events1: ServerMessage[] = [];
|
|
1724
1755
|
const events2: ServerMessage[] = [];
|
|
1725
1756
|
|
|
1726
1757
|
// Start first message (promise intentionally not awaited — we test queue drain behavior)
|
|
1727
|
-
const _p1 =
|
|
1758
|
+
const _p1 = conversation.processMessage(
|
|
1728
1759
|
"msg-1",
|
|
1729
1760
|
[],
|
|
1730
1761
|
(e) => events1.push(e),
|
|
@@ -1733,17 +1764,15 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1733
1764
|
await waitForPendingRun(1);
|
|
1734
1765
|
|
|
1735
1766
|
// Enqueue a second message while the first is processing
|
|
1736
|
-
|
|
1767
|
+
conversation.enqueueMessage("msg-2", [], (e) => events2.push(e), "req-2");
|
|
1737
1768
|
|
|
1738
1769
|
// Complete the first agent loop run
|
|
1739
1770
|
resolveRun(0);
|
|
1740
1771
|
|
|
1741
1772
|
// The turn should still complete (timeout fires) and drain the queue
|
|
1742
1773
|
// even though commitTurnChanges never resolves.
|
|
1743
|
-
//
|
|
1744
|
-
//
|
|
1745
|
-
// We wait for the second run to be registered, which proves the
|
|
1746
|
-
// turn completed and the queue drained despite the hanging commit.
|
|
1774
|
+
// With the zero-delay setTimeout wrapper the 4000ms budget fires
|
|
1775
|
+
// instantly, so we only need a short wait for the second run.
|
|
1747
1776
|
await waitForPendingRun(2, 10_000);
|
|
1748
1777
|
|
|
1749
1778
|
// First message should have completed
|
|
@@ -1760,9 +1789,10 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
1760
1789
|
// Complete the second run so the test can clean up
|
|
1761
1790
|
turnCommitHangForever = false;
|
|
1762
1791
|
resolveRun(1);
|
|
1763
|
-
await new Promise((r) =>
|
|
1792
|
+
await new Promise((r) => origSetTimeout(r, 10));
|
|
1764
1793
|
} finally {
|
|
1765
1794
|
turnCommitHangForever = false;
|
|
1795
|
+
globalThis.setTimeout = origSetTimeout;
|
|
1766
1796
|
}
|
|
1767
1797
|
}, 15_000);
|
|
1768
1798
|
});
|