elanous 0.2.43 → 0.2.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{Om5xS9jpjSXJCeTNGYEi4 → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{3557ac4a.c8931684475018ad.js → 08334415.f0e80896acbef722.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/118.2a89982fe4276880.js +23 -0
- package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{3955.6922286237f2ac2b.js → 1306.967240ede9a0f757.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{5628.6ddb2d5ffba4ff4c.js → 1401.22dfe92640a2b1ac.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2573.387a707f6f9d720c.js → 1694.18debfd77562e56d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7910-6f139bcafd238b9f.js → 1850-522de4ee34957210.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1406.a1dc2ab6f8449374.js → 1978.eeb60a606dc5deac.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3402.44b565b314f2263c.js → 2043.e233e3b5a3e790f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3694.e0099884345f0198.js → 2216.802962c04f40a26e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
- package/apps/pwa/out/_next/static/chunks/239.de075467b5523469.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{1200.6a37c202f9f17e9a.js → 249.ba7051590d603c8f.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3935.16701e33f8982dc9.js → 2954.bbefc95d6b20e0d8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{aa57532f.510551854ff239b1.js → 2e0f720a.a0697c08e3806a60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5930.8b4df3b46c32b05a.js → 3349.b5f09ee474d9533e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5866.366966af47fdde5d.js → 3503.a47a9755fb4d97b0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7900.096f455c7c1efc53.js → 3843.bad404d008893291.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8588.d1c6a2903727ce87.js → 4393.28fa5228d0eec217.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8062-7cd0bcc7f01455ba.js → 4415-b9d6a90960920a4a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{8313-dfa1021bb58a46d6.js → 447-5b304de1fe098f43.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6944.309f4e3ea54d1537.js → 4502.bdcc877abd437a05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3072.01338851ca21a6f7.js → 46.57c783fa4884714f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8986.8e2e4efbfa655c59.js → 4757.67c6d7473a038e78.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4891.3f80ba517a3b2373.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8205.282ca4bb62d54a0a.js → 4998.810ca8833084caa9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5789.2da35c258292e1e5.js → 5052.7dbb12a55d4f18f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
- package/apps/pwa/out/_next/static/chunks/{9770.5f75bc6088b16109.js → 5439.3fec6dbce29ecb36.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1313-19f737e0222c4444.js → 5612-074d9a5e00dfac6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{3969.272ee7f9fd6c62e5.js → 5790.5eb06a653ebd8571.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6540.c7bef57ad8f90a87.js → 5989.7ecd362c5c44b747.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{0ad6802e.ae7afb63fdcb4491.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{0966f8a1.745fcd44f64a87ea.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
- package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
- package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
- package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2144.25b292396712196d.js → 6245.1182e007e9d230d9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{363bfab3.9623b9f89363541f.js → 63699a35.17262e162bc514b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{d96660fb.cbc21a2a88539dbb.js → 6549dad0.2740b25e51bf8f05.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{5564.9e72532188f57586.js → 6881.9e7955847640c7fe.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3903.3ef4656c67572764.js → 7010.1bbd17a7f2b3e376.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2312.0c8b61e22d3136d7.js → 7679.32c40cdd14f20b4a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4199.ce86b281fd0a60b7.js → 8442.2f09ca969d631615.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
- package/apps/pwa/out/_next/static/chunks/8551.f762945c2cda2e95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{fb7d20d5-6892502b6ee39ca6.js → 86961958-4b0689a5048f756b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/87f498e5-0881de09f2e44707.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{cb0f8df8.09a4a6be97e3fc5f.js → 892fd990.456232f326cc39c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{837-81336ebaca8198a8.js → 8965-135a2c9eaa2464cb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{8637.90f92d5c8db4732c.js → 9398.1f56e3f17795f43f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
- package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-0a815f34367b6db6.js → page-da787e8a10b8a82e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/overlays/README.md +6 -0
- package/graphs/release/release-loop.yaml +33 -17
- package/graphs/units/verbs/make-doc.yaml +1 -0
- package/package.json +1 -1
- package/scripts/bench-metering-plan.ts +229 -0
- package/scripts/demo/demo1104-parallel-host.ts +56 -0
- package/scripts/demo/demo1104-parallel.ts +72 -0
- package/scripts/public-leak-baseline.txt +0 -1
- package/scripts/release-loop/docs-node.ts +4 -2
- package/scripts/release-loop/gate-image-pin.ts +116 -2
- package/scripts/release-loop/gate-node.ts +217 -25
- package/scripts/release-loop/gate-progress-sim.ts +73 -0
- package/scripts/release-loop/notes-repair.ts +18 -1
- package/scripts/release-loop/preflight.ts +188 -8
- package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
- package/scripts/release-loop/resume-release.ts +9 -7
- package/scripts/release-loop/resume.ts +13 -4
- package/scripts/release-loop/warm-control-forward.ts +178 -0
- package/scripts/retro-cycle.ts +30 -8
- package/scripts/rhythm/daily.ts +4 -1
- package/scripts/rhythm/linear-progress-sync.ts +28 -15
- package/scripts/ux-sim.ts +7 -1
- package/scripts/warm-pool-provider-config.ts +6 -1
- package/src/agent-mission/grok-auth-status.ts +78 -18
- package/src/agent-mission/mission-out.ts +2 -2
- package/src/agent-substrate/pr-reviewer.ts +147 -11
- package/src/agent-substrate/self-review-cli.ts +10 -2
- package/src/auto-research/research-fanout.ts +221 -0
- package/src/auto-research/research-turn.ts +282 -36
- package/src/autopilot/mission-codebase-gate.ts +7 -3
- package/src/cli/control-cli.ts +15 -6
- package/src/cli/log-event-names.ts +8 -0
- package/src/cli/setup-keys.ts +20 -8
- package/src/cli/tui-test-cli.ts +9 -5
- package/src/control-plane/ledger.ts +42 -4
- package/src/control-plane/member-tokens.ts +25 -2
- package/src/control-plane/ports.ts +8 -3
- package/src/control-plane/server.ts +26 -5
- package/src/core-turn/research-policy.ts +7 -1
- package/src/core-turn/run-core-turn.ts +186 -39
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +113 -24
- package/src/dashboard/classic-sidetab-mission-pair.ts +3 -2
- package/src/dashboard/classic-sidetab-mission-trio.ts +35 -12
- package/src/dashboard/classic-sidetab-mission.ts +2 -0
- package/src/dashboard/index.ts +9 -1
- package/src/dashboard/sidetab-runtime.ts +2 -0
- package/src/dashboard/visible-mission-diagnostics.ts +16 -0
- package/src/domains/retro-cycle-observation.ts +43 -0
- package/src/domains/retro-cycle.ts +13 -2
- package/src/domains/retro-proposals.ts +92 -0
- package/src/domains/retro-report.ts +6 -1
- package/src/graph-runner/graph-cli.ts +24 -1
- package/src/graph-runner/graph-grow-llm.ts +3 -1
- package/src/graph-runner/runner.ts +226 -30
- package/src/harness/harness-cli-command.ts +4 -2
- package/src/harness/harness-pod-dispatch.ts +3 -0
- package/src/index.ts +2 -2
- package/src/llm/child-first-llm-observation.ts +112 -0
- package/src/llm/provider-credentials.ts +60 -4
- package/src/llm/provider-failure-evidence.ts +44 -0
- package/src/llm.ts +170 -11
- package/src/mcp/client.ts +7 -0
- package/src/mcp/proxy-runtime.ts +6 -1
- package/src/mcp/server.ts +54 -0
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/consult-requests.ts +18 -6
- package/src/nexus/api/discord-trigger-bot.ts +6 -6
- package/src/nexus/api/graphs-api.ts +4 -2
- package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
- package/src/nexus/api/telegram-trigger-bot.ts +6 -6
- package/src/nexus/boot/register-mcp-clients.ts +114 -8
- package/src/nexus/index.ts +15 -0
- package/src/nexus/outbound/grokbot-adapter.ts +71 -0
- package/src/nexus/outbound/router.ts +33 -13
- package/src/oauth/codex-owner-mirror.ts +47 -10
- package/src/onboarding/first-run.ts +44 -6
- package/src/preview/terminal.ts +22 -7
- package/src/prompt-enhance/enhance.ts +10 -0
- package/src/pty-shell/pty-write-provenance.ts +21 -3
- package/src/pty-shell/registry.ts +9 -2
- package/src/release-loop/proposal-auto-place.ts +83 -0
- package/src/research/axis-fanout.ts +40 -5
- package/src/research/lenses/second-order.ts +312 -0
- package/src/self-dev/dev-cli.ts +3 -1
- package/src/self-dev/draft-sweep.ts +31 -10
- package/src/self-dev/draft-triage-rules.ts +60 -3
- package/src/self-dev/run-supervisor.ts +152 -2
- package/src/self-implement/goal-author.ts +208 -23
- package/src/self-implement/graph-overlay-yaml.ts +151 -0
- package/src/self-implement/graph-yaml.ts +68 -2
- package/src/self-implement/orchestrator.ts +62 -15
- package/src/self-implement/test-scenario-request.ts +37 -6
- package/src/session/chat.ts +2 -2
- package/src/session-runtime/index.ts +37 -5
- package/src/sidetab-core/model.ts +205 -10
- package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
- package/src/sidetab-core/visible-agent-mission.ts +105 -47
- package/src/skills/tools/omni-search.ts +4 -2
- package/src/task-agent/parent-host.ts +19 -1
- package/src/task-agent/recall-inject.ts +98 -0
- package/src/task-agent/task-hand.ts +26 -7
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +19 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +15 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +460 -96
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +38 -8
- package/src/tool-hints/gate.ts +45 -14
- package/src/tool-hints/signals.ts +1 -1
- package/src/tool-hints/types.ts +2 -0
- package/src/tool-runtime/browser-hand-runtime.ts +11 -1
- package/src/tool-runtime/browser-runtime.ts +31 -18
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +152 -36
- package/src/tool-runtime/types.ts +2 -0
- package/src/tui/entry.ts +27 -7
- package/src/tui/sidetab/attach.ts +112 -0
- package/src/tui/sidetab/list.ts +3 -2
- package/src/tui-client/next-dashboard-runtime.ts +52 -0
- package/src/ux-sim/draft-inventory-builder.ts +2 -1
- package/src/ux-sim/linear-secretary.ts +4 -12
- package/src/ux-sim/mock-scenario-catalog.json +32 -29
- package/src/ux-sim/mock-scenario-catalog.ts +55 -3
- package/src/ux-sim/release-sim-rig.ts +62 -18
- package/src/ux-sim/service-key-setup.ts +63 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +0 -23
- package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3113.d7472bbc27d580c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +0 -1
- package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4445.7990c76b3751a918.js +0 -115
- package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +0 -36
- package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +0 -104
- package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +0 -287
- package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +0 -148
- package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +0 -74
- package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +0 -41
- package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8861-cc1fa1c7b920fa8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +0 -1
- package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +0 -1
- package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +0 -32
- package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +0 -8
- package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +0 -1
- package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +0 -1
- /package/apps/pwa/out/_next/static/{Om5xS9jpjSXJCeTNGYEi4 → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { RunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
2
|
+
import { redactSecretText } from '../debug/log.js';
|
|
3
|
+
|
|
4
|
+
export interface ChildFirstLlmEvent {
|
|
5
|
+
readonly runId: string;
|
|
6
|
+
readonly event: 'child-first-llm-call' | 'child-first-tool-call';
|
|
7
|
+
readonly data: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type ChildFirstLlmWriter = (event: ChildFirstLlmEvent) => void | Promise<void>;
|
|
11
|
+
|
|
12
|
+
/** Appends one first-provider-call timeline per child run. The writer is fail-soft by contract. */
|
|
13
|
+
export function createChildFirstLlmRecorder(write: ChildFirstLlmWriter) {
|
|
14
|
+
const started = new Set<string>();
|
|
15
|
+
const responded = new Set<string>();
|
|
16
|
+
const toolCalled = new Set<string>();
|
|
17
|
+
return {
|
|
18
|
+
async start(input: { runId: string; provider: string; model: string; accountName?: string; at?: string }): Promise<void> {
|
|
19
|
+
const runId = input.runId.trim();
|
|
20
|
+
if (!runId || started.has(runId)) return;
|
|
21
|
+
started.add(runId);
|
|
22
|
+
await write({
|
|
23
|
+
runId, event: 'child-first-llm-call',
|
|
24
|
+
data: { status: 'started', provider: input.provider, model: input.model,
|
|
25
|
+
accountName: input.accountName ?? null, startedAt: input.at ?? new Date().toISOString() },
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
async response(input: { runId: string; status: 'ok' | 'error'; httpStatus?: number; error?: unknown; at?: string }): Promise<void> {
|
|
29
|
+
const runId = input.runId.trim();
|
|
30
|
+
if (!runId || !started.has(runId) || responded.has(runId)) return;
|
|
31
|
+
responded.add(runId);
|
|
32
|
+
const raw = input.error instanceof Error ? input.error.message : input.error == null ? '' : String(input.error);
|
|
33
|
+
const firstLine = redactSecretText(raw.split(/\r?\n/u, 1)[0] ?? '').replace(/\s+/gu, ' ').slice(0, 240);
|
|
34
|
+
await write({
|
|
35
|
+
runId, event: 'child-first-llm-call',
|
|
36
|
+
data: { status: input.status, ...(input.httpStatus === undefined ? {} : { httpStatus: input.httpStatus }),
|
|
37
|
+
...(firstLine ? { errorFirstLine: firstLine } : {}), respondedAt: input.at ?? new Date().toISOString() },
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
async firstToolCall(input: { runId: string; at?: string }): Promise<void> {
|
|
41
|
+
const runId = input.runId.trim();
|
|
42
|
+
if (!runId || !started.has(runId) || toolCalled.has(runId)) return;
|
|
43
|
+
toolCalled.add(runId);
|
|
44
|
+
await write({ runId, event: 'child-first-tool-call', data: { at: input.at ?? new Date().toISOString() } });
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const defaultRecorder = createChildFirstLlmRecorder(async ({ runId, event, data }) => {
|
|
50
|
+
try {
|
|
51
|
+
const { appendRunLedgerEntry } = await import('../self-implement/run-ledger.js');
|
|
52
|
+
appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId, event, data } satisfies RunLedgerEntry);
|
|
53
|
+
} catch { /* observation must never prevent an LLM call */ }
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export function childRunIdForLlmObservation(env: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
57
|
+
const runId = env.ELANOUS_RUN_ID?.trim();
|
|
58
|
+
return runId || undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function recordChildFirstLlmStart(input: { provider: string; model: string; accountName?: string }): Promise<void> {
|
|
62
|
+
const runId = childRunIdForLlmObservation();
|
|
63
|
+
return runId ? defaultRecorder.start({ runId, ...input }) : Promise.resolve();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function recordChildFirstLlmResponse(input: { status: 'ok' | 'error'; httpStatus?: number; error?: unknown }): Promise<void> {
|
|
67
|
+
const runId = childRunIdForLlmObservation();
|
|
68
|
+
return runId ? defaultRecorder.response({ runId, ...input }) : Promise.resolve();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function recordChildFirstToolCall(): Promise<void> {
|
|
72
|
+
const runId = childRunIdForLlmObservation();
|
|
73
|
+
return runId ? defaultRecorder.firstToolCall({ runId }) : Promise.resolve();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface ChildFirstLlmFact {
|
|
77
|
+
readonly status: 'started' | 'ok' | 'error';
|
|
78
|
+
readonly provider: string;
|
|
79
|
+
readonly model: string;
|
|
80
|
+
readonly accountName: string | null;
|
|
81
|
+
readonly startedAt: string;
|
|
82
|
+
readonly respondedAt?: string;
|
|
83
|
+
readonly httpStatus?: number;
|
|
84
|
+
readonly errorFirstLine?: string;
|
|
85
|
+
readonly firstToolCallAt?: string;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function childFirstLlmFact(entries: readonly Pick<RunLedgerEntry, 'event' | 'data'>[]): ChildFirstLlmFact | undefined {
|
|
89
|
+
const start = entries.find((entry) => entry.event === 'child-first-llm-call' && entry.data.status === 'started');
|
|
90
|
+
if (!start || typeof start.data.provider !== 'string' || typeof start.data.model !== 'string' || typeof start.data.startedAt !== 'string') return undefined;
|
|
91
|
+
const response = entries.find((entry) => entry.event === 'child-first-llm-call' && (entry.data.status === 'ok' || entry.data.status === 'error'));
|
|
92
|
+
const tool = entries.find((entry) => entry.event === 'child-first-tool-call' && typeof entry.data.at === 'string');
|
|
93
|
+
const status = response?.data.status === 'ok' || response?.data.status === 'error' ? response.data.status : 'started';
|
|
94
|
+
return {
|
|
95
|
+
status, provider: start.data.provider, model: start.data.model,
|
|
96
|
+
accountName: typeof start.data.accountName === 'string' ? start.data.accountName : null,
|
|
97
|
+
startedAt: start.data.startedAt,
|
|
98
|
+
...(typeof response?.data.respondedAt === 'string' ? { respondedAt: response.data.respondedAt } : {}),
|
|
99
|
+
...(typeof response?.data.httpStatus === 'number' ? { httpStatus: response.data.httpStatus } : {}),
|
|
100
|
+
...(typeof response?.data.errorFirstLine === 'string' ? { errorFirstLine: response.data.errorFirstLine } : {}),
|
|
101
|
+
...(typeof tool?.data.at === 'string' ? { firstToolCallAt: tool.data.at } : {}),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function childFirstLlmStatusLabel(fact: ChildFirstLlmFact): string {
|
|
106
|
+
return fact.status === 'error' && fact.httpStatus !== undefined ? `error(${fact.httpStatus})` : fact.status;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function childFirstLlmReportFact(entries: readonly Pick<RunLedgerEntry, 'event' | 'data'>[]): (ChildFirstLlmFact & { readonly statusLabel: string }) | undefined {
|
|
110
|
+
const fact = childFirstLlmFact(entries);
|
|
111
|
+
return fact ? { ...fact, statusLabel: childFirstLlmStatusLabel(fact) } : undefined;
|
|
112
|
+
}
|
|
@@ -146,7 +146,7 @@ export function isKeylessProvider(provider: string | undefined): boolean {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/** 키가 어디서 왔나 — 관측·진단용(제1원칙: "왜 이 키인가"가 로그로 답해져야 한다). */
|
|
149
|
-
type CredentialSource = 'rotation' | 'env' | 'inherited' | 'none';
|
|
149
|
+
type CredentialSource = 'rotation' | 'env' | 'secret-store' | 'inherited' | 'none';
|
|
150
150
|
|
|
151
151
|
interface ResolvedCredential {
|
|
152
152
|
/** 해석된 키. 없으면 undefined(호출자가 provider 기본 인증으로 폴백하거나 명시 실패). */
|
|
@@ -176,6 +176,8 @@ interface ResolveCredentialInput {
|
|
|
176
176
|
/** base config 의 `llm.provider` — 전환 여부 판정용. */
|
|
177
177
|
baseProvider?: string | undefined;
|
|
178
178
|
env?: NodeJS.ProcessEnv;
|
|
179
|
+
/** 이미 조회한 SecretStore 값. 값은 런타임 메모리에서만 전달한다. */
|
|
180
|
+
secretStoreApiKey?: string | undefined;
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
/**
|
|
@@ -184,8 +186,9 @@ interface ResolveCredentialInput {
|
|
|
184
186
|
* 우선순위(대표 결정 (a)):
|
|
185
187
|
* ① `llm.rotation` 에서 같은 provider 엔트리의 apiKey (config·감사 가능)
|
|
186
188
|
* ② `providerEnvKey(provider)` 로 읽은 env
|
|
187
|
-
* ③
|
|
188
|
-
* ④
|
|
189
|
+
* ③ 기존 SecretStore (`providerEnvKey` 와 같은 ID)
|
|
190
|
+
* ④ provider 가 **안 바뀐** 경우에 한해 base `llm.apiKey` 상속
|
|
191
|
+
* ⑤ 없음 — 호출자가 판단(구독/OAuth provider 는 이게 정상일 수 있다)
|
|
189
192
|
*
|
|
190
193
|
* ⚠️ ③ 이 마지막인 것이 이 수리의 핵심이다. 종전엔 ③ 이 **무조건 첫 번째**였고, 그래서 provider 가
|
|
191
194
|
* 바뀌어도 옛 provider 의 키가 따라갔다(= 401 의 근본). provider 가 바뀌었으면 base 키는 **틀린 키**다.
|
|
@@ -230,7 +233,12 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
|
|
|
230
233
|
if (fromEnv) return { apiKey: fromEnv, source: 'env', envKey: candidate, ...withUrl };
|
|
231
234
|
}
|
|
232
235
|
|
|
233
|
-
// ③
|
|
236
|
+
// ③ SecretStore — setup service-keys uses providerEnvKey(provider) as its secret ID.
|
|
237
|
+
// The value is never copied to config or observability fields.
|
|
238
|
+
const stored = input.secretStoreApiKey?.trim();
|
|
239
|
+
if (stored) return { apiKey: stored, source: 'secret-store', ...(envKey ? { envKey } : {}), ...withUrl };
|
|
240
|
+
|
|
241
|
+
// ④ 상속 — **provider 가 확실히 그대로일 때만.** 바뀌었으면 base 키는 다른 provider 것이라 틀렸다.
|
|
234
242
|
// ⚠️ 리뷰 must-fix(#5488 2R): 종전 판정은 `!switched` 였는데 `baseProvider` 가 없으면 switched=false
|
|
235
243
|
// 가 되어 **전환 여부를 모르는데 상속**했다 = 401 재현. 상속은 `provider === baseProvider` 가
|
|
236
244
|
// **명시적으로 참**일 때만 허용한다(모르면 상속 안 함 = fail-closed).
|
|
@@ -246,6 +254,54 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
|
|
|
246
254
|
return { source: 'none', ...(envKey ? { envKey } : {}), ...withUrl };
|
|
247
255
|
}
|
|
248
256
|
|
|
257
|
+
function canReadHostSecretStore(env: NodeJS.ProcessEnv): boolean {
|
|
258
|
+
if (env.NODE_ENV === 'test' || env.ELANOUS_TEST_HOME?.trim()) return false;
|
|
259
|
+
const bunMain = (globalThis as { Bun?: { main?: string } }).Bun?.main;
|
|
260
|
+
if (bunMain && /\.(test|spec)\.[cm]?[jt]sx?$/.test(bunMain)) return false;
|
|
261
|
+
try {
|
|
262
|
+
const { resolveCurrentInstance } = require('../instance/current.js') as typeof import('../instance/current.js');
|
|
263
|
+
if (resolveCurrentInstance().kind !== 'prod') return false;
|
|
264
|
+
// `input.env` is injectable for deterministic callers. Preserve the same
|
|
265
|
+
// test-universe rule when it supplies a non-production parent stamp.
|
|
266
|
+
if (env.ELANOUS_STATE_DIR?.trim()) {
|
|
267
|
+
const { resolveInstance } = require('../instance/resolve.js') as typeof import('../instance/resolve.js');
|
|
268
|
+
if (resolveInstance({ stampedStateDir: env.ELANOUS_STATE_DIR }).kind !== 'prod') return false;
|
|
269
|
+
}
|
|
270
|
+
return true;
|
|
271
|
+
} catch {
|
|
272
|
+
// If the operational universe cannot be established, fail closed on host secrets.
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** Async runtime lookup for keys written by `setup service-keys`. Existing
|
|
278
|
+
* rotation and environment precedence is resolved before the SecretStore is
|
|
279
|
+
* queried; a legacy same-provider config key remains the final compatibility
|
|
280
|
+
* source. The secret value is returned only to the caller for the live request. */
|
|
281
|
+
export async function resolveProviderCredentialAsync(
|
|
282
|
+
input: ResolveCredentialInput,
|
|
283
|
+
getSecret?: (id: string) => Promise<string | undefined>,
|
|
284
|
+
): Promise<ResolvedCredential> {
|
|
285
|
+
const withoutStore = resolveProviderCredential(input);
|
|
286
|
+
if (withoutStore.source === 'rotation' || withoutStore.source === 'env') return withoutStore;
|
|
287
|
+
const secretId = providerEnvKey(input.provider);
|
|
288
|
+
if (!secretId) return withoutStore;
|
|
289
|
+
const env = input.env ?? process.env;
|
|
290
|
+
// Bun's test runner changes HOME, but the OS SecretStore (for example the
|
|
291
|
+
// macOS Keychain) is host-global. Never let those credentials alter a test's
|
|
292
|
+
// provider selection; callers can still inject a deterministic reader.
|
|
293
|
+
if (!getSecret && !canReadHostSecretStore(env)) return withoutStore;
|
|
294
|
+
let stored: string | undefined;
|
|
295
|
+
try {
|
|
296
|
+
if (getSecret) stored = await getSecret(secretId);
|
|
297
|
+
else {
|
|
298
|
+
const { getSecretAsync } = await import('../nexus/config/secrets/index.js');
|
|
299
|
+
stored = await getSecretAsync(secretId);
|
|
300
|
+
}
|
|
301
|
+
} catch { /* keep the legacy source fallback; never expose backend errors */ }
|
|
302
|
+
return resolveProviderCredential({ ...input, secretStoreApiKey: stored });
|
|
303
|
+
}
|
|
304
|
+
|
|
249
305
|
/**
|
|
250
306
|
* 해석 결과를 관측에 남긴다 — 제1원칙(관측 없으면 자기인지·힐링 불가). **키 값은 절대 싣지 않는다**(이름·출처만).
|
|
251
307
|
* 키가 필요한 provider 인데 못 찾은 경우는 warn 으로 올려 401 이 나기 **전에** 보이게 한다.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type ProviderFailureEvidence = {
|
|
2
|
+
httpStatus?: number;
|
|
3
|
+
providerErrorCode?: string;
|
|
4
|
+
providerErrorType?: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
function record(value: unknown): Record<string, unknown> | undefined {
|
|
8
|
+
return value !== null && typeof value === 'object' ? value as Record<string, unknown> : undefined;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function safeCode(value: unknown): string | undefined {
|
|
12
|
+
return typeof value === 'string' && /^[A-Za-z0-9_.-]{1,100}$/.test(value) ? value : undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Retain only non-secret structured fields from provider failures. */
|
|
16
|
+
export function providerFailureEvidence(error: unknown): ProviderFailureEvidence {
|
|
17
|
+
const source = record(error);
|
|
18
|
+
if (!source) return {};
|
|
19
|
+
|
|
20
|
+
let body: Record<string, unknown> | undefined;
|
|
21
|
+
if (typeof source.bodyText === 'string') {
|
|
22
|
+
try { body = record(JSON.parse(source.bodyText)); } catch { /* body is not structured JSON */ }
|
|
23
|
+
}
|
|
24
|
+
if (!body && typeof source.message === 'string') {
|
|
25
|
+
const jsonStart = source.message.indexOf('{');
|
|
26
|
+
if (jsonStart >= 0) {
|
|
27
|
+
try { body = record(JSON.parse(source.message.slice(jsonStart))); } catch { /* message may be clipped */ }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const nestedError = record(body?.error);
|
|
32
|
+
const status = source.status;
|
|
33
|
+
const httpStatus = typeof status === 'number' && Number.isInteger(status) && status >= 100 && status <= 599
|
|
34
|
+
? status
|
|
35
|
+
: undefined;
|
|
36
|
+
const providerErrorCode = safeCode(nestedError?.code) ?? safeCode(body?.code);
|
|
37
|
+
const providerErrorType = safeCode(nestedError?.type) ?? safeCode(body?.type);
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
...(httpStatus !== undefined ? { httpStatus } : {}),
|
|
41
|
+
...(providerErrorCode ? { providerErrorCode } : {}),
|
|
42
|
+
...(providerErrorType ? { providerErrorType } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
package/src/llm.ts
CHANGED
|
@@ -29,10 +29,13 @@ import {
|
|
|
29
29
|
import { debug, redactSecrets, redactSecretText } from './debug/log.js';
|
|
30
30
|
import { estimateMessagesTokens } from './tokens.js';
|
|
31
31
|
import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
|
|
32
|
+
import { resolveCodexAccountForRun } from './oauth/codex-account-store.js';
|
|
33
|
+
import { codexOwnerMirrorAuthPath, readCodexOwnerAccessMirror } from './oauth/codex-owner-mirror.js';
|
|
32
34
|
import { llmUsageCostFields } from './budget/llm-cost.js';
|
|
33
35
|
import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
|
|
34
36
|
import { ACTION_PHASE_OPS_TOOLS, isSteeredShellRejection, REPAIR_PHASE_READ_ONLY_OPS_TOOLS } from './llm/tool-loop-steered-rejection.js';
|
|
35
37
|
import { ToolCallTiming } from './chat/tool-call-timing.js';
|
|
38
|
+
import { recordChildFirstLlmResponse, recordChildFirstLlmStart, recordChildFirstToolCall } from './llm/child-first-llm-observation.js';
|
|
36
39
|
import {
|
|
37
40
|
dispatchWithParallelSafety,
|
|
38
41
|
isSafeForParallel,
|
|
@@ -54,6 +57,7 @@ import {
|
|
|
54
57
|
type ProviderFallbackTerminalVerdict,
|
|
55
58
|
} from './session-runtime/retry-policy.js';
|
|
56
59
|
import { ApiHttpError, fetchApiWithRetry, OverloadFailoverError, type FetchApiWithRetryOpts } from './session-runtime/retry-api.js';
|
|
60
|
+
import { providerFailureEvidence } from './llm/provider-failure-evidence.js';
|
|
57
61
|
import { isShapeRelevantRejection, summarizeCodexRequestShape } from './llm-request-shape.js';
|
|
58
62
|
import { BedrockProvider, isBedrockCompatibleModel, makeBedrockProvider } from './llm/bedrock-provider.js';
|
|
59
63
|
import { OPEN_WEIGHT_TOOL_DISCIPLINE } from './llm/open-weight-discipline.js';
|
|
@@ -497,6 +501,9 @@ export interface LLMOpts {
|
|
|
497
501
|
reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
498
502
|
/** Tool definitions made available to the model for this turn. */
|
|
499
503
|
tools?: LLMToolSpec[];
|
|
504
|
+
/** Optional tool pool exposed only to the first tool-loop request. The
|
|
505
|
+
* normal `tools` pool remains active for later requests and hydration. */
|
|
506
|
+
firstTurnTools?: LLMToolSpec[];
|
|
500
507
|
/** Tool-calling forcing for THIS turn. In streamLLMWithTools it forces on
|
|
501
508
|
* turn 0 only, then reverts to auto so the model can finalize. See ToolChoice. */
|
|
502
509
|
toolChoice?: ToolChoice;
|
|
@@ -4395,6 +4402,16 @@ function providerDecisionCandidates(): Array<LLMProvider & { name: ProviderDecis
|
|
|
4395
4402
|
|
|
4396
4403
|
/** Exported (OB1) so onboarding and `setup` judge «is there a usable ChatGPT/Codex login» exactly as the runtime does. */
|
|
4397
4404
|
export function codexOAuthAvailable(): boolean {
|
|
4405
|
+
if (process.env.ELANOUS_REMOTE_CODEX_ACCESS_ONLY === '1') {
|
|
4406
|
+
try {
|
|
4407
|
+
const mirrorPath = codexOwnerMirrorAuthPath();
|
|
4408
|
+
const account = resolveCodexAccountForRun(process.env, { storePath: mirrorPath });
|
|
4409
|
+
readCodexOwnerAccessMirror(account.storeKey, { path: mirrorPath });
|
|
4410
|
+
return true;
|
|
4411
|
+
} catch {
|
|
4412
|
+
return false;
|
|
4413
|
+
}
|
|
4414
|
+
}
|
|
4398
4415
|
try {
|
|
4399
4416
|
const account = resolveCodexAccount(process.env, { storedHome: (key) => loadTokens(key)?.codexHome });
|
|
4400
4417
|
if (loadTokens(account.storeKey)) return true;
|
|
@@ -5114,11 +5131,16 @@ async function consumeProviderText(
|
|
|
5114
5131
|
export async function streamLLM(
|
|
5115
5132
|
messages: LLMMessage[],
|
|
5116
5133
|
onChunk: (delta: string, full: string) => void,
|
|
5117
|
-
opts: LLMOpts & {
|
|
5134
|
+
opts: LLMOpts & {
|
|
5135
|
+
provider?: LLMProvider;
|
|
5136
|
+
initialProvider?: LLMProvider;
|
|
5137
|
+
onResolvedProvider?: (provider: string, model: string) => void;
|
|
5138
|
+
skipProviders?: readonly string[];
|
|
5139
|
+
} = {},
|
|
5118
5140
|
): Promise<string> {
|
|
5119
5141
|
const started = Date.now();
|
|
5120
|
-
let activeProvider = opts.provider ?? opts.initialProvider ??
|
|
5121
|
-
const attemptedProviders = new Set<string>([activeProvider.name]);
|
|
5142
|
+
let activeProvider = opts.provider ?? opts.initialProvider ?? await resolveDefaultProviderAsync(opts.model);
|
|
5143
|
+
const attemptedProviders = new Set<string>([activeProvider.name, ...(opts.skipProviders ?? [])]);
|
|
5122
5144
|
let blockedProviders: ProviderFallbackAttempt[] = [];
|
|
5123
5145
|
let modelOverride = opts.model;
|
|
5124
5146
|
|
|
@@ -5131,6 +5153,11 @@ export async function streamLLM(
|
|
|
5131
5153
|
const activeModel = finalized.model;
|
|
5132
5154
|
if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(opts.tools);
|
|
5133
5155
|
opts.onResolvedProvider?.(activeProvider.name, activeModel);
|
|
5156
|
+
await recordChildFirstLlmStart({
|
|
5157
|
+
provider: activeProvider.name, model: activeModel,
|
|
5158
|
+
...(activeProvider.name === 'openai-codex' && process.env.ELANOUS_CODEX_ACCOUNT?.trim()
|
|
5159
|
+
? { accountName: process.env.ELANOUS_CODEX_ACCOUNT.trim() } : {}),
|
|
5160
|
+
});
|
|
5134
5161
|
debug.log('llm.router', 'streamLLM', {
|
|
5135
5162
|
provider: activeProvider.name,
|
|
5136
5163
|
model: activeModel,
|
|
@@ -5153,6 +5180,7 @@ export async function streamLLM(
|
|
|
5153
5180
|
);
|
|
5154
5181
|
const full = consumed.full;
|
|
5155
5182
|
if (consumed.ok) {
|
|
5183
|
+
await recordChildFirstLlmResponse({ status: 'ok' });
|
|
5156
5184
|
if (consumed.usage !== 'unmeasured') {
|
|
5157
5185
|
try {
|
|
5158
5186
|
logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
|
|
@@ -5171,6 +5199,11 @@ export async function streamLLM(
|
|
|
5171
5199
|
}
|
|
5172
5200
|
|
|
5173
5201
|
const err: any = consumed.error;
|
|
5202
|
+
await recordChildFirstLlmResponse({
|
|
5203
|
+
status: 'error',
|
|
5204
|
+
...(Number.isSafeInteger(err?.status) ? { httpStatus: err.status as number } : Number.isSafeInteger(err?.statusCode) ? { httpStatus: err.statusCode as number } : {}),
|
|
5205
|
+
error: err,
|
|
5206
|
+
});
|
|
5174
5207
|
if (err instanceof OverloadFailoverError && !opts.provider) {
|
|
5175
5208
|
const switched = activeProvider.name === 'openai-codex'
|
|
5176
5209
|
? firstAvailableFallbackProvider(attemptedProviders, opts)
|
|
@@ -5197,6 +5230,7 @@ export async function streamLLM(
|
|
|
5197
5230
|
model: activeModel,
|
|
5198
5231
|
durationMs: Date.now() - started,
|
|
5199
5232
|
message: reason,
|
|
5233
|
+
...providerFailureEvidence(err),
|
|
5200
5234
|
...(isAuthRejectionError(err) ? { authRejected: true } : {}),
|
|
5201
5235
|
}, { level: 'error' });
|
|
5202
5236
|
if (opts.provider) {
|
|
@@ -5343,6 +5377,44 @@ export function resolveDefaultProvider(model?: string): LLMProvider {
|
|
|
5343
5377
|
}
|
|
5344
5378
|
}
|
|
5345
5379
|
|
|
5380
|
+
/** Async default resolver for requests that can use keys saved by setup service-keys. */
|
|
5381
|
+
export async function resolveDefaultProviderAsync(model?: string): Promise<LLMProvider> {
|
|
5382
|
+
try {
|
|
5383
|
+
// Preserve the established resolver as the default for every credential
|
|
5384
|
+
// source it already handles. Besides avoiding provider-factory churn, this
|
|
5385
|
+
// keeps registered providers and injected resolver implementations intact.
|
|
5386
|
+
const existingProvider = resolveDefaultProvider(model);
|
|
5387
|
+
const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
|
|
5388
|
+
const cfg = getUserConfig();
|
|
5389
|
+
const modelHint = cfg.llm.provider !== 'auto' && !isModelCompatible(cfg.llm.provider, model)
|
|
5390
|
+
? undefined
|
|
5391
|
+
: model;
|
|
5392
|
+
const decision = decideProviderForConfig(cfg, modelHint);
|
|
5393
|
+
let usedSecretStore = false;
|
|
5394
|
+
const asyncProvider = await getProviderForConfigAsync(cfg, modelHint, undefined, process.env, () => {
|
|
5395
|
+
usedSecretStore = true;
|
|
5396
|
+
});
|
|
5397
|
+
const p = usedSecretStore ? asyncProvider : existingProvider;
|
|
5398
|
+
debug.log('llm.router', 'resolveDefaultProvider', {
|
|
5399
|
+
source: cfg.llm.provider === 'auto' ? 'user-config-auto-decision' : 'user-config',
|
|
5400
|
+
configProvider: cfg.llm.provider,
|
|
5401
|
+
configModel: cfg.llm.model,
|
|
5402
|
+
requestedModel: model,
|
|
5403
|
+
decisionProvider: decision.provider,
|
|
5404
|
+
decisionAuth: decision.auth,
|
|
5405
|
+
resolvedTo: p.name,
|
|
5406
|
+
resolvedModel: p.defaultModel,
|
|
5407
|
+
available: p.available(),
|
|
5408
|
+
}, { level: 'info' });
|
|
5409
|
+
return p;
|
|
5410
|
+
} catch {
|
|
5411
|
+
debug.log('llm.router', 'resolveDefaultProvider-secretstore-fallback', {
|
|
5412
|
+
reason: 'async-provider-resolution-failed',
|
|
5413
|
+
}, { level: 'warn' });
|
|
5414
|
+
return resolveDefaultProvider(model);
|
|
5415
|
+
}
|
|
5416
|
+
}
|
|
5417
|
+
|
|
5346
5418
|
/** Handlers + result for `streamLLMWithTools`. */
|
|
5347
5419
|
export interface StreamWithToolsHandlers {
|
|
5348
5420
|
/** Streaming text delta — invoked for every text chunk across all turns. */
|
|
@@ -8596,7 +8668,7 @@ export async function streamLLMWithTools(
|
|
|
8596
8668
|
const circuit = !opts.provider && !opts.initialProvider
|
|
8597
8669
|
? await import('./session-runtime/provider-circuit.js')
|
|
8598
8670
|
: undefined;
|
|
8599
|
-
const provider = opts.provider ?? opts.initialProvider ??
|
|
8671
|
+
const provider = opts.provider ?? opts.initialProvider ?? await resolveDefaultProviderAsync(opts.model);
|
|
8600
8672
|
const initial = finalizeStreamingProviderModel(provider, opts.model ?? provider.defaultModel);
|
|
8601
8673
|
let activeProvider = initial.provider;
|
|
8602
8674
|
let activeModel = initial.model;
|
|
@@ -8622,6 +8694,19 @@ export async function streamLLMWithTools(
|
|
|
8622
8694
|
}
|
|
8623
8695
|
}
|
|
8624
8696
|
opts.onResolvedProvider?.(activeProvider.name, activeModel);
|
|
8697
|
+
await recordChildFirstLlmStart({
|
|
8698
|
+
provider: activeProvider.name, model: activeModel,
|
|
8699
|
+
...(activeProvider.name === 'openai-codex' && process.env.ELANOUS_CODEX_ACCOUNT?.trim()
|
|
8700
|
+
? { accountName: process.env.ELANOUS_CODEX_ACCOUNT.trim() } : {}),
|
|
8701
|
+
});
|
|
8702
|
+
const initialToolHandler = handlers.onToolCall;
|
|
8703
|
+
handlers = {
|
|
8704
|
+
...handlers,
|
|
8705
|
+
onToolCall: (call) => {
|
|
8706
|
+
void recordChildFirstToolCall();
|
|
8707
|
+
initialToolHandler?.(call);
|
|
8708
|
+
},
|
|
8709
|
+
};
|
|
8625
8710
|
const attemptedProviders = new Set<string>([
|
|
8626
8711
|
activeProvider.name,
|
|
8627
8712
|
...(circuitBlockedInitialProvider ? [circuitBlockedInitialProvider] : []),
|
|
@@ -9171,7 +9256,9 @@ export async function streamLLMWithTools(
|
|
|
9171
9256
|
const base = {
|
|
9172
9257
|
...opts,
|
|
9173
9258
|
model: activeModel,
|
|
9174
|
-
tools: completionNeedsFinalTurn && !keepToolsNoCall
|
|
9259
|
+
tools: completionNeedsFinalTurn && !keepToolsNoCall
|
|
9260
|
+
? []
|
|
9261
|
+
: turn === 0 && opts.firstTurnTools ? opts.firstTurnTools : activeTools,
|
|
9175
9262
|
remainingFallbacks,
|
|
9176
9263
|
};
|
|
9177
9264
|
if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
|
|
@@ -9304,7 +9391,11 @@ export async function streamLLMWithTools(
|
|
|
9304
9391
|
new Promise<{ idle: true }>((res) => { idleTimer = setTimeout(() => res({ idle: true }), streamIdleTimeoutMs); }),
|
|
9305
9392
|
]);
|
|
9306
9393
|
if (step.idle) throw new StreamIdleTimeoutError(streamIdleTimeoutMs);
|
|
9394
|
+
await recordChildFirstLlmResponse({ status: 'ok' });
|
|
9307
9395
|
} catch (err) {
|
|
9396
|
+
const status = Number.isSafeInteger((err as { status?: unknown })?.status) ? (err as { status: number }).status
|
|
9397
|
+
: Number.isSafeInteger((err as { statusCode?: unknown })?.statusCode) ? (err as { statusCode: number }).statusCode : undefined;
|
|
9398
|
+
await recordChildFirstLlmResponse({ status: 'error', ...(status === undefined ? {} : { httpStatus: status }), error: err });
|
|
9308
9399
|
if (idleTimer) clearTimeout(idleTimer);
|
|
9309
9400
|
releaseStreamAttempt(true, err);
|
|
9310
9401
|
if (err instanceof ApiHttpError && err.status === 400 && providerToolSchemaDiagnostics) {
|
|
@@ -12810,14 +12901,14 @@ export function getProviderForConfig(
|
|
|
12810
12901
|
}
|
|
12811
12902
|
const crossFamilyModel = (model || userConfig.llm.model) && resolvedProviderName !== provider;
|
|
12812
12903
|
if (crossFamilyModel) {
|
|
12813
|
-
const
|
|
12814
|
-
const keyImplies =
|
|
12904
|
+
const key = userConfig.llm.apiKey || '';
|
|
12905
|
+
const keyImplies = key.startsWith('sk-ant')
|
|
12815
12906
|
? 'anthropic'
|
|
12816
|
-
:
|
|
12907
|
+
: key.startsWith('xai-')
|
|
12817
12908
|
? 'grok'
|
|
12818
|
-
:
|
|
12909
|
+
: key.startsWith('sk-')
|
|
12819
12910
|
? 'openai'
|
|
12820
|
-
:
|
|
12911
|
+
: key
|
|
12821
12912
|
? 'unknown'
|
|
12822
12913
|
: 'none';
|
|
12823
12914
|
const keyMismatch =
|
|
@@ -12828,7 +12919,6 @@ export function getProviderForConfig(
|
|
|
12828
12919
|
configProvider: provider,
|
|
12829
12920
|
model: decision.model,
|
|
12830
12921
|
implied: resolvedProviderName,
|
|
12831
|
-
keyPrefix: keyPrefix || null,
|
|
12832
12922
|
keyImplies,
|
|
12833
12923
|
keyMismatch,
|
|
12834
12924
|
}, { level: 'info' });
|
|
@@ -12873,6 +12963,75 @@ export function getProviderForConfig(
|
|
|
12873
12963
|
// union without a case here fails loud at first call.
|
|
12874
12964
|
throw new Error(`unknown provider: ${provider as string}`);
|
|
12875
12965
|
}
|
|
12966
|
+
|
|
12967
|
+
/** Async counterpart used by production request paths. It overlays a SecretStore
|
|
12968
|
+
* credential only on the ephemeral config passed to the provider factory; the
|
|
12969
|
+
* persisted UserConfig is never mutated or saved. */
|
|
12970
|
+
export async function getProviderForConfigAsync(
|
|
12971
|
+
userConfig: UserConfig,
|
|
12972
|
+
model?: string,
|
|
12973
|
+
getSecret?: (id: string) => Promise<string | undefined>,
|
|
12974
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
12975
|
+
onSecretStoreCredential?: () => void,
|
|
12976
|
+
): Promise<LLMProvider> {
|
|
12977
|
+
const { resolveProviderCredentialAsync } = await import('./llm/provider-credentials.js');
|
|
12978
|
+
const decision = finalizeProviderModelCompatibility(decideProviderForConfig(userConfig, model));
|
|
12979
|
+
let target = decision.provider.startsWith('auto:')
|
|
12980
|
+
? decision.provider.slice('auto:'.length)
|
|
12981
|
+
: decision.provider;
|
|
12982
|
+
|
|
12983
|
+
// decideProviderForConfig preserves the established env/subscription and
|
|
12984
|
+
// keyless-provider selection. This loop only runs when that resolver found
|
|
12985
|
+
// no synchronous candidate; it then checks persisted setup keys in the same
|
|
12986
|
+
// provider order.
|
|
12987
|
+
if (target === 'auto') {
|
|
12988
|
+
for (const candidate of PROVIDER_DECISION_ORDER) {
|
|
12989
|
+
const credential = await resolveProviderCredentialAsync({
|
|
12990
|
+
provider: candidate,
|
|
12991
|
+
rotation: userConfig.llm.rotation,
|
|
12992
|
+
baseProvider: userConfig.llm.provider,
|
|
12993
|
+
baseApiKey: userConfig.llm.apiKey,
|
|
12994
|
+
env,
|
|
12995
|
+
}, getSecret);
|
|
12996
|
+
if (credential.source !== 'none') {
|
|
12997
|
+
target = candidate;
|
|
12998
|
+
break;
|
|
12999
|
+
}
|
|
13000
|
+
}
|
|
13001
|
+
}
|
|
13002
|
+
if (target === 'auto') return getProviderForConfig(userConfig, model);
|
|
13003
|
+
|
|
13004
|
+
const resolvedModel = decision.provider === 'auto' || decision.model === '(none)'
|
|
13005
|
+
? defaultModelForProvider(target as ConcreteProviderName)
|
|
13006
|
+
: decision.model;
|
|
13007
|
+
|
|
13008
|
+
const credential = await resolveProviderCredentialAsync({
|
|
13009
|
+
provider: target,
|
|
13010
|
+
rotation: userConfig.llm.rotation,
|
|
13011
|
+
baseProvider: userConfig.llm.provider,
|
|
13012
|
+
baseApiKey: userConfig.llm.apiKey,
|
|
13013
|
+
env,
|
|
13014
|
+
}, getSecret);
|
|
13015
|
+
// Keep the established provider registry/factory path unless this request
|
|
13016
|
+
// actually depends on a setup key. In particular, auto mode may have a
|
|
13017
|
+
// registered provider implementation (test doubles included) that must not
|
|
13018
|
+
// be replaced by a newly constructed provider with an empty ephemeral key.
|
|
13019
|
+
if (credential.source !== 'secret-store') return getProviderForConfig(userConfig, model);
|
|
13020
|
+
onSecretStoreCredential?.();
|
|
13021
|
+
const ephemeralConfig = {
|
|
13022
|
+
...userConfig,
|
|
13023
|
+
llm: {
|
|
13024
|
+
...userConfig.llm,
|
|
13025
|
+
provider: target as UserConfig['llm']['provider'],
|
|
13026
|
+
model: resolvedModel,
|
|
13027
|
+
apiKey: credential.apiKey,
|
|
13028
|
+
baseUrl: target === userConfig.llm.provider
|
|
13029
|
+
? credential.baseUrl ?? userConfig.llm.baseUrl
|
|
13030
|
+
: credential.baseUrl,
|
|
13031
|
+
},
|
|
13032
|
+
};
|
|
13033
|
+
return getProviderForConfig(ephemeralConfig, resolvedModel);
|
|
13034
|
+
}
|
|
12876
13035
|
import { getModelFamily, isGpt6GenerationModel, usesCodexBehaviorGuards } from './models/prompts.js';
|
|
12877
13036
|
import type { ModelFamily } from './models/prompts.js';
|
|
12878
13037
|
|
package/src/mcp/client.ts
CHANGED
|
@@ -91,6 +91,11 @@ export interface McpToolCallContent {
|
|
|
91
91
|
[k: string]: unknown;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
/** Per-call MCP metadata. `elanousRunId` is only a correlation key. */
|
|
95
|
+
export interface McpCallMeta extends Record<string, unknown> {
|
|
96
|
+
elanousRunId?: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
94
99
|
/** The remote server answered with a JSON-RPC `error` envelope.
|
|
95
100
|
*
|
|
96
101
|
* ⛔⭐ **「서버가 안 된다고 했다」와 「서버에 못 닿았다」는 다른 값이다.**
|
|
@@ -749,11 +754,13 @@ export class McpClient {
|
|
|
749
754
|
async callTool(
|
|
750
755
|
name: string,
|
|
751
756
|
args: Record<string, unknown>,
|
|
757
|
+
meta?: McpCallMeta,
|
|
752
758
|
): Promise<McpToolCallResult> {
|
|
753
759
|
this.requireReady('callTool');
|
|
754
760
|
const result = (await this.send('tools/call', {
|
|
755
761
|
name,
|
|
756
762
|
arguments: args,
|
|
763
|
+
...(meta && Object.keys(meta).length > 0 ? { _meta: meta } : {}),
|
|
757
764
|
})) as McpToolCallResult;
|
|
758
765
|
return result;
|
|
759
766
|
}
|
package/src/mcp/proxy-runtime.ts
CHANGED
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
type FeedbackEnvelope,
|
|
45
45
|
} from '../feedback/envelope.js';
|
|
46
46
|
import { mcpMediaJobs, mcpResultImages } from '../feedback/media.js';
|
|
47
|
+
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
47
48
|
import { McpServerError } from './client.js';
|
|
48
49
|
import type { McpClient, McpTool, McpToolCallResult } from './client.js';
|
|
49
50
|
|
|
@@ -278,7 +279,11 @@ export function createMcpProxyRuntime(
|
|
|
278
279
|
};
|
|
279
280
|
}
|
|
280
281
|
try {
|
|
281
|
-
const
|
|
282
|
+
const runId = (ctx.runId || getHarnessRunId()).trim();
|
|
283
|
+
// The correlation id is needed only for Aside's delegated return path.
|
|
284
|
+
// Do not disclose the local run identity to other MCP servers.
|
|
285
|
+
const meta = opts.serverId === 'aside' && runId ? { elanousRunId: runId } : undefined;
|
|
286
|
+
const result = await opts.client.callTool(opts.mcpTool.name, req, meta);
|
|
282
287
|
const converted = mcpResultToRunResult(result);
|
|
283
288
|
emitMcpMediaFeedback(converted, ctx);
|
|
284
289
|
const capped = capMcpOutput(converted, {
|