elanous 0.2.42 → 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/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
- 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/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
- 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/1306.967240ede9a0f757.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.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/{6632.0eac1c554f8f2ef3.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/1850-522de4ee34957210.js +1 -0
- 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/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
- 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/2216.802962c04f40a26e.js +64 -0
- 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/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
- 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/2954.bbefc95d6b20e0d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
- 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/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
- 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/4393.28fa5228d0eec217.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.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/{1262.e804feb8fd1acb8c.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/{1063.2fb8a9dc55c731f2.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/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
- package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.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/5439.3fec6dbce29ecb36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
- 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/5790.5eb06a653ebd8571.js +34 -0
- 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/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.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/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.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/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
- 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/7010.1bbd17a7f2b3e376.js +1 -0
- 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/7679.32c40cdd14f20b4a.js +1 -0
- 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/{8138.6c10b2a356d52fca.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/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
- 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/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
- 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/9398.1f56e3f17795f43f.js +1 -0
- 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-da787e8a10b8a82e.js +1 -0
- 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/_next/static/css/d1f8bb401740a549.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/external-commands.yaml +5 -3
- package/catalog/meta/catalogVersion.yaml +2 -1
- package/catalog/signing/catalog-signing-public.pem +3 -0
- package/graphs/intake/intake-daily.yaml +16 -0
- package/graphs/intake/news-sources.yaml +1 -0
- package/graphs/intake/recipes.yaml +7 -0
- package/graphs/overlays/README.md +6 -0
- package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/release/release-loop.yaml +33 -17
- package/graphs/units/verbs/make-doc.yaml +1 -0
- package/package.json +6 -2
- package/plugins/demo-absorption-briefing/plugin.json +18 -0
- package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
- package/plugins/demo-browser-hand/plugin.json +13 -0
- package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
- package/plugins/demo-linear-secretary/plugin.json +15 -0
- package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
- package/plugins/demo-plugin-wizard/plugin.json +11 -0
- package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
- package/plugins/demo-research/plugin.json +16 -0
- package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
- package/plugins/demo-video-briefing/plugin.json +15 -0
- package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
- package/scripts/bench-metering-plan.ts +229 -0
- package/scripts/build-signed-catalog.ts +48 -0
- package/scripts/ci-typecheck-main-delta.sh +88 -0
- package/scripts/codex-fallback-live-probe.ts +1 -1
- package/scripts/demo/demo1104-parallel-host.ts +56 -0
- package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
- package/scripts/demo/demo1104-parallel.ts +72 -0
- package/scripts/demo/demo1104-stage.config.ts +21 -0
- package/scripts/demo/demo1104-stage.ts +316 -0
- package/scripts/goal-method-audit.ts +17 -1
- package/scripts/graph-units/land-enqueue.ts +90 -0
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/landing-heal/land-plan.ts +57 -0
- package/scripts/public-leak-baseline.txt +0 -1
- package/scripts/release-loop/auto-approve-node.ts +1 -1
- package/scripts/release-loop/docs-node.ts +4 -2
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- package/scripts/release-loop/gate-image-pin.ts +116 -2
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node.ts +395 -43
- package/scripts/release-loop/gate-progress-sim.ts +73 -0
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/notes-repair.ts +18 -1
- package/scripts/release-loop/preflight.ts +544 -10
- 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/unattended-release.ts +20 -9
- package/scripts/release-loop/warm-control-forward.ts +178 -0
- package/scripts/retro-cycle.ts +30 -8
- package/scripts/rhythm/daily.ts +39 -4
- package/scripts/rhythm/linear-progress-sync.ts +311 -0
- package/scripts/ux-sim.ts +7 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +35 -7
- package/src/acp/agent-manager.ts +1 -0
- package/src/acp/codex-app-server-agent.ts +33 -0
- package/src/acp/codex-app-server-client.ts +153 -16
- package/src/acp/core-turn-bridge.ts +17 -12
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -0
- package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
- package/src/agent-mission/claude-headless.ts +4 -1
- package/src/agent-mission/codex-exec.ts +105 -0
- package/src/agent-mission/driver.ts +192 -11
- package/src/agent-mission/grok-auth-status.ts +107 -0
- package/src/agent-mission/hand-hooks.ts +101 -0
- package/src/agent-mission/mission-cli.ts +56 -21
- package/src/agent-mission/mission-hand-reply.ts +118 -0
- package/src/agent-mission/mission-line.ts +180 -0
- package/src/agent-mission/mission-out.ts +256 -18
- package/src/agent-mission/tool-install.ts +122 -11
- package/src/agent-substrate/pr-reviewer.ts +147 -11
- package/src/agent-substrate/self-review-cli.ts +10 -2
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-fanout.ts +221 -0
- package/src/auto-research/research-turn.ts +362 -31
- package/src/autopilot/mission-codebase-gate.ts +7 -3
- package/src/autopilot/pr-manager.ts +31 -3
- package/src/boot/daemon-tools/self-implement.ts +3 -1
- package/src/boot/daemon-tools/web-search.ts +1 -2
- package/src/briefing/brief-items.ts +55 -11
- package/src/cli/agent-cli.ts +2 -1
- package/src/cli/catalog-cli.ts +31 -0
- package/src/cli/connector-cli.ts +16 -0
- package/src/cli/control-cli.ts +15 -6
- package/src/cli/doctor-fix.ts +2 -2
- package/src/cli/intake-source-cli.ts +44 -8
- package/src/cli/log-event-names.ts +8 -0
- package/src/cli/msg-cli.ts +32 -3
- package/src/cli/pr-cli.ts +21 -1
- package/src/cli/pr-land-heavy-remote.ts +44 -6
- package/src/cli/pr-land-overlap-evidence.ts +13 -1
- package/src/cli/pr-land-pod-shadow-job.ts +143 -5
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +44 -16
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +9 -0
- package/src/cli/setup-cli.ts +166 -6
- package/src/cli/setup-keys.ts +199 -0
- package/src/cli/task-plugin-wizard-host.ts +114 -0
- package/src/cli/tasks-cli.ts +54 -9
- package/src/cli/tui-test-cli.ts +190 -0
- package/src/config.ts +4 -2
- package/src/connectors/linear-daily-progress.ts +228 -0
- package/src/connectors/linear-projector.ts +34 -12
- package/src/connectors/linear.ts +151 -7
- 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/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +43 -0
- package/src/core-turn/run-core-turn.ts +488 -51
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
- package/src/dashboard/classic-sidetab-mission.ts +169 -5
- package/src/dashboard/index.ts +387 -14
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
- package/src/dashboard/mission-cli-consumer.ts +20 -8
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/sidetab-runtime.ts +3 -1
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/visible-mission-diagnostics.ts +16 -0
- package/src/decisions/linear-progress-summary.ts +78 -0
- package/src/decisions/linear-progress-sync.ts +152 -0
- package/src/domains/outbound-alert.ts +49 -11
- 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/domains/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-cli.ts +24 -1
- package/src/graph-runner/graph-grow-llm.ts +3 -1
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/runner.ts +310 -46
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/harness/dispatch-backpressure.ts +54 -1
- package/src/harness/dispatch-shadow-compare.ts +74 -0
- package/src/harness/harness-cli-command.ts +15 -3
- package/src/harness/harness-pod-dispatch.ts +3 -0
- package/src/harness/skill-exec.ts +21 -9
- package/src/harness/skill-select.ts +1 -1
- package/src/hooks/error-report-cloud.ts +101 -0
- package/src/hooks/receiver.ts +29 -2
- package/src/index.ts +129 -12
- package/src/intake-plane/actions.ts +354 -0
- package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
- package/src/intake-plane/intake-sources.ts +78 -8
- package/src/intake-plane/items.ts +14 -4
- package/src/intake-plane/linear-mission-sync.ts +80 -0
- package/src/intake-plane/linear-secretary-runtime.ts +178 -0
- package/src/intake-plane/linear-wish.ts +227 -1
- package/src/life/life-cli.ts +168 -0
- package/src/life/life-kinds.ts +160 -0
- package/src/live-supply/budget-consumer.ts +78 -0
- package/src/live-supply/read.ts +3 -0
- package/src/live-supply/snapshot.ts +45 -0
- package/src/llm/child-first-llm-observation.ts +112 -0
- package/src/llm/provider-credentials.ts +68 -6
- package/src/llm/provider-failure-evidence.ts +44 -0
- package/src/llm.ts +172 -12
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/mcp/client.ts +7 -0
- package/src/mcp/proxy-runtime.ts +6 -1
- package/src/mcp/server.ts +54 -0
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +36 -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/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -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 +22 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/grokbot-adapter.ts +71 -0
- package/src/nexus/outbound/router.ts +121 -16
- package/src/nexus/setup-status.ts +9 -0
- package/src/nexus/state/state.ts +3 -0
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-owner-mirror.ts +81 -0
- package/src/oauth/codex.ts +17 -2
- package/src/oauth/fallback-chain.ts +47 -17
- package/src/onboarding/first-run-doctor.ts +8 -1
- package/src/onboarding/first-run.ts +126 -29
- package/src/onboarding/key-setup.ts +103 -0
- package/src/onboarding/menu-answer.ts +13 -0
- package/src/onboarding/secret-prompt.ts +37 -0
- package/src/plugins/install/plugin-install.ts +59 -0
- package/src/pr-tool/census.ts +130 -0
- package/src/preview/terminal.ts +22 -7
- package/src/prompt-enhance/enhance.ts +10 -0
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-write-provenance.ts +21 -3
- package/src/pty-shell/registry.ts +9 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/release-loop/proposal-auto-place.ts +83 -0
- package/src/research/axis-fanout.ts +79 -29
- package/src/research/lenses/second-order.ts +312 -0
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/dev-cli.ts +7 -2
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- package/src/self-dev/draft-sweep.ts +31 -10
- package/src/self-dev/draft-triage-rules.ts +60 -3
- package/src/self-dev/graph-front-nodes.ts +2 -1
- package/src/self-dev/graph-journey-route.ts +76 -21
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +1 -1
- package/src/self-dev/run-supervisor.ts +152 -2
- package/src/self-dev/shard-aggregate.ts +4 -0
- package/src/self-dev/shard-run.ts +36 -15
- package/src/self-implement/abandoned-classification.ts +12 -3
- package/src/self-implement/budget-gate.ts +7 -0
- package/src/self-implement/child-llm-preference.ts +10 -1
- package/src/self-implement/doctor-visit.ts +30 -8
- package/src/self-implement/elanous-tui-spawn.ts +3 -0
- package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
- package/src/self-implement/gate-artifacts.ts +2 -1
- package/src/self-implement/goal-author-cli.ts +4 -2
- package/src/self-implement/goal-author.ts +549 -10
- package/src/self-implement/graph-overlay-yaml.ts +181 -4
- package/src/self-implement/graph-overlay.ts +3 -1
- package/src/self-implement/graph-profile-yaml.ts +107 -0
- package/src/self-implement/graph-yaml.ts +94 -5
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +298 -26
- package/src/self-implement/run-chart.ts +6 -3
- package/src/self-implement/run-ledger.ts +51 -1
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/tdd-evidence-tags.ts +9 -0
- package/src/self-implement/test-scenario-request.ts +37 -6
- package/src/self-implement/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +6 -4
- package/src/session/session-fanout.ts +2 -0
- package/src/session/streaming/acp-stream-sink.ts +2 -1
- package/src/session/streaming/chunk-producer.ts +6 -0
- package/src/session/streaming/stream-compositor.ts +3 -2
- package/src/session-runtime/index.ts +74 -6
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/setup/llm-env-detect.ts +3 -0
- package/src/setup/service-key-catalog.ts +46 -0
- package/src/setup/service-keys.ts +241 -0
- 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 +182 -48
- package/src/skills/tools/agent.ts +23 -4
- package/src/skills/tools/omni-search.ts +127 -27
- package/src/task-agent/parent-host.ts +29 -1
- package/src/task-agent/recall-inject.ts +98 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +46 -14
- package/src/task-orchestrator/dispatcher.ts +14 -1
- package/src/task-orchestrator/linear-capture-events.ts +55 -0
- package/src/task-orchestrator/store.ts +16 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
- package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
- package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
- package/src/task-orchestrator/types.ts +14 -0
- package/src/telegram.ts +14 -16
- package/src/terminal/coding-agent.ts +14 -5
- package/src/terminal/session-registry.ts +1 -1
- package/src/tool-hints/gate.ts +46 -14
- package/src/tool-hints/signals.ts +1 -1
- package/src/tool-hints/types.ts +2 -0
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/browser-hand-runtime.ts +391 -0
- package/src/tool-runtime/browser-runtime.ts +33 -19
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/types.ts +5 -0
- package/src/tui/entry.ts +51 -8
- package/src/tui/sidetab/attach.ts +252 -11
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui/sidetab/list.ts +3 -2
- package/src/tui-client/next-dashboard-runtime.ts +52 -0
- package/src/user-config.ts +34 -9
- package/src/user-intent/types.ts +4 -3
- package/src/ux-sim/browser-hand.ts +165 -0
- package/src/ux-sim/draft-inventory-builder.ts +199 -0
- package/src/ux-sim/fake-browser-page.ts +81 -0
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/graph-engine-sim.ts +47 -0
- package/src/ux-sim/linear-secretary.ts +208 -0
- package/src/ux-sim/mock-scenario-catalog.json +81 -26
- package/src/ux-sim/mock-scenario-catalog.ts +175 -5
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/release-sim-rig.ts +62 -18
- package/src/ux-sim/scenario.ts +70 -26
- package/src/ux-sim/service-key-setup.ts +113 -0
- package/src/ux-sim/term-slash-device.ts +74 -0
- package/src/ux-sim/turn-throw-sim.ts +31 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/index.ts +30 -9
- package/src/web-search/provider.ts +4 -1
- package/src/web-search/x-intent.ts +5 -0
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
- package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
- package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
import { BUILTIN_CATALOG } from '../intelligence-map/model-catalog.js';
|
|
31
31
|
import { debug } from '../debug/log.js';
|
|
32
|
+
import { PROVIDER_ENV_SPEC } from '../setup/llm-env-detect.js';
|
|
32
33
|
|
|
33
34
|
/** provider → API-key env var. catalog 이 envKey 를 안 다는 provider 의 명시 보정.
|
|
34
35
|
* ⚠️ catalog 파생이 이미 값을 주는 provider 는 **여기 적지 않는다** — 이중 진실을 만들지 않기 위해. */
|
|
@@ -145,7 +146,7 @@ export function isKeylessProvider(provider: string | undefined): boolean {
|
|
|
145
146
|
}
|
|
146
147
|
|
|
147
148
|
/** 키가 어디서 왔나 — 관측·진단용(제1원칙: "왜 이 키인가"가 로그로 답해져야 한다). */
|
|
148
|
-
type CredentialSource = 'rotation' | 'env' | 'inherited' | 'none';
|
|
149
|
+
type CredentialSource = 'rotation' | 'env' | 'secret-store' | 'inherited' | 'none';
|
|
149
150
|
|
|
150
151
|
interface ResolvedCredential {
|
|
151
152
|
/** 해석된 키. 없으면 undefined(호출자가 provider 기본 인증으로 폴백하거나 명시 실패). */
|
|
@@ -175,6 +176,8 @@ interface ResolveCredentialInput {
|
|
|
175
176
|
/** base config 의 `llm.provider` — 전환 여부 판정용. */
|
|
176
177
|
baseProvider?: string | undefined;
|
|
177
178
|
env?: NodeJS.ProcessEnv;
|
|
179
|
+
/** 이미 조회한 SecretStore 값. 값은 런타임 메모리에서만 전달한다. */
|
|
180
|
+
secretStoreApiKey?: string | undefined;
|
|
178
181
|
}
|
|
179
182
|
|
|
180
183
|
/**
|
|
@@ -183,8 +186,9 @@ interface ResolveCredentialInput {
|
|
|
183
186
|
* 우선순위(대표 결정 (a)):
|
|
184
187
|
* ① `llm.rotation` 에서 같은 provider 엔트리의 apiKey (config·감사 가능)
|
|
185
188
|
* ② `providerEnvKey(provider)` 로 읽은 env
|
|
186
|
-
* ③
|
|
187
|
-
* ④
|
|
189
|
+
* ③ 기존 SecretStore (`providerEnvKey` 와 같은 ID)
|
|
190
|
+
* ④ provider 가 **안 바뀐** 경우에 한해 base `llm.apiKey` 상속
|
|
191
|
+
* ⑤ 없음 — 호출자가 판단(구독/OAuth provider 는 이게 정상일 수 있다)
|
|
188
192
|
*
|
|
189
193
|
* ⚠️ ③ 이 마지막인 것이 이 수리의 핵심이다. 종전엔 ③ 이 **무조건 첫 번째**였고, 그래서 provider 가
|
|
190
194
|
* 바뀌어도 옛 provider 의 키가 따라갔다(= 401 의 근본). provider 가 바뀌었으면 base 키는 **틀린 키**다.
|
|
@@ -221,10 +225,20 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
|
|
|
221
225
|
|
|
222
226
|
// ② env — provider 별 표준 env var.
|
|
223
227
|
const envKey = providerEnvKey(provider);
|
|
224
|
-
const
|
|
225
|
-
|
|
228
|
+
const envSpec = PROVIDER_ENV_SPEC.find((spec) => spec.provider === provider);
|
|
229
|
+
const envCandidates = [...new Set([envKey, envSpec?.primaryKeyEnv, ...(envSpec?.aliasKeyEnvs ?? [])]
|
|
230
|
+
.filter((name): name is string => Boolean(name)))];
|
|
231
|
+
for (const candidate of envCandidates) {
|
|
232
|
+
const fromEnv = env[candidate]?.trim();
|
|
233
|
+
if (fromEnv) return { apiKey: fromEnv, source: 'env', envKey: candidate, ...withUrl };
|
|
234
|
+
}
|
|
235
|
+
|
|
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 };
|
|
226
240
|
|
|
227
|
-
//
|
|
241
|
+
// ④ 상속 — **provider 가 확실히 그대로일 때만.** 바뀌었으면 base 키는 다른 provider 것이라 틀렸다.
|
|
228
242
|
// ⚠️ 리뷰 must-fix(#5488 2R): 종전 판정은 `!switched` 였는데 `baseProvider` 가 없으면 switched=false
|
|
229
243
|
// 가 되어 **전환 여부를 모르는데 상속**했다 = 401 재현. 상속은 `provider === baseProvider` 가
|
|
230
244
|
// **명시적으로 참**일 때만 허용한다(모르면 상속 안 함 = fail-closed).
|
|
@@ -240,6 +254,54 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
|
|
|
240
254
|
return { source: 'none', ...(envKey ? { envKey } : {}), ...withUrl };
|
|
241
255
|
}
|
|
242
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
|
+
|
|
243
305
|
/**
|
|
244
306
|
* 해석 결과를 관측에 남긴다 — 제1원칙(관측 없으면 자기인지·힐링 불가). **키 값은 절대 싣지 않는다**(이름·출처만).
|
|
245
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;
|
|
@@ -4577,7 +4594,8 @@ function configuredFallbackChainSteps(): readonly string[] {
|
|
|
4577
4594
|
try {
|
|
4578
4595
|
const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
|
|
4579
4596
|
const { normalizeFallbackChain } = require('./oauth/fallback-chain.js') as typeof import('./oauth/fallback-chain.js');
|
|
4580
|
-
|
|
4597
|
+
const llm = getUserConfig().llm;
|
|
4598
|
+
return normalizeFallbackChain(llm.fallbackChain, llm.provider).chain;
|
|
4581
4599
|
} catch (err) {
|
|
4582
4600
|
// ⛔ 조용히 삼키면 「설정을 못 읽었다」가 「폴백 후보가 없다」로 «둔갑»한다 —
|
|
4583
4601
|
// 호출자는 그것을 `fallback candidates exhausted` 로 보고 사람에게 그렇게 말한다.
|
|
@@ -5113,11 +5131,16 @@ async function consumeProviderText(
|
|
|
5113
5131
|
export async function streamLLM(
|
|
5114
5132
|
messages: LLMMessage[],
|
|
5115
5133
|
onChunk: (delta: string, full: string) => void,
|
|
5116
|
-
opts: LLMOpts & {
|
|
5134
|
+
opts: LLMOpts & {
|
|
5135
|
+
provider?: LLMProvider;
|
|
5136
|
+
initialProvider?: LLMProvider;
|
|
5137
|
+
onResolvedProvider?: (provider: string, model: string) => void;
|
|
5138
|
+
skipProviders?: readonly string[];
|
|
5139
|
+
} = {},
|
|
5117
5140
|
): Promise<string> {
|
|
5118
5141
|
const started = Date.now();
|
|
5119
|
-
let activeProvider = opts.provider ?? opts.initialProvider ??
|
|
5120
|
-
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 ?? [])]);
|
|
5121
5144
|
let blockedProviders: ProviderFallbackAttempt[] = [];
|
|
5122
5145
|
let modelOverride = opts.model;
|
|
5123
5146
|
|
|
@@ -5130,6 +5153,11 @@ export async function streamLLM(
|
|
|
5130
5153
|
const activeModel = finalized.model;
|
|
5131
5154
|
if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(opts.tools);
|
|
5132
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
|
+
});
|
|
5133
5161
|
debug.log('llm.router', 'streamLLM', {
|
|
5134
5162
|
provider: activeProvider.name,
|
|
5135
5163
|
model: activeModel,
|
|
@@ -5152,6 +5180,7 @@ export async function streamLLM(
|
|
|
5152
5180
|
);
|
|
5153
5181
|
const full = consumed.full;
|
|
5154
5182
|
if (consumed.ok) {
|
|
5183
|
+
await recordChildFirstLlmResponse({ status: 'ok' });
|
|
5155
5184
|
if (consumed.usage !== 'unmeasured') {
|
|
5156
5185
|
try {
|
|
5157
5186
|
logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
|
|
@@ -5170,6 +5199,11 @@ export async function streamLLM(
|
|
|
5170
5199
|
}
|
|
5171
5200
|
|
|
5172
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
|
+
});
|
|
5173
5207
|
if (err instanceof OverloadFailoverError && !opts.provider) {
|
|
5174
5208
|
const switched = activeProvider.name === 'openai-codex'
|
|
5175
5209
|
? firstAvailableFallbackProvider(attemptedProviders, opts)
|
|
@@ -5196,6 +5230,7 @@ export async function streamLLM(
|
|
|
5196
5230
|
model: activeModel,
|
|
5197
5231
|
durationMs: Date.now() - started,
|
|
5198
5232
|
message: reason,
|
|
5233
|
+
...providerFailureEvidence(err),
|
|
5199
5234
|
...(isAuthRejectionError(err) ? { authRejected: true } : {}),
|
|
5200
5235
|
}, { level: 'error' });
|
|
5201
5236
|
if (opts.provider) {
|
|
@@ -5342,6 +5377,44 @@ export function resolveDefaultProvider(model?: string): LLMProvider {
|
|
|
5342
5377
|
}
|
|
5343
5378
|
}
|
|
5344
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
|
+
|
|
5345
5418
|
/** Handlers + result for `streamLLMWithTools`. */
|
|
5346
5419
|
export interface StreamWithToolsHandlers {
|
|
5347
5420
|
/** Streaming text delta — invoked for every text chunk across all turns. */
|
|
@@ -8595,7 +8668,7 @@ export async function streamLLMWithTools(
|
|
|
8595
8668
|
const circuit = !opts.provider && !opts.initialProvider
|
|
8596
8669
|
? await import('./session-runtime/provider-circuit.js')
|
|
8597
8670
|
: undefined;
|
|
8598
|
-
const provider = opts.provider ?? opts.initialProvider ??
|
|
8671
|
+
const provider = opts.provider ?? opts.initialProvider ?? await resolveDefaultProviderAsync(opts.model);
|
|
8599
8672
|
const initial = finalizeStreamingProviderModel(provider, opts.model ?? provider.defaultModel);
|
|
8600
8673
|
let activeProvider = initial.provider;
|
|
8601
8674
|
let activeModel = initial.model;
|
|
@@ -8621,6 +8694,19 @@ export async function streamLLMWithTools(
|
|
|
8621
8694
|
}
|
|
8622
8695
|
}
|
|
8623
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
|
+
};
|
|
8624
8710
|
const attemptedProviders = new Set<string>([
|
|
8625
8711
|
activeProvider.name,
|
|
8626
8712
|
...(circuitBlockedInitialProvider ? [circuitBlockedInitialProvider] : []),
|
|
@@ -9170,7 +9256,9 @@ export async function streamLLMWithTools(
|
|
|
9170
9256
|
const base = {
|
|
9171
9257
|
...opts,
|
|
9172
9258
|
model: activeModel,
|
|
9173
|
-
tools: completionNeedsFinalTurn && !keepToolsNoCall
|
|
9259
|
+
tools: completionNeedsFinalTurn && !keepToolsNoCall
|
|
9260
|
+
? []
|
|
9261
|
+
: turn === 0 && opts.firstTurnTools ? opts.firstTurnTools : activeTools,
|
|
9174
9262
|
remainingFallbacks,
|
|
9175
9263
|
};
|
|
9176
9264
|
if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
|
|
@@ -9303,7 +9391,11 @@ export async function streamLLMWithTools(
|
|
|
9303
9391
|
new Promise<{ idle: true }>((res) => { idleTimer = setTimeout(() => res({ idle: true }), streamIdleTimeoutMs); }),
|
|
9304
9392
|
]);
|
|
9305
9393
|
if (step.idle) throw new StreamIdleTimeoutError(streamIdleTimeoutMs);
|
|
9394
|
+
await recordChildFirstLlmResponse({ status: 'ok' });
|
|
9306
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 });
|
|
9307
9399
|
if (idleTimer) clearTimeout(idleTimer);
|
|
9308
9400
|
releaseStreamAttempt(true, err);
|
|
9309
9401
|
if (err instanceof ApiHttpError && err.status === 400 && providerToolSchemaDiagnostics) {
|
|
@@ -12809,14 +12901,14 @@ export function getProviderForConfig(
|
|
|
12809
12901
|
}
|
|
12810
12902
|
const crossFamilyModel = (model || userConfig.llm.model) && resolvedProviderName !== provider;
|
|
12811
12903
|
if (crossFamilyModel) {
|
|
12812
|
-
const
|
|
12813
|
-
const keyImplies =
|
|
12904
|
+
const key = userConfig.llm.apiKey || '';
|
|
12905
|
+
const keyImplies = key.startsWith('sk-ant')
|
|
12814
12906
|
? 'anthropic'
|
|
12815
|
-
:
|
|
12907
|
+
: key.startsWith('xai-')
|
|
12816
12908
|
? 'grok'
|
|
12817
|
-
:
|
|
12909
|
+
: key.startsWith('sk-')
|
|
12818
12910
|
? 'openai'
|
|
12819
|
-
:
|
|
12911
|
+
: key
|
|
12820
12912
|
? 'unknown'
|
|
12821
12913
|
: 'none';
|
|
12822
12914
|
const keyMismatch =
|
|
@@ -12827,7 +12919,6 @@ export function getProviderForConfig(
|
|
|
12827
12919
|
configProvider: provider,
|
|
12828
12920
|
model: decision.model,
|
|
12829
12921
|
implied: resolvedProviderName,
|
|
12830
|
-
keyPrefix: keyPrefix || null,
|
|
12831
12922
|
keyImplies,
|
|
12832
12923
|
keyMismatch,
|
|
12833
12924
|
}, { level: 'info' });
|
|
@@ -12872,6 +12963,75 @@ export function getProviderForConfig(
|
|
|
12872
12963
|
// union without a case here fails loud at first call.
|
|
12873
12964
|
throw new Error(`unknown provider: ${provider as string}`);
|
|
12874
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
|
+
}
|
|
12875
13035
|
import { getModelFamily, isGpt6GenerationModel, usesCodexBehaviorGuards } from './models/prompts.js';
|
|
12876
13036
|
import type { ModelFamily } from './models/prompts.js';
|
|
12877
13037
|
|
|
@@ -59,10 +59,10 @@ export const FEATURE_MATURITY = {
|
|
|
59
59
|
},
|
|
60
60
|
// Canonical CLI command names only; aliases inherit their command's grade.
|
|
61
61
|
cliRoot: {
|
|
62
|
-
preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta',
|
|
62
|
+
preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta', catalog: 'beta',
|
|
63
63
|
where: 'stable', bench: 'beta', shadow: 'beta', llm: 'beta', storage: 'beta', leader: 'beta',
|
|
64
64
|
pod: 'beta', browser: 'beta', questions: 'beta', usage: 'stable', live: 'beta',
|
|
65
|
-
research: 'beta', release: 'beta', rfc: 'beta', know: 'beta', freeze: 'beta', herdr: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
|
|
65
|
+
research: 'beta', release: 'beta', rfc: 'beta', know: 'beta', life: 'beta', freeze: 'beta', herdr: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
|
|
66
66
|
control: 'beta', resources: 'beta', hooks: 'beta', setup: 'stable', start: 'stable',
|
|
67
67
|
grounding: 'beta', graph: 'beta', loop: 'stable', resource: 'beta', card: 'stable', 'launch-head': 'beta',
|
|
68
68
|
a2a: 'beta', plugin: 'stable', make: 'beta', skills: 'beta', connect: 'beta', import: 'beta',
|
|
@@ -82,7 +82,7 @@ export const FEATURE_MATURITY = {
|
|
|
82
82
|
onboarding: 'beta', login: 'stable', session: 'beta', chat: 'stable', repl: 'stable',
|
|
83
83
|
agent: 'stable', registry: 'beta', tier: 'stable', local: 'beta', scheduler: 'beta',
|
|
84
84
|
attach: 'beta', wf: 'beta', nexus: 'stable', phone: 'beta', token: 'beta',
|
|
85
|
-
acp: 'beta', voice: 'beta', sim: 'beta',
|
|
85
|
+
acp: 'beta', voice: 'beta', sim: 'beta', tui: 'system',
|
|
86
86
|
'run-detached': 'system', dogfood: 'system', run: 'system',
|
|
87
87
|
},
|
|
88
88
|
// Canonical names only; aliases inherit their command's grade at lookup.
|
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, {
|
package/src/mcp/server.ts
CHANGED
|
@@ -29,6 +29,7 @@ import { buildCliAgentTools } from '../cli/agent-cli.js';
|
|
|
29
29
|
import { getUserConfig } from '../user-config.js';
|
|
30
30
|
import type { TokenScope } from '../auth/scope.js';
|
|
31
31
|
import { filterToolsForScope, isToolAllowedForScope } from '../nexus/api/mcp-public-allowlist.js';
|
|
32
|
+
import { normalizeRunId } from '../harness/harness-space.js';
|
|
32
33
|
|
|
33
34
|
// ─── JSON-RPC shapes ─────────────────────────────────────────────
|
|
34
35
|
|
|
@@ -102,6 +103,30 @@ export interface McpServerContext {
|
|
|
102
103
|
tokenScope?: TokenScope;
|
|
103
104
|
}
|
|
104
105
|
|
|
106
|
+
/** Accept only an already-safe run identifier from standard MCP params._meta. */
|
|
107
|
+
function mcpRunId(params: Record<string, unknown> | undefined): string | undefined {
|
|
108
|
+
const meta = params?._meta;
|
|
109
|
+
if (!meta || typeof meta !== 'object' || Array.isArray(meta)) return undefined;
|
|
110
|
+
const value = (meta as Record<string, unknown>).elanousRunId;
|
|
111
|
+
if (typeof value !== 'string' || !/^[A-Za-z0-9_-]{1,64}$/.test(value)) return undefined;
|
|
112
|
+
const normalized = normalizeRunId(value);
|
|
113
|
+
return normalized === value ? value : undefined;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function logAsideRunIdDrop(toolName: string, params: Record<string, unknown> | undefined): void {
|
|
117
|
+
const meta = params?._meta;
|
|
118
|
+
const raw = meta && typeof meta === 'object' && !Array.isArray(meta)
|
|
119
|
+
? (meta as Record<string, unknown>).elanousRunId
|
|
120
|
+
: undefined;
|
|
121
|
+
const reason = typeof raw !== 'string'
|
|
122
|
+
? 'missing-or-non-string'
|
|
123
|
+
: !/^[A-Za-z0-9_-]{1,64}$/.test(raw)
|
|
124
|
+
? 'invalid-format'
|
|
125
|
+
: normalizeRunId(raw) !== raw ? 'not-normalized' : 'validation-rejected';
|
|
126
|
+
try { debug.log('mcp-server.aside', 'elanous-tool-call-run-id-dropped', { toolName, reason }); }
|
|
127
|
+
catch { /* observation must not block the caller */ }
|
|
128
|
+
}
|
|
129
|
+
|
|
105
130
|
/** Emit a `system.mcp.proxy_call` user-intent event for a single
|
|
106
131
|
* tool dispatch. Best-effort — sink failures swallowed upstream by
|
|
107
132
|
* `userIntentLogger.emit`, and the outer try/catch keeps the
|
|
@@ -177,8 +202,20 @@ export async function handleMcpRequest(
|
|
|
177
202
|
const args = (req.params?.arguments as Record<string, unknown>) ?? {};
|
|
178
203
|
const surface = ctx.surface ?? 'mcp';
|
|
179
204
|
const rt = getToolRuntime(name);
|
|
205
|
+
const runId = ctx.clientName === 'aside' ? mcpRunId(req.params) : undefined;
|
|
206
|
+
if (ctx.clientName === 'aside' && !runId) logAsideRunIdDrop(name, req.params);
|
|
207
|
+
const asideReturn = runId !== undefined;
|
|
180
208
|
const isExposedOnSurface = listToolRuntimes(surface).some(runtime => runtime.id === rt?.id);
|
|
181
209
|
if (!rt || !isExposedOnSurface) {
|
|
210
|
+
if (asideReturn) {
|
|
211
|
+
try {
|
|
212
|
+
debug.log('mcp-server.aside', 'elanous-tool-call', { runId, toolName: name });
|
|
213
|
+
debug.log('mcp-server.aside', 'elanous-tool-result', {
|
|
214
|
+
runId, toolName: name, ok: false,
|
|
215
|
+
errorClass: rt ? 'tool_not_exposed' : 'unknown_tool',
|
|
216
|
+
});
|
|
217
|
+
} catch { /* observation must not block the caller */ }
|
|
218
|
+
}
|
|
182
219
|
emitProxyCallIntent(name, ctx.origin, false, 'unknown_tool');
|
|
183
220
|
return {
|
|
184
221
|
...base,
|
|
@@ -186,6 +223,10 @@ export async function handleMcpRequest(
|
|
|
186
223
|
};
|
|
187
224
|
}
|
|
188
225
|
try {
|
|
226
|
+
if (asideReturn) {
|
|
227
|
+
try { debug.log('mcp-server.aside', 'elanous-tool-call', { runId, toolName: name }); }
|
|
228
|
+
catch { /* observation must not block the caller */ }
|
|
229
|
+
}
|
|
189
230
|
const isMcpAgent = surface === 'mcp' && rt.id === 'agent';
|
|
190
231
|
const agentArgs = isMcpAgent
|
|
191
232
|
? { ...args, run_in_background: args.run_in_background ?? true }
|
|
@@ -198,6 +239,7 @@ export async function handleMcpRequest(
|
|
|
198
239
|
const out = await dispatchToolByName(name, agentArgs, {
|
|
199
240
|
surface,
|
|
200
241
|
...(ctx.clientName ? { mcpClient: ctx.clientName } : {}),
|
|
242
|
+
...(runId ? { runId } : {}),
|
|
201
243
|
...(agentTools ? {
|
|
202
244
|
agentHostTools: agentTools.specs,
|
|
203
245
|
agentCwd,
|
|
@@ -212,10 +254,22 @@ export async function handleMcpRequest(
|
|
|
212
254
|
background: agentArgs.run_in_background === true,
|
|
213
255
|
});
|
|
214
256
|
}
|
|
257
|
+
if (asideReturn) {
|
|
258
|
+
const resultRecord = out && typeof out === 'object' ? out as Record<string, unknown> : {};
|
|
259
|
+
const toolOk = resultRecord.ok === false || resultRecord.isError === true
|
|
260
|
+
? false
|
|
261
|
+
: resultRecord.ok === true ? true : null;
|
|
262
|
+
try { debug.log('mcp-server.aside', 'elanous-tool-result', { runId, toolName: name, ok: toolOk }); }
|
|
263
|
+
catch { /* observation must not block the caller */ }
|
|
264
|
+
}
|
|
215
265
|
emitProxyCallIntent(name, ctx.origin, true);
|
|
216
266
|
return { ...base, result: toMcpToolCallResult(out) };
|
|
217
267
|
} catch (err) {
|
|
218
268
|
const msg = err instanceof Error ? err.message : String(err);
|
|
269
|
+
if (asideReturn) {
|
|
270
|
+
try { debug.log('mcp-server.aside', 'elanous-tool-result', { runId, toolName: name, ok: false, errorClass: err instanceof Error ? err.name : 'unknown' }); }
|
|
271
|
+
catch { /* observation must not block the caller */ }
|
|
272
|
+
}
|
|
219
273
|
emitProxyCallIntent(name, ctx.origin, false, msg);
|
|
220
274
|
throw err;
|
|
221
275
|
}
|