feat: add optional proxy usage and human model-key quotas (row333)
This commit is contained in:
1 parent
09a847edaa
commit
503b91e561
68 files changed
+4229
-40
No files matched your search
@@ -5816,3 +5816,13 @@ Before: agents can read the library; supporting-path and push-credential depende
|
|||||||
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
|
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
|
||||||
|
|
||||||
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
|
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
|
||||||
|
|
||||||
|
## 2026-10-26 — row333/P5 Mos1961 implementation begins (Codex)
|
||||||
|
|
||||||
|
Base 09a847eda on isolated t3/model-proxy-p5-quota-usage includes landed 362893d04. Accepted scope: human-only per-key quotas and optional value-free usage queue polling; no 657/658/662 work, live proxy/accounts/credentials, broad gates, queue mutation or push. Parent owns independent review and landing. Runtime overlap coordinated with Sage: collector wiring/tick/close at createUsage; Fethry owns launcher/proxy context. Evidence: agents/codex/work/queue-333/BUILD.md.
|
||||||
|
|
||||||
|
## 2026-10-26 — row333/P5 Mos1961 scoped candidate verified (Codex)
|
||||||
|
|
||||||
|
Implemented human-only model-key quota settings and human-only optional usage plugin/poll changes, native per-key accounting with trusted current/retiring run attribution, bounded management queue reads with immediate client/upstream value hashing, append-only telemetry isolated from quota decisions, and proxy-labelled Console numbers. No schema/deadline/role/launcher/harness/session/business-route changes. Parent-authorized additive usage registry inventories retain every old entry/assertion. Original limit-stop exact subject assertion caught an extra-run regression; retained RED18, reported before retry, corrected production through separate internal context without changing that assertion. Further missing-context and supplied-ID bypass tests fail closed.
|
||||||
|
|
||||||
|
Final scoped current whole-file proof: 174/174 PASS across 24 files, serial nice19/private config and tmp roots, unchanged budgets. Upstream-value mutant killed (4 failures), restored byte-identically, positive restoration plus final GREEN. Evidence and 202-input source freeze: agents/codex/work/queue-333/BUILD.md, source-inputs.sha256 and receipts/24-final-current-wholefiles-green.txt. Own scratch cleaned; worktree retained. Parent owns fresh review and admitted combined/full/browser gates under1014.Q264. No queue mutation, remote post, push, merge or landing.
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# row333 P5 implementation — Mos1961
|
||||||
|
|
||||||
|
Base: 09a847eda. Branch: t3/model-proxy-p5-quota-usage. Actor: Codex.
|
||||||
|
Accepted brief: docs/plans/2026-10-24_model-proxy-rows.md P5; associated design D18–D20 with mos-1600 correction.
|
||||||
|
|
||||||
|
Queue next codex refused a linked worktree; no canonical mutation. Parent supplied accepted assignment/authority and coordinated runtime collector ownership. No remote issue posting or live configuration/credential reads.
|
||||||
|
|
||||||
|
Ruling: preserve existing schema by carrying safe modelKeyId in usage cursor metadata; proxy telemetry uses a separate source excluded from turnRecords and every quota check. Existing account limits stay compatible. A model key daily quota is keys.<12-hex-id> with reset/timeZone; unset remains no quota. Human-only protection applies to model-key limit changes and resets. No launcher/session/harness/business route edits.
|
||||||
|
|
||||||
|
Verification uses serial nice19 node tests with private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG and unchanged test budgets. Broad/full gates reserved to parent after row334 target returns. Receipts below are actual command outputs; failures retained.
|
||||||
|
|
||||||
|
Parent steering receipts: runtime ownership confirmed createUsage/createLimits collector wiring/tick/close exclusively P5; Fethry avoids this area. Broker changes only usage option accepted by human plugins.set and mustStop run identity. No launch/harness/session/business-route bytes changed.
|
||||||
|
|
||||||
|
Exact additive old expectation update authorized by parent: kinds.test.mjs old five-entry Object.keys(KINDS) expected array retains all five in their original order and adds usage. loader.test.mjs complete loaded() expected objects retain all original members and add usage:[]. No old assertion was removed, guard relaxed, timeout increased or sleep added.
|
||||||
|
|
||||||
|
First RED receipts: 01-token-red (native key limit incorrectly allows); 02-contract-red (daily key quota, key schema and HTTP method absent); 04-integration-red (new collector absent; native attribution and plugins.set config missing); 08-edges-red (lookup fails open, nonhuman usage writer allowed, Console labels absent); 10-lookup-behavior-red (existing runtime lookup extracted unchanged: missing exception for missing/foreign/ambiguous ownership). 09 captured the preceding missing export, not behavior proof. 05 captured duplicate local variable syntax error, fixed before 06. Runtime fixture failures 12/13 were missing required process identity then incorrect cap extraction; corrected fixture follows actual runtime contract. 14 proves actual model-key issue/preflight, native accounting at key quota, stopping, later launch denial and broker human plugin setting path.
|
||||||
|
|
||||||
|
Unexpected existing named failure (reported to parent before any rerun): receipt18 was 169/170, failing `REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check` at limit-stop.test.mjs:61. Cause: additional run in the broker's second mustStop argument violated its existing exact subject contract. Fix keeps that argument unchanged; run moves to a separate internal third context and is consumed by host lookup only. The old assertion remains byte-for-byte unchanged. Correction to initial parent message: the quoted name here is the exact failing test name (the first report paraphrased it).
|
||||||
|
|
||||||
|
Scoped receipt19: original contract corrected, 170/170 current whole-file tests GREEN. Parent then required direct native-context/no-bypass regression: receipt20 genuinely RED (`stop:false` on a supplied safe-looking modelKeyId when lookup returned null). Removed that fallback entirely and stripped caller modelKeyId/run from the public check subject. Only trusted host resolver can provide the ID; only the separate third internal context provides run. Receipt21: direct context tests, original unmodified limit-stop file and proxy telemetry whole files 15/15 GREEN. Retiring/current mapping rejects wrong business/instance/run and unknown or ambiguous retained IDs.
|
||||||
|
|
||||||
|
Final implementation decisions and evidence:
|
||||||
|
|
||||||
|
- Native source records carry only the immutable run modelKeyId. New and retained generations resolve from safe Credentials.status metadata; missing, duplicate, foreign or no-longer-retained mappings fail `proxy-key-refused`. Third mustStop context is internal and associated by the broker from its authenticated session, never an agent argument. Missing context is fail-closed (receipt23 genuine RED `stop:false`, fixed in receipt24).
|
||||||
|
- `tokens.keys.<12hex>` accepts the daily quota shape, uses daily-quota when reset/timeZone are present, and remains unset by default. Existing named account keys and account daily quotas retain their plugins and contracts. All model-key quota/reset changes and usage module/poll changes are fenced at both organization validation points for every writer, tester included.
|
||||||
|
- Management queue HTTP GET is fixed to loopback with count=100, original 5-second default and 8 MiB response cap, no retries/redirects. Client api_key and upstream source hash immediately to the first 12 SHA-256 hex characters. Fields are whitelisted; malformed batches are atomic. No raw values, upstream body or arbitrary error text reaches product store/log/view/audit.
|
||||||
|
- Exactly one bus writer owns the collector, shares one management client, drains once and assigns metadata owners, including retained keys. Unknown msk IDs get reconcile receipts; disabled businesses and foreign unmanaged keys get no telemetry. Polling defaults 15 seconds, accepts integer 1..59 and serializes concurrent ticks. `@proxy/cliproxy-queue` records are append-only but excluded before every native turn record/total/limit decision. Availability and account counts are explicitly proxy-reported in the Console.
|
||||||
|
- Named upstream-value mutant changed `accountId: sha256(event.source).slice(0,12)` to the raw `event.source`: receipt16 exit1, four tests failed. Restoration matched original client SHA256 f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441, receipt17 positive 15/15. Final receipt24 also runs after restoration and is GREEN.
|
||||||
|
- Final current whole-file verification: `bash agents/codex/work/queue-333/verify-scoped.sh` → 174/174 PASS, 24 explicitly listed whole files, serial nice19, private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG, original test budgets. Raw output: receipts/24-final-current-wholefiles-green.txt SHA256 3358af061c35d42b00d5ee1e001939534c5e7563d4f5418ea85431605d0b9f6d. Runner SHA256 c8a2bf4539bffe38f3198308fd60e9c1ad338841b406af160ab0739c15394290.
|
||||||
|
- Source freeze: source-inputs.sha256 enumerates all 202 consumed repository inputs (182 modules/scripts plus 20 schema/PIN/other files), traced on final execution and rehashed unchanged after it. Manifest SHA256 b4662dcafb2aeb27a06e5dbd3b9d0b6d184e8624e344fed351ff20e3b255951b. Raw per-process trace is receipts/source-inputs.raw.jsonl. candidate-sourcepaths.txt and candidate-sourcehashes.sha256 list every changed package file for parent combination; receipts.sha256 covers every raw run and source trace. Runner/trace use no content logging.
|
||||||
|
- Cleanup: original private mktemp root removed and absence verified; scoped runner EXIT trap removes its separate private root. All fixture servers/stores close through test cleanup. Mutant backup and temporary root marker removed. Isolated worktree retained for parent review; no production process, real proxy, account, config, credential path or provider was contacted.
|
||||||
|
|
||||||
|
Limits and handoff: scoped GREEN is not the full landing gate. No package/full gates, Chromium/browser gates, acceptance binary, canonical queue mutation, remote issue post, push, merge or landing was run. Full/browser/combined gates remain with the parent under 1014.Q264 after admission; fresh independent Codex review is the parent's next task. No self-approval is claimed. Base remains 09a847eda and no unlanded662/657/658 feature bytes were imported.
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
packages/bus/src/broker.mjs: OK
|
||||||
|
packages/bus/src/limits.mjs: OK
|
||||||
|
packages/bus/src/proxy-usage.mjs: OK
|
||||||
|
packages/bus/src/runtime.mjs: OK
|
||||||
|
packages/bus/src/usage.mjs: OK
|
||||||
|
packages/bus/tests/limit-checks.test.mjs: OK
|
||||||
|
packages/bus/tests/p5-key-context.test.mjs: OK
|
||||||
|
packages/bus/tests/p5-runtime.test.mjs: OK
|
||||||
|
packages/bus/tests/proxy-usage.test.mjs: OK
|
||||||
|
packages/bus/tests/usage.test.mjs: OK
|
||||||
|
packages/business/src/business.mjs: OK
|
||||||
|
packages/business/src/launch.mjs: OK
|
||||||
|
packages/business/src/organization.mjs: OK
|
||||||
|
packages/business/src/plugin-settings.mjs: OK
|
||||||
|
packages/business/tests/plugin-settings.test.mjs: OK
|
||||||
|
packages/business/tests/token-limit-settings.test.mjs: OK
|
||||||
|
packages/model-proxy/README.md: OK
|
||||||
|
packages/model-proxy/src/client.mjs: OK
|
||||||
|
packages/model-proxy/tests/usage-client.test.mjs: OK
|
||||||
|
packages/plugins/README.md: OK
|
||||||
|
packages/plugins/limit-check/daily-quota/index.mjs: OK
|
||||||
|
packages/plugins/limit-check/token-limit/index.mjs: OK
|
||||||
|
packages/plugins/src/kinds.mjs: OK
|
||||||
|
packages/plugins/tests/daily-quota.test.mjs: OK
|
||||||
|
packages/plugins/tests/kinds.test.mjs: OK
|
||||||
|
packages/plugins/tests/loader.test.mjs: OK
|
||||||
|
packages/plugins/tests/token-limit.test.mjs: OK
|
||||||
|
packages/plugins/usage/cliproxy-queue/README.md: OK
|
||||||
|
packages/plugins/usage/cliproxy-queue/index.mjs: OK
|
||||||
|
packages/webui/src/public/bus.js: OK
|
||||||
|
packages/webui/tests/usage-render.test.mjs: OK
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5 packages/bus/src/broker.mjs
|
||||||
|
18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3 packages/bus/src/limits.mjs
|
||||||
|
5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59 packages/bus/src/proxy-usage.mjs
|
||||||
|
969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6 packages/bus/src/runtime.mjs
|
||||||
|
4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29 packages/bus/src/usage.mjs
|
||||||
|
45870a4903d1996915c0086a6beb4d0a4c75b38386b7c5e6d98b5bc811c3b541 packages/bus/tests/limit-checks.test.mjs
|
||||||
|
e37114eab9c5f21015ea8e429f0574d3ea34b06263f1e42b83b31b8d2df222a7 packages/bus/tests/p5-key-context.test.mjs
|
||||||
|
241e779016ffd0b54c5646cb4fac7e21ea1167e77afbd652ff4e01f8d238f99c packages/bus/tests/p5-runtime.test.mjs
|
||||||
|
84c8351029272b6ee05e7fd81b4cc4453553ceeb7a5127a1333dae63d1336ad5 packages/bus/tests/proxy-usage.test.mjs
|
||||||
|
2613ba0561572a7d4f753066922fddc90cca812cb0ce2b3e0a9a4d249a15e340 packages/bus/tests/usage.test.mjs
|
||||||
|
aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9 packages/business/src/business.mjs
|
||||||
|
0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c packages/business/src/launch.mjs
|
||||||
|
fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7 packages/business/src/organization.mjs
|
||||||
|
9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50 packages/business/src/plugin-settings.mjs
|
||||||
|
f0dfe004905dce31317d85d89a05802db878c3472e765e85dc9f1e04166e1df6 packages/business/tests/plugin-settings.test.mjs
|
||||||
|
bc6b3a31e8918d70aced7151b91ac4b39afec4081054024b162acb0e8f8fae07 packages/business/tests/token-limit-settings.test.mjs
|
||||||
|
2e97ddcf7deac43002f60c44571056273ddffd4aa0ed0d86f15f550d958a106e packages/model-proxy/README.md
|
||||||
|
f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441 packages/model-proxy/src/client.mjs
|
||||||
|
1ad66d56800a31cfbd387939e640653bc72150f4e73822d9e3c777b3bffbf1e1 packages/model-proxy/tests/usage-client.test.mjs
|
||||||
|
d54d94604d2f8944292fd5a11be8378afc84c06fb6a04137221bfe1a89c5389c packages/plugins/README.md
|
||||||
|
3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b packages/plugins/limit-check/daily-quota/index.mjs
|
||||||
|
4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524 packages/plugins/limit-check/token-limit/index.mjs
|
||||||
|
eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78 packages/plugins/src/kinds.mjs
|
||||||
|
3d4fab56fea4c45c6a317ef41121aa5b6da0502a6ef614b7931f91cafdfc1f71 packages/plugins/tests/daily-quota.test.mjs
|
||||||
|
f3081e1dbdac20ade2246c743bcbb3934be686f79f378af21c365cd1451893ba packages/plugins/tests/kinds.test.mjs
|
||||||
|
8588ad7eee0c9ce5de3b53e3b88562812a155a3d791a2bd3413bb1754655d78b packages/plugins/tests/loader.test.mjs
|
||||||
|
6e96bb96278ec754ca1816a24f49ef677771615ab5cf186ae41969fc2f93d8cc packages/plugins/tests/token-limit.test.mjs
|
||||||
|
e9deb2504741f45645cd52ea6a1daee031cd2d3d44775a1221e76cec73c6b480 packages/plugins/usage/cliproxy-queue/README.md
|
||||||
|
6096a577cd5d7e8bf84fd6b98ab284e2f47d5facebd027548e07e6aeec442f96 packages/plugins/usage/cliproxy-queue/index.mjs
|
||||||
|
3c7a35e25b4c1cfda19ac9466d4b2fbc86c880761a1d04ad3ece8bc485f60f93 packages/webui/src/public/bus.js
|
||||||
|
39f50991578b98594183390a00efbca84fda90ef61617eea4215e2c75f90b82c packages/webui/tests/usage-render.test.mjs
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
packages/bus/src/broker.mjs
|
||||||
|
packages/bus/src/limits.mjs
|
||||||
|
packages/bus/src/proxy-usage.mjs
|
||||||
|
packages/bus/src/runtime.mjs
|
||||||
|
packages/bus/src/usage.mjs
|
||||||
|
packages/bus/tests/limit-checks.test.mjs
|
||||||
|
packages/bus/tests/p5-key-context.test.mjs
|
||||||
|
packages/bus/tests/p5-runtime.test.mjs
|
||||||
|
packages/bus/tests/proxy-usage.test.mjs
|
||||||
|
packages/bus/tests/usage.test.mjs
|
||||||
|
packages/business/src/business.mjs
|
||||||
|
packages/business/src/launch.mjs
|
||||||
|
packages/business/src/organization.mjs
|
||||||
|
packages/business/src/plugin-settings.mjs
|
||||||
|
packages/business/tests/plugin-settings.test.mjs
|
||||||
|
packages/business/tests/token-limit-settings.test.mjs
|
||||||
|
packages/model-proxy/README.md
|
||||||
|
packages/model-proxy/src/client.mjs
|
||||||
|
packages/model-proxy/tests/usage-client.test.mjs
|
||||||
|
packages/plugins/README.md
|
||||||
|
packages/plugins/limit-check/daily-quota/index.mjs
|
||||||
|
packages/plugins/limit-check/token-limit/index.mjs
|
||||||
|
packages/plugins/src/kinds.mjs
|
||||||
|
packages/plugins/tests/daily-quota.test.mjs
|
||||||
|
packages/plugins/tests/kinds.test.mjs
|
||||||
|
packages/plugins/tests/loader.test.mjs
|
||||||
|
packages/plugins/tests/token-limit.test.mjs
|
||||||
|
packages/plugins/usage/cliproxy-queue/README.md
|
||||||
|
packages/plugins/usage/cliproxy-queue/index.mjs
|
||||||
|
packages/webui/src/public/bus.js
|
||||||
|
packages/webui/tests/usage-render.test.mjs
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
agents/codex/work/queue-333/receipts/01-token-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/02-contract-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/03-core-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/04-integration-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/05-collector-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/06-collector-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/07-wiring-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/08-edges-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/09-lookup-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/10-lookup-behavior-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/11-edges-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/12-runtime.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/13-runtime.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/14-runtime.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/15-safety-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/16-upstream-value-mutant.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/17-mutant-restored-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/18-current-wholefiles.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/19-current-wholefiles-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/20-context-bypass-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/21-context-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/22-final-current-wholefiles-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/23-missing-context-red.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/24-final-current-wholefiles-green.txt: OK
|
||||||
|
agents/codex/work/queue-333/receipts/source-inputs.raw.jsonl: OK
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
83116bee02980cd12f66b9db2db0dfe4add8c1d2a19b7de3a3b05c18b0cec8cd agents/codex/work/queue-333/receipts/01-token-red.txt
|
||||||
|
0f21d268ed7777bcfc0290160f30016932f0f3580d9174daf84158833e693e0f agents/codex/work/queue-333/receipts/02-contract-red.txt
|
||||||
|
9aa1d4feb1924ac45c8fa9af14714aa8c89ef6ba7d711884f415c6473ffe20af agents/codex/work/queue-333/receipts/03-core-green.txt
|
||||||
|
11ed664ff680750630dd861bc60cc2cc47cba77575cb63e64001e3271162c33a agents/codex/work/queue-333/receipts/04-integration-red.txt
|
||||||
|
818e3654c49d95ac81200676c46ebecc8155b101352e4e34ed8907a6b4bd93db agents/codex/work/queue-333/receipts/05-collector-green.txt
|
||||||
|
304d137843363f96eb9b0bfef8a570b5d2c3ee53fc66da4ebb5e18a571f71fce agents/codex/work/queue-333/receipts/06-collector-green.txt
|
||||||
|
6bb1254ff078de90dac8503c326422180c5c40df7be6aea569ce6f41cf136a49 agents/codex/work/queue-333/receipts/07-wiring-green.txt
|
||||||
|
0fe51fde4f88bf85d049b26ebfd3048fbc15db3e6785d14f45b987256744def8 agents/codex/work/queue-333/receipts/08-edges-red.txt
|
||||||
|
e47bc241fe8bfcc8a84e64a274d51383f143b16b95fe5ffaf3fa5ec5030b5d2c agents/codex/work/queue-333/receipts/09-lookup-red.txt
|
||||||
|
688dff5c657bfb58c8a4125cbfb4decdb62633d0e1be9b2579dea2d2619db009 agents/codex/work/queue-333/receipts/10-lookup-behavior-red.txt
|
||||||
|
58ac0ed96465af6571b899402e47dc3cd76f420873975e0ca8df091184c9f322 agents/codex/work/queue-333/receipts/11-edges-green.txt
|
||||||
|
f3be41efca8f65dbf5a69b2ad5541d090db7f1f084b7d95eca5192cf07fcf0b2 agents/codex/work/queue-333/receipts/12-runtime.txt
|
||||||
|
9aefb96aa52e8baf033eebf14226c74db255b6047f9fd0a46d5bc20b2b75d04e agents/codex/work/queue-333/receipts/13-runtime.txt
|
||||||
|
9331e56310edd0a8d31807d9f0b7c1092188eb75be44e0c001f001a751b55654 agents/codex/work/queue-333/receipts/14-runtime.txt
|
||||||
|
d138c2fa4c79ed4bed64fec95c08ec706e092766d5d74c421a26206d7d844ded agents/codex/work/queue-333/receipts/15-safety-green.txt
|
||||||
|
10a1ad5d5eecfcdef684f35e861fa2903c2598008ce18b05fb56d2d5460f6fa0 agents/codex/work/queue-333/receipts/16-upstream-value-mutant.txt
|
||||||
|
25f57b7482a0110a8be18e233e2b216b2d99ea826359d60bf1c72c075da036de agents/codex/work/queue-333/receipts/17-mutant-restored-green.txt
|
||||||
|
aefa2196d51cf0e957bdf03b769757d27a174bd163627c72aa8c8eb2c47a21da agents/codex/work/queue-333/receipts/18-current-wholefiles.txt
|
||||||
|
31357c2a88cc3a70ed9fa4b79a43715b34493d9abbb816029f6a8ffac72f4db5 agents/codex/work/queue-333/receipts/19-current-wholefiles-green.txt
|
||||||
|
4fbae7204515aac046c7b782df18c5fba937fdfc536527740ffeffffe0f59226 agents/codex/work/queue-333/receipts/20-context-bypass-red.txt
|
||||||
|
764db5e9b464d6b070720977c0a62edbd4e9329ca918cedc1ee69419da96d47d agents/codex/work/queue-333/receipts/21-context-green.txt
|
||||||
|
5d45ed8ea8e79e91c4b41a59239824ef05cfa924a55b3cc6fb163120027ed441 agents/codex/work/queue-333/receipts/22-final-current-wholefiles-green.txt
|
||||||
|
f6928aae72409ec0e8b13da469c5a957ebc8f6ae1911dfeec8c681359fc4b429 agents/codex/work/queue-333/receipts/23-missing-context-red.txt
|
||||||
|
3358af061c35d42b00d5ee1e001939534c5e7563d4f5418ea85431605d0b9f6d agents/codex/work/queue-333/receipts/24-final-current-wholefiles-green.txt
|
||||||
|
9c16aa4b8e6d81aa5b9867fec5e0890b22e90db5c307da55badfcfa9f240aef1 agents/codex/work/queue-333/receipts/source-inputs.raw.jsonl
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (3.955474ms)
|
||||||
|
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.336324ms)
|
||||||
|
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.329981ms)
|
||||||
|
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.256881ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.171382ms)
|
||||||
|
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.142272ms)
|
||||||
|
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.184471ms)
|
||||||
|
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.143936ms)
|
||||||
|
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.65868ms)
|
||||||
|
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.216805ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.16854ms)
|
||||||
|
✖ P5 a model key ID limit counts stack records by key ID without an account (0.661965ms)
|
||||||
|
ℹ tests 12
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 11
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 51.890649
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/plugins/tests/token-limit.test.mjs:153:1
|
||||||
|
✖ P5 a model key ID limit counts stack records by key ID without an account (0.661965ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
|
||||||
|
true !== false
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/plugins/tests/token-limit.test.mjs:158:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: true,
|
||||||
|
expected: false,
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (18.6933ms)
|
||||||
|
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (266.957706ms)
|
||||||
|
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (259.927876ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (136.121744ms)
|
||||||
|
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (27.149735ms)
|
||||||
|
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (147.184856ms)
|
||||||
|
✖ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (2.663205ms)
|
||||||
|
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (7.314165ms)
|
||||||
|
✖ P5 bad envelope refuses safely with no retry (1.407651ms)
|
||||||
|
✖ P5 over count refuses safely with no retry (0.970003ms)
|
||||||
|
✖ P5 missing key refuses safely with no retry (0.457173ms)
|
||||||
|
✖ P5 bad counts refuses safely with no retry (0.970914ms)
|
||||||
|
✖ P5 redirect refuses safely with no retry (0.566467ms)
|
||||||
|
✖ P5 refusal refuses safely with no retry (0.492518ms)
|
||||||
|
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (4.119781ms)
|
||||||
|
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.801692ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.304042ms)
|
||||||
|
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.440258ms)
|
||||||
|
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.636362ms)
|
||||||
|
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.3629ms)
|
||||||
|
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.307097ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (1.317847ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.410965ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.040865ms)
|
||||||
|
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.338405ms)
|
||||||
|
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.143241ms)
|
||||||
|
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.174843ms)
|
||||||
|
✖ P5 daily quota for a model key ID matches stack key records and resets the next day (0.717346ms)
|
||||||
|
ℹ tests 28
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 19
|
||||||
|
ℹ fail 9
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1055.443581
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/business/tests/token-limit-settings.test.mjs:154:1
|
||||||
|
✖ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (2.663205ms)
|
||||||
|
Error [BusinessError]: unsupported /tmp/mosaic-row333-4L4S3o/tmp/mosaic-business-CbuiLR/businesses/acme.json launch.limits.tokens.keys.012345abcdef key: "reset"
|
||||||
|
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/errors.mjs:12:9)
|
||||||
|
at rejectUnknownKeys (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/util.mjs:17:33)
|
||||||
|
at tokenLimit (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:31:3)
|
||||||
|
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:57:80
|
||||||
|
at Array.map (<anonymous>)
|
||||||
|
at tokenMap (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:57:51)
|
||||||
|
at checkTokenLimits (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:71:48)
|
||||||
|
at checkLimits (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:112:52)
|
||||||
|
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/business.mjs:196:16)
|
||||||
|
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/business.mjs:310:57) {
|
||||||
|
exitCode: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:21:1
|
||||||
|
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (7.314165ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:23:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
|
||||||
|
✖ P5 bad envelope refuses safely with no retry (1.407651ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
|
||||||
|
✖ P5 over count refuses safely with no retry (0.970003ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
|
||||||
|
✖ P5 missing key refuses safely with no retry (0.457173ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
|
||||||
|
✖ P5 bad counts refuses safely with no retry (0.970914ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
|
||||||
|
✖ P5 redirect refuses safely with no retry (0.566467ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
|
||||||
|
✖ P5 refusal refuses safely with no retry (0.492518ms)
|
||||||
|
TypeError: f.client.readUsageQueue is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/plugins/tests/daily-quota.test.mjs:173:1
|
||||||
|
✖ P5 daily quota for a model key ID matches stack key records and resets the next day (0.717346ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||||
|
|
||||||
|
true !== false
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/plugins/tests/daily-quota.test.mjs:178:10)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: true,
|
||||||
|
expected: false,
|
||||||
|
operator: 'strictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (12.739299ms)
|
||||||
|
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (233.858718ms)
|
||||||
|
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (274.692946ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (129.01269ms)
|
||||||
|
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (24.597721ms)
|
||||||
|
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (146.514468ms)
|
||||||
|
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (202.85529ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.363195ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (3.275949ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.650709ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.355454ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (2.028358ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.385706ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (1.027413ms)
|
||||||
|
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (4.002643ms)
|
||||||
|
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.703557ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.285389ms)
|
||||||
|
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.427944ms)
|
||||||
|
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.664291ms)
|
||||||
|
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.359593ms)
|
||||||
|
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.292084ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (1.428363ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.427054ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.066274ms)
|
||||||
|
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.329306ms)
|
||||||
|
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.160938ms)
|
||||||
|
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.172297ms)
|
||||||
|
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.746089ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.156529ms)
|
||||||
|
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.303907ms)
|
||||||
|
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.353216ms)
|
||||||
|
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.2777ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.150391ms)
|
||||||
|
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.1377ms)
|
||||||
|
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.170332ms)
|
||||||
|
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.135122ms)
|
||||||
|
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.635473ms)
|
||||||
|
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.62587ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.130727ms)
|
||||||
|
✔ P5 a model key ID limit counts stack records by key ID without an account (0.11813ms)
|
||||||
|
ℹ tests 40
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 40
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1270.553008
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
node:internal/modules/esm/resolve:272
|
||||||
|
throw new ERR_MODULE_NOT_FOUND(
|
||||||
|
^
|
||||||
|
|
||||||
|
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/proxy-usage.mjs' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs
|
||||||
|
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
|
||||||
|
at moduleResolve (node:internal/modules/esm/resolve:879:10)
|
||||||
|
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
|
||||||
|
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
|
||||||
|
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
|
||||||
|
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
|
||||||
|
at #resolve (node:internal/modules/esm/loader:690:17)
|
||||||
|
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
|
||||||
|
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
|
||||||
|
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
|
||||||
|
code: 'ERR_MODULE_NOT_FOUND',
|
||||||
|
url: 'file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/proxy-usage.mjs'
|
||||||
|
}
|
||||||
|
|
||||||
|
Node.js v26.8.1
|
||||||
|
✖ packages/bus/tests/proxy-usage.test.mjs (51.269919ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (51.514952ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (50.36014ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (46.155638ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.267126ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.725198ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (45.864606ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (40.628929ms)
|
||||||
|
✔ usage records are append-only (40.809636ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (46.321713ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (56.488827ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (45.994492ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (46.867774ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (55.909721ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (72.188479ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (47.882475ms)
|
||||||
|
✖ P5 immutable stack key attribution survives rotation and restart without key values (46.501339ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (10.169709ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (136.187046ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (158.840283ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.730784ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (19.213042ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.512701ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (56.368217ms)
|
||||||
|
✖ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (1.972898ms)
|
||||||
|
ℹ tests 25
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 22
|
||||||
|
ℹ fail 3
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1344.122542
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/proxy-usage.test.mjs:1:1
|
||||||
|
✖ packages/bus/tests/proxy-usage.test.mjs (51.269919ms)
|
||||||
|
'test failed'
|
||||||
|
|
||||||
|
test at packages/bus/tests/usage.test.mjs:157:1
|
||||||
|
✖ P5 immutable stack key attribution survives rotation and restart without key values (46.501339ms)
|
||||||
|
TypeError: Cannot read properties of undefined (reading '0')
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/usage.test.mjs:162:39)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/business/tests/plugin-settings.test.mjs:148:1
|
||||||
|
✖ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (1.972898ms)
|
||||||
|
Error: invalid-request
|
||||||
|
at Object.set (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/plugin-settings.mjs:22:13)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/tests/plugin-settings.test.mjs:150:15)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
code: 'invalid-request'
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/limits.mjs:126
|
||||||
|
const key = keyForSubject(business, subject);
|
||||||
|
^
|
||||||
|
|
||||||
|
SyntaxError: Identifier 'key' has already been declared
|
||||||
|
at compileSourceTextModule (node:internal/modules/esm/utils:355:16)
|
||||||
|
at ModuleLoader.moduleStrategy (node:internal/modules/esm/translators:93:18)
|
||||||
|
at #translate (node:internal/modules/esm/loader:441:20)
|
||||||
|
at afterLoad (node:internal/modules/esm/loader:509:29)
|
||||||
|
at ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:514:12)
|
||||||
|
at #getOrCreateModuleJobAfterResolve (node:internal/modules/esm/loader:567:36)
|
||||||
|
at afterResolve (node:internal/modules/esm/loader:614:52)
|
||||||
|
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:620:12)
|
||||||
|
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
|
||||||
|
at ModuleJob.link (node:internal/modules/esm/module_job:389:17)
|
||||||
|
|
||||||
|
Node.js v26.8.1
|
||||||
|
✖ packages/bus/tests/proxy-usage.test.mjs (51.892872ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (50.378772ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (45.234905ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (44.712639ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (38.834227ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.613047ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (61.823662ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (39.178221ms)
|
||||||
|
✔ usage records are append-only (48.911454ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (44.798699ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (74.440531ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (44.272941ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (45.321015ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (50.132554ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (45.271975ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (45.784161ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (46.660026ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.948537ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (133.831911ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (204.184755ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.716312ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.420971ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.601618ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (51.983097ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (99.930829ms)
|
||||||
|
ℹ tests 25
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 24
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1470.74285
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/proxy-usage.test.mjs:1:1
|
||||||
|
✖ packages/bus/tests/proxy-usage.test.mjs (51.892872ms)
|
||||||
|
'test failed'
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (65.214926ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (52.537861ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (41.558814ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (41.087812ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (47.727536ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (50.881627ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (45.298282ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (44.997351ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (39.610461ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.405893ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (45.836002ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (40.248661ms)
|
||||||
|
✔ usage records are append-only (40.155769ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (45.604899ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (55.889033ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (44.53629ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (45.80935ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (54.81715ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (46.31434ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (46.570895ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (47.523777ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.987571ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (141.127286ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (184.625638ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.650477ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (22.208259ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.619398ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (53.382155ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (100.346538ms)
|
||||||
|
ℹ tests 29
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 29
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1701.08968
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"0f9af1a6-ff5d-4a03-8deb-ee3d9ff7a587","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max","run":"run1"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"139909cd-89c9-47ab-8924-fef1d9125ebc","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (160.313054ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (141.082402ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (118.409041ms)
|
||||||
|
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (60.812376ms)
|
||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (67.249055ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (48.031566ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (46.042815ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (41.173899ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (52.566146ms)
|
||||||
|
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (131.491274ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (52.546321ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (47.077487ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (46.271817ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.225039ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.02419ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (47.584801ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (40.815955ms)
|
||||||
|
✔ usage records are append-only (41.122845ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (45.862091ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (57.327879ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (47.939521ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (46.384741ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (98.373431ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (46.863279ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (47.359644ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (51.503418ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.131497ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.214135ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.919785ms)
|
||||||
|
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.136387ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.149287ms)
|
||||||
|
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.136962ms)
|
||||||
|
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (8.544145ms)
|
||||||
|
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.570635ms)
|
||||||
|
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.394552ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.605144ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.314239ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (30.160706ms)
|
||||||
|
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.027836ms)
|
||||||
|
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.75119ms)
|
||||||
|
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.412894ms)
|
||||||
|
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.793659ms)
|
||||||
|
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.303983ms)
|
||||||
|
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.5092ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.97048ms)
|
||||||
|
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.870072ms)
|
||||||
|
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.648634ms)
|
||||||
|
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.357607ms)
|
||||||
|
✔ REQ-PLUG-1 the loader needs a log callback (1.14637ms)
|
||||||
|
ℹ tests 49
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 49
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 2281.541817
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.223541ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.222664ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (52.7698ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (43.539654ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (42.903925ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (55.045959ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (44.040412ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.200469ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (43.887012ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (42.425785ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (44.483506ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (43.702967ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.492979ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (85.991456ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (51.829594ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.348009ms)
|
||||||
|
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.10118ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (39.693163ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.742544ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (146.282626ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (169.54836ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.751884ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.391321ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.677099ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (52.536228ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (94.782042ms)
|
||||||
|
✖ P5 only human can enable/disable telemetry or change polling, including direct organization writes (50.536153ms)
|
||||||
|
✖ P5 Console displays stack count per safe key separately from optional proxy account numbers (1.0934ms)
|
||||||
|
✖ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.228091ms)
|
||||||
|
ℹ tests 29
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 25
|
||||||
|
ℹ fail 4
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1398.637079
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/limit-checks.test.mjs:328:1
|
||||||
|
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.10118ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
{
|
||||||
|
+ allow: true
|
||||||
|
- allow: false,
|
||||||
|
- check: null,
|
||||||
|
- code: 'proxy-key-refused'
|
||||||
|
}
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:333:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: { allow: true },
|
||||||
|
expected: { allow: false, check: null, code: 'proxy-key-refused' },
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/business/tests/plugin-settings.test.mjs:161:1
|
||||||
|
✖ P5 only human can enable/disable telemetry or change polling, including direct organization writes (50.536153ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/tests/plugin-settings.test.mjs:163:56)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
expected: { code: 'organization-usage-human-only' },
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/webui/tests/usage-render.test.mjs:10:1
|
||||||
|
✖ P5 Console displays stack count per safe key separately from optional proxy account numbers (1.0934ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /Key: 012345abcdef/. Input:
|
||||||
|
|
||||||
|
'<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/webui/tests/usage-render.test.mjs:12:34)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.start (node:internal/test_runner/test:1262:17)
|
||||||
|
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>',
|
||||||
|
expected: /Key: 012345abcdef/,
|
||||||
|
operator: 'match',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/webui/tests/usage-render.test.mjs:17:1
|
||||||
|
✖ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.228091ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /unavailable/. Input:
|
||||||
|
|
||||||
|
'<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>'
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/webui/tests/usage-render.test.mjs:19:42)
|
||||||
|
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||||
|
at Test.run (node:internal/test_runner/test:1402:25)
|
||||||
|
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||||
|
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||||
|
at Test.run (node:internal/test_runner/test:1467:12)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>',
|
||||||
|
expected: /unavailable/,
|
||||||
|
operator: 'match',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.351672ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.197022ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (45.900174ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (48.270064ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (46.136204ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (57.022124ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (45.147203ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.845585ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (43.247414ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (45.643077ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (37.420192ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (41.526492ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.579005ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (89.130888ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (53.18557ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.432955ms)
|
||||||
|
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (45.896754ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (40.6658ms)
|
||||||
|
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.282933ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 17
|
||||||
|
ℹ fail 2
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 767.199722
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/limit-checks.test.mjs:328:1
|
||||||
|
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (45.896754ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
{
|
||||||
|
+ allow: true
|
||||||
|
- allow: false,
|
||||||
|
- check: null,
|
||||||
|
- code: 'proxy-key-refused'
|
||||||
|
}
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:333:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: { allow: true },
|
||||||
|
expected: { allow: false, check: null, code: 'proxy-key-refused' },
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/bus/tests/limit-checks.test.mjs:346:1
|
||||||
|
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.282933ms)
|
||||||
|
TypeError: modelUsageKey is not a function
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:351:15)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.471904ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.238869ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (48.889383ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (48.804518ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (47.424391ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (58.732905ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (46.311117ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (52.110899ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (50.032452ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (45.35538ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (45.361587ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (47.343794ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.52398ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (91.231334ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (56.207075ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.2189ms)
|
||||||
|
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (44.848352ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (43.672096ms)
|
||||||
|
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.426717ms)
|
||||||
|
ℹ tests 19
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 17
|
||||||
|
ℹ fail 2
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 816.537108
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/limit-checks.test.mjs:328:1
|
||||||
|
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (44.848352ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
{
|
||||||
|
+ allow: true
|
||||||
|
- allow: false,
|
||||||
|
- check: null,
|
||||||
|
- code: 'proxy-key-refused'
|
||||||
|
}
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:333:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: { allow: true },
|
||||||
|
expected: { allow: false, check: null, code: 'proxy-key-refused' },
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/bus/tests/limit-checks.test.mjs:346:1
|
||||||
|
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.426717ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:354:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
expected: { code: 'proxy-key-refused' },
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.497774ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.231342ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (41.157068ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (47.622762ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (40.772915ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (64.210535ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (41.33012ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (46.47583ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (42.554949ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (42.55839ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (42.856274ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (42.087566ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.540151ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (83.555041ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (50.237156ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.834976ms)
|
||||||
|
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.561579ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (40.600997ms)
|
||||||
|
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.439799ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (10.470972ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (139.490847ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (177.184056ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.815855ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.853399ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.605034ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (52.267349ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (94.963454ms)
|
||||||
|
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (142.850292ms)
|
||||||
|
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.865798ms)
|
||||||
|
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (3.686422ms)
|
||||||
|
ℹ tests 30
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 30
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1490.937181
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569","9e2b7988546b"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569","9e2b7988546b"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["9e2b7988546b"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["9e2b7988546b"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (212.342125ms)
|
||||||
|
ℹ tests 1
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 0
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 343.620467
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/p5-runtime.test.mjs:13:1
|
||||||
|
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (212.342125ms)
|
||||||
|
Error: invalid-launch-process
|
||||||
|
at Object.bindLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/runtime.mjs:641:15)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-runtime.test.mjs:41:16)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
code: 'invalid-launch-process'
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8","9f64355841b6"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8","9f64355841b6"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["9f64355841b6"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["9f64355841b6"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (218.643013ms)
|
||||||
|
ℹ tests 1
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 0
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 343.099863
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/p5-runtime.test.mjs:14:1
|
||||||
|
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (218.643013ms)
|
||||||
|
Error: unauthenticated
|
||||||
|
at fail (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/broker.mjs:230:9)
|
||||||
|
at #session (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/broker.mjs:657:39)
|
||||||
|
at Broker.request (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/broker.mjs:4817:28)
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-runtime.test.mjs:43:13)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
code: 'unauthenticated'
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f","f39c9ad3cf05"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f","f39c9ad3cf05"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["f39c9ad3cf05"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["f39c9ad3cf05"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"run":"p5-run","modelKeyId":"f39c9ad3cf05"},"path":["tokens","keys","f39c9ad3cf05"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"f39c9ad3cf05"},"path":["tokens","keys","f39c9ad3cf05"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (304.08638ms)
|
||||||
|
ℹ tests 1
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 1
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 420.753441
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (86.257274ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (54.618111ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (44.583676ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (46.4743ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (56.121284ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (47.108755ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (49.990509ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (56.900609ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (51.730832ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (50.614029ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (44.230231ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (48.44147ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (45.801767ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (39.52636ms)
|
||||||
|
✔ usage records are append-only (37.948303ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (47.7119ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (55.743022ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (57.173303ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (41.62154ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (46.188396ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (46.675381ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (43.283736ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (46.409665ms)
|
||||||
|
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (45.477235ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.43995ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (2.606864ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.613165ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.32277ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (2.00608ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.518136ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (1.062337ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.122725ms)
|
||||||
|
ℹ tests 32
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 32
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1490.423611
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (60.34137ms)
|
||||||
|
✖ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (43.55479ms)
|
||||||
|
✖ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.788302ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.315969ms)
|
||||||
|
✖ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (40.209703ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (38.596309ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (45.908134ms)
|
||||||
|
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (16.729146ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (3.674119ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.818219ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.550156ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (2.537033ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.858685ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (1.153412ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.135306ms)
|
||||||
|
ℹ tests 15
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 11
|
||||||
|
ℹ fail 4
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 487.776777
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/proxy-usage.test.mjs:36:1
|
||||||
|
✖ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (43.55479ms)
|
||||||
|
TypeError: Cannot read properties of undefined (reading 'keyId')
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs:38:87)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||||
|
|
||||||
|
test at packages/bus/tests/proxy-usage.test.mjs:47:1
|
||||||
|
✖ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.788302ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
+ undefined
|
||||||
|
- {
|
||||||
|
- action: 'proxy.usage.reconcile',
|
||||||
|
- code: 'proxy-usage-unknown-key',
|
||||||
|
- keyId: 'f76403e5ce2e'
|
||||||
|
- }
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs:49:9)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
expected: { action: 'proxy.usage.reconcile', keyId: 'f76403e5ce2e', code: 'proxy-usage-unknown-key' },
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/bus/tests/proxy-usage.test.mjs:58:1
|
||||||
|
✖ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (40.209703ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs:63:9)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: false,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: undefined,
|
||||||
|
expected: /append-only/,
|
||||||
|
operator: 'throws',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
|
|
||||||
|
test at packages/model-proxy/tests/usage-client.test.mjs:21:1
|
||||||
|
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (16.729146ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
+ accountId: 'made-up-upstream-canary',
|
||||||
|
- accountId: '51dfa8a6722b',
|
||||||
|
cacheRead: 4,
|
||||||
|
cacheWrite: 3,
|
||||||
|
failed: true,
|
||||||
|
input: 7,
|
||||||
|
keyId: 'd1e3e19ac482',
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:24:10)
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: [ { keyId: 'd1e3e19ac482', accountId: 'made-up-upstream-canary', managed: true, failed: true, statusCode: 503, input: 7, output: 2, cacheWrite: 3, cacheRead: 4 } ],
|
||||||
|
expected: [ { keyId: 'd1e3e19ac482', accountId: '51dfa8a6722b', managed: true, failed: true, statusCode: 503, input: 7, output: 2, cacheWrite: 3, cacheRead: 4 } ],
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (63.115978ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (53.184947ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (43.353706ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (42.937785ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (48.231864ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.352423ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (43.470712ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (15.069336ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (2.896886ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.591065ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.351768ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (2.127704ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.349646ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (1.162024ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.135262ms)
|
||||||
|
ℹ tests 15
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 15
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 508.770711
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"bc8872d6-c10d-4cbc-963c-dd87cf9163e5","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max","run":"run1"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"3e17a52f-1444-4d91-a204-87e39766f9c6","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (170.726529ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (145.594621ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (126.673361ms)
|
||||||
|
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (67.580463ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.298781ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.222463ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (47.459097ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (46.035967ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (45.718506ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (57.755296ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (45.052811ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (51.313528ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (46.094531ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (48.189649ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (44.413841ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (46.465199ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.636118ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (87.250164ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (52.454059ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (2.054757ms)
|
||||||
|
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (42.170203ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (41.545306ms)
|
||||||
|
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.418717ms)
|
||||||
|
✖ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (106.432474ms)
|
||||||
|
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (170.782587ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (437.666292ms)
|
||||||
|
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (120.745836ms)
|
||||||
|
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (80.230732ms)
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"3646df55-73df-46ac-a828-41d4c0adef5c","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null,"run":"run1"},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"ae4d4f3a-9306-4a9d-88c5-234c2f2bfcaf","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (243.095091ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (90.928952ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (143.039435ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (136.591564ms)
|
||||||
|
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (171.913947ms)
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9","fd2b06e41cec"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9","fd2b06e41cec"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["fd2b06e41cec"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["fd2b06e41cec"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"run":"p5-run","modelKeyId":"fd2b06e41cec"},"path":["tokens","keys","fd2b06e41cec"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"fd2b06e41cec"},"path":["tokens","keys","fd2b06e41cec"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (313.95876ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (100.42834ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (261.328835ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (199.005826ms)
|
||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (59.508865ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (54.132395ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.918239ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (47.414676ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (49.580277ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.767702ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (44.597112ms)
|
||||||
|
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (115.479121ms)
|
||||||
|
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (137.456433ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (52.575663ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (47.838399ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (46.771667ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.568247ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.022848ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (44.520995ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (38.477112ms)
|
||||||
|
✔ usage records are append-only (38.207707ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (49.361853ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (59.674051ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (52.284427ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (54.284346ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (54.236183ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (50.417947ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (49.190606ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (45.910581ms)
|
||||||
|
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (45.051417ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.756957ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (139.461766ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (198.116707ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.940571ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (23.77339ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.651382ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (56.64271ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (100.452598ms)
|
||||||
|
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (148.009247ms)
|
||||||
|
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (12.986058ms)
|
||||||
|
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (248.032277ms)
|
||||||
|
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (276.275719ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (149.313217ms)
|
||||||
|
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (22.104886ms)
|
||||||
|
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (155.859496ms)
|
||||||
|
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (232.766603ms)
|
||||||
|
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.606016ms)
|
||||||
|
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.349516ms)
|
||||||
|
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.394451ms)
|
||||||
|
✔ proxy-down: agent-key probe connection failure is sanitized (1.448631ms)
|
||||||
|
✔ proxy-down: silent listener cannot extend probe request deadline (50.92774ms)
|
||||||
|
✔ agent-key probe returns redirect status without following Location or exposing key (2.519341ms)
|
||||||
|
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.954469ms)
|
||||||
|
✔ proxy-client-invalid: http://example.com:18318 (0.688091ms)
|
||||||
|
✔ proxy-client-invalid: http://localhost:18318 (0.089486ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.072442ms)
|
||||||
|
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.075664ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.064187ms)
|
||||||
|
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (15.756687ms)
|
||||||
|
✔ proxy-client-refused (3.167201ms)
|
||||||
|
✔ proxy-client-response (1.333201ms)
|
||||||
|
✔ proxy-client-redirect (1.083098ms)
|
||||||
|
✔ proxy-client-down: transport errors redact details (0.993207ms)
|
||||||
|
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.155978ms)
|
||||||
|
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (1.086163ms)
|
||||||
|
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.529214ms)
|
||||||
|
✔ proxy-client-response: truncated response remains a redacted named refusal (12.081487ms)
|
||||||
|
✔ management client ignores ambient fetch dispatchers (1.152012ms)
|
||||||
|
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.391538ms)
|
||||||
|
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.062708ms)
|
||||||
|
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.046332ms)
|
||||||
|
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.087954ms)
|
||||||
|
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (16.664061ms)
|
||||||
|
✔ OAuth management calls keep URL and state out of receipts (16.723462ms)
|
||||||
|
✔ upstream key goes only in request body and upstream refusal body is discarded (3.387523ms)
|
||||||
|
✔ redirected management calls are not followed or retried (1.835042ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.543908ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (2.805976ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.641432ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.977544ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (1.458ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.387336ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (1.028864ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.11627ms)
|
||||||
|
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.248222ms)
|
||||||
|
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.695173ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.286778ms)
|
||||||
|
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.491571ms)
|
||||||
|
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.574704ms)
|
||||||
|
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.368738ms)
|
||||||
|
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.297179ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.789063ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.436754ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.07467ms)
|
||||||
|
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.372713ms)
|
||||||
|
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.387209ms)
|
||||||
|
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.190068ms)
|
||||||
|
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.797912ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.067108ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.242701ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.499586ms)
|
||||||
|
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.148124ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.132027ms)
|
||||||
|
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.141236ms)
|
||||||
|
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.357471ms)
|
||||||
|
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.869634ms)
|
||||||
|
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.937122ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.673271ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.374164ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.658454ms)
|
||||||
|
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.627026ms)
|
||||||
|
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.181959ms)
|
||||||
|
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.491019ms)
|
||||||
|
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.663113ms)
|
||||||
|
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.78261ms)
|
||||||
|
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.634605ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.598243ms)
|
||||||
|
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.844243ms)
|
||||||
|
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.647337ms)
|
||||||
|
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.801872ms)
|
||||||
|
✔ REQ-PLUG-1 the loader needs a log callback (1.263318ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.188308ms)
|
||||||
|
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.33092ms)
|
||||||
|
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.355614ms)
|
||||||
|
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.231653ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.148217ms)
|
||||||
|
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.136573ms)
|
||||||
|
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.176874ms)
|
||||||
|
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.124961ms)
|
||||||
|
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.607578ms)
|
||||||
|
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.23856ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.114066ms)
|
||||||
|
✔ P5 a model key ID limit counts stack records by key ID without an account (0.118256ms)
|
||||||
|
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.841797ms)
|
||||||
|
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.176474ms)
|
||||||
|
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (25.573147ms)
|
||||||
|
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (4.896859ms)
|
||||||
|
ℹ tests 170
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 169
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 9018.08934
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/limit-stop.test.mjs:51:1
|
||||||
|
✖ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (106.432474ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
... Skipped lines
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
business: 'demo',
|
||||||
|
subject: {
|
||||||
|
account: null,
|
||||||
|
...
|
||||||
|
provider: 'anthropic',
|
||||||
|
+ run: 'run1'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
business: 'demo',
|
||||||
|
subject: {
|
||||||
|
...
|
||||||
|
provider: 'anthropic',
|
||||||
|
+ run: 'run1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-stop.test.mjs:61:10)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: [ { business: 'demo', subject: [Object] }, { business: 'demo', subject: [Object] } ],
|
||||||
|
expected: [ { business: 'demo', subject: [Object] }, { business: 'demo', subject: [Object] } ],
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"5bb2f720-5e85-4a68-a925-a3353c40a2f8","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"705b4abe-0076-4b91-a1cc-5086242adeed","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (161.759642ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (143.832834ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (121.34683ms)
|
||||||
|
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (69.700044ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.251176ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.204566ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (51.271224ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (52.372536ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (45.813258ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (54.966516ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (45.689186ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.849713ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (48.476916ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (50.630185ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (43.636714ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (43.52912ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.50935ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (85.225278ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (51.638301ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.900971ms)
|
||||||
|
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (52.673427ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (41.052561ms)
|
||||||
|
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.486898ms)
|
||||||
|
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (142.265785ms)
|
||||||
|
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (186.467373ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (423.452103ms)
|
||||||
|
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (110.322117ms)
|
||||||
|
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (77.036392ms)
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"071301b4-8009-4918-9b07-39907d1d5082","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"231aab8c-068f-4e5a-81e9-19b1cf7d34cc","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (248.63219ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (87.393715ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (140.096907ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (122.214342ms)
|
||||||
|
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (161.718448ms)
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8","e87aa1b93018"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8","e87aa1b93018"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["e87aa1b93018"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["e87aa1b93018"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"modelKeyId":"e87aa1b93018"},"path":["tokens","keys","e87aa1b93018"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"e87aa1b93018"},"path":["tokens","keys","e87aa1b93018"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (311.047592ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (99.333676ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (257.002212ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (196.173099ms)
|
||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (58.628561ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (52.79243ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.569864ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (41.831504ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (47.808191ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (43.023649ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (42.774113ms)
|
||||||
|
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (111.658595ms)
|
||||||
|
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (136.372459ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (52.523881ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (60.980995ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (47.608728ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.927657ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (55.771008ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (57.407378ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (42.03284ms)
|
||||||
|
✔ usage records are append-only (41.064096ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (46.863323ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (51.492502ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (40.548781ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (41.97363ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (50.186944ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (44.545546ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (44.101897ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (44.09141ms)
|
||||||
|
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (44.151576ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.654239ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (136.405265ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (164.709168ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.961195ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (20.250129ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.590323ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (50.378509ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (93.589584ms)
|
||||||
|
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (146.907219ms)
|
||||||
|
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (14.755461ms)
|
||||||
|
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (223.35974ms)
|
||||||
|
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (262.018477ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (136.45906ms)
|
||||||
|
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (22.468222ms)
|
||||||
|
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (146.912888ms)
|
||||||
|
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (199.214764ms)
|
||||||
|
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.500079ms)
|
||||||
|
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.29275ms)
|
||||||
|
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.453939ms)
|
||||||
|
✔ proxy-down: agent-key probe connection failure is sanitized (1.448596ms)
|
||||||
|
✔ proxy-down: silent listener cannot extend probe request deadline (51.226767ms)
|
||||||
|
✔ agent-key probe returns redirect status without following Location or exposing key (2.599627ms)
|
||||||
|
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.940367ms)
|
||||||
|
✔ proxy-client-invalid: http://example.com:18318 (0.110721ms)
|
||||||
|
✔ proxy-client-invalid: http://localhost:18318 (0.551474ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.085358ms)
|
||||||
|
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.082245ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.071237ms)
|
||||||
|
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (16.679264ms)
|
||||||
|
✔ proxy-client-refused (2.60845ms)
|
||||||
|
✔ proxy-client-response (1.279043ms)
|
||||||
|
✔ proxy-client-redirect (1.146966ms)
|
||||||
|
✔ proxy-client-down: transport errors redact details (0.949938ms)
|
||||||
|
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.180359ms)
|
||||||
|
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (0.938153ms)
|
||||||
|
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.489424ms)
|
||||||
|
✔ proxy-client-response: truncated response remains a redacted named refusal (12.060482ms)
|
||||||
|
✔ management client ignores ambient fetch dispatchers (1.377676ms)
|
||||||
|
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.526441ms)
|
||||||
|
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.110569ms)
|
||||||
|
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.01067ms)
|
||||||
|
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.13613ms)
|
||||||
|
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (17.073708ms)
|
||||||
|
✔ OAuth management calls keep URL and state out of receipts (16.393438ms)
|
||||||
|
✔ upstream key goes only in request body and upstream refusal body is discarded (3.072175ms)
|
||||||
|
✔ redirected management calls are not followed or retried (1.57426ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (15.82294ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (2.96929ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.741334ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.466913ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (2.929775ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.463954ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (1.03957ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.194237ms)
|
||||||
|
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.253421ms)
|
||||||
|
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (12.848519ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.34571ms)
|
||||||
|
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.530747ms)
|
||||||
|
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.735447ms)
|
||||||
|
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.388703ms)
|
||||||
|
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.354873ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.967098ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.478992ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.167482ms)
|
||||||
|
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.375179ms)
|
||||||
|
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.739059ms)
|
||||||
|
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.22961ms)
|
||||||
|
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.935079ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.194208ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.254856ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (1.125412ms)
|
||||||
|
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.161968ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.141125ms)
|
||||||
|
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.146226ms)
|
||||||
|
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.365221ms)
|
||||||
|
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (4.138219ms)
|
||||||
|
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.181488ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (3.076206ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.618445ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (30.33829ms)
|
||||||
|
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.849943ms)
|
||||||
|
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.25734ms)
|
||||||
|
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.597703ms)
|
||||||
|
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.743636ms)
|
||||||
|
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.876351ms)
|
||||||
|
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.717178ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.639476ms)
|
||||||
|
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.884786ms)
|
||||||
|
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.078835ms)
|
||||||
|
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.865433ms)
|
||||||
|
✔ REQ-PLUG-1 the loader needs a log callback (1.252523ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.15958ms)
|
||||||
|
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.269598ms)
|
||||||
|
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.319894ms)
|
||||||
|
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.245595ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.147653ms)
|
||||||
|
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.136545ms)
|
||||||
|
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.161235ms)
|
||||||
|
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.131986ms)
|
||||||
|
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.612439ms)
|
||||||
|
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.225872ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.115054ms)
|
||||||
|
✔ P5 a model key ID limit counts stack records by key ID without an account (0.118321ms)
|
||||||
|
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.840194ms)
|
||||||
|
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.169412ms)
|
||||||
|
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (25.71419ms)
|
||||||
|
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (4.903993ms)
|
||||||
|
ℹ tests 170
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 170
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 8854.156666
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (99.462478ms)
|
||||||
|
✖ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (43.555167ms)
|
||||||
|
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.357162ms)
|
||||||
|
ℹ tests 3
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 2
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 237.626033
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/p5-key-context.test.mjs:23:1
|
||||||
|
✖ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (43.555167ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
{
|
||||||
|
+ stop: false
|
||||||
|
- check: null,
|
||||||
|
- code: 'proxy-key-refused',
|
||||||
|
- stop: true
|
||||||
|
}
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-key-context.test.mjs:27:9)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: { stop: false },
|
||||||
|
expected: { stop: true, check: null, code: 'proxy-key-refused' },
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (135.950817ms)
|
||||||
|
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (183.02595ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (446.621104ms)
|
||||||
|
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (114.707723ms)
|
||||||
|
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (71.318028ms)
|
||||||
|
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (89.174131ms)
|
||||||
|
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (41.80406ms)
|
||||||
|
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.436962ms)
|
||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (57.810472ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (54.180897ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (41.762914ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.65014ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (50.005361ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.308399ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (46.350571ms)
|
||||||
|
ℹ tests 15
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 15
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 1674.306377
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"4fe53301-641b-494d-a461-847c03170e3f","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"797da8e3-f04c-4e40-b8e1-bfb60b07c554","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (158.160821ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (143.809206ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (121.006833ms)
|
||||||
|
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (64.961645ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.220027ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.214936ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (44.021673ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (43.052934ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (40.139268ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (52.680831ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (47.313105ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (46.754294ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (42.493056ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (41.402846ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (41.969573ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (41.694193ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.52246ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (83.096899ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (50.535823ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.710249ms)
|
||||||
|
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.544044ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (39.590387ms)
|
||||||
|
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.460753ms)
|
||||||
|
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (132.493862ms)
|
||||||
|
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (177.559162ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (440.047034ms)
|
||||||
|
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (109.873105ms)
|
||||||
|
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (77.150566ms)
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"b338e07c-04c8-4942-902f-484f07e73153","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"fd7f45ea-e03c-49dd-a53c-e385fdd5acbf","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (245.80231ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (84.052026ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (136.937413ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (118.705264ms)
|
||||||
|
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (165.970294ms)
|
||||||
|
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (90.023506ms)
|
||||||
|
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (42.127316ms)
|
||||||
|
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.383979ms)
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056","fa6669b39602"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056","fa6669b39602"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["fa6669b39602"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["fa6669b39602"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"modelKeyId":"fa6669b39602"},"path":["tokens","keys","fa6669b39602"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"fa6669b39602"},"path":["tokens","keys","fa6669b39602"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (325.548897ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (104.870501ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (268.507544ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (215.488037ms)
|
||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (60.18695ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (56.879533ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (46.789381ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.152978ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (49.497425ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (46.179514ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (46.481349ms)
|
||||||
|
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (113.617169ms)
|
||||||
|
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (154.197141ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (55.1487ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (48.001192ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (52.699151ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (43.859028ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (49.684957ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (48.842941ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (46.725304ms)
|
||||||
|
✔ usage records are append-only (43.666526ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (50.791657ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (67.235771ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (50.444244ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (48.518074ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (52.596237ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (48.989984ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (47.601985ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (58.908338ms)
|
||||||
|
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (48.622269ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (11.123203ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (144.541984ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (186.444017ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (2.070716ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (24.002633ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.819444ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (53.502998ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (102.914554ms)
|
||||||
|
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (153.795381ms)
|
||||||
|
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (12.633498ms)
|
||||||
|
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (250.719331ms)
|
||||||
|
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (279.391871ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (143.161688ms)
|
||||||
|
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (22.600091ms)
|
||||||
|
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (147.449414ms)
|
||||||
|
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (211.379051ms)
|
||||||
|
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.650453ms)
|
||||||
|
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.452411ms)
|
||||||
|
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.454096ms)
|
||||||
|
✔ proxy-down: agent-key probe connection failure is sanitized (1.507584ms)
|
||||||
|
✔ proxy-down: silent listener cannot extend probe request deadline (51.18593ms)
|
||||||
|
✔ agent-key probe returns redirect status without following Location or exposing key (2.629896ms)
|
||||||
|
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.940604ms)
|
||||||
|
✔ proxy-client-invalid: http://example.com:18318 (0.620294ms)
|
||||||
|
✔ proxy-client-invalid: http://localhost:18318 (0.082993ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.075406ms)
|
||||||
|
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.082019ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.077949ms)
|
||||||
|
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (16.759591ms)
|
||||||
|
✔ proxy-client-refused (2.644555ms)
|
||||||
|
✔ proxy-client-response (1.257544ms)
|
||||||
|
✔ proxy-client-redirect (1.116738ms)
|
||||||
|
✔ proxy-client-down: transport errors redact details (0.932782ms)
|
||||||
|
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.174045ms)
|
||||||
|
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (0.93563ms)
|
||||||
|
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.481342ms)
|
||||||
|
✔ proxy-client-response: truncated response remains a redacted named refusal (11.038179ms)
|
||||||
|
✔ management client ignores ambient fetch dispatchers (1.371561ms)
|
||||||
|
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.426795ms)
|
||||||
|
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.114261ms)
|
||||||
|
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.011023ms)
|
||||||
|
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.128478ms)
|
||||||
|
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (16.93766ms)
|
||||||
|
✔ OAuth management calls keep URL and state out of receipts (16.303618ms)
|
||||||
|
✔ upstream key goes only in request body and upstream refusal body is discarded (3.098596ms)
|
||||||
|
✔ redirected management calls are not followed or retried (1.618972ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.682335ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (2.770996ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.619582ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (2.024573ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (1.40751ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.380605ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (0.992984ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.079984ms)
|
||||||
|
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.195525ms)
|
||||||
|
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (12.385039ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.294446ms)
|
||||||
|
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.448244ms)
|
||||||
|
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.585636ms)
|
||||||
|
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.344176ms)
|
||||||
|
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.309404ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.823288ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.462864ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.053193ms)
|
||||||
|
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.384911ms)
|
||||||
|
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.335648ms)
|
||||||
|
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.194429ms)
|
||||||
|
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.764141ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.078533ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.243968ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.928754ms)
|
||||||
|
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.133743ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.128969ms)
|
||||||
|
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.180465ms)
|
||||||
|
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.158842ms)
|
||||||
|
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (4.034236ms)
|
||||||
|
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.123767ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.857748ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.422702ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.290401ms)
|
||||||
|
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.752498ms)
|
||||||
|
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.289418ms)
|
||||||
|
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.561921ms)
|
||||||
|
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.761977ms)
|
||||||
|
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.894842ms)
|
||||||
|
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.759495ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.719036ms)
|
||||||
|
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (2.205867ms)
|
||||||
|
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.120271ms)
|
||||||
|
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.864421ms)
|
||||||
|
✔ REQ-PLUG-1 the loader needs a log callback (1.369307ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.204087ms)
|
||||||
|
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.293377ms)
|
||||||
|
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.332255ms)
|
||||||
|
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.241481ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.148082ms)
|
||||||
|
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.130431ms)
|
||||||
|
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.168183ms)
|
||||||
|
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.134841ms)
|
||||||
|
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.611062ms)
|
||||||
|
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.218561ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.116475ms)
|
||||||
|
✔ P5 a model key ID limit counts stack records by key ID without an account (0.113961ms)
|
||||||
|
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.908576ms)
|
||||||
|
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.662967ms)
|
||||||
|
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (26.726073ms)
|
||||||
|
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (5.304556ms)
|
||||||
|
ℹ tests 173
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 173
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 9284.877315
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (100.714572ms)
|
||||||
|
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (42.059265ms)
|
||||||
|
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.383747ms)
|
||||||
|
✖ P5 model-key mustStop without native run context fails closed even when the current key resolves (42.738629ms)
|
||||||
|
ℹ tests 4
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 3
|
||||||
|
ℹ fail 1
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 276.940054
|
||||||
|
|
||||||
|
✖ failing tests:
|
||||||
|
|
||||||
|
test at packages/bus/tests/p5-key-context.test.mjs:39:1
|
||||||
|
✖ P5 model-key mustStop without native run context fails closed even when the current key resolves (42.738629ms)
|
||||||
|
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||||
|
+ actual - expected
|
||||||
|
|
||||||
|
{
|
||||||
|
+ stop: false
|
||||||
|
- check: null,
|
||||||
|
- code: 'proxy-key-refused',
|
||||||
|
- stop: true
|
||||||
|
}
|
||||||
|
|
||||||
|
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-key-context.test.mjs:43:9)
|
||||||
|
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||||
|
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||||
|
generatedMessage: true,
|
||||||
|
code: 'ERR_ASSERTION',
|
||||||
|
actual: { stop: false },
|
||||||
|
expected: { stop: true, check: null, code: 'proxy-key-refused' },
|
||||||
|
operator: 'deepStrictEqual',
|
||||||
|
diff: 'simple'
|
||||||
|
}
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"713a4859-153d-4efb-9e60-6abbd4549b0e","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"6615caa1-e75d-463c-b6b8-789d6dc77e40","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (160.549327ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (143.628999ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (123.342684ms)
|
||||||
|
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (67.349794ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.271433ms)
|
||||||
|
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.194636ms)
|
||||||
|
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (45.635942ms)
|
||||||
|
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (46.176242ms)
|
||||||
|
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (44.938267ms)
|
||||||
|
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (54.558566ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (46.342833ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.766687ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (43.59231ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (48.104463ms)
|
||||||
|
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (42.805959ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (43.597155ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.492317ms)
|
||||||
|
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (91.037972ms)
|
||||||
|
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (50.368678ms)
|
||||||
|
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.715607ms)
|
||||||
|
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (40.810413ms)
|
||||||
|
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (35.820247ms)
|
||||||
|
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.45891ms)
|
||||||
|
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (121.318326ms)
|
||||||
|
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (168.385765ms)
|
||||||
|
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (417.685568ms)
|
||||||
|
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (114.909337ms)
|
||||||
|
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (77.129589ms)
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"5c3d20b7-bbe0-44e1-876f-393c04bf33e3","source":"@none","code":"baseline-unknown"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
|
||||||
|
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"1ed92631-bf69-4279-8f2e-da5c8c2d9061","source":"@none","code":"baseline-unknown"}
|
||||||
|
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (242.78734ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (83.772136ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (135.822066ms)
|
||||||
|
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (121.123659ms)
|
||||||
|
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (159.884938ms)
|
||||||
|
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (89.685601ms)
|
||||||
|
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (41.975207ms)
|
||||||
|
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.374876ms)
|
||||||
|
✔ P5 model-key mustStop without native run context fails closed even when the current key resolves (39.706143ms)
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4"]}
|
||||||
|
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4"]}
|
||||||
|
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4","f81b23885f0a"]}
|
||||||
|
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4","f81b23885f0a"]}
|
||||||
|
model-proxy: {"action":"proxy.key.issued","keyIds":["f81b23885f0a"],"instance":"demo/coder"}
|
||||||
|
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["f81b23885f0a"]}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"modelKeyId":"f81b23885f0a"},"path":["tokens","keys","f81b23885f0a"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"f81b23885f0a"},"path":["tokens","keys","f81b23885f0a"],"limit":2,"count":2,"unknownTurns":0}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (319.346483ms)
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
organization: {"event":"reload-needs-restart","business":"demo"}
|
||||||
|
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (102.705755ms)
|
||||||
|
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (258.622237ms)
|
||||||
|
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (194.943673ms)
|
||||||
|
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (58.879723ms)
|
||||||
|
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (51.610465ms)
|
||||||
|
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (41.842706ms)
|
||||||
|
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.265972ms)
|
||||||
|
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (45.846149ms)
|
||||||
|
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.767318ms)
|
||||||
|
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (42.425739ms)
|
||||||
|
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (107.035274ms)
|
||||||
|
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (138.029928ms)
|
||||||
|
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (102.708913ms)
|
||||||
|
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (51.29996ms)
|
||||||
|
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (44.547138ms)
|
||||||
|
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.305662ms)
|
||||||
|
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (46.243747ms)
|
||||||
|
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (49.699154ms)
|
||||||
|
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (41.750326ms)
|
||||||
|
✔ usage records are append-only (44.741061ms)
|
||||||
|
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (46.066508ms)
|
||||||
|
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (58.388899ms)
|
||||||
|
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (45.643672ms)
|
||||||
|
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (46.749719ms)
|
||||||
|
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (51.822533ms)
|
||||||
|
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (53.80965ms)
|
||||||
|
✔ row 65 a run bound without a transcript directory records no-transcript (57.433717ms)
|
||||||
|
✔ P5 immutable stack key attribution survives rotation and restart without key values (47.921754ms)
|
||||||
|
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (48.881094ms)
|
||||||
|
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.919614ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (141.282316ms)
|
||||||
|
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (199.085632ms)
|
||||||
|
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (5.994558ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (29.095644ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (2.986444ms)
|
||||||
|
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (64.912764ms)
|
||||||
|
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (124.041908ms)
|
||||||
|
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (163.47796ms)
|
||||||
|
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (25.815386ms)
|
||||||
|
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (253.253525ms)
|
||||||
|
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (294.58611ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (144.894737ms)
|
||||||
|
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (26.673634ms)
|
||||||
|
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (173.373389ms)
|
||||||
|
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (221.557913ms)
|
||||||
|
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.906006ms)
|
||||||
|
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.654873ms)
|
||||||
|
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.465852ms)
|
||||||
|
✔ proxy-down: agent-key probe connection failure is sanitized (1.484469ms)
|
||||||
|
✔ proxy-down: silent listener cannot extend probe request deadline (52.146773ms)
|
||||||
|
✔ agent-key probe returns redirect status without following Location or exposing key (2.580254ms)
|
||||||
|
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.937801ms)
|
||||||
|
✔ proxy-client-invalid: http://example.com:18318 (0.535029ms)
|
||||||
|
✔ proxy-client-invalid: http://localhost:18318 (0.087694ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.069318ms)
|
||||||
|
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.073249ms)
|
||||||
|
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.061539ms)
|
||||||
|
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (16.662783ms)
|
||||||
|
✔ proxy-client-refused (2.363491ms)
|
||||||
|
✔ proxy-client-response (1.26715ms)
|
||||||
|
✔ proxy-client-redirect (1.119781ms)
|
||||||
|
✔ proxy-client-down: transport errors redact details (0.943923ms)
|
||||||
|
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.172918ms)
|
||||||
|
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (0.890633ms)
|
||||||
|
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.473687ms)
|
||||||
|
✔ proxy-client-response: truncated response remains a redacted named refusal (10.816438ms)
|
||||||
|
✔ management client ignores ambient fetch dispatchers (1.14023ms)
|
||||||
|
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.507611ms)
|
||||||
|
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.092119ms)
|
||||||
|
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.004054ms)
|
||||||
|
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.102862ms)
|
||||||
|
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (16.268442ms)
|
||||||
|
✔ OAuth management calls keep URL and state out of receipts (16.20323ms)
|
||||||
|
✔ upstream key goes only in request body and upstream refusal body is discarded (3.013252ms)
|
||||||
|
✔ redirected management calls are not followed or retried (1.543184ms)
|
||||||
|
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.200284ms)
|
||||||
|
✔ P5 bad envelope refuses safely with no retry (2.700404ms)
|
||||||
|
✔ P5 over count refuses safely with no retry (1.604716ms)
|
||||||
|
✔ P5 missing key refuses safely with no retry (1.370666ms)
|
||||||
|
✔ P5 bad counts refuses safely with no retry (2.020663ms)
|
||||||
|
✔ P5 redirect refuses safely with no retry (1.338733ms)
|
||||||
|
✔ P5 refusal refuses safely with no retry (0.975888ms)
|
||||||
|
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.062269ms)
|
||||||
|
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.111774ms)
|
||||||
|
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.668338ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.297908ms)
|
||||||
|
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.432147ms)
|
||||||
|
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.598992ms)
|
||||||
|
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.356206ms)
|
||||||
|
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.313154ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.81377ms)
|
||||||
|
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.455025ms)
|
||||||
|
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.086843ms)
|
||||||
|
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.349512ms)
|
||||||
|
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.388492ms)
|
||||||
|
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.195575ms)
|
||||||
|
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.769635ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.012155ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.250245ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.922679ms)
|
||||||
|
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.147977ms)
|
||||||
|
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.122575ms)
|
||||||
|
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.132403ms)
|
||||||
|
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.032509ms)
|
||||||
|
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.876412ms)
|
||||||
|
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.975479ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.818854ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.461598ms)
|
||||||
|
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (30.463335ms)
|
||||||
|
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.687366ms)
|
||||||
|
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.214904ms)
|
||||||
|
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.519903ms)
|
||||||
|
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.657821ms)
|
||||||
|
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.655045ms)
|
||||||
|
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.640761ms)
|
||||||
|
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.650255ms)
|
||||||
|
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (2.148582ms)
|
||||||
|
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.724542ms)
|
||||||
|
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.671706ms)
|
||||||
|
✔ REQ-PLUG-1 the loader needs a log callback (1.199165ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (0.667098ms)
|
||||||
|
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.777171ms)
|
||||||
|
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.345096ms)
|
||||||
|
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.242181ms)
|
||||||
|
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.147915ms)
|
||||||
|
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.129665ms)
|
||||||
|
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.156705ms)
|
||||||
|
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.145396ms)
|
||||||
|
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.617108ms)
|
||||||
|
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.218957ms)
|
||||||
|
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.119273ms)
|
||||||
|
✔ P5 a model key ID limit counts stack records by key ID without an account (0.120965ms)
|
||||||
|
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.925558ms)
|
||||||
|
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.191209ms)
|
||||||
|
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (27.325912ms)
|
||||||
|
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (5.087908ms)
|
||||||
|
ℹ tests 174
|
||||||
|
ℹ suites 0
|
||||||
|
ℹ pass 174
|
||||||
|
ℹ fail 0
|
||||||
|
ℹ cancelled 0
|
||||||
|
ℹ skipped 0
|
||||||
|
ℹ todo 0
|
||||||
|
ℹ duration_ms 9323.231998
|
||||||
@@ -0,0 +1,944 @@
|
|||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/daily-quota-runtime.test.mjs","sha256":"dbbfa80b4082fd44e2f08539b5455653fac062321b8f2106f638e2d8161fa3eb"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
|
||||||
|
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
|
||||||
|
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
|
||||||
|
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
|
||||||
|
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
|
||||||
|
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
|
||||||
|
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
|
||||||
|
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
|
||||||
|
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
|
||||||
|
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
|
||||||
|
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
|
||||||
|
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
|
||||||
|
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
|
||||||
|
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
|
||||||
|
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
|
||||||
|
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
|
||||||
|
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
|
||||||
|
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
|
||||||
|
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
|
||||||
|
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
|
||||||
|
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
|
||||||
|
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
|
||||||
|
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
|
||||||
|
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
|
||||||
|
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
|
||||||
|
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
|
||||||
|
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
|
||||||
|
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
|
||||||
|
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
|
||||||
|
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
|
||||||
|
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
|
||||||
|
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
|
||||||
|
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
|
||||||
|
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
|
||||||
|
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
|
||||||
|
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
|
||||||
|
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
|
||||||
|
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
|
||||||
|
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
|
||||||
|
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
|
||||||
|
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
|
||||||
|
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
|
||||||
|
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
|
||||||
|
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
|
||||||
|
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
|
||||||
|
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
|
||||||
|
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
|
||||||
|
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
|
||||||
|
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
|
||||||
|
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
|
||||||
|
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
|
||||||
|
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
|
||||||
|
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
|
||||||
|
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
|
||||||
|
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
|
||||||
|
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
|
||||||
|
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
|
||||||
|
{"path":"packages/plugins/limit-check/daily-quota/index.mjs","sha256":"3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/limit-checks.test.mjs","sha256":"45870a4903d1996915c0086a6beb4d0a4c75b38386b7c5e6d98b5bc811c3b541"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/plugins/tests/helpers.mjs","sha256":"5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
|
||||||
|
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/process.mjs","sha256":"ed13afdce6359df31d35a79496ebb4afdefef82030a8326a76b2a25b37e98d9d"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/limit-stop.test.mjs","sha256":"561d0950b788d08ad9a79ccd6572ad6976ba4b2e2b1c79d1e4d06827a84c131b"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"roles/assistant.json","sha256":"5f63ff52aaccf06a0f2415ffdd9d1903c202679cf953bef5266a6841b5e39ab7"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/limits-runtime.test.mjs","sha256":"a2e553025edbe6e930c9d03b48289c53b51b153ac9ae49bb21bf721b725f1913"}
|
||||||
|
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
|
||||||
|
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
|
||||||
|
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
|
||||||
|
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
|
||||||
|
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
|
||||||
|
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
|
||||||
|
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
|
||||||
|
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
|
||||||
|
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
|
||||||
|
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
|
||||||
|
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
|
||||||
|
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
|
||||||
|
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
|
||||||
|
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
|
||||||
|
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
|
||||||
|
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
|
||||||
|
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
|
||||||
|
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
|
||||||
|
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
|
||||||
|
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
|
||||||
|
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
|
||||||
|
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
|
||||||
|
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
|
||||||
|
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
|
||||||
|
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
|
||||||
|
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
|
||||||
|
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
|
||||||
|
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
|
||||||
|
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
|
||||||
|
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
|
||||||
|
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
|
||||||
|
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
|
||||||
|
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
|
||||||
|
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
|
||||||
|
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
|
||||||
|
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
|
||||||
|
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
|
||||||
|
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
|
||||||
|
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
|
||||||
|
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
|
||||||
|
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
|
||||||
|
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
|
||||||
|
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
|
||||||
|
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
|
||||||
|
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
|
||||||
|
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
|
||||||
|
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
|
||||||
|
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
|
||||||
|
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
|
||||||
|
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
|
||||||
|
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
|
||||||
|
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
|
||||||
|
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
|
||||||
|
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/p5-key-context.test.mjs","sha256":"e37114eab9c5f21015ea8e429f0574d3ea34b06263f1e42b83b31b8d2df222a7"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/p5-runtime.test.mjs","sha256":"241e779016ffd0b54c5646cb4fac7e21ea1167e77afbd652ff4e01f8d238f99c"}
|
||||||
|
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
|
||||||
|
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
|
||||||
|
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
|
||||||
|
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
|
||||||
|
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
|
||||||
|
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
|
||||||
|
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
|
||||||
|
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
|
||||||
|
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
|
||||||
|
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
|
||||||
|
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
|
||||||
|
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
|
||||||
|
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
|
||||||
|
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
|
||||||
|
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
|
||||||
|
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
|
||||||
|
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
|
||||||
|
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
|
||||||
|
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
|
||||||
|
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
|
||||||
|
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
|
||||||
|
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
|
||||||
|
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
|
||||||
|
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
|
||||||
|
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
|
||||||
|
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
|
||||||
|
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
|
||||||
|
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
|
||||||
|
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
|
||||||
|
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
|
||||||
|
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
|
||||||
|
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
|
||||||
|
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
|
||||||
|
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
|
||||||
|
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
|
||||||
|
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
|
||||||
|
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
|
||||||
|
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
|
||||||
|
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
|
||||||
|
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
|
||||||
|
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
|
||||||
|
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
|
||||||
|
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
|
||||||
|
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
|
||||||
|
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
|
||||||
|
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
|
||||||
|
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
|
||||||
|
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
|
||||||
|
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
|
||||||
|
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
|
||||||
|
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
|
||||||
|
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
|
||||||
|
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
|
||||||
|
{"path":"packages/plugins/usage-source/transcript/index.mjs","sha256":"d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e"}
|
||||||
|
{"path":"packages/plugins/limit-check/daily-quota/index.mjs","sha256":"3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/plugins-verb.test.mjs","sha256":"895ffddbcca1b38fdaa17eefdeca9092a9b9a934d3a54a3bf7857f42fe99fba7"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
|
||||||
|
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
|
||||||
|
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
|
||||||
|
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
|
||||||
|
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
|
||||||
|
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
|
||||||
|
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
|
||||||
|
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
|
||||||
|
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
|
||||||
|
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
|
||||||
|
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
|
||||||
|
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
|
||||||
|
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
|
||||||
|
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
|
||||||
|
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
|
||||||
|
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
|
||||||
|
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
|
||||||
|
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
|
||||||
|
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
|
||||||
|
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
|
||||||
|
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
|
||||||
|
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
|
||||||
|
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
|
||||||
|
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
|
||||||
|
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
|
||||||
|
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
|
||||||
|
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
|
||||||
|
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
|
||||||
|
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
|
||||||
|
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
|
||||||
|
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
|
||||||
|
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
|
||||||
|
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
|
||||||
|
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
|
||||||
|
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
|
||||||
|
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
|
||||||
|
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
|
||||||
|
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
|
||||||
|
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
|
||||||
|
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
|
||||||
|
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
|
||||||
|
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
|
||||||
|
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
|
||||||
|
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
|
||||||
|
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
|
||||||
|
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
|
||||||
|
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
|
||||||
|
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
|
||||||
|
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
|
||||||
|
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
|
||||||
|
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
|
||||||
|
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
|
||||||
|
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
|
||||||
|
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
|
||||||
|
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
|
||||||
|
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
|
||||||
|
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/proxy-usage.test.mjs","sha256":"84c8351029272b6ee05e7fd81b4cc4453553ceeb7a5127a1333dae63d1336ad5"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"packages/plugins/usage/cliproxy-queue/index.mjs","sha256":"6096a577cd5d7e8bf84fd6b98ab284e2f47d5facebd027548e07e6aeec442f96"}
|
||||||
|
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/usage-broker.test.mjs","sha256":"4b2149ea4219f49db19669ada9f88931f7691cdd73dd27dceec6e8fe1f76dd0c"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/usage-runtime.test.mjs","sha256":"5abe93fca8442f06ff68760623e91262d863e1191fa35a3d0c87d7b0e6c0a4c6"}
|
||||||
|
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
|
||||||
|
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
|
||||||
|
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
|
||||||
|
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
|
||||||
|
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
|
||||||
|
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
|
||||||
|
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
|
||||||
|
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
|
||||||
|
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
|
||||||
|
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
|
||||||
|
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
|
||||||
|
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
|
||||||
|
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
|
||||||
|
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
|
||||||
|
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
|
||||||
|
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
|
||||||
|
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
|
||||||
|
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
|
||||||
|
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
|
||||||
|
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
|
||||||
|
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
|
||||||
|
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
|
||||||
|
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
|
||||||
|
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
|
||||||
|
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
|
||||||
|
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
|
||||||
|
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
|
||||||
|
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
|
||||||
|
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
|
||||||
|
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
|
||||||
|
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
|
||||||
|
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
|
||||||
|
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
|
||||||
|
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
|
||||||
|
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
|
||||||
|
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
|
||||||
|
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
|
||||||
|
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
|
||||||
|
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
|
||||||
|
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
|
||||||
|
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
|
||||||
|
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
|
||||||
|
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
|
||||||
|
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
|
||||||
|
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
|
||||||
|
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
|
||||||
|
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
|
||||||
|
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
|
||||||
|
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
|
||||||
|
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
|
||||||
|
{"path":"packages/bus/src/client.mjs","sha256":"f3d483f61a24cbc9cce235e1e92889f09b8cecf513fcaf90c741f316f62262e2"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
|
||||||
|
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
|
||||||
|
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"packages/plugins/usage-source/transcript/index.mjs","sha256":"d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e"}
|
||||||
|
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
|
||||||
|
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
|
||||||
|
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/bus/tests/usage.test.mjs","sha256":"2613ba0561572a7d4f753066922fddc90cca812cb0ce2b3e0a9a4d249a15e340"}
|
||||||
|
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
|
||||||
|
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
|
||||||
|
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
|
||||||
|
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
|
||||||
|
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
|
||||||
|
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
|
||||||
|
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
|
||||||
|
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
|
||||||
|
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
|
||||||
|
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
|
||||||
|
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
|
||||||
|
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
|
||||||
|
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
|
||||||
|
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
|
||||||
|
{"path":"packages/plugins/usage-source/transcript/index.mjs","sha256":"d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e"}
|
||||||
|
{"path":"packages/plugins/tests/helpers.mjs","sha256":"5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/business/tests/plugin-settings.test.mjs","sha256":"f0dfe004905dce31317d85d89a05802db878c3472e765e85dc9f1e04166e1df6"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/business/tests/token-limit-settings.test.mjs","sha256":"bc6b3a31e8918d70aced7151b91ac4b39afec4081054024b162acb0e8f8fae07"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/model-proxy/tests/client-probe.test.mjs","sha256":"77327681d6eb51f25d7aeffcc532b7e8269c1dc59139cb03adb4a3a1409f63e9"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/model-proxy/tests/client.test.mjs","sha256":"790c6a50ec030a8b27a28fac7fd129bd9eabe79774adf11d6620c00df9b6ae86"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/model-proxy/tests/management-key-encoding.test.mjs","sha256":"95e39a519f7ac8b9592876e6157191169f9b14d002163867a6ff6ab808e42c14"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/model-proxy/tests/page-client.test.mjs","sha256":"f24e1d121a340cbcaa3f6cd6390eeb7d4b05f778dd498d76ba099cba5a719dea"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/model-proxy/tests/usage-client.test.mjs","sha256":"1ad66d56800a31cfbd387939e640653bc72150f4e73822d9e3c777b3bffbf1e1"}
|
||||||
|
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/plugins/tests/daily-quota.test.mjs","sha256":"3d4fab56fea4c45c6a317ef41121aa5b6da0502a6ef614b7931f91cafdfc1f71"}
|
||||||
|
{"path":"packages/plugins/limit-check/daily-quota/index.mjs","sha256":"3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/plugins/tests/kinds.test.mjs","sha256":"f3081e1dbdac20ade2246c743bcbb3934be686f79f378af21c365cd1451893ba"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/plugins/tests/loader.test.mjs","sha256":"8588ad7eee0c9ce5de3b53e3b88562812a155a3d791a2bd3413bb1754655d78b"}
|
||||||
|
{"path":"packages/plugins/tests/helpers.mjs","sha256":"5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2"}
|
||||||
|
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/plugins/tests/token-limit.test.mjs","sha256":"6e96bb96278ec754ca1816a24f49ef677771615ab5cf186ae41969fc2f93d8cc"}
|
||||||
|
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/webui/tests/usage-render.test.mjs","sha256":"39f50991578b98594183390a00efbca84fda90ef61617eea4215e2c75f90b82c"}
|
||||||
|
{"path":"packages/webui/src/public/bus.js","sha256":"3c7a35e25b4c1cfda19ac9466d4b2fbc86c880761a1d04ad3ece8bc485f60f93"}
|
||||||
|
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
|
||||||
|
{"path":"packages/webui/tests/usage.test.mjs","sha256":"f96d06974bc83051c0d5c9000e38161ea0cc231997410bcc6c42ed7f55718dfd"}
|
||||||
|
{"path":"packages/webui/src/serve.mjs","sha256":"7b7bee91604b7bd973027b177de83205db9aed366e694072fc6343b46465b5ba"}
|
||||||
|
{"path":"packages/webui/src/proxy-http.mjs","sha256":"a09028cd5ca57367f597d0681e84926ca871fd4626769e9947927d949c2b6ab7"}
|
||||||
|
{"path":"packages/webui/src/tester-socket.mjs","sha256":"1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16"}
|
||||||
|
{"path":"packages/webui/src/bus.mjs","sha256":"4ebf6c2b5d71c23d85cbde83f69aa671058dc2195c9ae4bdda624f6940729d1b"}
|
||||||
|
{"path":"packages/cli/src/transport.mjs","sha256":"662642a8ce739fcb6c188ad07125a94e008c8a305eced127c8041d472c56e55b"}
|
||||||
|
{"path":"packages/cli/src/errors.mjs","sha256":"c7bdd98a3ddeeb9bc4415d907b92555d723c566eba314075d91486da9b5e85dc"}
|
||||||
|
{"path":"packages/cli/src/host.mjs","sha256":"a0936aee783ff47dd58fc907fefd86f63e571809a3ce5b0d6d931f71e756b15e"}
|
||||||
|
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
|
||||||
|
{"path":"packages/bus/src/views.mjs","sha256":"1f31aefa71984fba90c5390df5cc595d929681965f57485ad4972143d5c4b15f"}
|
||||||
|
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
|
||||||
|
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
|
||||||
|
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
|
||||||
|
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
|
||||||
|
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
|
||||||
|
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
|
||||||
|
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
|
||||||
|
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
|
||||||
|
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
|
||||||
|
{"path":"packages/webui/src/reads.mjs","sha256":"46defeb3b4be0e1a22e4b89445872ad6b15cdee182076e9e6222219ae29997f4"}
|
||||||
|
{"path":"packages/business/src/index.mjs","sha256":"a386ce5bd1d41d86f7b90641a423a2b651b491c8989d5085412c7d202ac1cb30"}
|
||||||
|
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
|
||||||
|
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
|
||||||
|
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
|
||||||
|
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
|
||||||
|
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
|
||||||
|
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
|
||||||
|
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
|
||||||
|
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
|
||||||
|
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
|
||||||
|
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
|
||||||
|
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
|
||||||
|
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
|
||||||
|
{"path":"packages/business/src/library-seats.mjs","sha256":"93a7fddac9a08b5f740a0a277b29b8a3459e6f5a4fd33a37212437cb456b9b62"}
|
||||||
|
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
|
||||||
|
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
|
||||||
|
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
|
||||||
|
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
|
||||||
|
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
|
||||||
|
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
|
||||||
|
{"path":"packages/cli/src/boot-status.mjs","sha256":"147a17bbdcbc34efe20a88a4cabe796c101cb63dce621d28103f4de29def4cc2"}
|
||||||
|
{"path":"packages/cli/src/cli.mjs","sha256":"1e663b175e18e39ff68c9ac3a65ff71fc777a6c37ebca035fce6a2783d0aaac3"}
|
||||||
|
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
|
||||||
|
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
|
||||||
|
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
|
||||||
|
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
|
||||||
|
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
|
||||||
|
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
|
||||||
|
{"path":"packages/cli/src/project.mjs","sha256":"6cfe7fd5086ddb59c5666060c6f8044c2852e0f3d5755b1fa206f7521173f300"}
|
||||||
|
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
|
||||||
|
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
|
||||||
|
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
|
||||||
|
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
|
||||||
|
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
|
||||||
|
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
|
||||||
|
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
|
||||||
|
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
|
||||||
|
{"path":"packages/cli/src/config.mjs","sha256":"d960c2a9df3f7c84deff22dad1f0ab120f95ee365984e390de98eba7292b65a1"}
|
||||||
|
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
|
||||||
|
{"path":"packages/cli/src/access.mjs","sha256":"c4949a16173d11f9d32d10d3ddd58a181631848b259bef1998820a78f5694808"}
|
||||||
|
{"path":"packages/cli/src/format.mjs","sha256":"481d9956698df7765ca8556d57164fb78f131708a09900d5a55b9048b5638f5f"}
|
||||||
|
{"path":"packages/cli/src/thread.mjs","sha256":"58888b7731f8009d4c3f8be2caf4445f13dd8f534e1633f6e2720b259fcc3f92"}
|
||||||
|
{"path":"packages/cli/src/session.mjs","sha256":"1a30048032f5bb64419ae9716a1692978bc1a137220a094d1900298aca6ba1d7"}
|
||||||
|
{"path":"packages/cli/src/limits.mjs","sha256":"2f291a71f490f2741edada7a3e3788500f8976a08eb8ab1411f6c5982f778260"}
|
||||||
|
{"path":"packages/business/src/migrate-launch.mjs","sha256":"44fa089c9024934a2f9fb5ef99552eb18d616842210cbc0fc860ea32ce0b1524"}
|
||||||
|
{"path":"packages/cli/src/plugins.mjs","sha256":"f8d9fc24ccd71494fb2914914949cb08948ae93fb3180b9531eb807c921a6f53"}
|
||||||
|
{"path":"packages/cli/src/model-proxy.mjs","sha256":"9a043f122e1d49103bab64716d0eb80cfc09da3c91f7e2eb014b0d8ff0b02f3d"}
|
||||||
|
{"path":"packages/model-proxy/src/fetch.mjs","sha256":"00378d2ea95ac4945899696462f8ff4c70dc020cc58d93663d731d2f2f333783"}
|
||||||
|
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
|
||||||
|
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
|
||||||
|
{"path":"packages/cli/src/credentials.mjs","sha256":"19755f7bb002d8455990c5dc7c458e64aeb95252ec7231a2ed2fd9c638fcb511"}
|
||||||
|
{"path":"packages/cli/src/hosts.mjs","sha256":"60419503898f5e7f3046df5e749098728fbdfea76eb5c53b5dc9b909329abe2e"}
|
||||||
|
{"path":"packages/cli/src/grants.mjs","sha256":"b586907ca8f351f60dc19ec2683df75d2d70ddb12955d09fb14560c9d3bed3dc"}
|
||||||
|
{"path":"packages/cli/src/instances.mjs","sha256":"8d6dab8da62b4458477572ca1956adad57bc0b0d308df6eae57477175c345d7a"}
|
||||||
|
{"path":"packages/plugins/src/channel.mjs","sha256":"5fcecf8336ee247e8ac2f626b21e4c79b1edc49082eadfd536cd23016c6bb756"}
|
||||||
|
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
|
||||||
|
{"path":"packages/cli/src/launcher.mjs","sha256":"373d4c028dfa6d85c748d56f56359789fe2b81987f522ac23747fd37bb5478ed"}
|
||||||
|
{"path":"packages/cli/src/model-stall.mjs","sha256":"0bdc91dcaa096bd3dc9d08a1dea59893a21f6505c843e698ad9c8daa4b74364b"}
|
||||||
|
{"path":"packages/harness/src/bundle.mjs","sha256":"e944a4c7a26d1fe55e13ac1eca31dd86c302dc7c868224b8b000b27255976153"}
|
||||||
|
{"path":"packages/harness/src/tools.mjs","sha256":"38fe84040a78c3f8a8dcde4339d88db3b5df9ef669d605ad1d92ff3e8b646b40"}
|
||||||
|
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
|
||||||
|
{"path":"packages/cli/src/git-socket.mjs","sha256":"3076a53b9891d4d0e084306567b88ded12c4de53a943c029646a424bf59d8e49"}
|
||||||
|
{"path":"packages/seat/src/landing.mjs","sha256":"6f7c938a32b349ee49ce95b89ad499e599f6016e5e9d7efd79a9ea4177b4d175"}
|
||||||
|
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
|
||||||
|
{"path":"packages/cli/src/app.mjs","sha256":"15a8ee212fc37cea28e389f60ddb8916f9e1509cdcfb2e522acfe548702a16dc"}
|
||||||
|
{"path":"packages/cli/src/screens.mjs","sha256":"9d03335628ae62e85c5fbc08c2e739ed0bd43b10d486faf397129a56a1b343e0"}
|
||||||
|
{"path":"packages/conversation/src/terminal.mjs","sha256":"c24d28a073659640b8b027eb12ad150ba895c3001091b892ecef2ec1da40d5cd"}
|
||||||
|
{"path":"packages/conversation/src/client.mjs","sha256":"a45beb82438bb42d97d1e322010e175e785767664e548b90c4125e98b7660003"}
|
||||||
|
{"path":"packages/conversation/src/framing.mjs","sha256":"eaf0772b60bb17fbf9548267c9cfeb0104f92f5cbafdfcb60c1633883eec6432"}
|
||||||
|
{"path":"packages/conversation/src/records.mjs","sha256":"96f7b64c2e2c3493e270224542818fd14f042e3cf0ac14788b3f881010bc25b1"}
|
||||||
|
{"path":"packages/conversation/src/parts.mjs","sha256":"da336ed2a2a149ff56ac12af2440a8353d4573c33e9069381be60f1a0ca70151"}
|
||||||
|
{"path":"packages/conversation/src/transcript.mjs","sha256":"f834ee740e7149e7d2ed976112d0719ce0660270e3b61cf93e1774d112c992a2"}
|
||||||
|
{"path":"packages/cli/src/usage.mjs","sha256":"f9e0c69849633ae36a7a6aa22729a690dc40292178ac3db43accbb131fd7b4ca"}
|
||||||
|
{"path":"packages/tasks/src/fields.mjs","sha256":"c9a883e9a1649277edce97adca40bca2874df7b5312c70e4ac6f6d4a1c860841"}
|
||||||
|
{"path":"packages/webui/src/chat-http.mjs","sha256":"3a5321a5f492a98d342e4ddcc1e9da3522cfff89a4f9bc3f51d2ab1426d3de1b"}
|
||||||
|
{"path":"packages/webui/src/processing-http.mjs","sha256":"c3825a02c3b4f4e5537db4a945439d707e177e74c3e8b1fc2cb777515e610b64"}
|
||||||
|
{"path":"packages/webui/src/decision-http.mjs","sha256":"93d4d0c36d0b74eaace24bce4c3e7179b7418377eb4df6d0f6a9ca89d5eb8e39"}
|
||||||
|
{"path":"packages/webui/tests/fixture.mjs","sha256":"b35d3f3471d6d83ef2d19d6102eaecce2ddec9330f337d7194f1d7be03cbd216"}
|
||||||
|
{"path":"packages/control-board/src/serve.mjs","sha256":"2eb25c46e85ddadd3bdbdbe605db54a6e09845155384a209622554d78307e583"}
|
||||||
|
{"path":"packages/control-board/src/scan.mjs","sha256":"6d74b131af360268be748a1f8f7f2b3f5a9180365e7279426640883fc295a676"}
|
||||||
|
{"path":"packages/control-board/src/discord.mjs","sha256":"8966f1f98ea81b4525345fc4889db5e0e5263ca41b5132ac8dd9bd99a2c88522"}
|
||||||
|
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
|
||||||
|
{"path":"packages/conversation/src/reader.mjs","sha256":"75d0cc982c36b0a81ff23f0da9da1b56906c496250a043f91d3a3b18ffa8e51b"}
|
||||||
|
{"path":"packages/conversation/src/safe-fs.mjs","sha256":"62b0f7e9f798f584fcc0e4ead0522e44fd113bd0803f2bad92ffa480cadb7527"}
|
||||||
|
{"path":"packages/conversation/src/pi.mjs","sha256":"20e781240846298fa65f9a8226b5e1ee1e81338b81229334666d845c17c99ac1"}
|
||||||
|
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
|
||||||
|
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
|
||||||
|
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
|
||||||
|
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1 agents/codex/work/queue-333/trace-inputs.mjs
|
||||||
|
a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7 packages/bus/schema.sql
|
||||||
|
232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23 packages/bus/src/address.mjs
|
||||||
|
c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5 packages/bus/src/broker.mjs
|
||||||
|
ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996 packages/bus/src/business.mjs
|
||||||
|
f3d483f61a24cbc9cce235e1e92889f09b8cecf513fcaf90c741f316f62262e2 packages/bus/src/client.mjs
|
||||||
|
86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f packages/bus/src/credential-verbs.mjs
|
||||||
|
10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678 packages/bus/src/credentials.mjs
|
||||||
|
27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b packages/bus/src/gitea-grant.mjs
|
||||||
|
48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949 packages/bus/src/host-grant.mjs
|
||||||
|
324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593 packages/bus/src/host-run.mjs
|
||||||
|
bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885 packages/bus/src/human.mjs
|
||||||
|
56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd packages/bus/src/interpreter.mjs
|
||||||
|
9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b packages/bus/src/landing.mjs
|
||||||
|
18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3 packages/bus/src/limits.mjs
|
||||||
|
b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07 packages/bus/src/migrations/3b-3c.sql
|
||||||
|
179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65 packages/bus/src/migrations/3b.sql
|
||||||
|
0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56 packages/bus/src/migrations/3c-3d.sql
|
||||||
|
d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077 packages/bus/src/migrations/3d-3e.sql
|
||||||
|
bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3 packages/bus/src/migrations/3e-3f.sql
|
||||||
|
82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05 packages/bus/src/migrations/3f-3g.sql
|
||||||
|
76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0 packages/bus/src/migrations/3g-3h.sql
|
||||||
|
e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035 packages/bus/src/migrations/3h-3i.sql
|
||||||
|
5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031 packages/bus/src/migrations/3i-3j.sql
|
||||||
|
2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4 packages/bus/src/migrations/3j-3k.sql
|
||||||
|
eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58 packages/bus/src/migrations/3k-3l.sql
|
||||||
|
791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156 packages/bus/src/migrations/3l-3m.sql
|
||||||
|
b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a packages/bus/src/migrations/3m-3n.sql
|
||||||
|
b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550 packages/bus/src/model-keys.mjs
|
||||||
|
29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7 packages/bus/src/peercred.mjs
|
||||||
|
2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137 packages/bus/src/principal.mjs
|
||||||
|
ed13afdce6359df31d35a79496ebb4afdefef82030a8326a76b2a25b37e98d9d packages/bus/src/process.mjs
|
||||||
|
cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9 packages/bus/src/proxy-page-vocabulary.mjs
|
||||||
|
af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7 packages/bus/src/proxy-page.mjs
|
||||||
|
5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59 packages/bus/src/proxy-usage.mjs
|
||||||
|
969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6 packages/bus/src/runtime.mjs
|
||||||
|
8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7 packages/bus/src/server.mjs
|
||||||
|
dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84 packages/bus/src/store.mjs
|
||||||
|
5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346 packages/bus/src/tester.mjs
|
||||||
|
4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29 packages/bus/src/usage.mjs
|
||||||
|
1f31aefa71984fba90c5390df5cc595d929681965f57485ad4972143d5c4b15f packages/bus/src/views.mjs
|
||||||
|
68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc packages/bus/src/web.mjs
|
||||||
|
dbbfa80b4082fd44e2f08539b5455653fac062321b8f2106f638e2d8161fa3eb packages/bus/tests/daily-quota-runtime.test.mjs
|
||||||
|
45870a4903d1996915c0086a6beb4d0a4c75b38386b7c5e6d98b5bc811c3b541 packages/bus/tests/limit-checks.test.mjs
|
||||||
|
561d0950b788d08ad9a79ccd6572ad6976ba4b2e2b1c79d1e4d06827a84c131b packages/bus/tests/limit-stop.test.mjs
|
||||||
|
a2e553025edbe6e930c9d03b48289c53b51b153ac9ae49bb21bf721b725f1913 packages/bus/tests/limits-runtime.test.mjs
|
||||||
|
e37114eab9c5f21015ea8e429f0574d3ea34b06263f1e42b83b31b8d2df222a7 packages/bus/tests/p5-key-context.test.mjs
|
||||||
|
241e779016ffd0b54c5646cb4fac7e21ea1167e77afbd652ff4e01f8d238f99c packages/bus/tests/p5-runtime.test.mjs
|
||||||
|
895ffddbcca1b38fdaa17eefdeca9092a9b9a934d3a54a3bf7857f42fe99fba7 packages/bus/tests/plugins-verb.test.mjs
|
||||||
|
84c8351029272b6ee05e7fd81b4cc4453553ceeb7a5127a1333dae63d1336ad5 packages/bus/tests/proxy-usage.test.mjs
|
||||||
|
4b2149ea4219f49db19669ada9f88931f7691cdd73dd27dceec6e8fe1f76dd0c packages/bus/tests/usage-broker.test.mjs
|
||||||
|
5abe93fca8442f06ff68760623e91262d863e1191fa35a3d0c87d7b0e6c0a4c6 packages/bus/tests/usage-runtime.test.mjs
|
||||||
|
2613ba0561572a7d4f753066922fddc90cca812cb0ce2b3e0a9a4d249a15e340 packages/bus/tests/usage.test.mjs
|
||||||
|
af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f packages/business/src/access.mjs
|
||||||
|
aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9 packages/business/src/business.mjs
|
||||||
|
c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73 packages/business/src/credentials.mjs
|
||||||
|
cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a packages/business/src/errors.mjs
|
||||||
|
e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882 packages/business/src/hosts.mjs
|
||||||
|
a386ce5bd1d41d86f7b90641a423a2b651b491c8989d5085412c7d202ac1cb30 packages/business/src/index.mjs
|
||||||
|
09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd packages/business/src/instance-settings.mjs
|
||||||
|
e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96 packages/business/src/launch-settings.mjs
|
||||||
|
0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c packages/business/src/launch.mjs
|
||||||
|
93a7fddac9a08b5f740a0a277b29b8a3459e6f5a4fd33a37212437cb456b9b62 packages/business/src/library-seats.mjs
|
||||||
|
44fa089c9024934a2f9fb5ef99552eb18d616842210cbc0fc860ea32ce0b1524 packages/business/src/migrate-launch.mjs
|
||||||
|
fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7 packages/business/src/organization.mjs
|
||||||
|
9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50 packages/business/src/plugin-settings.mjs
|
||||||
|
9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff packages/business/src/project.mjs
|
||||||
|
712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109 packages/business/src/resolve.mjs
|
||||||
|
b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9 packages/business/src/role.mjs
|
||||||
|
e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c packages/business/src/util.mjs
|
||||||
|
f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421 packages/business/src/vars.mjs
|
||||||
|
de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb packages/business/src/vocabulary.mjs
|
||||||
|
a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1 packages/business/tests/helpers.mjs
|
||||||
|
f0dfe004905dce31317d85d89a05802db878c3472e765e85dc9f1e04166e1df6 packages/business/tests/plugin-settings.test.mjs
|
||||||
|
bc6b3a31e8918d70aced7151b91ac4b39afec4081054024b162acb0e8f8fae07 packages/business/tests/token-limit-settings.test.mjs
|
||||||
|
c4949a16173d11f9d32d10d3ddd58a181631848b259bef1998820a78f5694808 packages/cli/src/access.mjs
|
||||||
|
15a8ee212fc37cea28e389f60ddb8916f9e1509cdcfb2e522acfe548702a16dc packages/cli/src/app.mjs
|
||||||
|
147a17bbdcbc34efe20a88a4cabe796c101cb63dce621d28103f4de29def4cc2 packages/cli/src/boot-status.mjs
|
||||||
|
1e663b175e18e39ff68c9ac3a65ff71fc777a6c37ebca035fce6a2783d0aaac3 packages/cli/src/cli.mjs
|
||||||
|
d960c2a9df3f7c84deff22dad1f0ab120f95ee365984e390de98eba7292b65a1 packages/cli/src/config.mjs
|
||||||
|
19755f7bb002d8455990c5dc7c458e64aeb95252ec7231a2ed2fd9c638fcb511 packages/cli/src/credentials.mjs
|
||||||
|
c7bdd98a3ddeeb9bc4415d907b92555d723c566eba314075d91486da9b5e85dc packages/cli/src/errors.mjs
|
||||||
|
481d9956698df7765ca8556d57164fb78f131708a09900d5a55b9048b5638f5f packages/cli/src/format.mjs
|
||||||
|
3076a53b9891d4d0e084306567b88ded12c4de53a943c029646a424bf59d8e49 packages/cli/src/git-socket.mjs
|
||||||
|
b586907ca8f351f60dc19ec2683df75d2d70ddb12955d09fb14560c9d3bed3dc packages/cli/src/grants.mjs
|
||||||
|
a0936aee783ff47dd58fc907fefd86f63e571809a3ce5b0d6d931f71e756b15e packages/cli/src/host.mjs
|
||||||
|
60419503898f5e7f3046df5e749098728fbdfea76eb5c53b5dc9b909329abe2e packages/cli/src/hosts.mjs
|
||||||
|
8d6dab8da62b4458477572ca1956adad57bc0b0d308df6eae57477175c345d7a packages/cli/src/instances.mjs
|
||||||
|
373d4c028dfa6d85c748d56f56359789fe2b81987f522ac23747fd37bb5478ed packages/cli/src/launcher.mjs
|
||||||
|
2f291a71f490f2741edada7a3e3788500f8976a08eb8ab1411f6c5982f778260 packages/cli/src/limits.mjs
|
||||||
|
9a043f122e1d49103bab64716d0eb80cfc09da3c91f7e2eb014b0d8ff0b02f3d packages/cli/src/model-proxy.mjs
|
||||||
|
0bdc91dcaa096bd3dc9d08a1dea59893a21f6505c843e698ad9c8daa4b74364b packages/cli/src/model-stall.mjs
|
||||||
|
f8d9fc24ccd71494fb2914914949cb08948ae93fb3180b9531eb807c921a6f53 packages/cli/src/plugins.mjs
|
||||||
|
6cfe7fd5086ddb59c5666060c6f8044c2852e0f3d5755b1fa206f7521173f300 packages/cli/src/project.mjs
|
||||||
|
9d03335628ae62e85c5fbc08c2e739ed0bd43b10d486faf397129a56a1b343e0 packages/cli/src/screens.mjs
|
||||||
|
1a30048032f5bb64419ae9716a1692978bc1a137220a094d1900298aca6ba1d7 packages/cli/src/session.mjs
|
||||||
|
58888b7731f8009d4c3f8be2caf4445f13dd8f534e1633f6e2720b259fcc3f92 packages/cli/src/thread.mjs
|
||||||
|
662642a8ce739fcb6c188ad07125a94e008c8a305eced127c8041d472c56e55b packages/cli/src/transport.mjs
|
||||||
|
f9e0c69849633ae36a7a6aa22729a690dc40292178ac3db43accbb131fd7b4ca packages/cli/src/usage.mjs
|
||||||
|
8966f1f98ea81b4525345fc4889db5e0e5263ca41b5132ac8dd9bd99a2c88522 packages/control-board/src/discord.mjs
|
||||||
|
6d74b131af360268be748a1f8f7f2b3f5a9180365e7279426640883fc295a676 packages/control-board/src/scan.mjs
|
||||||
|
2eb25c46e85ddadd3bdbdbe605db54a6e09845155384a209622554d78307e583 packages/control-board/src/serve.mjs
|
||||||
|
a45beb82438bb42d97d1e322010e175e785767664e548b90c4125e98b7660003 packages/conversation/src/client.mjs
|
||||||
|
eaf0772b60bb17fbf9548267c9cfeb0104f92f5cbafdfcb60c1633883eec6432 packages/conversation/src/framing.mjs
|
||||||
|
da336ed2a2a149ff56ac12af2440a8353d4573c33e9069381be60f1a0ca70151 packages/conversation/src/parts.mjs
|
||||||
|
20e781240846298fa65f9a8226b5e1ee1e81338b81229334666d845c17c99ac1 packages/conversation/src/pi.mjs
|
||||||
|
75d0cc982c36b0a81ff23f0da9da1b56906c496250a043f91d3a3b18ffa8e51b packages/conversation/src/reader.mjs
|
||||||
|
96f7b64c2e2c3493e270224542818fd14f042e3cf0ac14788b3f881010bc25b1 packages/conversation/src/records.mjs
|
||||||
|
62b0f7e9f798f584fcc0e4ead0522e44fd113bd0803f2bad92ffa480cadb7527 packages/conversation/src/safe-fs.mjs
|
||||||
|
c24d28a073659640b8b027eb12ad150ba895c3001091b892ecef2ec1da40d5cd packages/conversation/src/terminal.mjs
|
||||||
|
f834ee740e7149e7d2ed976112d0719ce0660270e3b61cf93e1774d112c992a2 packages/conversation/src/transcript.mjs
|
||||||
|
5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec packages/discord/src/binding.mjs
|
||||||
|
917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed packages/discord/src/errors.mjs
|
||||||
|
c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7 packages/discord/src/git.mjs
|
||||||
|
12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5 packages/discord/src/journal.mjs
|
||||||
|
8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783 packages/discord/src/processing.mjs
|
||||||
|
ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387 packages/discord/src/setspark.mjs
|
||||||
|
975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f packages/discord/src/tools.mjs
|
||||||
|
e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7 packages/discord/src/web.mjs
|
||||||
|
e944a4c7a26d1fe55e13ac1eca31dd86c302dc7c868224b8b000b27255976153 packages/harness/src/bundle.mjs
|
||||||
|
a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b packages/harness/src/gate.mjs
|
||||||
|
38fe84040a78c3f8a8dcde4339d88db3b5df9ef669d605ad1d92ff3e8b646b40 packages/harness/src/tools.mjs
|
||||||
|
f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2 packages/library/src/guard.mjs
|
||||||
|
70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7 packages/library/src/index-build.mjs
|
||||||
|
98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e packages/library/src/index.mjs
|
||||||
|
98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530 packages/library/src/limits.mjs
|
||||||
|
def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc packages/library/src/links.mjs
|
||||||
|
c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802 packages/library/src/mapping.mjs
|
||||||
|
26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae packages/library/src/mirror.mjs
|
||||||
|
0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31 packages/library/src/problems.mjs
|
||||||
|
bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0 packages/library/src/query.mjs
|
||||||
|
ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d packages/library/src/reader.mjs
|
||||||
|
bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5 packages/library/src/render.mjs
|
||||||
|
7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809 packages/library/src/reply-protocol.mjs
|
||||||
|
97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192 packages/library/src/scope.mjs
|
||||||
|
6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c packages/library/src/supporting.mjs
|
||||||
|
016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093 packages/library/src/survey.mjs
|
||||||
|
a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa packages/library/src/sync.mjs
|
||||||
|
a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198 packages/library/src/write.mjs
|
||||||
|
889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b packages/model-proxy/PIN
|
||||||
|
f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441 packages/model-proxy/src/client.mjs
|
||||||
|
a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23 packages/model-proxy/src/common.mjs
|
||||||
|
00378d2ea95ac4945899696462f8ff4c70dc020cc58d93663d731d2f2f333783 packages/model-proxy/src/fetch.mjs
|
||||||
|
1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb packages/model-proxy/src/settings.mjs
|
||||||
|
e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1 packages/model-proxy/src/validation.mjs
|
||||||
|
77327681d6eb51f25d7aeffcc532b7e8269c1dc59139cb03adb4a3a1409f63e9 packages/model-proxy/tests/client-probe.test.mjs
|
||||||
|
790c6a50ec030a8b27a28fac7fd129bd9eabe79774adf11d6620c00df9b6ae86 packages/model-proxy/tests/client.test.mjs
|
||||||
|
95e39a519f7ac8b9592876e6157191169f9b14d002163867a6ff6ab808e42c14 packages/model-proxy/tests/management-key-encoding.test.mjs
|
||||||
|
f24e1d121a340cbcaa3f6cd6390eeb7d4b05f778dd498d76ba099cba5a719dea packages/model-proxy/tests/page-client.test.mjs
|
||||||
|
1ad66d56800a31cfbd387939e640653bc72150f4e73822d9e3c777b3bffbf1e1 packages/model-proxy/tests/usage-client.test.mjs
|
||||||
|
a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a packages/plugins/harness/claude-code/index.mjs
|
||||||
|
aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd packages/plugins/harness/pi/compactions.mjs
|
||||||
|
39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af packages/plugins/harness/pi/index.mjs
|
||||||
|
3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b packages/plugins/limit-check/daily-quota/index.mjs
|
||||||
|
4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524 packages/plugins/limit-check/token-limit/index.mjs
|
||||||
|
5fcecf8336ee247e8ac2f626b21e4c79b1edc49082eadfd536cd23016c6bb756 packages/plugins/src/channel.mjs
|
||||||
|
eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78 packages/plugins/src/kinds.mjs
|
||||||
|
2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f packages/plugins/src/loader.mjs
|
||||||
|
3d4fab56fea4c45c6a317ef41121aa5b6da0502a6ef614b7931f91cafdfc1f71 packages/plugins/tests/daily-quota.test.mjs
|
||||||
|
5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2 packages/plugins/tests/helpers.mjs
|
||||||
|
f3081e1dbdac20ade2246c743bcbb3934be686f79f378af21c365cd1451893ba packages/plugins/tests/kinds.test.mjs
|
||||||
|
8588ad7eee0c9ce5de3b53e3b88562812a155a3d791a2bd3413bb1754655d78b packages/plugins/tests/loader.test.mjs
|
||||||
|
6e96bb96278ec754ca1816a24f49ef677771615ab5cf186ae41969fc2f93d8cc packages/plugins/tests/token-limit.test.mjs
|
||||||
|
d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e packages/plugins/usage-source/transcript/index.mjs
|
||||||
|
6096a577cd5d7e8bf84fd6b98ab284e2f47d5facebd027548e07e6aeec442f96 packages/plugins/usage/cliproxy-queue/index.mjs
|
||||||
|
781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd packages/processing-control/src/containers.mjs
|
||||||
|
ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73 packages/processing-control/src/coordinator.mjs
|
||||||
|
3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17 packages/processing-control/src/effects.mjs
|
||||||
|
7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea packages/processing-control/src/runtimes.mjs
|
||||||
|
ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed packages/processing-control/src/state.mjs
|
||||||
|
925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b packages/project/schemas/decision.schema.json
|
||||||
|
f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de packages/project/schemas/project.schema.json
|
||||||
|
79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3 packages/project/schemas/requirement.schema.json
|
||||||
|
af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e packages/project/src/git.mjs
|
||||||
|
3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899 packages/project/src/index.mjs
|
||||||
|
bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9 packages/project/src/paths.mjs
|
||||||
|
42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c packages/project/src/read.mjs
|
||||||
|
e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5 packages/project/src/validate.mjs
|
||||||
|
5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d packages/seat/src/checkout.mjs
|
||||||
|
c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774 packages/seat/src/compactions.mjs
|
||||||
|
6f7c938a32b349ee49ce95b89ad499e599f6016e5e9d7efd79a9ea4177b4d175 packages/seat/src/landing.mjs
|
||||||
|
382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198 packages/seat/src/proc.mjs
|
||||||
|
0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf packages/seat/src/sandbox.mjs
|
||||||
|
eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15 packages/seat/src/seat.mjs
|
||||||
|
c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41 packages/seat/src/session.mjs
|
||||||
|
621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3 packages/seat/src/working.mjs
|
||||||
|
80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1 packages/tasks/requirements.json
|
||||||
|
c9a883e9a1649277edce97adca40bca2874df7b5312c70e4ac6f6d4a1c860841 packages/tasks/src/fields.mjs
|
||||||
|
38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d packages/tasks/src/requirements.mjs
|
||||||
|
4ebf6c2b5d71c23d85cbde83f69aa671058dc2195c9ae4bdda624f6940729d1b packages/webui/src/bus.mjs
|
||||||
|
3a5321a5f492a98d342e4ddcc1e9da3522cfff89a4f9bc3f51d2ab1426d3de1b packages/webui/src/chat-http.mjs
|
||||||
|
93d4d0c36d0b74eaace24bce4c3e7179b7418377eb4df6d0f6a9ca89d5eb8e39 packages/webui/src/decision-http.mjs
|
||||||
|
c3825a02c3b4f4e5537db4a945439d707e177e74c3e8b1fc2cb777515e610b64 packages/webui/src/processing-http.mjs
|
||||||
|
a09028cd5ca57367f597d0681e84926ca871fd4626769e9947927d949c2b6ab7 packages/webui/src/proxy-http.mjs
|
||||||
|
3c7a35e25b4c1cfda19ac9466d4b2fbc86c880761a1d04ad3ece8bc485f60f93 packages/webui/src/public/bus.js
|
||||||
|
46defeb3b4be0e1a22e4b89445872ad6b15cdee182076e9e6222219ae29997f4 packages/webui/src/reads.mjs
|
||||||
|
7b7bee91604b7bd973027b177de83205db9aed366e694072fc6343b46465b5ba packages/webui/src/serve.mjs
|
||||||
|
1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16 packages/webui/src/tester-socket.mjs
|
||||||
|
b35d3f3471d6d83ef2d19d6102eaecce2ddec9330f337d7194f1d7be03cbd216 packages/webui/tests/fixture.mjs
|
||||||
|
39f50991578b98594183390a00efbca84fda90ef61617eea4215e2c75f90b82c packages/webui/tests/usage-render.test.mjs
|
||||||
|
f96d06974bc83051c0d5c9000e38161ea0cc231997410bcc6c42ed7f55718dfd packages/webui/tests/usage.test.mjs
|
||||||
|
5f63ff52aaccf06a0f2415ffdd9d1903c202679cf953bef5266a6841b5e39ab7 roles/assistant.json
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
agents/codex/work/queue-333/trace-inputs.mjs: OK
|
||||||
|
packages/bus/schema.sql: OK
|
||||||
|
packages/bus/src/address.mjs: OK
|
||||||
|
packages/bus/src/broker.mjs: OK
|
||||||
|
packages/bus/src/business.mjs: OK
|
||||||
|
packages/bus/src/client.mjs: OK
|
||||||
|
packages/bus/src/credential-verbs.mjs: OK
|
||||||
|
packages/bus/src/credentials.mjs: OK
|
||||||
|
packages/bus/src/gitea-grant.mjs: OK
|
||||||
|
packages/bus/src/host-grant.mjs: OK
|
||||||
|
packages/bus/src/host-run.mjs: OK
|
||||||
|
packages/bus/src/human.mjs: OK
|
||||||
|
packages/bus/src/interpreter.mjs: OK
|
||||||
|
packages/bus/src/landing.mjs: OK
|
||||||
|
packages/bus/src/limits.mjs: OK
|
||||||
|
packages/bus/src/migrations/3b-3c.sql: OK
|
||||||
|
packages/bus/src/migrations/3b.sql: OK
|
||||||
|
packages/bus/src/migrations/3c-3d.sql: OK
|
||||||
|
packages/bus/src/migrations/3d-3e.sql: OK
|
||||||
|
packages/bus/src/migrations/3e-3f.sql: OK
|
||||||
|
packages/bus/src/migrations/3f-3g.sql: OK
|
||||||
|
packages/bus/src/migrations/3g-3h.sql: OK
|
||||||
|
packages/bus/src/migrations/3h-3i.sql: OK
|
||||||
|
packages/bus/src/migrations/3i-3j.sql: OK
|
||||||
|
packages/bus/src/migrations/3j-3k.sql: OK
|
||||||
|
packages/bus/src/migrations/3k-3l.sql: OK
|
||||||
|
packages/bus/src/migrations/3l-3m.sql: OK
|
||||||
|
packages/bus/src/migrations/3m-3n.sql: OK
|
||||||
|
packages/bus/src/model-keys.mjs: OK
|
||||||
|
packages/bus/src/peercred.mjs: OK
|
||||||
|
packages/bus/src/principal.mjs: OK
|
||||||
|
packages/bus/src/process.mjs: OK
|
||||||
|
packages/bus/src/proxy-page-vocabulary.mjs: OK
|
||||||
|
packages/bus/src/proxy-page.mjs: OK
|
||||||
|
packages/bus/src/proxy-usage.mjs: OK
|
||||||
|
packages/bus/src/runtime.mjs: OK
|
||||||
|
packages/bus/src/server.mjs: OK
|
||||||
|
packages/bus/src/store.mjs: OK
|
||||||
|
packages/bus/src/tester.mjs: OK
|
||||||
|
packages/bus/src/usage.mjs: OK
|
||||||
|
packages/bus/src/views.mjs: OK
|
||||||
|
packages/bus/src/web.mjs: OK
|
||||||
|
packages/bus/tests/daily-quota-runtime.test.mjs: OK
|
||||||
|
packages/bus/tests/limit-checks.test.mjs: OK
|
||||||
|
packages/bus/tests/limit-stop.test.mjs: OK
|
||||||
|
packages/bus/tests/limits-runtime.test.mjs: OK
|
||||||
|
packages/bus/tests/p5-key-context.test.mjs: OK
|
||||||
|
packages/bus/tests/p5-runtime.test.mjs: OK
|
||||||
|
packages/bus/tests/plugins-verb.test.mjs: OK
|
||||||
|
packages/bus/tests/proxy-usage.test.mjs: OK
|
||||||
|
packages/bus/tests/usage-broker.test.mjs: OK
|
||||||
|
packages/bus/tests/usage-runtime.test.mjs: OK
|
||||||
|
packages/bus/tests/usage.test.mjs: OK
|
||||||
|
packages/business/src/access.mjs: OK
|
||||||
|
packages/business/src/business.mjs: OK
|
||||||
|
packages/business/src/credentials.mjs: OK
|
||||||
|
packages/business/src/errors.mjs: OK
|
||||||
|
packages/business/src/hosts.mjs: OK
|
||||||
|
packages/business/src/index.mjs: OK
|
||||||
|
packages/business/src/instance-settings.mjs: OK
|
||||||
|
packages/business/src/launch-settings.mjs: OK
|
||||||
|
packages/business/src/launch.mjs: OK
|
||||||
|
packages/business/src/library-seats.mjs: OK
|
||||||
|
packages/business/src/migrate-launch.mjs: OK
|
||||||
|
packages/business/src/organization.mjs: OK
|
||||||
|
packages/business/src/plugin-settings.mjs: OK
|
||||||
|
packages/business/src/project.mjs: OK
|
||||||
|
packages/business/src/resolve.mjs: OK
|
||||||
|
packages/business/src/role.mjs: OK
|
||||||
|
packages/business/src/util.mjs: OK
|
||||||
|
packages/business/src/vars.mjs: OK
|
||||||
|
packages/business/src/vocabulary.mjs: OK
|
||||||
|
packages/business/tests/helpers.mjs: OK
|
||||||
|
packages/business/tests/plugin-settings.test.mjs: OK
|
||||||
|
packages/business/tests/token-limit-settings.test.mjs: OK
|
||||||
|
packages/cli/src/access.mjs: OK
|
||||||
|
packages/cli/src/app.mjs: OK
|
||||||
|
packages/cli/src/boot-status.mjs: OK
|
||||||
|
packages/cli/src/cli.mjs: OK
|
||||||
|
packages/cli/src/config.mjs: OK
|
||||||
|
packages/cli/src/credentials.mjs: OK
|
||||||
|
packages/cli/src/errors.mjs: OK
|
||||||
|
packages/cli/src/format.mjs: OK
|
||||||
|
packages/cli/src/git-socket.mjs: OK
|
||||||
|
packages/cli/src/grants.mjs: OK
|
||||||
|
packages/cli/src/host.mjs: OK
|
||||||
|
packages/cli/src/hosts.mjs: OK
|
||||||
|
packages/cli/src/instances.mjs: OK
|
||||||
|
packages/cli/src/launcher.mjs: OK
|
||||||
|
packages/cli/src/limits.mjs: OK
|
||||||
|
packages/cli/src/model-proxy.mjs: OK
|
||||||
|
packages/cli/src/model-stall.mjs: OK
|
||||||
|
packages/cli/src/plugins.mjs: OK
|
||||||
|
packages/cli/src/project.mjs: OK
|
||||||
|
packages/cli/src/screens.mjs: OK
|
||||||
|
packages/cli/src/session.mjs: OK
|
||||||
|
packages/cli/src/thread.mjs: OK
|
||||||
|
packages/cli/src/transport.mjs: OK
|
||||||
|
packages/cli/src/usage.mjs: OK
|
||||||
|
packages/control-board/src/discord.mjs: OK
|
||||||
|
packages/control-board/src/scan.mjs: OK
|
||||||
|
packages/control-board/src/serve.mjs: OK
|
||||||
|
packages/conversation/src/client.mjs: OK
|
||||||
|
packages/conversation/src/framing.mjs: OK
|
||||||
|
packages/conversation/src/parts.mjs: OK
|
||||||
|
packages/conversation/src/pi.mjs: OK
|
||||||
|
packages/conversation/src/reader.mjs: OK
|
||||||
|
packages/conversation/src/records.mjs: OK
|
||||||
|
packages/conversation/src/safe-fs.mjs: OK
|
||||||
|
packages/conversation/src/terminal.mjs: OK
|
||||||
|
packages/conversation/src/transcript.mjs: OK
|
||||||
|
packages/discord/src/binding.mjs: OK
|
||||||
|
packages/discord/src/errors.mjs: OK
|
||||||
|
packages/discord/src/git.mjs: OK
|
||||||
|
packages/discord/src/journal.mjs: OK
|
||||||
|
packages/discord/src/processing.mjs: OK
|
||||||
|
packages/discord/src/setspark.mjs: OK
|
||||||
|
packages/discord/src/tools.mjs: OK
|
||||||
|
packages/discord/src/web.mjs: OK
|
||||||
|
packages/harness/src/bundle.mjs: OK
|
||||||
|
packages/harness/src/gate.mjs: OK
|
||||||
|
packages/harness/src/tools.mjs: OK
|
||||||
|
packages/library/src/guard.mjs: OK
|
||||||
|
packages/library/src/index-build.mjs: OK
|
||||||
|
packages/library/src/index.mjs: OK
|
||||||
|
packages/library/src/limits.mjs: OK
|
||||||
|
packages/library/src/links.mjs: OK
|
||||||
|
packages/library/src/mapping.mjs: OK
|
||||||
|
packages/library/src/mirror.mjs: OK
|
||||||
|
packages/library/src/problems.mjs: OK
|
||||||
|
packages/library/src/query.mjs: OK
|
||||||
|
packages/library/src/reader.mjs: OK
|
||||||
|
packages/library/src/render.mjs: OK
|
||||||
|
packages/library/src/reply-protocol.mjs: OK
|
||||||
|
packages/library/src/scope.mjs: OK
|
||||||
|
packages/library/src/supporting.mjs: OK
|
||||||
|
packages/library/src/survey.mjs: OK
|
||||||
|
packages/library/src/sync.mjs: OK
|
||||||
|
packages/library/src/write.mjs: OK
|
||||||
|
packages/model-proxy/PIN: OK
|
||||||
|
packages/model-proxy/src/client.mjs: OK
|
||||||
|
packages/model-proxy/src/common.mjs: OK
|
||||||
|
packages/model-proxy/src/fetch.mjs: OK
|
||||||
|
packages/model-proxy/src/settings.mjs: OK
|
||||||
|
packages/model-proxy/src/validation.mjs: OK
|
||||||
|
packages/model-proxy/tests/client-probe.test.mjs: OK
|
||||||
|
packages/model-proxy/tests/client.test.mjs: OK
|
||||||
|
packages/model-proxy/tests/management-key-encoding.test.mjs: OK
|
||||||
|
packages/model-proxy/tests/page-client.test.mjs: OK
|
||||||
|
packages/model-proxy/tests/usage-client.test.mjs: OK
|
||||||
|
packages/plugins/harness/claude-code/index.mjs: OK
|
||||||
|
packages/plugins/harness/pi/compactions.mjs: OK
|
||||||
|
packages/plugins/harness/pi/index.mjs: OK
|
||||||
|
packages/plugins/limit-check/daily-quota/index.mjs: OK
|
||||||
|
packages/plugins/limit-check/token-limit/index.mjs: OK
|
||||||
|
packages/plugins/src/channel.mjs: OK
|
||||||
|
packages/plugins/src/kinds.mjs: OK
|
||||||
|
packages/plugins/src/loader.mjs: OK
|
||||||
|
packages/plugins/tests/daily-quota.test.mjs: OK
|
||||||
|
packages/plugins/tests/helpers.mjs: OK
|
||||||
|
packages/plugins/tests/kinds.test.mjs: OK
|
||||||
|
packages/plugins/tests/loader.test.mjs: OK
|
||||||
|
packages/plugins/tests/token-limit.test.mjs: OK
|
||||||
|
packages/plugins/usage-source/transcript/index.mjs: OK
|
||||||
|
packages/plugins/usage/cliproxy-queue/index.mjs: OK
|
||||||
|
packages/processing-control/src/containers.mjs: OK
|
||||||
|
packages/processing-control/src/coordinator.mjs: OK
|
||||||
|
packages/processing-control/src/effects.mjs: OK
|
||||||
|
packages/processing-control/src/runtimes.mjs: OK
|
||||||
|
packages/processing-control/src/state.mjs: OK
|
||||||
|
packages/project/schemas/decision.schema.json: OK
|
||||||
|
packages/project/schemas/project.schema.json: OK
|
||||||
|
packages/project/schemas/requirement.schema.json: OK
|
||||||
|
packages/project/src/git.mjs: OK
|
||||||
|
packages/project/src/index.mjs: OK
|
||||||
|
packages/project/src/paths.mjs: OK
|
||||||
|
packages/project/src/read.mjs: OK
|
||||||
|
packages/project/src/validate.mjs: OK
|
||||||
|
packages/seat/src/checkout.mjs: OK
|
||||||
|
packages/seat/src/compactions.mjs: OK
|
||||||
|
packages/seat/src/landing.mjs: OK
|
||||||
|
packages/seat/src/proc.mjs: OK
|
||||||
|
packages/seat/src/sandbox.mjs: OK
|
||||||
|
packages/seat/src/seat.mjs: OK
|
||||||
|
packages/seat/src/session.mjs: OK
|
||||||
|
packages/seat/src/working.mjs: OK
|
||||||
|
packages/tasks/requirements.json: OK
|
||||||
|
packages/tasks/src/fields.mjs: OK
|
||||||
|
packages/tasks/src/requirements.mjs: OK
|
||||||
|
packages/webui/src/bus.mjs: OK
|
||||||
|
packages/webui/src/chat-http.mjs: OK
|
||||||
|
packages/webui/src/decision-http.mjs: OK
|
||||||
|
packages/webui/src/processing-http.mjs: OK
|
||||||
|
packages/webui/src/proxy-http.mjs: OK
|
||||||
|
packages/webui/src/public/bus.js: OK
|
||||||
|
packages/webui/src/reads.mjs: OK
|
||||||
|
packages/webui/src/serve.mjs: OK
|
||||||
|
packages/webui/src/tester-socket.mjs: OK
|
||||||
|
packages/webui/tests/fixture.mjs: OK
|
||||||
|
packages/webui/tests/usage-render.test.mjs: OK
|
||||||
|
packages/webui/tests/usage.test.mjs: OK
|
||||||
|
roles/assistant.json: OK
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// Final scoped verification only: records paths/hashes, never file contents.
|
||||||
|
import fs from 'node:fs';
|
||||||
|
import { createHash } from 'node:crypto';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import { resolve, relative, isAbsolute } from 'node:path';
|
||||||
|
import { registerHooks, syncBuiltinESMExports } from 'node:module';
|
||||||
|
const root = process.env.P5_SOURCE_ROOT;
|
||||||
|
const target = process.env.P5_INPUT_TRACE;
|
||||||
|
const read = fs.readFileSync.bind(fs), append = fs.appendFileSync.bind(fs);
|
||||||
|
const seen = new Set();
|
||||||
|
function record(path) {
|
||||||
|
try {
|
||||||
|
if (path instanceof URL) path = fileURLToPath(path);
|
||||||
|
if (typeof path !== 'string') return;
|
||||||
|
path = resolve(path);
|
||||||
|
const rel = relative(root, path);
|
||||||
|
if (rel.startsWith('..') || isAbsolute(rel) || rel.startsWith('agents/codex/work/queue-333/receipts/') || rel === relative(root,target)) return;
|
||||||
|
const sha256 = createHash('sha256').update(read(path)).digest('hex');
|
||||||
|
const key = rel + ':' + sha256;
|
||||||
|
if (!seen.has(key)) { seen.add(key); append(target,JSON.stringify({path:rel,sha256})+'\n'); }
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
fs.readFileSync = function(path,...args) { const answer=read(path,...args);record(path);return answer; };
|
||||||
|
syncBuiltinESMExports();
|
||||||
|
registerHooks({ load(url,context,next) { const answer=next(url,context);if(url.startsWith('file:'))record(fileURLToPath(url));return answer; } });
|
||||||
|
record(fileURLToPath(import.meta.url));
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
# Run from the repository root. Explicit current whole files; no package/full gate.
|
||||||
|
p5root=$(mktemp -d /tmp/p5-scoped-XXXXXX)
|
||||||
|
trap 'rm -rf "$p5root"' EXIT
|
||||||
|
mkdir "$p5root/home" "$p5root/config" "$p5root/tmp"
|
||||||
|
export HOME="$p5root/home" XDG_CONFIG_HOME="$p5root/config" TMPDIR="$p5root/tmp" MOSAIC_CONFIG="$p5root/config/absent.json"
|
||||||
|
export P5_SOURCE_ROOT="$PWD" P5_INPUT_TRACE="$PWD/agents/codex/work/queue-333/receipts/source-inputs.raw.jsonl"
|
||||||
|
: > "$P5_INPUT_TRACE"
|
||||||
|
printf '%s\n' 'serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets'
|
||||||
|
nice -n 19 node --import ./agents/codex/work/queue-333/trace-inputs.mjs --test --test-concurrency=1 \
|
||||||
|
packages/model-proxy/tests/usage-client.test.mjs \
|
||||||
|
packages/model-proxy/tests/client.test.mjs \
|
||||||
|
packages/model-proxy/tests/client-probe.test.mjs \
|
||||||
|
packages/model-proxy/tests/page-client.test.mjs \
|
||||||
|
packages/model-proxy/tests/management-key-encoding.test.mjs \
|
||||||
|
packages/plugins/tests/kinds.test.mjs \
|
||||||
|
packages/plugins/tests/loader.test.mjs \
|
||||||
|
packages/plugins/tests/token-limit.test.mjs \
|
||||||
|
packages/plugins/tests/daily-quota.test.mjs \
|
||||||
|
packages/business/tests/plugin-settings.test.mjs \
|
||||||
|
packages/business/tests/token-limit-settings.test.mjs \
|
||||||
|
packages/bus/tests/usage.test.mjs \
|
||||||
|
packages/bus/tests/proxy-usage.test.mjs \
|
||||||
|
packages/bus/tests/p5-runtime.test.mjs \
|
||||||
|
packages/bus/tests/p5-key-context.test.mjs \
|
||||||
|
packages/bus/tests/limit-checks.test.mjs \
|
||||||
|
packages/bus/tests/usage-runtime.test.mjs \
|
||||||
|
packages/bus/tests/usage-broker.test.mjs \
|
||||||
|
packages/bus/tests/daily-quota-runtime.test.mjs \
|
||||||
|
packages/bus/tests/limits-runtime.test.mjs \
|
||||||
|
packages/bus/tests/limit-stop.test.mjs \
|
||||||
|
packages/bus/tests/plugins-verb.test.mjs \
|
||||||
|
packages/webui/tests/usage.test.mjs \
|
||||||
|
packages/webui/tests/usage-render.test.mjs
|
||||||
@@ -1879,3 +1879,7 @@ are never rewritten or removed; corrections are new entries.
|
|||||||
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
|
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
|
||||||
|
|
||||||
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
|
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
|
||||||
|
|
||||||
|
2026-10-26 | Codex P5 builder | row333/Mos1961 isolated t3/model-proxy-p5-quota-usage at 09a847eda; clean base verified, queue next refused linked worktree (no canonical mutation) | implementation started; local fake-only serial nice19 verification; parent owns review/full gates/landing.
|
||||||
|
|
||||||
|
2026-10-26 | Codex P5 builder | row333/Mos1961 implementation candidate on isolated base09a847eda | 174/174 scoped whole-file GREEN; upstream-value mutant killed/restored+positive; native current/retiring key ownership fail-closed and telemetry isolated; 202 consumed inputs frozen in agents/codex/work/queue-333; own scratch cleaned; parent fresh review/full/browser gate pending1014.Q264; no queue/remote/push/landing.
|
||||||
@@ -4930,7 +4930,7 @@ export class Broker {
|
|||||||
if (!role && !s.human && !s.tester) fail("human-required");
|
if (!role && !s.human && !s.tester) fail("human-required");
|
||||||
if (!this.#organization) fail("not-configured");
|
if (!this.#organization) fail("not-configured");
|
||||||
if (["limits", "plugins", "instances", "routes", "organization.revision"].includes(request.verb)) keys(args, []);
|
if (["limits", "plugins", "instances", "routes", "organization.revision"].includes(request.verb)) keys(args, []);
|
||||||
else if (request.verb === "plugins.set") keys(args, ["revision", "plugins"], ["revision", "plugins"]);
|
else if (request.verb === "plugins.set") keys(args, ["revision", "plugins", "usage"], ["revision", "plugins"]);
|
||||||
// Row 165 (#1662): instances.set is human-only and outside ORGANIZATION_KEYS, so
|
// Row 165 (#1662): instances.set is human-only and outside ORGANIZATION_KEYS, so
|
||||||
// organization.set and the chief of staff's tool never reach it (sage-0918).
|
// organization.set and the chief of staff's tool never reach it (sage-0918).
|
||||||
else if (request.verb === "instances.set") {
|
else if (request.verb === "instances.set") {
|
||||||
@@ -5303,7 +5303,7 @@ export class Broker {
|
|||||||
if (!this.#limits) return;
|
if (!this.#limits) return;
|
||||||
let answer;
|
let answer;
|
||||||
try {
|
try {
|
||||||
answer = await this.#limits.mustStop(s.business, { instance: s.role, provider: s.provider ?? null, model: s.model ?? null, account: s.account ?? null });
|
answer = await this.#limits.mustStop(s.business, { instance: s.role, provider: s.provider ?? null, model: s.model ?? null, account: s.account ?? null }, { run: s.run });
|
||||||
} catch {
|
} catch {
|
||||||
answer = { stop: true, check: null, code: 'check-threw' };
|
answer = { stop: true, check: null, code: 'check-threw' };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class Failure extends Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// makeLoader is the plug-in loader's factory; tests pass a scratch tree's copy to load fixture checks.
|
// makeLoader is the plug-in loader's factory; tests pass a scratch tree's copy to load fixture checks.
|
||||||
export function createLimits({ store, read, log, makeLoader = createLoader }) {
|
export function createLimits({ store, read, log, makeLoader = createLoader, keyForSubject = () => null }) {
|
||||||
if (typeof read !== 'function' || typeof log !== 'function') throw new TypeError('createLimits needs read and log');
|
if (typeof read !== 'function' || typeof log !== 'function') throw new TypeError('createLimits needs read and log');
|
||||||
const loaders = new Map();
|
const loaders = new Map();
|
||||||
const loaderFor = business => {
|
const loaderFor = business => {
|
||||||
@@ -111,7 +111,7 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
|
|||||||
|
|
||||||
// mayLaunch and mustStop: every switched-on check is asked in order; the first refusal or
|
// mayLaunch and mustStop: every switched-on check is asked in order; the first refusal or
|
||||||
// stop wins. key is the answer's boolean (allow, stop) and go its value when nothing is hit.
|
// stop wins. key is the answer's boolean (allow, stop) and go its value when nothing is hit.
|
||||||
async function decide(business, subject, name, key, go, halt) {
|
async function decide(business, subject, name, key, go, halt, context = {}) {
|
||||||
await refresh(business);
|
await refresh(business);
|
||||||
let st;
|
let st;
|
||||||
try { st = state(business); } catch (e) {
|
try { st = state(business); } catch (e) {
|
||||||
@@ -123,6 +123,18 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
|
|||||||
return halt({ check: st.missing, code: 'not-loaded' });
|
return halt({ check: st.missing, code: 'not-loaded' });
|
||||||
}
|
}
|
||||||
const leaves = limitLeaves(st.limits);
|
const leaves = limitLeaves(st.limits);
|
||||||
|
if (Object.keys(st.limits?.tokens?.keys ?? {}).some(k => /^[a-f0-9]{12}$/.test(k))) {
|
||||||
|
let modelKeyId;
|
||||||
|
try {
|
||||||
|
if (name === 'mustStop' && (typeof context?.run !== 'string' || !context.run)) throw new Failure('proxy-key-refused');
|
||||||
|
modelKeyId = keyForSubject(business, { ...subject, ...context });
|
||||||
|
} catch {}
|
||||||
|
if (typeof modelKeyId !== 'string' || !/^[a-f0-9]{12}$/.test(modelKeyId)) {
|
||||||
|
log({ event: 'limit-check-failed', business, check: null, export: name, code: 'proxy-key-refused' });
|
||||||
|
return halt({ check: null, code: 'proxy-key-refused' });
|
||||||
|
}
|
||||||
|
subject = { ...subject, modelKeyId };
|
||||||
|
}
|
||||||
const args = { business, limits: st.limits, subject, records: st.records, now: new Date().toISOString() };
|
const args = { business, limits: st.limits, subject, records: st.records, now: new Date().toISOString() };
|
||||||
for (const check of st.checks) {
|
for (const check of st.checks) {
|
||||||
const { answer, code } = ask(business, check, name, args, a =>
|
const { answer, code } = ask(business, check, name, args, a =>
|
||||||
@@ -136,14 +148,15 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
|
|||||||
return { [key]: go };
|
return { [key]: go };
|
||||||
}
|
}
|
||||||
|
|
||||||
const subjectOf = ({ instance, provider = null, model = null, account = null }) => ({ instance, provider, model, account });
|
const subjectOf = ({ instance, provider = null, model = null, account = null }) =>
|
||||||
|
({ instance, provider, model, account });
|
||||||
|
|
||||||
// { allow: true } | { allow: false, check, hit } | { allow: false, check, code }
|
// { allow: true } | { allow: false, check, hit } | { allow: false, check, code }
|
||||||
const mayLaunch = (business, subject) =>
|
const mayLaunch = (business, subject) =>
|
||||||
decide(business, subjectOf(subject), 'mayLaunch', 'allow', true, why => ({ allow: false, ...why }));
|
decide(business, subjectOf(subject), 'mayLaunch', 'allow', true, why => ({ allow: false, ...why }));
|
||||||
// { stop: false } | { stop: true, check, hit } | { stop: true, check, code }
|
// { stop: false } | { stop: true, check, hit } | { stop: true, check, code }
|
||||||
const mustStop = (business, subject) =>
|
const mustStop = (business, subject, context = {}) =>
|
||||||
decide(business, subjectOf(subject), 'mustStop', 'stop', false, why => ({ stop: true, ...why }));
|
decide(business, subjectOf(subject), 'mustStop', 'stop', false, why => ({ stop: true, ...why }), context);
|
||||||
|
|
||||||
const validEntry = (e, leaves) => {
|
const validEntry = (e, leaves) => {
|
||||||
const leaf = plainObject(e) && Array.isArray(e.path) && leaves.find(l => same(l.path, e.path));
|
const leaf = plainObject(e) && Array.isArray(e.path) && leaves.find(l => same(l.path, e.path));
|
||||||
@@ -187,3 +200,20 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
|
|||||||
|
|
||||||
return { refresh, mayLaunch, mustStop, report };
|
return { refresh, mayLaunch, mustStop, report };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Host metadata adapter, extracted from runtime so ownership cases are testable.
|
||||||
|
export function modelUsageKey(records, runs, business, subject) {
|
||||||
|
const fail = () => { throw new Failure('proxy-key-refused'); };
|
||||||
|
const instance = business + '/' + subject.instance;
|
||||||
|
const owners = records.filter(r => r.service === 'model' && r.instance === instance);
|
||||||
|
if (owners.length !== 1 || !/^[a-f0-9]{12}$/.test(owners[0].keyId ?? '')) fail();
|
||||||
|
const record = owners[0], ids = [record.keyId, ...(record.retiring ?? []).map(r => r.keyId)];
|
||||||
|
if (ids.some(id => !/^[a-f0-9]{12}$/.test(id ?? '')) || new Set(ids).size !== ids.length) fail();
|
||||||
|
// A key ID must identify exactly this owner, including retained generations.
|
||||||
|
for (const other of records.filter(r => r.service === 'model' && r !== record))
|
||||||
|
if ([other.keyId, ...(other.retiring ?? []).map(r => r.keyId)].some(id => ids.includes(id))) fail();
|
||||||
|
if (!subject.run) return record.keyId;
|
||||||
|
const run = runs.get(business + ':' + subject.run);
|
||||||
|
if (!run || run.instance !== instance || !ids.includes(run.keyId)) fail();
|
||||||
|
return run.keyId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
// P5: one reader per broker/data root drains the instance queue once, then routes
|
||||||
|
// safe IDs to the owning business. It never supplies records to limit checks.
|
||||||
|
import { randomUUID } from 'node:crypto';
|
||||||
|
import { createLoader } from '../../plugins/src/loader.mjs';
|
||||||
|
import { checkUsageSettings } from '../../plugins/src/kinds.mjs';
|
||||||
|
const SOURCE = '@proxy/cliproxy-queue';
|
||||||
|
const KINDS = ['input', 'output', 'cacheWrite', 'cacheRead'];
|
||||||
|
const ID = /^[a-f0-9]{12}$/;
|
||||||
|
const plain = n => n <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(n) : String(n);
|
||||||
|
export function createProxyUsage({ store, read, client, records, log, now = Date.now }) {
|
||||||
|
const loader = createLoader({ log });
|
||||||
|
let due = 0, previous = '', pending = null, closed = false;
|
||||||
|
const states = new Map();
|
||||||
|
function configured() {
|
||||||
|
return Object.entries(read()).filter(([, b]) => b.plugins?.usage === 'cliproxy-queue').map(([business, b]) => {
|
||||||
|
checkUsageSettings(b.usage ?? {});
|
||||||
|
return { business, pollSeconds: b.usage?.cliproxyQueue?.pollSeconds ?? 15 };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async function poll() {
|
||||||
|
let enabled;
|
||||||
|
try { enabled = configured(); }
|
||||||
|
catch { log({ action: 'proxy.usage', code: 'invalid-usage-settings' }); return; }
|
||||||
|
if (!enabled.length) { previous = ''; return; }
|
||||||
|
const signature = JSON.stringify(enabled);
|
||||||
|
if (signature !== previous) { previous = signature; due = 0; }
|
||||||
|
if (now() < due) return;
|
||||||
|
due = now() + Math.min(...enabled.map(b => b.pollSeconds)) * 1000;
|
||||||
|
try {
|
||||||
|
await loader.load({ usage: 'cliproxy-queue' });
|
||||||
|
const module = loader.modules('usage')[0], management = client();
|
||||||
|
if (!module || !management) throw Error('unavailable');
|
||||||
|
const events = await module.read({ client: management });
|
||||||
|
const owners = new Map();
|
||||||
|
for (const record of records()) {
|
||||||
|
if (record.service !== 'model') continue;
|
||||||
|
const split = record.instance.indexOf('/'), business = record.instance.slice(0, split), instance = record.instance.slice(split + 1);
|
||||||
|
if (split < 1) continue;
|
||||||
|
for (const keyId of [record.keyId, ...(record.retiring ?? []).map(r => r.keyId)]) {
|
||||||
|
if (!ID.test(keyId ?? '')) continue;
|
||||||
|
if (owners.has(keyId)) throw Error('ambiguous');
|
||||||
|
owners.set(keyId, { business, instance });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Validate all plug-in answers before writing any row or log field.
|
||||||
|
if (!Array.isArray(events) || events.length > 100 || events.some(e => !e || !ID.test(e.keyId ?? '') || !ID.test(e.accountId ?? '')
|
||||||
|
|| typeof e.managed !== 'boolean' || typeof e.failed !== 'boolean'
|
||||||
|
|| (e.statusCode !== null && (!Number.isSafeInteger(e.statusCode) || e.statusCode < 0 || e.statusCode > 599))
|
||||||
|
|| KINDS.some(k => !Number.isSafeInteger(e[k]) || e[k] < 0))) throw Error('invalid');
|
||||||
|
const unknown = [];
|
||||||
|
store.transaction(() => {
|
||||||
|
for (const e of events) {
|
||||||
|
const owner = owners.get(e.keyId);
|
||||||
|
if (!owner) { if (e.managed) unknown.push(e.keyId); continue; }
|
||||||
|
if (!enabled.some(b => b.business === owner.business)) continue;
|
||||||
|
// Whitelist fields; never persist raw plug-in results. Cursor holds only
|
||||||
|
// metadata, and turnRecords excludes SOURCE before every quota decision.
|
||||||
|
store.run(`INSERT INTO usage_records(at,business,run,instance,account,turn,source,phase,status,code,cursor,input,output,cache_write,cache_read)
|
||||||
|
VALUES (?,?,?,?,?,?,?,'end','known',?,?,?,?,?,?)`, new Date(now()).toISOString(), owner.business, '@proxy', owner.instance,
|
||||||
|
e.accountId, randomUUID(), SOURCE, e.failed ? 'proxy-upstream-failed' : null,
|
||||||
|
JSON.stringify({ modelKeyId: e.keyId, failed: e.failed, statusCode: e.statusCode }), e.input, e.output, e.cacheWrite, e.cacheRead);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (const keyId of unknown) log({ action: 'proxy.usage.reconcile', keyId, code: 'proxy-usage-unknown-key' });
|
||||||
|
for (const { business } of enabled) states.set(business, 'available');
|
||||||
|
} catch {
|
||||||
|
for (const { business } of enabled) states.set(business, 'unavailable');
|
||||||
|
log({ action: 'proxy.usage', code: 'proxy-usage-read-failed' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function tick() {
|
||||||
|
if (closed) return Promise.resolve();
|
||||||
|
if (pending) return pending;
|
||||||
|
pending = poll().finally(() => { pending = null; });
|
||||||
|
return pending;
|
||||||
|
}
|
||||||
|
function view(business) {
|
||||||
|
try { if (!configured().some(b => b.business === business)) return null; } catch { return null; }
|
||||||
|
const byKey = new Map(), byAccount = new Map();
|
||||||
|
for (const r of store.all('SELECT * FROM usage_records WHERE business=? AND source=? ORDER BY seq', business, SOURCE)) {
|
||||||
|
const meta = JSON.parse(r.cursor);
|
||||||
|
for (const [map, identity] of [[byKey, { keyId: meta.modelKeyId }], [byAccount, { accountId: r.account }]]) {
|
||||||
|
const id = Object.values(identity)[0];
|
||||||
|
if (!map.has(id)) map.set(id, { ...identity, input: 0n, output: 0n, cacheWrite: 0n, cacheRead: 0n, requests: 0, failures: 0, statuses: {} });
|
||||||
|
const entry = map.get(id);
|
||||||
|
for (const [key, column] of [['input','input'],['output','output'],['cacheWrite','cache_write'],['cacheRead','cache_read']]) entry[key] += BigInt(r[column]);
|
||||||
|
entry.requests++; if (meta.failed) entry.failures++;
|
||||||
|
if (meta.failed && meta.statusCode !== null) entry.statuses[meta.statusCode] = (entry.statuses[meta.statusCode] ?? 0) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const finish = map => [...map.values()].map(e => ({ ...e, ...Object.fromEntries(KINDS.map(k => [k, plain(e[k])])) }));
|
||||||
|
return { source: 'proxy', state: states.get(business) ?? 'unread', byKey: finish(byKey), byAccount: finish(byAccount) };
|
||||||
|
}
|
||||||
|
return { tick, view, async close() { closed = true; await pending; } };
|
||||||
|
}
|
||||||
@@ -35,7 +35,8 @@ import { loadAccess } from '../../business/src/access.mjs';
|
|||||||
import { inspectInterpreter, recordInterpreterStart } from './interpreter.mjs';
|
import { inspectInterpreter, recordInterpreterStart } from './interpreter.mjs';
|
||||||
import { createPeerReader } from './peercred.mjs';
|
import { createPeerReader } from './peercred.mjs';
|
||||||
import { createUsage } from './usage.mjs';
|
import { createUsage } from './usage.mjs';
|
||||||
import { createLimits } from './limits.mjs';
|
import { createProxyUsage } from './proxy-usage.mjs';
|
||||||
|
import { createLimits, modelUsageKey } from './limits.mjs';
|
||||||
import { createProcessing } from '../../processing-control/src/coordinator.mjs';
|
import { createProcessing } from '../../processing-control/src/coordinator.mjs';
|
||||||
import { discordProcessingHooks } from '../../discord/src/processing.mjs';
|
import { discordProcessingHooks } from '../../discord/src/processing.mjs';
|
||||||
import { createContainerStopper } from '../../processing-control/src/containers.mjs';
|
import { createContainerStopper } from '../../processing-control/src/containers.mjs';
|
||||||
@@ -265,7 +266,7 @@ export async function startBroker({
|
|||||||
|| (Object.hasOwn(librarySync, 'intervalMs') && !(Number.isSafeInteger(librarySync.intervalMs) && librarySync.intervalMs > 0))
|
|| (Object.hasOwn(librarySync, 'intervalMs') && !(Number.isSafeInteger(librarySync.intervalMs) && librarySync.intervalMs > 0))
|
||||||
|| (Object.hasOwn(librarySync, 'configDir') && typeof librarySync.configDir !== 'string')))
|
|| (Object.hasOwn(librarySync, 'configDir') && typeof librarySync.configDir !== 'string')))
|
||||||
throw new BusError('invalid-host-request');
|
throw new BusError('invalid-host-request');
|
||||||
let modelProxyClient = null, proxyPage = null;
|
let modelProxyClient = null, proxyPage = null, proxyUsage = null, usageTimer = null;
|
||||||
let modelKeys = null, modelTimer = null, modelSweep = null;
|
let modelKeys = null, modelTimer = null, modelSweep = null;
|
||||||
const modelRuns = new Map();
|
const modelRuns = new Map();
|
||||||
let store, credentials, server, adapter, processing, syncTimer = null, syncPass = null, accessTimer = null;
|
let store, credentials, server, adapter, processing, syncTimer = null, syncPass = null, accessTimer = null;
|
||||||
@@ -379,12 +380,18 @@ export async function startBroker({
|
|||||||
const proxyOrganization = modelKeys ? modelOrganization({ modelKeys, writer: organizationWriter({ dir: organization.dir, rolesDir: organization.rolesDir }) }) : null;
|
const proxyOrganization = modelKeys ? modelOrganization({ modelKeys, writer: organizationWriter({ dir: organization.dir, rolesDir: organization.rolesDir }) }) : null;
|
||||||
const instances=organization?instanceSettings({dir:organization.dir,rolesDir:organization.rolesDir,system:organization.system,levels,revoke,
|
const instances=organization?instanceSettings({dir:organization.dir,rolesDir:organization.rolesDir,system:organization.system,levels,revoke,
|
||||||
...(proxyOrganization ? { writer: proxyOrganization.writer, revoke: proxyOrganization.revoke(revoke) } : {})}):null;
|
...(proxyOrganization ? { writer: proxyOrganization.writer, revoke: proxyOrganization.revoke(revoke) } : {})}):null;
|
||||||
const usage = await createUsage({ store, dataRoot, businesses,
|
const usageLog = entry => process.stderr.write(`usage: ${JSON.stringify(entry)}\n`);
|
||||||
log: entry => process.stderr.write(`usage: ${JSON.stringify(entry)}\n`) });
|
const keyForRun = (business, run) => modelRuns.get(business + ':' + run)?.keyId ?? null;
|
||||||
|
const usage = await createUsage({ store, dataRoot, businesses, log: usageLog, keyForRun,
|
||||||
|
proxyView: business => proxyUsage?.view(business) ?? null });
|
||||||
|
proxyUsage = createProxyUsage({ store, log: usageLog, client: () => modelProxyClient,
|
||||||
|
records: () => credentials.status(),
|
||||||
|
read: () => Object.fromEntries(Object.keys(businesses).map(id => [id, settings ? settings.current(id) : businesses[id]])) });
|
||||||
// Row 125 (#1619, REQ-LIMIT-3, REQ-LIMIT-4): the limit checks read the organization file at
|
// Row 125 (#1619, REQ-LIMIT-3, REQ-LIMIT-4): the limit checks read the organization file at
|
||||||
// each ask, so a limit, a reset or a switched-on check takes effect without a restart.
|
// each ask, so a limit, a reset or a switched-on check takes effect without a restart.
|
||||||
const limitLog = entry => process.stderr.write(`limits: ${JSON.stringify(entry)}\n`);
|
const limitLog = entry => process.stderr.write(`limits: ${JSON.stringify(entry)}\n`);
|
||||||
const limits = createLimits({ store, read: id => settings ? settings.current(id) : businesses[id], log: limitLog });
|
const limits = createLimits({ store, read: id => settings ? settings.current(id) : businesses[id], log: limitLog,
|
||||||
|
keyForSubject: (business, subject) => modelUsageKey(credentials.status(), modelRuns, business, subject) });
|
||||||
for (const id of Object.keys(businesses)) await limits.refresh(id);
|
for (const id of Object.keys(businesses)) await limits.refresh(id);
|
||||||
const withTokens = (id, result) => ({ ...result, tokens: limits.report(id) });
|
const withTokens = (id, result) => ({ ...result, tokens: limits.report(id) });
|
||||||
// Row 210 (#1707, design D7 step 6) and row 234 (#1740, r6 E2): the run dir and the host enrollment half.
|
// Row 210 (#1707, design D7 step 6) and row 234 (#1740, r6 E2): the run dir and the host enrollment half.
|
||||||
@@ -853,6 +860,11 @@ export async function startBroker({
|
|||||||
}, 1000);
|
}, 1000);
|
||||||
modelTimer.unref();
|
modelTimer.unref();
|
||||||
}
|
}
|
||||||
|
// One bounded queue read at a time. The service applies the configured
|
||||||
|
// 1..59 second poll deadline; this tick only checks whether a read is due.
|
||||||
|
usageTimer = setInterval(() => { proxyUsage.tick().catch(() => usageLog({ action: 'proxy.usage', code: 'proxy-usage-read-failed' })); }, 1000);
|
||||||
|
usageTimer.unref();
|
||||||
|
await proxyUsage.tick();
|
||||||
return {
|
return {
|
||||||
broker,
|
broker,
|
||||||
credentials,
|
credentials,
|
||||||
@@ -916,6 +928,8 @@ export async function startBroker({
|
|||||||
launches: bound,
|
launches: bound,
|
||||||
readers: readCaps,
|
readers: readCaps,
|
||||||
async close() {
|
async close() {
|
||||||
|
clearInterval(usageTimer);
|
||||||
|
await proxyUsage.close();
|
||||||
clearInterval(modelTimer);
|
clearInterval(modelTimer);
|
||||||
await modelSweep;
|
await modelSweep;
|
||||||
clearInterval(accessTimer);
|
clearInterval(accessTimer);
|
||||||
@@ -928,6 +942,8 @@ export async function startBroker({
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
clearInterval(usageTimer);
|
||||||
|
await proxyUsage?.close();
|
||||||
clearInterval(modelTimer);
|
clearInterval(modelTimer);
|
||||||
clearInterval(accessTimer);
|
clearInterval(accessTimer);
|
||||||
await server?.close();
|
await server?.close();
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ function delta(before, after) {
|
|||||||
export function turnRecords(store, business) {
|
export function turnRecords(store, business) {
|
||||||
const turns = new Map();
|
const turns = new Map();
|
||||||
for (const row of store.all(`SELECT * FROM usage_records WHERE business=? ORDER BY seq`, business)) {
|
for (const row of store.all(`SELECT * FROM usage_records WHERE business=? ORDER BY seq`, business)) {
|
||||||
|
if (row.source === '@proxy/cliproxy-queue') continue; // telemetry never drives quotas
|
||||||
const key = JSON.stringify([row.run, row.turn, row.source]);
|
const key = JSON.stringify([row.run, row.turn, row.source]);
|
||||||
if (row.phase === 'end' || !turns.has(key)) turns.set(key, row);
|
if (row.phase === 'end' || !turns.has(key)) turns.set(key, row);
|
||||||
}
|
}
|
||||||
@@ -45,13 +46,14 @@ export function turnRecords(store, business) {
|
|||||||
const known = row.phase === 'end' && row.status === 'known';
|
const known = row.phase === 'end' && row.status === 'known';
|
||||||
return {
|
return {
|
||||||
at: row.at, run: row.run, turn: row.turn, source: row.source, instance: row.instance,
|
at: row.at, run: row.run, turn: row.turn, source: row.source, instance: row.instance,
|
||||||
|
modelKeyId: row.cursor ? JSON.parse(row.cursor).modelKeyId ?? null : null,
|
||||||
provider: row.provider, model: row.model, account: row.account, status: known ? 'known' : 'unknown',
|
provider: row.provider, model: row.model, account: row.account, status: known ? 'known' : 'unknown',
|
||||||
input: known ? row.input : null, output: known ? row.output : null,
|
input: known ? row.input : null, output: known ? row.output : null,
|
||||||
cacheWrite: known ? row.cache_write : null, cacheRead: known ? row.cache_read : null,
|
cacheWrite: known ? row.cache_write : null, cacheRead: known ? row.cache_read : null,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
export async function createUsage({ store, businesses, log }) {
|
export async function createUsage({ store, businesses, log, keyForRun = () => null, proxyView = () => null }) {
|
||||||
const loaders = new Map();
|
const loaders = new Map();
|
||||||
for (const [id, b] of Object.entries(businesses)) {
|
for (const [id, b] of Object.entries(businesses)) {
|
||||||
const loader = createLoader({ log });
|
const loader = createLoader({ log });
|
||||||
@@ -70,6 +72,9 @@ export async function createUsage({ store, businesses, log }) {
|
|||||||
const sources = modules.length ? modules.map((module, i) => ({ module, name: names[i] })) : [{ name: '@none' }];
|
const sources = modules.length ? modules.map((module, i) => ({ module, name: names[i] })) : [{ name: '@none' }];
|
||||||
// Preserve a failed/disabled baseline even if configuration changes between calls/restarts.
|
// Preserve a failed/disabled baseline even if configuration changes between calls/restarts.
|
||||||
for (const base of bases) if (!sources.some(s => s.name === base.source)) sources.push({ name: base.source });
|
for (const base of bases) if (!sources.some(s => s.name === base.source)) sources.push({ name: base.source });
|
||||||
|
const captured = bases.find(row => row.cursor && JSON.parse(row.cursor).modelKeyId)?.cursor;
|
||||||
|
const candidate = captured ? JSON.parse(captured).modelKeyId : keyForRun(business, run);
|
||||||
|
const modelKeyId = typeof candidate === 'string' && /^[a-f0-9]{12}$/.test(candidate) ? candidate : null;
|
||||||
const rows = [];
|
const rows = [];
|
||||||
// Row 65 (#1558): where the run's harness keeps its session files is the module's transcript(),
|
// Row 65 (#1558): where the run's harness keeps its session files is the module's transcript(),
|
||||||
// which the launcher binds into the run record. A run bound without one has no reading.
|
// which the launcher binds into the run record. A run bound without one has no reading.
|
||||||
@@ -92,7 +97,7 @@ export async function createUsage({ store, businesses, log }) {
|
|||||||
store.run(`INSERT INTO usage_records(at,business,run,instance,provider,model,account,turn,source,phase,status,code,cursor,input,output,cache_write,cache_read)
|
store.run(`INSERT INTO usage_records(at,business,run,instance,provider,model,account,turn,source,phase,status,code,cursor,input,output,cache_write,cache_read)
|
||||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, new Date().toISOString(), business, run, instance,
|
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, new Date().toISOString(), business, run, instance,
|
||||||
provider, model, account, turn, name, phase, result.status, result.code ?? null,
|
provider, model, account, turn, name, phase, result.status, result.code ?? null,
|
||||||
phase === 'begin' ? JSON.stringify(result) : null,
|
phase === 'begin' ? JSON.stringify({ ...result, ...(modelKeyId ? { modelKeyId } : {}) }) : modelKeyId ? JSON.stringify({ modelKeyId }) : null,
|
||||||
known ? counts.input : null, known ? counts.output : null, known ? counts.cacheWrite : null, known ? counts.cacheRead : null);
|
known ? counts.input : null, known ? counts.output : null, known ? counts.cacheWrite : null, known ? counts.cacheRead : null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -109,7 +114,7 @@ export async function createUsage({ store, businesses, log }) {
|
|||||||
return op.finally(() => { if (pending.get(key) === tail) pending.delete(key); });
|
return op.finally(() => { if (pending.get(key) === tail) pending.delete(key); });
|
||||||
}
|
}
|
||||||
function view(business) {
|
function view(business) {
|
||||||
const groups = { byRun: new Map(), byInstance: new Map(), byProvider: new Map(), byModel: new Map(), byAccount: new Map() };
|
const groups = { byRun: new Map(), byInstance: new Map(), byProvider: new Map(), byModel: new Map(), byAccount: new Map(), byKey: new Map() };
|
||||||
const total = { ...zero(), unknown: new Set() };
|
const total = { ...zero(), unknown: new Set() };
|
||||||
const add = (target, row) => {
|
const add = (target, row) => {
|
||||||
if (row.status !== 'known') target.unknown.add(row.run + ':' + row.turn);
|
if (row.status !== 'known') target.unknown.add(row.run + ':' + row.turn);
|
||||||
@@ -118,7 +123,7 @@ export async function createUsage({ store, businesses, log }) {
|
|||||||
for (const row of turnRecords(store, business)) {
|
for (const row of turnRecords(store, business)) {
|
||||||
add(total, row);
|
add(total, row);
|
||||||
for (const [name, identity] of Object.entries({ byRun: { run: row.run }, byInstance: { instance: row.instance },
|
for (const [name, identity] of Object.entries({ byRun: { run: row.run }, byInstance: { instance: row.instance },
|
||||||
byProvider: { provider: row.provider }, byModel: { provider: row.provider, model: row.model }, byAccount: { account: row.account } })) {
|
byKey: { modelKeyId: row.modelKeyId }, byProvider: { provider: row.provider }, byModel: { provider: row.provider, model: row.model }, byAccount: { account: row.account } })) {
|
||||||
const key = JSON.stringify(identity);
|
const key = JSON.stringify(identity);
|
||||||
if (!groups[name].has(key)) groups[name].set(key, { ...identity, ...zero(), unknown: new Set() });
|
if (!groups[name].has(key)) groups[name].set(key, { ...identity, ...zero(), unknown: new Set() });
|
||||||
add(groups[name].get(key), row);
|
add(groups[name].get(key), row);
|
||||||
@@ -129,7 +134,8 @@ export async function createUsage({ store, businesses, log }) {
|
|||||||
for (const kind of KINDS) rest[kind] = BigInt(rest[kind]) <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(rest[kind]) : String(rest[kind]);
|
for (const kind of KINDS) rest[kind] = BigInt(rest[kind]) <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(rest[kind]) : String(rest[kind]);
|
||||||
return { ...rest, unknownTurns: unknown.size };
|
return { ...rest, unknownTurns: unknown.size };
|
||||||
};
|
};
|
||||||
return { total: finish(total), ...Object.fromEntries(Object.entries(groups).map(([key, map]) => [key, [...map.values()].map(finish)])) };
|
const proxy = proxyView(business);
|
||||||
|
return { ...(proxy ? { proxy } : {}), total: finish(total), ...Object.fromEntries(Object.entries(groups).map(([key, map]) => [key, [...map.values()].map(finish)])) };
|
||||||
}
|
}
|
||||||
return { collect, view };
|
return { collect, view };
|
||||||
}
|
}
|
||||||
@@ -324,3 +324,33 @@ test('REQ-LIMIT-3 core reaches limit checks only through the plug-in loader', ()
|
|||||||
assert.doesNotMatch(readFileSync(new URL(file, import.meta.url), 'utf8'), /limit-check\/|token-limit/, file);
|
assert.doesNotMatch(readFileSync(new URL(file, import.meta.url), 'utf8'), /limit-check\/|token-limit/, file);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error', async t => {
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'p5-limit-')),store=new Store(root),log=[];t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
|
||||||
|
const key='012345abcdef',doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[key]:{limit:5,since:SINCE}}}}}};
|
||||||
|
for(const lookup of [()=>null,()=>['012345abcdef','abcdef012345'],()=> 'msk-private-lookup',()=>{throw Error('PRIVATE-LOOKUP-CANARY');}]) {
|
||||||
|
const l=createLimits({store,read:()=>doc,log:e=>log.push(e),keyForSubject:lookup});
|
||||||
|
assert.deepEqual(await l.mayLaunch('demo',SUBJECT),{allow:false,check:null,code:'proxy-key-refused'});
|
||||||
|
assert.deepEqual(await l.mustStop('demo',SUBJECT,{run:'old-run'}),{stop:true,check:null,code:'proxy-key-refused'});
|
||||||
|
}
|
||||||
|
assert.equal(JSON.stringify(log).includes('PRIVATE-LOOKUP-CANARY'),false);assert.equal(JSON.stringify(log).includes('msk-private-lookup'),false);
|
||||||
|
});
|
||||||
|
test('P5 trusted lookup uses the retiring run key rather than the agent current key',async t=>{
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'p5-old-key-')),store=new Store(root);t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
|
||||||
|
const old='012345abcdef',current='abcdef012345',doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[old]:{limit:0,since:SINCE}}}}}};
|
||||||
|
const l=createLimits({store,read:()=>doc,log:()=>{},keyForSubject:(_,s)=>s.run==='old-run'?old:current});
|
||||||
|
assert.equal((await l.mayLaunch('demo',SUBJECT)).allow,true);
|
||||||
|
assert.equal((await l.mustStop('demo',SUBJECT,{run:'old-run'})).stop,true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run',async()=>{
|
||||||
|
const { modelUsageKey }=await import('../src/limits.mjs');
|
||||||
|
const old='012345abcdef',current='abcdef012345';
|
||||||
|
const rows=[{service:'model',instance:'demo/coder',keyId:current,retiring:[{keyId:old}]},{service:'model',instance:'other/coder',keyId:'123456abcdef',retiring:[]}];
|
||||||
|
const runs=new Map([['demo:old-run',{instance:'demo/coder',keyId:old}],['demo:foreign-run',{instance:'other/coder',keyId:'123456abcdef'}]]);
|
||||||
|
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder'}),current);
|
||||||
|
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder',run:'old-run'}),old);
|
||||||
|
for(const [rs,s] of [[rows,{instance:'coder',run:'absent'}],[rows,{instance:'coder',run:'foreign-run'}],[[...rows,{...rows[0]}],{instance:'coder'}],[[{...rows[0],retiring:[]}],{instance:'coder',run:'old-run'}]]) {
|
||||||
|
assert.throws(()=>modelUsageKey(rs,runs,'demo',s),{code:'proxy-key-refused'});
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { mkdtempSync, rmSync } from 'node:fs';
|
||||||
|
import { tmpdir } from 'node:os';
|
||||||
|
import { join } from 'node:path';
|
||||||
|
import { Store } from '../src/store.mjs';
|
||||||
|
import { Broker } from '../src/broker.mjs';
|
||||||
|
import { createLimits, modelUsageKey } from '../src/limits.mjs';
|
||||||
|
const key='012345abcdef';
|
||||||
|
test('P5 broker preserves original plugin subject and derives internal run context from authenticated native caller',async t=>{
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'p5-context-')),store=new Store(root),asked=[];t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
|
||||||
|
const b=new Broker({store,businesses:{demo:{id:'demo',human:'jason',arbiters:{technical:'coder',delivery:'coder'},roles:{coder:{authority:{withinRole:[],crossRole:[]}}}}},
|
||||||
|
limits:{mustStop:async(...args)=>{asked.push(args);return {stop:false};}},usage:{collect:async()=>({recorded:true}),view:()=>({})}});
|
||||||
|
const human=b.bindHuman({business:'demo',human:'jason',via:'cli',outsideAgent:true});
|
||||||
|
const cap=b.bindLaunch({business:'demo',role:'coder',run:'native-run',harness:'pi',provider:'fixture',model:'fake'});b.request(cap,{verb:'role.claim'});
|
||||||
|
const {id}=b.request(human,{verb:'message.send',args:{to:'coder',body:'work'}});b.request(cap,{verb:'message.receive'});
|
||||||
|
await b.request(cap,{verb:'usage.begin',args:{turn:id}});
|
||||||
|
await assert.rejects(b.request(cap,{verb:'usage.end',args:{turn:id,run:'forged-run'}}),{code:'invalid-request'});
|
||||||
|
assert.equal(asked.length,0);
|
||||||
|
await b.request(cap,{verb:'usage.end',args:{turn:id}});
|
||||||
|
assert.deepEqual(asked,[['demo',{instance:'coder',provider:'fixture',model:'fake',account:null},{run:'native-run'}]]);
|
||||||
|
});
|
||||||
|
test('P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing',async t=>{
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'p5-no-bypass-')),store=new Store(root);t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
|
||||||
|
const doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[key]:{limit:10,since:'2026-01-01T00:00:00.000Z'}}}}}};
|
||||||
|
const limits=createLimits({store,read:()=>doc,log:()=>{},keyForSubject:()=>null});
|
||||||
|
assert.deepEqual(await limits.mustStop('demo',{instance:'coder',modelKeyId:key},{run:'forged-run'}),{stop:true,check:null,code:'proxy-key-refused'});
|
||||||
|
});
|
||||||
|
test('P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse',()=>{
|
||||||
|
const newer='abcdef012345',rows=[{instance:'demo/coder',service:'model',keyId:newer,retiring:[{keyId:key}]}];
|
||||||
|
const runs=new Map([['demo:old',{instance:'demo/coder',keyId:key}],['demo:new',{instance:'demo/coder',keyId:newer}],['other:wrong',{instance:'demo/coder',keyId:key}]]);
|
||||||
|
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder'}),newer);
|
||||||
|
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder',run:'old'}),key);
|
||||||
|
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder',run:'new'}),newer);
|
||||||
|
for(const [business,subject] of [['other',{instance:'coder',run:'wrong'}],['demo',{instance:'other',run:'old'}],['demo',{instance:'coder',run:'wrong'}]])
|
||||||
|
assert.throws(()=>modelUsageKey(rows,runs,business,subject),{code:'proxy-key-refused'});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('P5 model-key mustStop without native run context fails closed even when the current key resolves',async t=>{
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'p5-missing-context-')),store=new Store(root);t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
|
||||||
|
const doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[key]:{limit:10,since:'2026-01-01T00:00:00.000Z'}}}}}};
|
||||||
|
const limits=createLimits({store,read:()=>doc,log:()=>{},keyForSubject:()=>key});
|
||||||
|
assert.deepEqual(await limits.mustStop('demo',{instance:'coder'}),{stop:true,check:null,code:'proxy-key-refused'});
|
||||||
|
});
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
// P5 end-to-end within one process: only fresh fake config, credentials and loopback HTTP.
|
||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import http from 'node:http';
|
||||||
|
import { createHash, randomBytes } from 'node:crypto';
|
||||||
|
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync } from 'node:fs';
|
||||||
|
import { tmpdir } from 'node:os';
|
||||||
|
import { join } from 'node:path';
|
||||||
|
import { startBroker } from '../src/runtime.mjs';
|
||||||
|
import { Registry } from '../../seat/src/session.mjs';
|
||||||
|
import { startTimeOf } from '../../seat/src/proc.mjs';
|
||||||
|
import { businessDoc, rolesCopy, systemFor, writeJson } from '../../business/tests/helpers.mjs';
|
||||||
|
const hash=s=>createHash('sha256').update(s).digest('hex').slice(0,12);
|
||||||
|
test('P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract',async t=>{
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'p5-runtime-')),config=join(root,'config'),data=join(root,'data');
|
||||||
|
mkdirSync(config,{mode:0o700});mkdirSync(data,{mode:0o700});const rolesDir=rolesCopy(config),doc=businessDoc(config,'demo');
|
||||||
|
doc.plugins={'usage-source':['transcript'],'limit-check':['daily-quota'],harness:['pi']};
|
||||||
|
writeJson(join(config,'businesses/demo.json'),doc);mkdirSync(join(config,'secrets'),{recursive:true,mode:0o700});
|
||||||
|
writeFileSync(join(config,'secrets/proxy-management.key'),'p5-fake-management',{mode:0o600});
|
||||||
|
new Registry(data);
|
||||||
|
let keys=[`msk-${hash(config)}-sentinel-${randomBytes(32).toString('base64url')}`],queue=[],calls=[];
|
||||||
|
const server=http.createServer(async(req,res)=>{
|
||||||
|
calls.push(req.url);
|
||||||
|
if(req.url==='/v8/management/config/access/api-keys') {
|
||||||
|
if(req.method==='PUT'){let b='';for await(const c of req)b+=c;keys=JSON.parse(b);res.end('{"status":"ok"}');}
|
||||||
|
else res.end(JSON.stringify(keys));return;
|
||||||
|
}
|
||||||
|
if(req.url==='/v8/management/observability/usage/queue?count=100'){res.end(JSON.stringify(queue));queue=[];return;}
|
||||||
|
res.writeHead(keys.includes(req.headers.authorization?.slice(7))?200:401);res.end('{}');
|
||||||
|
});
|
||||||
|
await new Promise(r=>server.listen(0,'127.0.0.1',r));let bus;
|
||||||
|
t.after(async()=>{await bus?.close();await new Promise(r=>server.close(r));rmSync(root,{recursive:true,force:true});});
|
||||||
|
bus=await startBroker({dataRoot:data,businesses:{demo:{id:'demo',human:'jason',plugins:doc.plugins,arbiters:{technical:'coder',delivery:'coder'},roles:{coder:{definition:'coder',authority:{withinRole:[],crossRole:[]}}}}},
|
||||||
|
organization:{dir:config,rolesDir,system:systemFor(config)},proxy:{port:server.address().port,binary:'/fixture-unused'}});
|
||||||
|
assert.equal(calls.some(p=>p.includes('usage/queue')),false);
|
||||||
|
const model=await bus.modelPreflight({business:'demo',role:'coder'}),keyId=hash(model.key);
|
||||||
|
const human=bus.broker.bindHuman({business:'demo',human:'jason',via:'cli',outsideAgent:true});
|
||||||
|
let limits=bus.broker.request(human,{verb:'limits'});
|
||||||
|
bus.broker.request(human,{verb:'limits.set',args:{revision:limits.revision,limits:{tokens:{keys:{[keyId]:{limit:2,reset:'00:00',timeZone:'UTC'}}}}}});
|
||||||
|
assert.equal((await bus.mayLaunch({business:'demo',instance:'coder',provider:'fixture',model:'fake'})).allow,true);
|
||||||
|
const dir=join(root,'transcript');mkdirSync(dir);
|
||||||
|
const {cap}=bus.bindLaunch({business:'demo',role:'coder',run:'p5-run',harness:'pi',modelKeyId:keyId,transcript:dir,pid:process.pid,startTime:startTimeOf(process.pid)});
|
||||||
|
bus.broker.request(cap,{verb:'role.claim'});
|
||||||
|
const {id}=bus.broker.request(human,{verb:'message.send',args:{to:'coder',body:'fake work'}});
|
||||||
|
bus.broker.request(cap,{verb:'message.receive'});
|
||||||
|
await bus.broker.request(cap,{verb:'usage.begin',args:{turn:id}});
|
||||||
|
writeFileSync(join(dir,'s.jsonl'),JSON.stringify({type:'message',id:'fake',message:{role:'assistant',usage:{input:2,output:0,cacheWrite:0,cacheRead:0}}})+'\n');
|
||||||
|
await bus.broker.request(cap,{verb:'usage.end',args:{turn:id}});
|
||||||
|
const view=bus.broker.request(human,{verb:'usage'});assert.equal(view.byKey[0].modelKeyId,keyId);assert.equal(view.byKey[0].input,2);
|
||||||
|
assert.equal((await bus.mayLaunch({business:'demo',instance:'coder',provider:'fixture',model:'fake'})).allow,false);
|
||||||
|
assert.throws(()=>bus.broker.request(cap,{verb:'message.receive'}),{code:'not-holder'});
|
||||||
|
let plugins=bus.broker.request(human,{verb:'plugins'});
|
||||||
|
plugins=bus.broker.request(human,{verb:'plugins.set',args:{revision:plugins.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:7}}}});
|
||||||
|
assert.equal(plugins.plugins.usage,'cliproxy-queue');assert.equal(plugins.usage.cliproxyQueue.pollSeconds,7);
|
||||||
|
const history=readFileSync(join(config,'businesses/.history/demo/changes.jsonl'),'utf8');
|
||||||
|
for(const value of [model.key,'p5-fake-management'])assert.equal(JSON.stringify([view,history]).includes(value),false);
|
||||||
|
});
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import http from 'node:http';
|
||||||
|
import { mkdtempSync, rmSync } from 'node:fs';
|
||||||
|
import { tmpdir } from 'node:os';
|
||||||
|
import { join } from 'node:path';
|
||||||
|
import { createHash } from 'node:crypto';
|
||||||
|
import { Store } from '../src/store.mjs';
|
||||||
|
import { createUsage, turnRecords } from '../src/usage.mjs';
|
||||||
|
import { createLimits } from '../src/limits.mjs';
|
||||||
|
import { createProxyUsage } from '../src/proxy-usage.mjs';
|
||||||
|
import { ManagementClient } from '../../model-proxy/src/client.mjs';
|
||||||
|
const id = s => createHash('sha256').update(s).digest('hex').slice(0,12);
|
||||||
|
const key='msk-fake-client-value',source='fake-upstream-value',keyId=id(key);
|
||||||
|
async function fixture(t) {
|
||||||
|
const root=mkdtempSync(join(tmpdir(),'proxy-usage-')),store=new Store(root),logs=[],calls=[];
|
||||||
|
let events=[],now=0,fail=false;
|
||||||
|
const server=http.createServer((req,res)=>{calls.push(req.url);res.writeHead(fail?500:200);res.end(JSON.stringify(events));events=[];});
|
||||||
|
await new Promise(r=>server.listen(0,'127.0.0.1',r));
|
||||||
|
const client=new ManagementClient({baseUrl:`http://127.0.0.1:${server.address().port}`,key:'fake-management',receipt:e=>logs.push(e)});
|
||||||
|
let doc={plugins:{},launch:{limits:{tokens:{keys:{[keyId]:{limit:1,since:'2026-01-01T00:00:00.000Z'}}}}}};
|
||||||
|
const reader=createProxyUsage({store,read:()=>({demo:doc}),client:()=>client,records:()=>[{instance:'demo/coder',service:'model',keyId,retiring:[]}],log:e=>logs.push(e),now:()=>now});
|
||||||
|
t.after(async()=>{await reader.close();await new Promise(r=>server.close(r));store.close();rmSync(root,{recursive:true,force:true});});
|
||||||
|
const event=(over={})=>({api_key:key,source,failed:true,fail:{status_code:503,body:source},tokens:{input_tokens:9,output_tokens:2},...over});
|
||||||
|
return {store,logs,calls,reader,event,setEvents:v=>{events=v;},clock:v=>{now=v;},enable:(pollSeconds)=>{doc={...doc,plugins:{usage:'cliproxy-queue','limit-check':['token-limit']},...(pollSeconds===undefined?{}:{usage:{cliproxyQueue:{pollSeconds}}})};},doc:()=>doc,fail:()=>{fail=true;}};
|
||||||
|
}
|
||||||
|
test('P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks',async t=>{
|
||||||
|
const f=await fixture(t);await f.reader.tick();assert.equal(f.calls.length,0);assert.equal(f.reader.view('demo'),null);
|
||||||
|
f.enable();await f.reader.tick();assert.equal(f.calls.length,1);
|
||||||
|
f.clock(14999);await f.reader.tick();assert.equal(f.calls.length,1);
|
||||||
|
f.clock(15000);await f.reader.tick();assert.equal(f.calls.length,2);
|
||||||
|
f.enable(7);f.clock(16000);await f.reader.tick();assert.equal(f.calls.length,3);
|
||||||
|
f.clock(22999);await f.reader.tick();assert.equal(f.calls.length,3);
|
||||||
|
f.clock(23000);await f.reader.tick();assert.equal(f.calls.length,4);
|
||||||
|
});
|
||||||
|
test('P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records',async t=>{
|
||||||
|
const f=await fixture(t);f.enable();f.setEvents([f.event()]);await f.reader.tick();
|
||||||
|
const v=f.reader.view('demo');assert.equal(v.source,'proxy');assert.equal(v.byKey[0].keyId,keyId);assert.equal(v.byKey[0].failures,1);assert.deepEqual(v.byKey[0].statuses,{'503':1});
|
||||||
|
assert.equal(v.byAccount[0].accountId,id(source));assert.equal(v.byAccount[0].input,9);
|
||||||
|
const usage=await createUsage({store:f.store,businesses:{demo:f.doc()},log:()=>{},proxyView:b=>f.reader.view(b)});
|
||||||
|
assert.equal(usage.view('demo').proxy.source,'proxy');assert.equal(usage.view('demo').total.input,0);
|
||||||
|
assert.deepEqual(turnRecords(f.store,'demo'),[]);
|
||||||
|
const limits=createLimits({store:f.store,read:()=>f.doc(),log:()=>{},keyForSubject:()=>keyId});
|
||||||
|
assert.equal((await limits.mayLaunch('demo',{instance:'coder',modelKeyId:keyId})).allow,true);
|
||||||
|
for(const value of [key,source,'fake-management']) assert.equal(JSON.stringify([f.store.all('SELECT * FROM usage_records'),f.logs,usage.view('demo')]).includes(value),false);
|
||||||
|
});
|
||||||
|
test('P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated',async t=>{
|
||||||
|
const f=await fixture(t);f.enable();f.setEvents([f.event({api_key:'msk-unknown-canary'}),f.event({api_key:'external-canary'})]);await f.reader.tick();
|
||||||
|
assert.deepEqual(f.logs.find(e=>e.action==='proxy.usage.reconcile'),{action:'proxy.usage.reconcile',keyId:id('msk-unknown-canary'),code:'proxy-usage-unknown-key'});
|
||||||
|
assert.equal(f.reader.view('demo').byKey.length,0);assert.equal(f.reader.view('other'),null);
|
||||||
|
assert.equal(JSON.stringify(f.logs).includes('msk-unknown-canary'),false);
|
||||||
|
assert.equal(f.store.all('SELECT * FROM usage_records').length,0);
|
||||||
|
});
|
||||||
|
test('P5 queue failure is safe, does not enforce and does not retry before poll deadline',async t=>{
|
||||||
|
const f=await fixture(t);f.enable();f.fail();await f.reader.tick();await f.reader.tick();
|
||||||
|
assert.equal(f.calls.length,1);assert.equal(f.logs.at(-1).code,'proxy-usage-read-failed');assert.equal(f.reader.view('demo').state,'unavailable');
|
||||||
|
});
|
||||||
|
test('P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart',async t=>{
|
||||||
|
const f=await fixture(t);f.enable();f.setEvents([f.event()]);await f.reader.tick();
|
||||||
|
const before=f.reader.view('demo');await f.reader.close();
|
||||||
|
const again=createProxyUsage({store:f.store,read:()=>({demo:f.doc()}),client:()=>null,records:()=>[],log:()=>{}});
|
||||||
|
assert.deepEqual(again.view('demo').byKey,before.byKey);await again.close();
|
||||||
|
assert.throws(()=>f.store.run('DELETE FROM usage_records'),/append-only/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view',async t=>{
|
||||||
|
const f=await fixture(t);f.enable();f.setEvents([f.event(),f.event({source:'malformed-upstream-canary',tokens:{input_tokens:-1}})]);await f.reader.tick();
|
||||||
|
assert.equal(f.store.all('SELECT * FROM usage_records').length,0);
|
||||||
|
for(const secret of [key,source,'malformed-upstream-canary'])assert.equal(JSON.stringify([f.logs,f.reader.view('demo')]).includes(secret),false);
|
||||||
|
});
|
||||||
|
test('P5 concurrent ticks issue one bounded queue read and a closed collector never polls again',async t=>{
|
||||||
|
const f=await fixture(t);f.enable();await Promise.all([f.reader.tick(),f.reader.tick(),f.reader.tick()]);assert.equal(f.calls.length,1);
|
||||||
|
await f.reader.close();f.clock(90000);await f.reader.tick();assert.equal(f.calls.length,1);
|
||||||
|
});
|
||||||
@@ -153,3 +153,21 @@ test('row 65 a run bound without a transcript directory records no-transcript',
|
|||||||
assert.equal(f.usage.view('demo').total.unknownTurns, 1);
|
assert.equal(f.usage.view('demo').total.unknownTurns, 1);
|
||||||
assert.ok(transcript);
|
assert.ok(transcript);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('P5 immutable stack key attribution survives rotation and restart without key values', async t => {
|
||||||
|
const f=await fixture(t),keyId='012345abcdef';let current=keyId;
|
||||||
|
const usage=await createUsage({store:f.store,businesses:{demo:{plugins:{'usage-source':['transcript']}}},log:()=>{},keyForRun:()=>current});
|
||||||
|
f.save([]);await usage.collect(f.session,'begin','key-turn');current='abcdef012345';
|
||||||
|
f.save([f.put('new')]);await usage.collect(f.session,'end','key-turn');
|
||||||
|
assert.equal(usage.view('demo').byKey[0].modelKeyId,keyId);
|
||||||
|
assert.equal(usage.view('demo').byKey[0].input,2);
|
||||||
|
const again=await createUsage({store:f.store,businesses:{demo:{plugins:{}}},log:()=>{}});
|
||||||
|
assert.equal(again.view('demo').byKey[0].modelKeyId,keyId);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('P5 malformed key metadata is dropped rather than stored or exposed as a key value',async t=>{
|
||||||
|
const f=await fixture(t);
|
||||||
|
const usage=await createUsage({store:f.store,businesses:{demo:{plugins:{}}},log:e=>f.logs.push(e),keyForRun:()=> 'msk-fake-invalid-metadata-canary'});
|
||||||
|
await usage.collect(f.session,'begin','invalid-key');await usage.collect(f.session,'end','invalid-key');
|
||||||
|
assert.equal(JSON.stringify([f.store.all('SELECT * FROM usage_records'),f.logs,usage.view('demo')]).includes('msk-fake-invalid-metadata-canary'),false);
|
||||||
|
});
|
||||||
@@ -10,7 +10,7 @@ import { checkVars } from "./vars.mjs";
|
|||||||
import { parseCredentialRef } from "./credentials.mjs";
|
import { parseCredentialRef } from "./credentials.mjs";
|
||||||
import { loadRole } from "./role.mjs";
|
import { loadRole } from "./role.mjs";
|
||||||
import { END_PROTECTED } from "./vocabulary.mjs";
|
import { END_PROTECTED } from "./vocabulary.mjs";
|
||||||
import { checkPlugins } from "../../plugins/src/kinds.mjs";
|
import { checkPlugins, checkUsageSettings } from "../../plugins/src/kinds.mjs";
|
||||||
import { checkMapping } from "../../library/src/mapping.mjs";
|
import { checkMapping } from "../../library/src/mapping.mjs";
|
||||||
import { forkProblem, giteaName, parseGiteaUrl, HOST_SERVICE, CREATIVE_DEFINITIONS } from "./vocabulary.mjs";
|
import { forkProblem, giteaName, parseGiteaUrl, HOST_SERVICE, CREATIVE_DEFINITIONS } from "./vocabulary.mjs";
|
||||||
import {
|
import {
|
||||||
@@ -21,7 +21,7 @@ const BOT_NAME = /^bot-[a-z0-9][a-z0-9._-]{0,60}$/;
|
|||||||
// How long a thread's session stays up with no turn before the launcher stops
|
// How long a thread's session stays up with no turn before the launcher stops
|
||||||
// it, when launch.threadIdleSeconds is absent (REQ-THREAD-2, row 121).
|
// it, when launch.threadIdleSeconds is absent (REQ-THREAD-2, row 121).
|
||||||
export const THREAD_IDLE_SECONDS = 900;
|
export const THREAD_IDLE_SECONDS = 900;
|
||||||
const TOP_KEYS = ["businessVersion", "id", "human", "arbiters", "projects", "vars", "tracker", "roles", "launch", "plugins", "hosts", "retired", "replyLimits"];
|
const TOP_KEYS = ["businessVersion", "id", "human", "arbiters", "projects", "vars", "tracker", "roles", "launch", "plugins", "hosts", "retired", "replyLimits", "usage"];
|
||||||
|
|
||||||
// The config directory: next to the system config, $MOSAIC_CONFIG or
|
// The config directory: next to the system config, $MOSAIC_CONFIG or
|
||||||
// ~/.config/mosaic-dev/config.json, the same rule mosaic-config.mjs uses.
|
// ~/.config/mosaic-dev/config.json, the same rule mosaic-config.mjs uses.
|
||||||
@@ -312,11 +312,12 @@ export function validateBusinessDocument(document, file, { rolesDir }) {
|
|||||||
// here; whether each module loads is the loader's check, at load time.
|
// here; whether each module loads is the loader's check, at load time.
|
||||||
const plugins = document.plugins === undefined ? {}
|
const plugins = document.plugins === undefined ? {}
|
||||||
: structuredClone(checkPlugins(document.plugins, `${file} plugins`, { fail: (_code, message) => refuse(message) }));
|
: structuredClone(checkPlugins(document.plugins, `${file} plugins`, { fail: (_code, message) => refuse(message) }));
|
||||||
|
const usage = document.usage === undefined ? undefined : checkUsageSettings(document.usage);
|
||||||
const retired = document.retired === undefined ? undefined : checkRetired(document.retired, roles, file);
|
const retired = document.retired === undefined ? undefined : checkRetired(document.retired, roles, file);
|
||||||
|
|
||||||
return deepFreeze({
|
return deepFreeze({
|
||||||
businessVersion: 1, id: document.id, file, human, arbiters, projects, vars, tracker, roles, launch, plugins, definitions,
|
businessVersion: 1, id: document.id, file, human, arbiters, projects, vars, tracker, roles, launch, plugins, definitions,
|
||||||
...(retired ? { retired } : {}),
|
...(retired ? { retired } : {}), ...(usage === undefined ? {} : { usage }),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,8 +67,12 @@ export function checkTokenLimits(value, where = "launch.limits.tokens") {
|
|||||||
if (Object.hasOwn(value, "models")) {
|
if (Object.hasOwn(value, "models")) {
|
||||||
out.models = tokenMap(value.models, `${where}.models`, name, (models, at) => tokenMap(models, at, name, tokenLimit));
|
out.models = tokenMap(value.models, `${where}.models`, name, (models, at) => tokenMap(models, at, name, tokenLimit));
|
||||||
}
|
}
|
||||||
// A key is a name until row 126 names the accounts.
|
// P5: model key IDs are 12 hex characters (including digit-leading IDs).
|
||||||
if (Object.hasOwn(value, "keys")) out.keys = tokenMap(value.keys, `${where}.keys`, requireId, tokenLimit);
|
// A model key may use the daily quota shape; existing account limits retain theirs.
|
||||||
|
if (Object.hasOwn(value, "keys")) out.keys = tokenMap(value.keys, `${where}.keys`,
|
||||||
|
(key, at) => /^[a-f0-9]{12}$/.test(key) ? key : requireId(key, at),
|
||||||
|
(entry, at) => Object.hasOwn(entry ?? {}, "reset") && /^[a-f0-9]{12}$/.test(at.split('.').at(-1))
|
||||||
|
? dailyQuota(entry, at) : tokenLimit(entry, at));
|
||||||
// One quota per account; the business read checks each key names launch.account.
|
// One quota per account; the business read checks each key names launch.account.
|
||||||
if (Object.hasOwn(value, "daily")) out.daily = tokenMap(value.daily, `${where}.daily`, requireId, dailyQuota);
|
if (Object.hasOwn(value, "daily")) out.daily = tokenMap(value.daily, `${where}.daily`, requireId, dailyQuota);
|
||||||
return out;
|
return out;
|
||||||
|
|||||||
@@ -81,6 +81,26 @@ function changes(old, next, path = "") {
|
|||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// P5/Q222: every writer protects per-model-key quotas, including removal/reset.
|
||||||
|
function modelQuotaFence(old, document, actor) {
|
||||||
|
const keys = doc => Object.fromEntries(Object.entries(doc?.launch?.limits?.tokens?.keys ?? {})
|
||||||
|
.filter(([key]) => /^[a-f0-9]{12}$/.test(key)));
|
||||||
|
if (canonicalJson(keys(old)) === canonicalJson(keys(document))) return;
|
||||||
|
const agents = Object.entries(old.roles ?? {}).flatMap(([instance, entry]) => [instance, `${entry?.definition}.${instance}`]);
|
||||||
|
if (actor === old.human && actor !== "tester" && !agents.includes(actor)) return;
|
||||||
|
fail("organization-model-quota-human-only");
|
||||||
|
}
|
||||||
|
|
||||||
|
// P5: the optional queue reader and polling setting are human changes even on
|
||||||
|
// the tester organization path. This guards every writer, not only the UI verb.
|
||||||
|
function usageFence(old, document, actor) {
|
||||||
|
const setting = doc => ({ plugin: doc?.plugins?.usage ?? null, usage: doc?.usage ?? null });
|
||||||
|
if (canonicalJson(setting(old)) === canonicalJson(setting(document))) return;
|
||||||
|
const agents = Object.entries(old.roles ?? {}).flatMap(([instance, entry]) => [instance, `${entry?.definition}.${instance}`]);
|
||||||
|
if (actor === old.human && actor !== "tester" && !agents.includes(actor)) return;
|
||||||
|
fail("organization-usage-human-only");
|
||||||
|
}
|
||||||
|
|
||||||
// C2-06 M11: replyLimits is the human's alone. Any setter that changes it refuses unless the actor is
|
// C2-06 M11: replyLimits is the human's alone. Any setter that changes it refuses unless the actor is
|
||||||
// the business's human as the file stood before the write, and no agent or the tester under that
|
// the business's human as the file stood before the write, and no agent or the tester under that
|
||||||
// name. Compared as M9 compares projects, on the document and again on what lands on disk.
|
// name. Compared as M9 compares projects, on the document and again on what lands on disk.
|
||||||
@@ -240,6 +260,8 @@ export function organizationWriter({ dir, rolesDir, barrier = () => {} }) {
|
|||||||
if (canonicalJson(document?.projects) !== canonicalJson(old.projects))
|
if (canonicalJson(document?.projects) !== canonicalJson(old.projects))
|
||||||
fail('organization-projects-protected');
|
fail('organization-projects-protected');
|
||||||
replyLimitsFence(old, document, actor);
|
replyLimitsFence(old, document, actor);
|
||||||
|
modelQuotaFence(old, document, actor);
|
||||||
|
usageFence(old, document, actor);
|
||||||
validateBusinessDocument(document, file, { rolesDir });
|
validateBusinessDocument(document, file, { rolesDir });
|
||||||
const bytes = JSON.stringify(document, null, 2) + "\n";
|
const bytes = JSON.stringify(document, null, 2) + "\n";
|
||||||
// Check and log exactly what lands on disk, for every setter: a value JSON
|
// Check and log exactly what lands on disk, for every setter: a value JSON
|
||||||
@@ -248,6 +270,8 @@ export function organizationWriter({ dir, rolesDir, barrier = () => {} }) {
|
|||||||
if (canonicalJson(written.projects) !== canonicalJson(old.projects))
|
if (canonicalJson(written.projects) !== canonicalJson(old.projects))
|
||||||
fail('organization-projects-protected');
|
fail('organization-projects-protected');
|
||||||
replyLimitsFence(old, written, actor);
|
replyLimitsFence(old, written, actor);
|
||||||
|
modelQuotaFence(old, written, actor);
|
||||||
|
usageFence(old, written, actor);
|
||||||
validateBusinessDocument(written, file, { rolesDir });
|
validateBusinessDocument(written, file, { rolesDir });
|
||||||
if (beforeWrite) {
|
if (beforeWrite) {
|
||||||
beforeWrite();
|
beforeWrite();
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
// like a limit change. A write is a patch per kind (see set()): kinds it doesn't name are kept. A refused write throws a code and logs nothing.
|
// like a limit change. A write is a patch per kind (see set()): kinds it doesn't name are kept. A refused write throws a code and logs nothing.
|
||||||
import { organizationWriter, OrganizationError } from "./organization.mjs";
|
import { organizationWriter, OrganizationError } from "./organization.mjs";
|
||||||
import { isPlainObject } from "./util.mjs";
|
import { isPlainObject } from "./util.mjs";
|
||||||
import { KINDS, PluginError, checkPlugins } from "../../plugins/src/kinds.mjs";
|
import { KINDS, PluginError, checkPlugins, checkUsageSettings } from "../../plugins/src/kinds.mjs";
|
||||||
|
|
||||||
// `exists(kind, name)`, when given, refuses a name no module answers to (the host passes the
|
// `exists(kind, name)`, when given, refuses a name no module answers to (the host passes the
|
||||||
// loader's hasModule). Without it the setter checks only the shape, as before.
|
// loader's hasModule). Without it the setter checks only the shape, as before.
|
||||||
@@ -14,11 +14,12 @@ export function pluginSettings({ dir, rolesDir, exists = null }) {
|
|||||||
|
|
||||||
function read(id) {
|
function read(id) {
|
||||||
const { document, revision } = writer.read(id);
|
const { document, revision } = writer.read(id);
|
||||||
return { business: id, revision, plugins: structuredClone(document.plugins ?? {}) };
|
return { business: id, revision, plugins: structuredClone(document.plugins ?? {}),
|
||||||
|
...(document.usage === undefined ? {} : { usage: structuredClone(document.usage) }) };
|
||||||
}
|
}
|
||||||
|
|
||||||
function set(id, args, actor) {
|
function set(id, args, actor) {
|
||||||
if (!isPlainObject(args) || Object.keys(args).some(key => key !== "revision" && key !== "plugins")) {
|
if (!isPlainObject(args) || Object.keys(args).some(key => key !== "revision" && key !== "plugins" && key !== "usage")) {
|
||||||
throw new OrganizationError("invalid-request");
|
throw new OrganizationError("invalid-request");
|
||||||
}
|
}
|
||||||
if (typeof args.revision !== "string" || !/^[a-f0-9]{64}$/.test(args.revision)) {
|
if (typeof args.revision !== "string" || !/^[a-f0-9]{64}$/.test(args.revision)) {
|
||||||
@@ -55,6 +56,10 @@ export function pluginSettings({ dir, rolesDir, exists = null }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const next = structuredClone(writer.read(id).document);
|
const next = structuredClone(writer.read(id).document);
|
||||||
|
if (Object.hasOwn(args, "usage")) {
|
||||||
|
if (args.usage === null) delete next.usage;
|
||||||
|
else next.usage = checkUsageSettings(args.usage);
|
||||||
|
}
|
||||||
next.plugins = { ...structuredClone(next.plugins ?? {}), ...structuredClone(sets) };
|
next.plugins = { ...structuredClone(next.plugins ?? {}), ...structuredClone(sets) };
|
||||||
for (const kind of removals) delete next.plugins[kind];
|
for (const kind of removals) delete next.plugins[kind];
|
||||||
const receipt = writer.write(id, next, { revision: args.revision, actor });
|
const receipt = writer.write(id, next, { revision: args.revision, actor });
|
||||||
|
|||||||
@@ -144,3 +144,26 @@ test("vikunja:19/305 with an exists check, the setter refuses a module no tree f
|
|||||||
assert.equal(events(f).length, before);
|
assert.equal(events(f).length, before);
|
||||||
assert.deepEqual(settings.set("acme", { revision: view.revision, plugins: { "usage-source": ["meter"] } }, "jason").plugins, { "usage-source": ["meter"] });
|
assert.deepEqual(settings.set("acme", { revision: view.revision, plugins: { "usage-source": ["meter"] } }, "jason").plugins, { "usage-source": ["meter"] });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict', () => {
|
||||||
|
const f=fixture();let v=f.settings.read('acme');assert.equal(v.plugins.usage,undefined);assert.equal(v.usage,undefined);
|
||||||
|
v=f.settings.set('acme',{revision:v.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:7}}},'jason');
|
||||||
|
assert.equal(v.plugins.usage,'cliproxy-queue');assert.equal(v.usage.cliproxyQueue.pollSeconds,7);
|
||||||
|
for(const pollSeconds of [0,60,61,-1,1.5,'15',null]) {
|
||||||
|
const before=readFileSync(f.file,'utf8');
|
||||||
|
assert.throws(()=>f.settings.set('acme',{revision:v.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds}}},'jason'));
|
||||||
|
assert.equal(readFileSync(f.file,'utf8'),before);
|
||||||
|
}
|
||||||
|
v=f.settings.set('acme',{revision:v.revision,plugins:{usage:null},usage:null},'jason');
|
||||||
|
assert.equal(v.plugins.usage,undefined);assert.equal(v.usage,undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('P5 only human can enable/disable telemetry or change polling, including direct organization writes', () => {
|
||||||
|
const f=fixture();let v=f.settings.read('acme');const patch={plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:15}}};
|
||||||
|
for(const actor of ['tester','chief','coder']) assert.throws(()=>f.settings.set('acme',{revision:v.revision,...patch},actor),{code:'organization-usage-human-only'});
|
||||||
|
v=f.settings.set('acme',{revision:v.revision,...patch},'jason');
|
||||||
|
for(const actor of ['tester','chief','coder']) {
|
||||||
|
assert.throws(()=>f.settings.set('acme',{revision:v.revision,plugins:{usage:null}},actor),{code:'organization-usage-human-only'});
|
||||||
|
assert.throws(()=>f.settings.set('acme',{revision:v.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:1}}},actor),{code:'organization-usage-human-only'});
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -150,3 +150,21 @@ test('REQ-LIMIT-2 the writer stamps a daily quota\'s since, keeps its reset and
|
|||||||
// The account itself stays a hand edit: the file's account is untouched by the writes.
|
// The account itself stays a hand edit: the file's account is untouched by the writes.
|
||||||
assert.deepEqual(JSON.parse(readFileSync(f.file,'utf8')).launch.account,ACCOUNT);
|
assert.deepEqual(JSON.parse(readFileSync(f.file,'utf8')).launch.account,ACCOUNT);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them', () => {
|
||||||
|
const f=fixture(),key='012345abcdef'; let view=f.settings.read('acme');
|
||||||
|
assert.equal(view.limits.tokens,undefined);
|
||||||
|
const limits={tokens:{keys:{[key]:{limit:20,reset:'05:00',timeZone:'America/Chicago'}}}};
|
||||||
|
view=f.settings.set('acme',{revision:view.revision,limits},'jason');
|
||||||
|
assert.deepEqual(stored(f).keys[key],{...limits.tokens.keys[key],since:T0});
|
||||||
|
const bytes=readFileSync(f.file,'utf8');f.tick(T1);
|
||||||
|
for(const actor of ['chief','tester','coder']) {
|
||||||
|
assert.throws(()=>f.settings.set('acme',{revision:view.revision,limits:{tokens:{keys:{}}}},actor),{code:'organization-model-quota-human-only'});
|
||||||
|
assert.throws(()=>f.settings.set('acme',{revision:view.revision,reset:[['tokens','keys',key]]},actor),{code:'organization-model-quota-human-only'});
|
||||||
|
}
|
||||||
|
assert.equal(readFileSync(f.file,'utf8'),bytes);
|
||||||
|
f.tick(T1);view=f.settings.set('acme',{revision:view.revision,reset:[['tokens','keys',key]]},'jason');
|
||||||
|
assert.equal(stored(f).keys[key].since,T1);
|
||||||
|
view=f.settings.set('acme',{revision:view.revision,limits:{}},'jason');
|
||||||
|
assert.equal(view.limits.tokens,undefined);
|
||||||
|
});
|
||||||
@@ -95,3 +95,10 @@ a failed connection refuses `proxy-down`. No stdout by the configured deadline
|
|||||||
requests a bounded stop and records `proxy-stall` with key IDs. The runner writes
|
requests a bounded stop and records `proxy-stall` with key IDs. The runner writes
|
||||||
only a fixed token to `<run>/proxy-first-output`, never stdout contents. A stop
|
only a fixed token to `<run>/proxy-first-output`, never stdout contents. A stop
|
||||||
failure records/refuses `proxy-stop-failed` and retains the key.
|
failure records/refuses `proxy-stop-failed` and retains the key.
|
||||||
|
|
||||||
|
P5 adds the bus-only `readUsageQueue()` management operation. Its fixed
|
||||||
|
`GET /v8/management/observability/usage/queue?count=100` retains the client's
|
||||||
|
existing response-size/deadline/loopback controls. It validates the entire array
|
||||||
|
(maximum 100 events), hashes client `api_key` and upstream `source` to 12 hex IDs
|
||||||
|
at the read boundary, and returns only safe IDs, counts and failure metadata.
|
||||||
|
Bodies, credential values and upstream error messages never enter receipts.
|
||||||
@@ -76,6 +76,24 @@ export class ManagementClient {
|
|||||||
}
|
}
|
||||||
finally { this.#receipt({ call: `${method} ${endpoint.split('?')[0]}`, status, keyIds: [] }); }
|
finally { this.#receipt({ call: `${method} ${endpoint.split('?')[0]}`, status, keyIds: [] }); }
|
||||||
}
|
}
|
||||||
|
// The queue drains at most 100 events. Credential-bearing strings exist only
|
||||||
|
// inside this bounded read, never in a plug-in result, receipt, store or view.
|
||||||
|
async readUsageQueue() {
|
||||||
|
const events = await this.#page('GET', '/v8/management/observability/usage/queue?count=100');
|
||||||
|
if (!Array.isArray(events) || events.length > 100) refuse('proxy-client-response');
|
||||||
|
const string = v => typeof v === 'string' && v.length > 0 && v.length <= 4096 && !/[\r\n\x00]/.test(v);
|
||||||
|
const amount = v => v === undefined ? 0 : Number.isSafeInteger(v) && v >= 0 ? v : refuse('proxy-client-response');
|
||||||
|
return events.map(event => {
|
||||||
|
if (!event || !string(event.api_key) || !string(event.source) || typeof event.failed !== 'boolean'
|
||||||
|
|| !event.tokens || typeof event.tokens !== 'object' || Array.isArray(event.tokens)) refuse('proxy-client-response');
|
||||||
|
const statusCode = event.fail?.status_code ?? null;
|
||||||
|
if (statusCode !== null && (!Number.isSafeInteger(statusCode) || statusCode < 0 || statusCode > 599)) refuse('proxy-client-response');
|
||||||
|
return { keyId: sha256(event.api_key).slice(0, 12), accountId: sha256(event.source).slice(0, 12),
|
||||||
|
managed: event.api_key.startsWith('msk-'), failed: event.failed, statusCode,
|
||||||
|
input: amount(event.tokens.input_tokens), output: amount(event.tokens.output_tokens),
|
||||||
|
cacheWrite: amount(event.tokens.cache_creation_tokens), cacheRead: amount(event.tokens.cache_read_tokens) };
|
||||||
|
});
|
||||||
|
}
|
||||||
getCredentials() { return this.#page('GET', '/v8/management/credentials'); }
|
getCredentials() { return this.#page('GET', '/v8/management/credentials'); }
|
||||||
getUpstreamGroups() { return this.#page('GET', '/v8/management/config/api-keys/claude'); }
|
getUpstreamGroups() { return this.#page('GET', '/v8/management/config/api-keys/claude'); }
|
||||||
putUpstreamGroups(groups) {
|
putUpstreamGroups(groups) {
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import http from 'node:http';
|
||||||
|
import { createHash } from 'node:crypto';
|
||||||
|
import { ManagementClient } from '../src/client.mjs';
|
||||||
|
const id = s => createHash('sha256').update(s).digest('hex').slice(0, 12);
|
||||||
|
const raw = { api_key: 'msk-made-up-client-canary', source: 'made-up-upstream-canary', failed: true,
|
||||||
|
fail: { status_code: 503, body: 'private-body' }, tokens: { input_tokens: 7, output_tokens: 2, cache_creation_tokens: 3, cache_read_tokens: 4 },
|
||||||
|
user_agent: 'private-agent', request_id: 'private-request' };
|
||||||
|
async function fixture(t, reply = () => [raw]) {
|
||||||
|
const calls = [], receipts = [];
|
||||||
|
const server = http.createServer((req, res) => {
|
||||||
|
calls.push([req.method, req.url, req.headers.authorization]);
|
||||||
|
const answer = reply(); res.writeHead(answer.status ?? 200, answer.headers ?? {});
|
||||||
|
res.end(JSON.stringify(answer.body ?? answer));
|
||||||
|
});
|
||||||
|
await new Promise(r => server.listen(0, '127.0.0.1', r));
|
||||||
|
t.after(() => new Promise(r => server.close(r)));
|
||||||
|
return { calls, receipts, client: new ManagementClient({ baseUrl: `http://127.0.0.1:${server.address().port}`, key: 'fake-management', receipt: e => receipts.push(e) }) };
|
||||||
|
}
|
||||||
|
test('P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values', async t => {
|
||||||
|
const f = await fixture(t);
|
||||||
|
const events = await f.client.readUsageQueue();
|
||||||
|
assert.deepEqual(events, [{ keyId: id(raw.api_key), accountId: id(raw.source), managed: true, failed: true, statusCode: 503,
|
||||||
|
input: 7, output: 2, cacheWrite: 3, cacheRead: 4 }]);
|
||||||
|
assert.deepEqual(f.calls, [['GET', '/v8/management/observability/usage/queue?count=100', 'Bearer fake-management']]);
|
||||||
|
assert.deepEqual(f.receipts, [{ call: 'GET /v8/management/observability/usage/queue', status: 200, keyIds: [] }]);
|
||||||
|
for (const secret of [raw.api_key, raw.source, 'private-body', 'private-agent', 'private-request', 'fake-management'])
|
||||||
|
assert.equal(JSON.stringify([events, f.receipts]).includes(secret), false);
|
||||||
|
});
|
||||||
|
for (const [name, reply, code] of [
|
||||||
|
['bad envelope', () => ({ events: [raw] }), 'proxy-client-response'],
|
||||||
|
['over count', () => Array(101).fill(raw), 'proxy-client-response'],
|
||||||
|
['missing key', () => [{ ...raw, api_key: null }], 'proxy-client-response'],
|
||||||
|
['bad counts', () => [{ ...raw, tokens: { input_tokens: -1 } }], 'proxy-client-response'],
|
||||||
|
['redirect', () => ({ status: 302, headers: { location: 'http://127.0.0.1:8317/' }, body: raw }), 'proxy-client-redirect'],
|
||||||
|
['refusal', () => ({ status: 401, body: raw }), 'proxy-client-refused'],
|
||||||
|
]) test(`P5 ${name} refuses safely with no retry`, async t => {
|
||||||
|
const f = await fixture(t, reply);
|
||||||
|
await assert.rejects(f.client.readUsageQueue(), e => e.code === code && !e.message.includes(raw.source));
|
||||||
|
assert.equal(f.calls.length, 1);
|
||||||
|
assert.equal(JSON.stringify(f.receipts).includes(raw.api_key), false);
|
||||||
|
assert.equal(JSON.stringify(f.receipts).includes(raw.source), false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('P5 malformed event after a valid event rejects the entire queue before any credential can escape',async t=>{
|
||||||
|
const f=await fixture(t,()=>[raw,{...raw,source:'another-upstream-canary',tokens:{input_tokens:'bad-count'}}]);
|
||||||
|
await assert.rejects(f.client.readUsageQueue(),{code:'proxy-client-response'});
|
||||||
|
for(const secret of [raw.api_key,raw.source,'another-upstream-canary'])assert.equal(JSON.stringify(f.receipts).includes(secret),false);
|
||||||
|
});
|
||||||
@@ -327,3 +327,12 @@ organization file or unavailable bus.
|
|||||||
For the re-pin introducing this kind, Jason enables both channels through
|
For the re-pin introducing this kind, Jason enables both channels through
|
||||||
plugins.set immediately after activate in Mos's window, then smokes CLI thread
|
plugins.set immediately after activate in Mos's window, then smokes CLI thread
|
||||||
listing and Console chat. No development seat performs that live step.
|
listing and Console chat. No development seat performs that live step.
|
||||||
|
|
||||||
|
## Proxy usage telemetry (row333 / P5)
|
||||||
|
|
||||||
|
The optional `usage` kind is interface 1, a single module with `read({client})`.
|
||||||
|
`cliproxy-queue` is off by default and enabled through human `plugins.set`.
|
||||||
|
It supplies proxy-labelled per-account numbers alongside the native per-key
|
||||||
|
counts; it has no quota authority. See
|
||||||
|
[the module contract](usage/cliproxy-queue/README.md) for poll settings, ID mapping,
|
||||||
|
record separation, bounded reads and per-key quota settings.
|
||||||
@@ -62,10 +62,13 @@ function windowStart(entry, now) {
|
|||||||
|
|
||||||
function leaves(limits) {
|
function leaves(limits) {
|
||||||
const daily = limits?.tokens?.daily ?? {};
|
const daily = limits?.tokens?.daily ?? {};
|
||||||
return Object.entries(daily).map(([account, entry]) => {
|
const entries = [...Object.entries(daily).map(([account, entry]) => ({ path: ['tokens', 'daily', account], entry, match: x => x.account === account })),
|
||||||
|
...Object.entries(limits?.tokens?.keys ?? {}).filter(([key, entry]) => /^[a-f0-9]{12}$/.test(key) && Object.hasOwn(entry, 'reset'))
|
||||||
|
.map(([key, entry]) => ({ path: ['tokens', 'keys', key], entry, match: x => x.modelKeyId === key }))];
|
||||||
|
return entries.map(({ path, entry, match }) => {
|
||||||
if (!Number.isSafeInteger(entry?.limit) || entry.limit < 0 || typeof entry.reset !== 'string' || !RESET.test(entry.reset) ||
|
if (!Number.isSafeInteger(entry?.limit) || entry.limit < 0 || typeof entry.reset !== 'string' || !RESET.test(entry.reset) ||
|
||||||
typeof entry.timeZone !== 'string') refuse('bad-leaf');
|
typeof entry.timeZone !== 'string') refuse('bad-leaf');
|
||||||
return { path: ['tokens', 'daily', account], entry, account };
|
return { path, entry, match };
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +77,7 @@ function tally(leaf, records, now) {
|
|||||||
const kinds = Object.fromEntries(KINDS.map(k => [k, 0n]));
|
const kinds = Object.fromEntries(KINDS.map(k => [k, 0n]));
|
||||||
const unknown = new Set();
|
const unknown = new Set();
|
||||||
for (const r of records) {
|
for (const r of records) {
|
||||||
if (r.account !== leaf.account || time(r.at) < from) continue;
|
if (!leaf.match(r) || time(r.at) < from) continue;
|
||||||
if (r.status === 'known') for (const k of KINDS) kinds[k] += amount(r[k]);
|
if (r.status === 'known') for (const k of KINDS) kinds[k] += amount(r[k]);
|
||||||
else unknown.add(JSON.stringify([r.run, r.turn]));
|
else unknown.add(JSON.stringify([r.run, r.turn]));
|
||||||
}
|
}
|
||||||
@@ -86,7 +89,7 @@ function hitFor({ limits, subject, records, now }) {
|
|||||||
if (!Array.isArray(records)) refuse('bad-records');
|
if (!Array.isArray(records)) refuse('bad-records');
|
||||||
const at = time(now);
|
const at = time(now);
|
||||||
for (const leaf of leaves(limits)) {
|
for (const leaf of leaves(limits)) {
|
||||||
if (subject?.account !== leaf.account) continue;
|
if (!leaf.match(subject ?? {})) continue;
|
||||||
const { count, unknownTurns } = tally(leaf, records, at);
|
const { count, unknownTurns } = tally(leaf, records, at);
|
||||||
if (count >= BigInt(leaf.entry.limit)) return { path: leaf.path, limit: leaf.entry.limit, count: plain(count), unknownTurns };
|
if (count >= BigInt(leaf.entry.limit)) return { path: leaf.path, limit: leaf.entry.limit, count: plain(count), unknownTurns };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ function leaves(limits) {
|
|||||||
// A key is the record's account. Accounts are null until row 126 names them,
|
// A key is the record's account. Accounts are null until row 126 names them,
|
||||||
// so a key limit matches nothing until then.
|
// so a key limit matches nothing until then.
|
||||||
for (const [k, entry] of Object.entries(tokens.keys ?? {}))
|
for (const [k, entry] of Object.entries(tokens.keys ?? {}))
|
||||||
out.push({ path: ['tokens', 'keys', k], entry, match: x => x.account === k, key: true });
|
if (!Object.hasOwn(entry, 'reset')) out.push({ path: ['tokens', 'keys', k], entry,
|
||||||
|
match: x => /^[a-f0-9]{12}$/.test(k) ? x.modelKeyId === k : x.account === k, key: true });
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +73,7 @@ export function mustStop(args) {
|
|||||||
// while no record names an account (lead decision 150, Q1).
|
// while no record names an account (lead decision 150, Q1).
|
||||||
export function report({ limits, records }) {
|
export function report({ limits, records }) {
|
||||||
if (!Array.isArray(records)) refuse('bad-records');
|
if (!Array.isArray(records)) refuse('bad-records');
|
||||||
const named = records.some(r => r.account !== null && r.account !== undefined);
|
const named = records.some(r => r.account != null || r.modelKeyId != null);
|
||||||
return leaves(limits).map(leaf => {
|
return leaves(limits).map(leaf => {
|
||||||
const { path, entry: { limit, since } } = leaf;
|
const { path, entry: { limit, since } } = leaf;
|
||||||
if (leaf.key && !named) return { path, limit, since, notEnforced: 'no records name a key' };
|
if (leaf.key && !named) return { path, limit, since, notEnforced: 'no records name a key' };
|
||||||
|
|||||||
@@ -4,6 +4,19 @@
|
|||||||
// switches on one module or a list. Adding a kind, or changing one, is a
|
// switches on one module or a list. Adding a kind, or changing one, is a
|
||||||
// core change: a reviewed edit to this file.
|
// core change: a reviewed edit to this file.
|
||||||
|
|
||||||
|
// Optional proxy telemetry is separate from session usage-source and limit-check.
|
||||||
|
export function checkUsageSettings(value) {
|
||||||
|
const object = v => v !== null && typeof v === "object" && !Array.isArray(v);
|
||||||
|
const bad = () => { throw new PluginError("invalid-usage-settings", "usage.cliproxyQueue.pollSeconds must be a whole number from 1 through 59"); };
|
||||||
|
if (!object(value) || Object.keys(value).some(k => k !== "cliproxyQueue")) bad();
|
||||||
|
if (Object.hasOwn(value, "cliproxyQueue")) {
|
||||||
|
const queue = value.cliproxyQueue;
|
||||||
|
if (!object(queue) || Object.keys(queue).some(k => k !== "pollSeconds")) bad();
|
||||||
|
if (Object.hasOwn(queue, "pollSeconds") && (!Number.isSafeInteger(queue.pollSeconds) || queue.pollSeconds < 1 || queue.pollSeconds >= 60)) bad();
|
||||||
|
}
|
||||||
|
return structuredClone(value);
|
||||||
|
}
|
||||||
|
|
||||||
export const NAME = /^[a-z][a-z0-9-]*$/;
|
export const NAME = /^[a-z][a-z0-9-]*$/;
|
||||||
|
|
||||||
export const KINDS = Object.freeze({
|
export const KINDS = Object.freeze({
|
||||||
@@ -56,6 +69,9 @@ export const KINDS = Object.freeze({
|
|||||||
exports: Object.freeze(["adapter", "levels", "preflight", "version", "countsAccount", "mounts", "builtinWeb", "builtins",
|
exports: Object.freeze(["adapter", "levels", "preflight", "version", "countsAccount", "mounts", "builtinWeb", "builtins",
|
||||||
"typedName", "reliesOn", "gateTimeout", "bundle", "env", "turnEnd", "transcript", "compactions"]),
|
"typedName", "reliesOn", "gateTimeout", "bundle", "env", "turnEnd", "transcript", "compactions"]),
|
||||||
}),
|
}),
|
||||||
|
usage: Object.freeze({
|
||||||
|
kind: "usage", interfaceVersion: 1, exports: Object.freeze(["read"]), switch: "one",
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
export class PluginError extends Error {
|
export class PluginError extends Error {
|
||||||
|
|||||||
@@ -169,3 +169,17 @@ test("REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is emp
|
|||||||
assert.deepEqual(check.report(a), []);
|
assert.deepEqual(check.report(a), []);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('P5 daily quota for a model key ID matches stack key records and resets the next day', () => {
|
||||||
|
const keyId = '012345abcdef';
|
||||||
|
const a = { business: 'demo', now: NOW, limits: { tokens: { keys: { [keyId]: quota({ limit: 100 }) } } },
|
||||||
|
subject: { instance: 'coder', modelKeyId: keyId, account: null },
|
||||||
|
records: [known('2026-10-18T11:00:00.000Z', { modelKeyId: keyId, account: null })] };
|
||||||
|
assert.equal(check.mayLaunch(a).allow, false);
|
||||||
|
assert.equal(check.mustStop(a).stop, true);
|
||||||
|
assert.equal(check.report(a)[0].count, 100);
|
||||||
|
assert.deepEqual(check.report(a)[0].path, ['tokens', 'keys', keyId]);
|
||||||
|
assert.equal(check.mayLaunch({ ...a, now: '2026-10-19T11:00:00.000Z' }).allow, true);
|
||||||
|
assert.equal(check.mayLaunch({ ...a, subject: { modelKeyId: 'abcdef012345' } }).allow, true);
|
||||||
|
assert.equal(check.mayLaunch({ ...a, limits: {} }).allow, true);
|
||||||
|
});
|
||||||
@@ -6,7 +6,7 @@ import { KINDS, NAME, PluginError, checkPlugins } from "../src/kinds.mjs";
|
|||||||
const code = expected => e => e instanceof PluginError && e.code === expected;
|
const code = expected => e => e instanceof PluginError && e.code === expected;
|
||||||
|
|
||||||
test("REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list", () => {
|
test("REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list", () => {
|
||||||
assert.deepEqual(Object.keys(KINDS), ["usage-source", "limit-check", "search-source", "channel", "harness"]);
|
assert.deepEqual(Object.keys(KINDS), ["usage-source", "limit-check", "search-source", "channel", "harness", "usage"]);
|
||||||
assert.deepEqual({ ...KINDS["usage-source"], exports: [...KINDS["usage-source"].exports] },
|
assert.deepEqual({ ...KINDS["usage-source"], exports: [...KINDS["usage-source"].exports] },
|
||||||
{ kind: "usage-source", interfaceVersion: 1, exports: ["readTurn"], switch: "list" });
|
{ kind: "usage-source", interfaceVersion: 1, exports: ["readTurn"], switch: "list" });
|
||||||
assert.deepEqual({ ...KINDS["limit-check"], exports: [...KINDS["limit-check"].exports] },
|
assert.deepEqual({ ...KINDS["limit-check"], exports: [...KINDS["limit-check"].exports] },
|
||||||
@@ -54,3 +54,12 @@ test("REQ-PLUG-1 checkPlugins reports through the caller's fail callback", () =>
|
|||||||
assert.throws(() => checkPlugins({ "made-up": [] }, "x plugins", { fail }), /x plugins names unknown kind/);
|
assert.throws(() => checkPlugins({ "made-up": [] }, "x plugins", { fail }), /x plugins names unknown kind/);
|
||||||
assert.deepEqual(seen, ["unknown-kind"]);
|
assert.deepEqual(seen, ["unknown-kind"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test("P5 usage telemetry is optional, single module, separate from enforcing sources", () => {
|
||||||
|
assert.deepEqual({ ...KINDS.usage, exports: [...KINDS.usage.exports] },
|
||||||
|
{ kind: "usage", interfaceVersion: 1, exports: ["read"], switch: "one" });
|
||||||
|
assert.deepEqual(checkPlugins({}, "plugins"), {});
|
||||||
|
assert.deepEqual(checkPlugins({ usage: "cliproxy-queue" }, "plugins"), { usage: "cliproxy-queue" });
|
||||||
|
assert.throws(() => checkPlugins({ usage: ["cliproxy-queue"] }, "plugins"), code("bad-setting"));
|
||||||
|
});
|
||||||
@@ -12,7 +12,7 @@ import { validateBusinessDocument } from "../../business/src/business.mjs";
|
|||||||
|
|
||||||
const GOOD = { "usage-source": ["meter"], "limit-check": ["cap"] };
|
const GOOD = { "usage-source": ["meter"], "limit-check": ["cap"] };
|
||||||
// What loaded() reports for GOOD: search-source is a kind too, switched off here.
|
// What loaded() reports for GOOD: search-source is a kind too, switched off here.
|
||||||
const GOOD_LOADED = { ...GOOD, "search-source": [], channel: [], harness: [] };
|
const GOOD_LOADED = { ...GOOD, "search-source": [], channel: [], harness: [], usage: [] };
|
||||||
|
|
||||||
// A tree with one good module of each kind, already loaded.
|
// A tree with one good module of each kind, already loaded.
|
||||||
async function loadedTree(t, options) {
|
async function loadedTree(t, options) {
|
||||||
@@ -56,7 +56,7 @@ test("REQ-PLUG-1 fixture modules of each kind switch on from a test organization
|
|||||||
const loader = await s.loader();
|
const loader = await s.loader();
|
||||||
const result = await loader.load(business.plugins);
|
const result = await loader.load(business.plugins);
|
||||||
assert.deepEqual(result.refused, []);
|
assert.deepEqual(result.refused, []);
|
||||||
assert.deepEqual(result.loaded, { ...doc.plugins, "search-source": [], channel: [], harness: [] });
|
assert.deepEqual(result.loaded, { ...doc.plugins, "search-source": [], channel: [], harness: [], usage: [] });
|
||||||
assert.equal(loader.modules("usage-source")[0].readTurn(), "fixture-usage");
|
assert.equal(loader.modules("usage-source")[0].readTurn(), "fixture-usage");
|
||||||
assert.equal(loader.modules("limit-check")[0].mayLaunch(), "fixture-limit");
|
assert.equal(loader.modules("limit-check")[0].mayLaunch(), "fixture-limit");
|
||||||
assert.equal(loader.modules("limit-check")[0].mustStop(), false);
|
assert.equal(loader.modules("limit-check")[0].mustStop(), false);
|
||||||
@@ -170,7 +170,7 @@ test("REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses a
|
|||||||
assert.match(result.refused[0].message, /packages\/plugins can't be read \(EACCES\)/);
|
assert.match(result.refused[0].message, /packages\/plugins can't be read \(EACCES\)/);
|
||||||
assert.deepEqual(result.refused[0].kept, ["meter"]);
|
assert.deepEqual(result.refused[0].kept, ["meter"]);
|
||||||
assert.deepEqual(s.loader.logged.slice(before), result.refused);
|
assert.deepEqual(s.loader.logged.slice(before), result.refused);
|
||||||
assert.deepEqual(s.loader.loaded(), { "usage-source": ["meter"], "limit-check": [], "search-source": [], channel: [], harness: [] });
|
assert.deepEqual(s.loader.loaded(), { "usage-source": ["meter"], "limit-check": [], "search-source": [], channel: [], harness: [], usage: [] });
|
||||||
} finally {
|
} finally {
|
||||||
if (lock) chmodSync(lock, 0o755);
|
if (lock) chmodSync(lock, 0o755);
|
||||||
}
|
}
|
||||||
@@ -232,7 +232,7 @@ test("REQ-PLUG-1 a kind refused on its first load has nothing switched on, and t
|
|||||||
const loader = await s.loader();
|
const loader = await s.loader();
|
||||||
// meter loads, absent refuses: the whole kind stays off, not half on.
|
// meter loads, absent refuses: the whole kind stays off, not half on.
|
||||||
const result = await loader.load({ "usage-source": ["meter", "absent"], "limit-check": ["cap"] });
|
const result = await loader.load({ "usage-source": ["meter", "absent"], "limit-check": ["cap"] });
|
||||||
assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [] });
|
assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [], usage: [] });
|
||||||
assert.deepEqual(loader.loaded(), result.loaded);
|
assert.deepEqual(loader.loaded(), result.loaded);
|
||||||
assert.deepEqual(loader.modules("usage-source"), []);
|
assert.deepEqual(loader.modules("usage-source"), []);
|
||||||
assert.equal(loader.logged.length, 1);
|
assert.equal(loader.logged.length, 1);
|
||||||
@@ -260,7 +260,7 @@ test("REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole se
|
|||||||
await refusesKeepingOld(s, ["meter", "meter"], "bad-setting", "meter", /twice/);
|
await refusesKeepingOld(s, ["meter", "meter"], "bad-setting", "meter", /twice/);
|
||||||
// An absent key switches the kind off.
|
// An absent key switches the kind off.
|
||||||
result = await s.loader.load({ "limit-check": ["cap"] });
|
result = await s.loader.load({ "limit-check": ["cap"] });
|
||||||
assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [] });
|
assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [], usage: [] });
|
||||||
});
|
});
|
||||||
|
|
||||||
test("REQ-PLUG-1 loads run one at a time, so the last requested setting wins", async t => {
|
test("REQ-PLUG-1 loads run one at a time, so the last requested setting wins", async t => {
|
||||||
|
|||||||
@@ -149,3 +149,12 @@ test("REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check
|
|||||||
assert.deepEqual(check.mustStop(a), { stop: false });
|
assert.deepEqual(check.mustStop(a), { stop: false });
|
||||||
assert.deepEqual(check.report(a), []);
|
assert.deepEqual(check.report(a), []);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('P5 a model key ID limit counts stack records by key ID without an account', () => {
|
||||||
|
const keyId = '012345abcdef';
|
||||||
|
const args = { business: 'demo', limits: { tokens: { keys: { [keyId]: { limit: 5, since: '2026-10-18T00:00:00.000Z' } } } },
|
||||||
|
subject: { instance: 'coder', modelKeyId: keyId, account: null }, records: [{ at: '2026-10-18T01:00:00.000Z',
|
||||||
|
run: 'run', turn: 'turn', modelKeyId: keyId, account: null, status: 'known', input: 5, output: 0, cacheWrite: 0, cacheRead: 0 }] };
|
||||||
|
assert.equal(check.mayLaunch(args).allow, false);
|
||||||
|
assert.equal(check.report(args)[0].count, 5);
|
||||||
|
});
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# Optional CLIProxyAPI queue telemetry (P5)
|
||||||
|
|
||||||
|
Enable through the human `plugins.set` transport with `plugins.usage` set to
|
||||||
|
`"cliproxy-queue"`. Omission is off. The same patch may set
|
||||||
|
`usage.cliproxyQueue.pollSeconds` (integer 1 through 59, default 15); `usage: null`
|
||||||
|
removes this setting. Both switches and polling changes are human-only, including
|
||||||
|
on the tester path. The existing instance configuration and proxy key paths do
|
||||||
|
not change.
|
||||||
|
|
||||||
|
Interface 1 exports `read({client})`. The bus supplies its management client;
|
||||||
|
the module never reads credentials, configuration paths or the environment.
|
||||||
|
The client performs exactly one bounded GET of
|
||||||
|
`/v8/management/observability/usage/queue?count=100` per poll. Existing fixed
|
||||||
|
loopback, timeout, response byte cap and no-redirect/no-retry controls apply.
|
||||||
|
The proxy's array response is validated completely and mapped immediately:
|
||||||
|
`api_key` and `source` become their first 12 hexadecimal SHA-256 characters.
|
||||||
|
Only whitelisted token counts, a failure flag/status, and IDs leave the client.
|
||||||
|
No request IDs, failure bodies, client values or upstream values are retained.
|
||||||
|
Malformed batches fail atomically and yield a fixed, value-free failure code.
|
||||||
|
|
||||||
|
One bus/store writer owns the reader for its instance. It serializes polls,
|
||||||
|
drains the shared queue once, and assigns IDs to current and retiring model-key
|
||||||
|
metadata owners. Unknown `msk-` IDs go to the reconcile receipt. Foreign keys
|
||||||
|
without that prefix are ignored. Disabled businesses receive no telemetry.
|
||||||
|
|
||||||
|
Telemetry uses the existing append-only usage table with source
|
||||||
|
`@proxy/cliproxy-queue`, separate from native session source records. `turnRecords`
|
||||||
|
excludes it before every limit check and native usage total. Proxy totals may be
|
||||||
|
incomplete (60-second upstream retention and a 100-event drain); the Console
|
||||||
|
labels them proxy-reported and reports the reader's availability. They never
|
||||||
|
independently enforce quotas.
|
||||||
|
|
||||||
|
Native transcript counts carry the immutable run's safe `modelKeyId` in the
|
||||||
|
usage cursor, preserved at turn begin and end. The Console exposes `byKey`.
|
||||||
|
A business can set a daily per-key quota at
|
||||||
|
`launch.limits.tokens.keys.<12-hex-key-id>` with `{limit, since, reset, timeZone}`;
|
||||||
|
the human writer stamps `since`. Enable `limit-check: ["daily-quota"]` to apply
|
||||||
|
that quota. Cumulative model-key limits retain `{limit,since}` and use
|
||||||
|
`token-limit`. Omitting a limit means no quota. Existing named account keys and
|
||||||
|
`tokens.daily.<account>` retain their existing behavior. Model-key limits and
|
||||||
|
resets are human-only through every organization writer. Missing, ambiguous or
|
||||||
|
foreign run-key metadata fails closed with `proxy-key-refused`; a retiring run
|
||||||
|
counts against its own retained key, never the agent's newer key.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// P5: telemetry only. The bus's management client sanitizes at the HTTP boundary.
|
||||||
|
// No credential value or limit-check authority crosses this interface.
|
||||||
|
export const interfaceVersion = 1;
|
||||||
|
export function read({ client }) { return client.readUsageQueue(); }
|
||||||
@@ -751,13 +751,14 @@
|
|||||||
if (!value?.total) return '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Usage unavailable. No count was read.</p></section>';
|
if (!value?.total) return '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Usage unavailable. No count was read.</p></section>';
|
||||||
const columns = row => ['input', 'output', 'cacheWrite', 'cacheRead', 'unknownTurns'].map(key => `<td>${txt(row[key])}</td>`).join('');
|
const columns = row => ['input', 'output', 'cacheWrite', 'cacheRead', 'unknownTurns'].map(key => `<td>${txt(row[key])}</td>`).join('');
|
||||||
const rows = [`<tr><th scope="row">Total</th>${columns(value.total)}</tr>`];
|
const rows = [`<tr><th scope="row">Total</th>${columns(value.total)}</tr>`];
|
||||||
for (const [group, label] of [['byRun', 'Run'], ['byInstance', 'Instance'], ['byModel', 'Model'], ['byProvider', 'Provider'], ['byAccount', 'Account']]) {
|
for (const [group, label] of [['byRun', 'Run'], ['byInstance', 'Instance'], ['byModel', 'Model'], ['byProvider', 'Provider'], ['byAccount', 'Account'], ['byKey', 'Key']]) {
|
||||||
for (const row of value[group] || []) {
|
for (const row of value[group] || []) {
|
||||||
const name = ['run', 'instance', 'provider', 'model', 'account'].filter(key => key in row).map(key => row[key] ?? 'unassigned').join(' / ');
|
const name = ['run', 'instance', 'provider', 'model', 'account', 'modelKeyId'].filter(key => key in row).map(key => row[key] ?? 'unassigned').join(' / ');
|
||||||
rows.push(`<tr><th scope="row">${label}: ${txt(name)}</th>${columns(row)}</tr>`);
|
rows.push(`<tr><th scope="row">${label}: ${txt(name)}</th>${columns(row)}</tr>`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return `<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody>${rows.join('')}</tbody></table></div></section>`;
|
const proxy = value.proxy ? `<section aria-label="Proxy-reported usage"><h3>Proxy-reported usage</h3><p>Optional proxy telemetry never enforces a quota. Status: ${txt(value.proxy.state)}. These counts cover drained events and may be incomplete.</p><div class="table-wrap"><table><thead><tr><th>Proxy account ID</th><th>Input</th><th>Output</th><th>Cache write</th><th>Cache read</th><th>Requests</th><th>Failures</th></tr></thead><tbody>${(value.proxy.byAccount || []).map(row => `<tr><th scope="row">${txt(row.accountId)}</th>${['input','output','cacheWrite','cacheRead','requests','failures'].map(k => `<td>${txt(row[k])}</td>`).join('')}</tr>`).join('')}</tbody></table></div></section>` : '';
|
||||||
|
return `<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody>${rows.join('')}</tbody></table></div>${proxy}</section>`;
|
||||||
}
|
}
|
||||||
// Row 155 (#1649, Q169): each assistant instance's settings, its seat name and a stop. A save
|
// Row 155 (#1649, Q169): each assistant instance's settings, its seat name and a stop. A save
|
||||||
// sends only the fields that changed, with the read's revision. Drafts survive polling and
|
// sends only the fields that changed, with the read's revision. Drafts survive polling and
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// Local renderer contract: no browser, real accounts, provider or auth material.
|
||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { readFileSync } from 'node:fs';
|
||||||
|
import { runInNewContext } from 'node:vm';
|
||||||
|
const source=readFileSync(new URL('../src/public/bus.js',import.meta.url),'utf8');
|
||||||
|
const start=source.indexOf(' function tokenUsage(value) {'),end=source.indexOf('\n // Row 155',start);
|
||||||
|
const render=runInNewContext(`const txt=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));${source.slice(start,end)};tokenUsage`);
|
||||||
|
const counts={input:2,output:3,cacheWrite:4,cacheRead:5,unknownTurns:0};
|
||||||
|
test('P5 Console displays stack count per safe key separately from optional proxy account numbers',()=>{
|
||||||
|
const native={total:counts,byKey:[{modelKeyId:'012345abcdef',...counts}]};
|
||||||
|
const off=render(native);assert.match(off,/Key: 012345abcdef/);assert.doesNotMatch(off,/Proxy-reported/);
|
||||||
|
const on=render({...native,proxy:{source:'proxy',state:'available',byAccount:[{accountId:'abcdef012345',input:99,output:7,cacheWrite:0,cacheRead:0,requests:2,failures:1}]}});
|
||||||
|
assert.match(on,/Proxy-reported/);assert.match(on,/abcdef012345/);assert.match(on,/telemetry.*quota/i);assert.match(on,/>99</);
|
||||||
|
assert.match(on,/Key: 012345abcdef/);assert.doesNotMatch(on,/msk-|upstream-canary/);
|
||||||
|
});
|
||||||
|
test('P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero',()=>{
|
||||||
|
const page=render({total:counts,byKey:[{modelKeyId:'<img src=x>',...counts}],proxy:{source:'proxy',state:'unavailable',byAccount:[]}});
|
||||||
|
assert.doesNotMatch(page,/<img/);assert.match(page,/unavailable/);
|
||||||
|
});
|
||||||
Reference in new issue
Block a user