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
|
@@ -39,6 +39,18 @@ function readInstalledLockHash(repoDir: string): string | null {
|
|
|
39
39
|
} catch { return null; }
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
function pathIsAbsent(path: string): boolean {
|
|
43
|
+
try { lstatSync(path); return false; }
|
|
44
|
+
catch (error) { return (error as NodeJS.ErrnoException).code === 'ENOENT'; }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function isRealDirectory(path: string): boolean {
|
|
48
|
+
try {
|
|
49
|
+
const stat = lstatSync(path);
|
|
50
|
+
return stat.isDirectory() && !stat.isSymbolicLink();
|
|
51
|
+
} catch { return false; }
|
|
52
|
+
}
|
|
53
|
+
|
|
42
54
|
/** Record the image's installed dependency lock once source verification ties it to the worker key. */
|
|
43
55
|
function rememberInstalledLockHash(repoDir: string, lockHash: string): void {
|
|
44
56
|
try {
|
|
@@ -261,7 +273,35 @@ export class WarmWorkerRuntime {
|
|
|
261
273
|
}, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
|
|
262
274
|
return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
|
|
263
275
|
}
|
|
264
|
-
|
|
276
|
+
try {
|
|
277
|
+
(this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true, force: true })))(this.options.scratchDir);
|
|
278
|
+
// A successful rm call is not proof of cleanup: a stub can be a no-op, and an
|
|
279
|
+
// attacker can replace the path with a symlink before the next mkdir.
|
|
280
|
+
if (!pathIsAbsent(this.options.scratchDir)) throw new Error('scratch path remains after removal');
|
|
281
|
+
} catch {
|
|
282
|
+
this.quarantined = true;
|
|
283
|
+
try { debug.log('pod.reuse', 'clean-failed', {
|
|
284
|
+
runId: command.runId, attemptId: command.attemptId, workerId: command.workerId,
|
|
285
|
+
// The worker outcome stays cleanup-failed for callers; this event reason identifies the scratch phase.
|
|
286
|
+
// Include only a path that lstat can still observe; a failed rm may also have removed it.
|
|
287
|
+
reason: 'scratch-removal-failed',
|
|
288
|
+
remainingPaths: pathIsAbsent(this.options.scratchDir) ? [] : [this.options.scratchDir],
|
|
289
|
+
}, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
|
|
290
|
+
return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
// Non-recursive mkdir refuses a path that was recreated (for example as a
|
|
294
|
+
// symlink) after the absence check. Validate the resulting path type as well.
|
|
295
|
+
mkdirSync(this.options.scratchDir);
|
|
296
|
+
if (!isRealDirectory(this.options.scratchDir)) throw new Error('scratch path is not a real directory');
|
|
297
|
+
} catch {
|
|
298
|
+
this.quarantined = true;
|
|
299
|
+
try { debug.log('pod.reuse', 'clean-failed', {
|
|
300
|
+
runId: command.runId, attemptId: command.attemptId, workerId: command.workerId,
|
|
301
|
+
reason: 'scratch-directory-unsafe', remainingPaths: [this.options.scratchDir],
|
|
302
|
+
}, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
|
|
303
|
+
return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
|
|
304
|
+
}
|
|
265
305
|
mkdirSync(artifactsRoot, { recursive: true });
|
|
266
306
|
mkdirSync(artifactsDir, { recursive: true, mode: 0o700 });
|
|
267
307
|
const startedAt = now();
|
|
@@ -304,8 +344,10 @@ export class WarmWorkerRuntime {
|
|
|
304
344
|
reason = 'execution-error';
|
|
305
345
|
break;
|
|
306
346
|
} finally {
|
|
307
|
-
try {
|
|
308
|
-
|
|
347
|
+
try {
|
|
348
|
+
(this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true, force: true })))(sandbox);
|
|
349
|
+
if (!pathIsAbsent(sandbox)) throw new Error('request sandbox remains after removal');
|
|
350
|
+
} catch { this.quarantined = true; reason = 'cleanup-failed'; }
|
|
309
351
|
}
|
|
310
352
|
if (now() >= command.deadlineAt) reason = 'execution-error';
|
|
311
353
|
if (reason !== 'complete') break;
|
|
@@ -22,7 +22,7 @@ import { isVerifiedOpenGatewayModel } from '../../llm/opengateway-models.js';
|
|
|
22
22
|
import { configuredOpenGatewayKeys } from '../../llm/provider-credentials.js';
|
|
23
23
|
import { collectPodLedgers, createPodLedgerFollower } from './pod-ledger-collect.js';
|
|
24
24
|
import { captureFailedPodJobs } from './pod-ledger-events.js';
|
|
25
|
-
import { collectPodArtifacts, podNoResultDiagnostic, POD_SALVAGE_BUNDLE_FILE_LIMIT, POD_SALVAGE_BUNDLE_TOTAL_LIMIT } from './pod-artifact-return.js';
|
|
25
|
+
import { collectPodArtifacts, podNoResultChildError, podNoResultDiagnostic, POD_SALVAGE_BUNDLE_FILE_LIMIT, POD_SALVAGE_BUNDLE_TOTAL_LIMIT } from './pod-artifact-return.js';
|
|
26
26
|
import { readPodRepairArtifact } from './pod-repair-commit.js';
|
|
27
27
|
import { isValidAccountName, resolveCodexAccount } from '../../oauth/codex-account.js';
|
|
28
28
|
import { createCodexAccessMirror } from '../../oauth/codex-access-mirror.js';
|
|
@@ -32,6 +32,7 @@ import { finishPodFragment, writePodFragment } from '../../harness/self-send-tar
|
|
|
32
32
|
import { mintRunId, normalizeRunId } from '../../harness/harness-space.js';
|
|
33
33
|
import { TA_LAND_ENV } from '../../task-agent/task-hand.js';
|
|
34
34
|
import { appendRunLedgerEntry, loadRunLedger, runLedgerDir, runLedgerPath, type RunLedgerEntry } from '../../self-implement/run-ledger.js';
|
|
35
|
+
import { childFirstLlmFact, childFirstLlmReportFact } from '../../llm/child-first-llm-observation.js';
|
|
35
36
|
import { recordRunStop } from '../../self-implement/run-stop.js';
|
|
36
37
|
import { gateFailureReceipt, gateFailureReceiptLines } from '../../self-implement/gate-failure-signature.js';
|
|
37
38
|
import { runSuffixKey } from '../../self-implement/salvage-branches.js';
|
|
@@ -148,6 +149,19 @@ import { findGitDir } from '../../git-fs/locate.js';
|
|
|
148
149
|
import { hostLeaseBaseDir } from '../../pod-lease/host-lease.js';
|
|
149
150
|
import { acquireLockAsync } from '../../storage/file-lock.js';
|
|
150
151
|
import { debug, redactSecretText } from '../../debug/log.js';
|
|
152
|
+
|
|
153
|
+
function readPodChildFirstLlmFact(runId: string, ledgerDir: string, report = false) {
|
|
154
|
+
try {
|
|
155
|
+
const entries = loadRunLedger(runId, ledgerDir) ?? [];
|
|
156
|
+
return report ? childFirstLlmReportFact(entries) : childFirstLlmFact(entries);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
debug.log('self-implement.pod', 'child-first-llm-ledger-unavailable', {
|
|
159
|
+
childRunId: runId,
|
|
160
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
161
|
+
}, { level: 'warn' });
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
151
165
|
import { enterJourneyNode, exitJourneyNode, passJourneyNode } from '../../self-dev/graph-journey-nodes.js';
|
|
152
166
|
import { routeJourneyEdge } from '../../self-dev/graph-journey-route.js';
|
|
153
167
|
import { selectLiveDetail } from '../../live/detail-switch.js';
|
|
@@ -1003,9 +1017,11 @@ function podCodexAccountScript(accounts: readonly string[]): string {
|
|
|
1003
1017
|
return [
|
|
1004
1018
|
'mkdir -p "$HOME/.elanous" "$HOME/.codex"',
|
|
1005
1019
|
// Names travel as JSON data, never as shell syntax. Reconstruct the account-store keys that elanous resolves at runtime.
|
|
1006
|
-
`POD_CODEX_ACCOUNTS='${JSON.stringify(accounts)}' bun -e 'const fs=require("node:fs"),path=require("node:path");const names=JSON.parse(process.env.POD_CODEX_ACCOUNTS),home=process.env.HOME;const providers={};let version;for(let i=0;i<names.length;i++){const payload=JSON.parse(fs.readFileSync("/creds/codex-"+i+".json","utf8"));const row=JSON.parse(payload.elanousAuth);if(i===0)version=row.version;const entry=row.providers["openai-codex"];if(!entry)throw Error("missing
|
|
1020
|
+
`POD_CODEX_ACCOUNTS='${JSON.stringify(accounts)}' bun -e 'const fs=require("node:fs"),path=require("node:path");const names=JSON.parse(process.env.POD_CODEX_ACCOUNTS),home=process.env.HOME;const providers={},mirrorProviders={};let version;for(let i=0;i<names.length;i++){const payload=JSON.parse(fs.readFileSync("/creds/codex-"+i+".json","utf8"));const row=JSON.parse(payload.elanousAuth);if(i===0)version=row.version;const entry=row.providers["openai-codex"];if(!entry||!entry.tokens||typeof entry.tokens.accessToken!=="string"||!entry.tokens.accessToken||typeof entry.tokens.expiresAt!=="number"||!Number.isFinite(entry.tokens.expiresAt))throw Error("missing Codex access snapshot "+i);const accountKey=names[i]==="default"?"openai-codex":"openai-codex:"+names[i];const codexHome=path.join(home,".elanous/codex-accounts",String(i));fs.mkdirSync(codexHome,{recursive:true});fs.writeFileSync(path.join(codexHome,"auth.json"),payload.codexAuth,{mode:0o600});fs.chmodSync(path.join(codexHome,"auth.json"),0o600);providers[accountKey]={...entry,codexHome};mirrorProviders[accountKey]={authMode:"chatgpt",tokens:{accessToken:entry.tokens.accessToken,expiresAt:entry.tokens.expiresAt,refreshToken:"",refresh_token:""}}}if(!providers["openai-codex"])providers["openai-codex"]=providers["openai-codex:"+names[0]];if(!mirrorProviders["openai-codex"])mirrorProviders["openai-codex"]=mirrorProviders["openai-codex:"+names[0]];fs.writeFileSync(path.join(home,".elanous/auth.json"),JSON.stringify({version,providers}),{mode:0o600});fs.chmodSync(path.join(home,".elanous/auth.json"),0o600);const mirrorDir=path.join(home,".elanous/remote-parent-credentials/cli-mirror");fs.mkdirSync(mirrorDir,{recursive:true,mode:0o700});fs.chmodSync(mirrorDir,0o700);const mirrorPath=path.join(mirrorDir,"auth.json");fs.writeFileSync(mirrorPath,JSON.stringify({version,providers:mirrorProviders}),{mode:0o600});fs.chmodSync(mirrorPath,0o600);fs.copyFileSync(path.join(home,".elanous/codex-accounts/0/auth.json"),path.join(home,".codex/auth.json"));fs.chmodSync(path.join(home,".codex/auth.json"),0o600)' || exit 5`,
|
|
1007
1021
|
`export ELANOUS_CODEX_ACCOUNT='${accounts[0]!.replace(/'/g, `'\\''`)}'`,
|
|
1008
1022
|
'export ELANOUS_CODEX_ACCOUNT_HOME="$HOME/.elanous/codex-accounts/0" CODEX_HOME="$HOME/.elanous/codex-accounts/0"',
|
|
1023
|
+
'export ELANOUS_REMOTE_CODEX_ACCESS_ONLY=1',
|
|
1024
|
+
'export ELANOUS_REMOTE_CODEX_MIRROR_PATH="$HOME/.elanous/remote-parent-credentials/cli-mirror/auth.json"',
|
|
1009
1025
|
podQuotaPolicyExport(),
|
|
1010
1026
|
].join('\n');
|
|
1011
1027
|
}
|
|
@@ -1504,7 +1520,9 @@ if [ "$found" -eq 0 ]; then echo ELANOUS_RUN_LEDGER_NONE; fi`,
|
|
|
1504
1520
|
// ⭐ 런 계약(graph-run-contract.ts) — 이 칸이 «실제로» Pod 이고, 부모가 정한 계약도 Pod 다. 안의 그래프가 노드마다 대조한다.
|
|
1505
1521
|
{ name: ACTUAL_SUBSTRATE_ENV, value: 'pod' }, { name: RUN_CONTRACT_ENV, value: carryRunContract({ substrate: 'pod' }) },
|
|
1506
1522
|
...Object.entries(o.armEnv ?? {}).map(([name, value]) => ({ name, value })),
|
|
1507
|
-
|
|
1523
|
+
// Growth admission is host-validated control state, never a caller-provided Secret env.
|
|
1524
|
+
...o.passEnv.filter((key) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE')
|
|
1525
|
+
.map((key) => ({ name: key, valueFrom: { secretKeyRef: { name: `${o.name}-creds`, key: `env-${key}` } } })),
|
|
1508
1526
|
...(o.bedrock ? bedrockPodEnv(o.bedrock) : []),
|
|
1509
1527
|
...(o.zai || o.zaiFallback ? zaiPodEnv(o.zai ?? o.zaiFallback!) : []),
|
|
1510
1528
|
],
|
|
@@ -2631,7 +2649,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2631
2649
|
}
|
|
2632
2650
|
}
|
|
2633
2651
|
// Grok 자격은 전용 Secret 키 하나로만 보낸다 — passEnv 의 API 키 중복 전달은 막는다.
|
|
2634
|
-
const passKeys = [...new Set([...(options.passEnv ?? []), ...(openrouterCredentialNeeded && openrouterKey ? ['OPENROUTER_API_KEY'] : []), ...(openGateway ? ['OPENGATEWAY_API_KEY'] : []), ...(anthropic ? ['ANTHROPIC_API_KEY'] : [])])].filter((key) => key !== 'ELANOUS_LIVE_DETAIL_UNTIL'
|
|
2652
|
+
const passKeys = [...new Set([...(options.passEnv ?? []), ...(openrouterCredentialNeeded && openrouterKey ? ['OPENROUTER_API_KEY'] : []), ...(openGateway ? ['OPENGATEWAY_API_KEY'] : []), ...(anthropic ? ['ANTHROPIC_API_KEY'] : [])])].filter((key) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE' && key !== 'ELANOUS_LIVE_DETAIL_UNTIL'
|
|
2635
2653
|
&& key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV
|
|
2636
2654
|
&& (!grok || !['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'].includes(key)));
|
|
2637
2655
|
const skillEnvs: Record<string, string> = options.skillEnv
|
|
@@ -2811,7 +2829,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2811
2829
|
const hostKey = (k: string): string | undefined => k === 'OPENROUTER_API_KEY' && openrouterCredentialNeeded ? openrouterKey : k === 'OPENGATEWAY_API_KEY' && openGateway ? openGatewayKey : k === 'ANTHROPIC_API_KEY' && anthropic ? anthropicKey : env[k] ?? (options.readKeyCache ?? defaultReadKeyCache)(k);
|
|
2812
2830
|
const hostFallbackNames = hostConfig.llm.fallbackChain;
|
|
2813
2831
|
const zaiOverage = zaiLaunchOverage ?? zaiSettingsFromConfig(hostConfig.llm).overage;
|
|
2814
|
-
const normalizedFallback = normalizeFallbackChain(hostFallbackNames);
|
|
2832
|
+
const normalizedFallback = normalizeFallbackChain(hostFallbackNames, hostConfig.llm.provider);
|
|
2815
2833
|
let fallbackSteps = normalizedFallback.chain;
|
|
2816
2834
|
let zaiFallbackSpec: ZaiPodSpec | undefined;
|
|
2817
2835
|
const codexChild = options.provider === undefined || options.provider === 'openai-codex';
|
|
@@ -2996,10 +3014,11 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2996
3014
|
...(credentialRelay ? [POD_CREDENTIAL_TOKEN_ENV] : []),
|
|
2997
3015
|
...(githubRelay ? [POD_GITHUB_CREDENTIAL_TOKEN_ENV] : []),
|
|
2998
3016
|
];
|
|
3017
|
+
const podGrowthScope = env.ELANOUS_GRAPH_GROWTH_SCOPE === 'harness' ? 'harness' : undefined;
|
|
2999
3018
|
const detail = selectLiveDetail(options.liveDetailFile ? { path: options.liveDetailFile } : {}).state;
|
|
3000
3019
|
const detailUntil = detail && (detail.scope === 'all' || detail.scope === parentRunId || detail.scope === launchRunId) && detail.until > Date.now()
|
|
3001
3020
|
? String(detail.until) : undefined;
|
|
3002
|
-
const armEnv = Object.fromEntries(Object.entries(options.armEnv ?? {}).filter(([key]) => key !== 'ELANOUS_LIVE_DETAIL_UNTIL' && !key.startsWith('ELANOUS_PROMPT_ENHANCE_') && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV && (!hostRefresh || !['GH_TOKEN', 'GITHUB_TOKEN', 'GH_CONFIG_DIR'].includes(key))));
|
|
3021
|
+
const armEnv = Object.fromEntries(Object.entries(options.armEnv ?? {}).filter(([key]) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE' && key !== 'ELANOUS_LIVE_DETAIL_UNTIL' && !key.startsWith('ELANOUS_PROMPT_ENHANCE_') && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV && (!hostRefresh || !['GH_TOKEN', 'GITHUB_TOKEN', 'GH_CONFIG_DIR'].includes(key))));
|
|
3003
3022
|
const seat = env.ELANOUS_HARNESS_SEAT;
|
|
3004
3023
|
const authorEnv = authorChoice ? {
|
|
3005
3024
|
...(authorChoice.modelSource !== 'default' || inferProviderFromModel(authorChoice.model) === 'openai-codex' ? {
|
|
@@ -3018,9 +3037,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3018
3037
|
const reviewDeferredToHost = input.autoMerge === true
|
|
3019
3038
|
&& resolvePodHostAcpReview(options.hostAcpReview, env, options.kubectl ? () => undefined : getUserConfig).enabled;
|
|
3020
3039
|
if (reviewDeferredToHost) debug.log('self-implement.pod', 'review-deferred-armed', { job: name, env: REVIEW_DEFERRED_TO_HOST_ENV, ...(reviewerPin ? { reviewerPinUnused: reviewerPin } : {}) });
|
|
3021
|
-
const jobArmEnv = grounding || credentialRelay || githubRelay || env.ELANOUS_DISPATCH_RECORDED === '1' || options.armEnv || detailUntil || seat || env.ELANOUS_POD_AUTHOR_ON_POD === '1' || reviewerPin || reviewDeferredToHost || budgetSnapshot
|
|
3040
|
+
const jobArmEnv = grounding || credentialRelay || githubRelay || podGrowthScope || env.ELANOUS_DISPATCH_RECORDED === '1' || options.armEnv || detailUntil || seat || env.ELANOUS_POD_AUTHOR_ON_POD === '1' || reviewerPin || reviewDeferredToHost || budgetSnapshot
|
|
3022
3041
|
? {
|
|
3023
3042
|
...armEnv,
|
|
3043
|
+
...(podGrowthScope ? { ELANOUS_GRAPH_GROWTH_SCOPE: podGrowthScope } : {}),
|
|
3024
3044
|
...(budgetSnapshot ? { [BUDGET_SNAPSHOT_ENV]: encodeBudgetSnapshot(budgetSnapshot) } : {}),
|
|
3025
3045
|
...authorEnv,
|
|
3026
3046
|
...(reviewerPin ? { [roleLlmEnvName('review')]: reviewerPin } : {}),
|
|
@@ -3667,7 +3687,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3667
3687
|
}
|
|
3668
3688
|
}
|
|
3669
3689
|
}
|
|
3670
|
-
|
|
3690
|
+
let childFailure = state === 'failed' && !oomKilled && failedReason !== 'DeadlineExceeded'
|
|
3671
3691
|
? lastPodChildFailure(logs) : null;
|
|
3672
3692
|
let childPrFailure: ReturnType<typeof podPrOpenFailure> = null;
|
|
3673
3693
|
if (childFailure) {
|
|
@@ -3692,6 +3712,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3692
3712
|
};
|
|
3693
3713
|
}
|
|
3694
3714
|
let noResultDiagnostic: string | null = null;
|
|
3715
|
+
let noResultLedgerText: string | null = null;
|
|
3695
3716
|
let noResultLedgerObservation: { available: boolean; bytes: number; rows: number; lastEvent: string | null } = {
|
|
3696
3717
|
available: false, bytes: 0, rows: 0, lastEvent: null,
|
|
3697
3718
|
};
|
|
@@ -3701,6 +3722,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3701
3722
|
if (noResultCandidate) {
|
|
3702
3723
|
try {
|
|
3703
3724
|
const ledgerText = readFileSync(runLedgerPath(liveChildRunId, ledgerDir), 'utf8');
|
|
3725
|
+
noResultLedgerText = ledgerText;
|
|
3704
3726
|
const ledgerRows = ledgerText.split('\n').filter(Boolean);
|
|
3705
3727
|
let lastEvent: string | null = null;
|
|
3706
3728
|
try {
|
|
@@ -3713,6 +3735,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3713
3735
|
catch { /* ledger not returned: do not invent a stage */ }
|
|
3714
3736
|
noResultDiagnostic ??= 'child terminal result missing; last ledger stage=unknown; round=unknown; mustFix=unknown';
|
|
3715
3737
|
}
|
|
3738
|
+
if (!childFailure && state === 'failed' && noResultCandidate && noResultLedgerText) {
|
|
3739
|
+
const childError = podNoResultChildError(noResultLedgerText);
|
|
3740
|
+
if (childError) childFailure = { stage: 'pr-open-failed', error: childError, rawError: childError };
|
|
3741
|
+
}
|
|
3716
3742
|
// POD-FAIL-EVIDENCE-CAPTURE: failed Pods are collected/deleted immediately after terminal handling.
|
|
3717
3743
|
// Preserve a bounded log tail for every non-OOM/non-deadline failure, including known child stages:
|
|
3718
3744
|
// the terminal result line can be followed by the useful stderr that explains the actual exit.
|
|
@@ -3792,6 +3818,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3792
3818
|
const noResultIncident = state === 'failed' && failedReason !== 'DeadlineExceeded' && !disposition;
|
|
3793
3819
|
if (reportDeficit || noResultIncident) {
|
|
3794
3820
|
const evidence = disposition?.childEvidence;
|
|
3821
|
+
const firstLlm = readPodChildFirstLlmFact(liveChildRunId, ledgerDir, true);
|
|
3795
3822
|
const diagnosticLines = [
|
|
3796
3823
|
...(Array.isArray(evidence?.podLogTail) ? evidence.podLogTail : []),
|
|
3797
3824
|
...(typeof evidence?.detail === 'string' ? evidence.detail.split('\n') : []),
|
|
@@ -3812,6 +3839,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3812
3839
|
reason: failedReason || containerReason || 'unknown',
|
|
3813
3840
|
terminationReason: evidence?.terminationReason ?? null,
|
|
3814
3841
|
providerErrors: disposition?.providerErrors ?? null,
|
|
3842
|
+
firstLlm: firstLlm ?? null,
|
|
3815
3843
|
oomKilled, podTermination: podTermination ?? null,
|
|
3816
3844
|
detailTail: evidence?.detailTail ?? null,
|
|
3817
3845
|
lastLines: diagnosticLines,
|
|
@@ -3926,6 +3954,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3926
3954
|
const childProviderFailure = podChildProviderFailureFact(logs, {
|
|
3927
3955
|
providerHint: options.provider ?? podChildProviderOf(podDelegatedChildLlm(jobArgs)?.provider),
|
|
3928
3956
|
});
|
|
3957
|
+
const childFirstLlm = readPodChildFirstLlmFact(liveChildRunId, ledgerDir);
|
|
3929
3958
|
const childEvidenceRow = podChildEvidenceLedgerRow({
|
|
3930
3959
|
job: name,
|
|
3931
3960
|
childRunId: liveChildRunId,
|
|
@@ -3935,6 +3964,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3935
3964
|
noResultLogEvidence,
|
|
3936
3965
|
podTermination,
|
|
3937
3966
|
providerFailure: childProviderFailure,
|
|
3967
|
+
firstLlm: childFirstLlm,
|
|
3938
3968
|
});
|
|
3939
3969
|
if (childEvidenceRow) {
|
|
3940
3970
|
// Every terminal attempt writes a marker, including one with no parseable child facts.
|
package/src/tool-hints/gate.ts
CHANGED
|
@@ -36,7 +36,7 @@ export function evaluateGate(
|
|
|
36
36
|
const key = cacheKey(catalog, hints, signals);
|
|
37
37
|
const cached = CACHE.get(key);
|
|
38
38
|
if (cached) {
|
|
39
|
-
recordGateEvaluation(catalog
|
|
39
|
+
recordGateEvaluation(catalog, cached, {
|
|
40
40
|
defaultEnabled: notRunStage(),
|
|
41
41
|
probe: notRunStage(),
|
|
42
42
|
intentScope: notRunStage(),
|
|
@@ -58,10 +58,12 @@ export function evaluateGate(
|
|
|
58
58
|
};
|
|
59
59
|
const boost = new Map<string, number>();
|
|
60
60
|
const paramDefaults = new Map<string, Record<string, unknown>>();
|
|
61
|
+
const excludedReasons = new Map<string, string>();
|
|
61
62
|
|
|
62
63
|
// ─── Step 1: seed with defaultEnabled entries ──────────────────
|
|
63
64
|
for (const tool of catalog) {
|
|
64
65
|
if (tool.defaultEnabled) enabled.add(tool.id);
|
|
66
|
+
else excludedReasons.set(tool.id, 'default-disabled');
|
|
65
67
|
}
|
|
66
68
|
stages.defaultEnabled = executedStage(catalog.length, enabled.size);
|
|
67
69
|
|
|
@@ -74,6 +76,7 @@ export function evaluateGate(
|
|
|
74
76
|
const mode = tool.probe.onFail ?? 'hide';
|
|
75
77
|
if (mode === 'hide') enabled.delete(tool.id);
|
|
76
78
|
else if (mode === 'disable') enabled.delete(tool.id);
|
|
79
|
+
if (mode === 'hide' || mode === 'disable') excludedReasons.set(tool.id, `probe-${mode}`);
|
|
77
80
|
// 'warn': leave enabled; caller may read hintReasons to surface
|
|
78
81
|
}
|
|
79
82
|
stages.probe = executedStage(beforeProbe, enabled.size);
|
|
@@ -93,7 +96,10 @@ export function evaluateGate(
|
|
|
93
96
|
for (const tool of catalog) {
|
|
94
97
|
const scope: ToolIntentScope = tool.intentScope ?? 'always';
|
|
95
98
|
if (scope === 'always') continue;
|
|
96
|
-
if (!activeScopes.has(scope))
|
|
99
|
+
if (!activeScopes.has(scope)) {
|
|
100
|
+
enabled.delete(tool.id);
|
|
101
|
+
excludedReasons.set(tool.id, `intent-scope:${scope}`);
|
|
102
|
+
}
|
|
97
103
|
}
|
|
98
104
|
stages.intentScope = executedStage(beforeIntentScope, enabled.size);
|
|
99
105
|
}
|
|
@@ -107,7 +113,10 @@ export function evaluateGate(
|
|
|
107
113
|
for (const tool of catalog) {
|
|
108
114
|
if (!tool.minTier) continue;
|
|
109
115
|
const need = tierRank[tool.minTier] ?? 2;
|
|
110
|
-
if (activeRank < need)
|
|
116
|
+
if (activeRank < need) {
|
|
117
|
+
enabled.delete(tool.id);
|
|
118
|
+
excludedReasons.set(tool.id, `min-tier:${tool.minTier}`);
|
|
119
|
+
}
|
|
111
120
|
}
|
|
112
121
|
stages.minTier = executedStage(beforeMinTier, enabled.size);
|
|
113
122
|
}
|
|
@@ -126,8 +135,14 @@ export function evaluateGate(
|
|
|
126
135
|
if (seenForKind.has(comboKey)) continue;
|
|
127
136
|
seenForKind.set(comboKey, { toolId, kind: h.kind });
|
|
128
137
|
|
|
129
|
-
if (h.kind === 'enable')
|
|
130
|
-
|
|
138
|
+
if (h.kind === 'enable') {
|
|
139
|
+
enabled.add(toolId);
|
|
140
|
+
excludedReasons.delete(toolId);
|
|
141
|
+
}
|
|
142
|
+
if (h.kind === 'disable') {
|
|
143
|
+
enabled.delete(toolId);
|
|
144
|
+
excludedReasons.set(toolId, 'hint-disabled');
|
|
145
|
+
}
|
|
131
146
|
if (h.kind === 'prefer') boost.set(toolId, (boost.get(toolId) ?? 0) + 2);
|
|
132
147
|
if (h.kind === 'boost') boost.set(toolId, (boost.get(toolId) ?? 0) + 1);
|
|
133
148
|
if (h.kind === 'avoid') boost.set(toolId, (boost.get(toolId) ?? 0) - 1);
|
|
@@ -181,11 +196,21 @@ export function evaluateGate(
|
|
|
181
196
|
const beforeModelFamilyCap = keep.length;
|
|
182
197
|
const cap = signals.researchAgent ? 16 : 8;
|
|
183
198
|
if (keep.length > cap) {
|
|
184
|
-
|
|
199
|
+
const requiredResearchTools = signals.intentResearch
|
|
200
|
+
? ['web_search', 'web_fetch'].filter(id => enabled.has(id))
|
|
201
|
+
: [];
|
|
202
|
+
const required = new Set(requiredResearchTools);
|
|
203
|
+
const ranked = keep
|
|
204
|
+
.filter(id => !required.has(id))
|
|
185
205
|
.map(id => ({ id, score: boost.get(id) ?? 0 }))
|
|
186
206
|
.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id))
|
|
187
|
-
.slice(0, cap)
|
|
207
|
+
.slice(0, Math.max(0, cap - requiredResearchTools.length))
|
|
188
208
|
.map(x => x.id);
|
|
209
|
+
keep = [...requiredResearchTools, ...ranked];
|
|
210
|
+
const selectedBeforeStableSort = new Set(keep);
|
|
211
|
+
for (const id of enabled) {
|
|
212
|
+
if (!selectedBeforeStableSort.has(id)) excludedReasons.set(id, 'model-family-cap');
|
|
213
|
+
}
|
|
189
214
|
}
|
|
190
215
|
stages.modelFamilyCap = executedStage(beforeModelFamilyCap, keep.length);
|
|
191
216
|
}
|
|
@@ -204,6 +229,7 @@ export function evaluateGate(
|
|
|
204
229
|
boost: Object.fromEntries(boost),
|
|
205
230
|
paramDefaults: Object.fromEntries(paramDefaults),
|
|
206
231
|
hintReasons,
|
|
232
|
+
excludedReasons: Object.fromEntries(excludedReasons),
|
|
207
233
|
};
|
|
208
234
|
|
|
209
235
|
if (CACHE.size >= CACHE_MAX) {
|
|
@@ -212,7 +238,7 @@ export function evaluateGate(
|
|
|
212
238
|
if (firstKey !== undefined) CACHE.delete(firstKey);
|
|
213
239
|
}
|
|
214
240
|
CACHE.set(key, decision);
|
|
215
|
-
recordGateEvaluation(catalog
|
|
241
|
+
recordGateEvaluation(catalog, decision, stages, false);
|
|
216
242
|
return decision;
|
|
217
243
|
}
|
|
218
244
|
|
|
@@ -237,18 +263,23 @@ function executedStage(before: number, after: number): GateStage {
|
|
|
237
263
|
}
|
|
238
264
|
|
|
239
265
|
function recordGateEvaluation(
|
|
240
|
-
|
|
241
|
-
|
|
266
|
+
catalog: NativeToolCatalogEntry[],
|
|
267
|
+
decision: GateDecision,
|
|
242
268
|
stages: GateStages,
|
|
243
269
|
cacheHit: boolean,
|
|
244
270
|
): void {
|
|
245
|
-
|
|
271
|
+
const active = new Set(decision.filtered);
|
|
246
272
|
debug.log('capability.resolve', 'tool-gate-evaluated', {
|
|
247
273
|
cacheHit,
|
|
248
|
-
catalogCount,
|
|
249
|
-
filteredCount,
|
|
250
|
-
removedCount:
|
|
274
|
+
catalogCount: catalog.length,
|
|
275
|
+
filteredCount: decision.filtered.length,
|
|
276
|
+
removedCount: catalog.length - decision.filtered.length,
|
|
251
277
|
stages,
|
|
278
|
+
activeTools: decision.filtered.map((id) => catalog.find((tool) => tool.id === id)?.displayName ?? id),
|
|
279
|
+
excludedTools: catalog.filter((tool) => !active.has(tool.id)).map((tool) => ({
|
|
280
|
+
name: tool.displayName,
|
|
281
|
+
reason: decision.excludedReasons?.[tool.id] ?? 'unclassified-filter',
|
|
282
|
+
})),
|
|
252
283
|
});
|
|
253
284
|
}
|
|
254
285
|
|
|
@@ -120,7 +120,7 @@ const RESEARCH_ASCII_RE = /\b(research|find out|look up|investigate|latest (on|n
|
|
|
120
120
|
const RESEARCH_KO_RE = /(최신|뉴스|찾아(?:줘|봐)|알아봐|조사|리서치)/;
|
|
121
121
|
const RESEARCH_SKILL_RE = /\b(?:omni[ -]market|omni[ -]crawl|social[ -]pulse)\b/i;
|
|
122
122
|
const RESEARCH_EXPLANATION_RE = /(?:왜|이유|원인|전망|분석|비교|조사|\bwhy\b|\bcause\b|\boutlook\b|\banalysis\b|\bcompare\b)/i;
|
|
123
|
-
const RESEARCH_TOPIC_RE = /(
|
|
123
|
+
const RESEARCH_TOPIC_RE = /(?:금리|채권|시장|경제|물가|환율|주가|기업|산업|정책|선거|역사|기후|질병|의학|과학|반도체|HBM\d?|메모리|공급망|양산|인증|마이크론|삼성전자|SK하이닉스|\bbond\b|\byield\b|\bmarket\b|\beconomy\b|\binflation\b|\bstock\b|\bpolicy\b|\belection\b|\bhistory\b|\bclimate\b|\bhealth\b|\bscience\b)/i;
|
|
124
124
|
const RESEARCH_CODING_RE = /(?:코드|함수|버그|테스트|빌드|커밋|하니스|설정|오류|구현|수리|고쳐|수정|저장소|\brepo\b|\bcode\b|\bfunction\b|\bbug\b|\btest\b|\bbuild\b|\bcommit\b|\bconfig\b|\bimplement\b|\bfix\b)/i;
|
|
125
125
|
const DEEP_RESEARCH_INTENT_TERMS = [
|
|
126
126
|
'research', 'deep research', 'triangulate', 'compare sources',
|
package/src/tool-hints/types.ts
CHANGED
|
@@ -102,4 +102,6 @@ export interface GateDecision {
|
|
|
102
102
|
paramDefaults: Record<string, Record<string, unknown>>;
|
|
103
103
|
/** Reasons surfaced by current hints — for prompt injection. */
|
|
104
104
|
hintReasons: string[];
|
|
105
|
+
/** Why a catalog entry was not selected, keyed by stable catalog id. */
|
|
106
|
+
excludedReasons?: Record<string, string>;
|
|
105
107
|
}
|
|
@@ -14,6 +14,7 @@ import { requestConfirmation } from '../hitl/confirm.js';
|
|
|
14
14
|
import type { ToolRuntime, ToolRuntimeContext } from './types.js';
|
|
15
15
|
import { coordinateBrowserRoundtrip } from '../agent-mission/browser-roundtrip-coordinator.js';
|
|
16
16
|
import { appendRunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
17
|
+
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
17
18
|
|
|
18
19
|
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
19
20
|
const SELECTION_COMMENT = '이것도 반영';
|
|
@@ -194,6 +195,15 @@ async function loadPersona(id: string) {
|
|
|
194
195
|
|
|
195
196
|
/** Attached-CDP browser action stays behind harness browser-act's armed, host and reversibility checks. */
|
|
196
197
|
export async function dispatchBrowserHand(args: BrowserHandArgs, _ctx?: ToolRuntimeContext, deps: BrowserHandDeps = {}): Promise<BrowserHandResult> {
|
|
198
|
+
const runId = _ctx?.runId || getHarnessRunId() || undefined;
|
|
199
|
+
const browserActDeps = {
|
|
200
|
+
...deps.browserActDeps,
|
|
201
|
+
...(_ctx?.runId
|
|
202
|
+
? { getRunId: () => _ctx.runId! }
|
|
203
|
+
: deps.browserActDeps?.getRunId
|
|
204
|
+
? {}
|
|
205
|
+
: { getRunId: () => runId ?? null }),
|
|
206
|
+
};
|
|
197
207
|
const url = args.url.trim();
|
|
198
208
|
const target = args.target.trim();
|
|
199
209
|
const issueId = args.linearSubtaskId.trim();
|
|
@@ -240,7 +250,7 @@ export async function dispatchBrowserHand(args: BrowserHandArgs, _ctx?: ToolRunt
|
|
|
240
250
|
};
|
|
241
251
|
return (deps.browserAct ?? performBrowserAction)({
|
|
242
252
|
url: actionUrl, target, armed: true, entryPoint: 'tool-runtime/browser-hand', ...(persona ? { persona } : {}),
|
|
243
|
-
}, { ...
|
|
253
|
+
}, { ...browserActDeps, observe, reversibilityPolicy: 'navigation-only' });
|
|
244
254
|
};
|
|
245
255
|
try { sourceText = await inspect(url, pagePort); } catch { /* unavailable observation stays unknown */ }
|
|
246
256
|
let block = blockedKind(sourceText);
|
|
@@ -50,9 +50,9 @@ export interface BrowserRuntimeDeps {
|
|
|
50
50
|
observe?: BrowserActionObserver;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
function observeBrowserAction(data: Record<string, unknown
|
|
53
|
+
function observeBrowserAction(data: Record<string, unknown>, explicitRunId?: string): void {
|
|
54
54
|
try {
|
|
55
|
-
const runId = getHarnessRunId() || null;
|
|
55
|
+
const runId = explicitRunId || getHarnessRunId() || null;
|
|
56
56
|
(deps.observe ?? ((event, detail) => debug.log('harness.browser-action', event, detail)))('executed', {
|
|
57
57
|
runId,
|
|
58
58
|
sessionId: 'browser-runtime',
|
|
@@ -95,17 +95,20 @@ async function defaultCloseClient(): Promise<void> {
|
|
|
95
95
|
singletonPromise = null;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
const DEFAULT_DEPS: BrowserRuntimeDeps = {
|
|
99
99
|
getClient: defaultGetClient,
|
|
100
100
|
closeClient: defaultCloseClient,
|
|
101
101
|
};
|
|
102
|
+
let deps: BrowserRuntimeDeps = DEFAULT_DEPS;
|
|
102
103
|
let attachedControlSignalBus: ReturnType<typeof defaultControlSignalBus> | null = null;
|
|
104
|
+
let detachBrowserControlSignalConsumer: (() => void) | null = null;
|
|
103
105
|
|
|
104
106
|
function ensureBrowserControlSignalConsumer(): void {
|
|
105
107
|
const bus = defaultControlSignalBus();
|
|
106
108
|
if (attachedControlSignalBus === bus) return;
|
|
109
|
+
detachBrowserControlSignalConsumer?.();
|
|
107
110
|
attachedControlSignalBus = bus;
|
|
108
|
-
bus.subscribe(
|
|
111
|
+
detachBrowserControlSignalConsumer = bus.subscribe(
|
|
109
112
|
{ kind: 'browser-cdp-stop', minUrgency: 'quick-pass', surface: 'browser' },
|
|
110
113
|
() => {
|
|
111
114
|
void deps.closeClient?.();
|
|
@@ -117,6 +120,14 @@ export function setBrowserRuntimeDeps(next: Partial<BrowserRuntimeDeps>): void {
|
|
|
117
120
|
deps = { ...deps, ...next };
|
|
118
121
|
}
|
|
119
122
|
|
|
123
|
+
/** Reset dependency injection after a run-scoped observability test. */
|
|
124
|
+
export function _resetBrowserRuntimeDepsForTest(): void {
|
|
125
|
+
detachBrowserControlSignalConsumer?.();
|
|
126
|
+
detachBrowserControlSignalConsumer = null;
|
|
127
|
+
deps = DEFAULT_DEPS;
|
|
128
|
+
attachedControlSignalBus = null;
|
|
129
|
+
}
|
|
130
|
+
|
|
120
131
|
export async function closeBrowserRuntime(): Promise<void> {
|
|
121
132
|
if (deps.closeClient) await deps.closeClient();
|
|
122
133
|
}
|
|
@@ -189,6 +200,7 @@ const MAX_NAV_TIMEOUT_MS = 60_000;
|
|
|
189
200
|
|
|
190
201
|
export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: ToolRuntimeContext): Promise<BrowserNavigateResult> {
|
|
191
202
|
ensureBrowserControlSignalConsumer();
|
|
203
|
+
const runId = ctx?.runId || getHarnessRunId() || undefined;
|
|
192
204
|
const url = String(args.url ?? '').trim();
|
|
193
205
|
const input = args.input;
|
|
194
206
|
// Input is never an implicit side effect of navigation. Approval is scoped
|
|
@@ -215,7 +227,7 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
|
|
|
215
227
|
if (!approved) return { output: '# BrowserNavigate: input not approved', finalUrl: '', title: '', loadMs: 0 };
|
|
216
228
|
}
|
|
217
229
|
if (!url) {
|
|
218
|
-
observeBrowserAction({ action: 'navigate', url: '', target: 'url', ok: false, error: 'url is required' });
|
|
230
|
+
observeBrowserAction({ action: 'navigate', url: '', target: 'url', ok: false, error: 'url is required' }, runId);
|
|
219
231
|
return { output: '# BrowserNavigate: error\nurl is required', finalUrl: '', title: '', loadMs: 0 };
|
|
220
232
|
}
|
|
221
233
|
const waitForLoad = args.waitForLoad !== false;
|
|
@@ -226,12 +238,12 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
|
|
|
226
238
|
client = await deps.getClient();
|
|
227
239
|
} catch (err) {
|
|
228
240
|
const error = err instanceof Error ? err.message : String(err);
|
|
229
|
-
observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error });
|
|
241
|
+
observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error }, runId);
|
|
230
242
|
throw err;
|
|
231
243
|
}
|
|
232
244
|
if (!client) {
|
|
233
245
|
const availability = getBrowserCdpAvailability();
|
|
234
|
-
observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error: 'chrome-unavailable' });
|
|
246
|
+
observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error: 'chrome-unavailable' }, runId);
|
|
235
247
|
return {
|
|
236
248
|
output: `# BrowserNavigate: Chrome unavailable\n${availability.note}`,
|
|
237
249
|
finalUrl: '',
|
|
@@ -264,7 +276,7 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
|
|
|
264
276
|
await client.navigate(url);
|
|
265
277
|
} catch (err) {
|
|
266
278
|
const error = err instanceof Error ? err.message : String(err);
|
|
267
|
-
observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error, loadMs: Date.now() - started });
|
|
279
|
+
observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error, loadMs: Date.now() - started }, runId);
|
|
268
280
|
return {
|
|
269
281
|
output: `# BrowserNavigate: error\n${error}`,
|
|
270
282
|
finalUrl: url,
|
|
@@ -333,7 +345,7 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
|
|
|
333
345
|
timedOut ? 'warning: load event timed out' : '',
|
|
334
346
|
].filter(Boolean).join('\n');
|
|
335
347
|
|
|
336
|
-
observeBrowserAction({ action: 'navigate', url: finalUrl, target: url, ok: true, titleLength: title.length, loadMs, timedOut });
|
|
348
|
+
observeBrowserAction({ action: 'navigate', url: finalUrl, target: url, ok: true, titleLength: title.length, loadMs, timedOut }, runId);
|
|
337
349
|
return { output, finalUrl, title, loadMs, timedOut: timedOut || undefined };
|
|
338
350
|
}
|
|
339
351
|
|
|
@@ -405,8 +417,9 @@ function escapeForJs(s: string): string {
|
|
|
405
417
|
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
406
418
|
}
|
|
407
419
|
|
|
408
|
-
export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<BrowserReadResult> {
|
|
420
|
+
export async function dispatchBrowserRead(args: BrowserReadArgs, ctx?: ToolRuntimeContext): Promise<BrowserReadResult> {
|
|
409
421
|
ensureBrowserControlSignalConsumer();
|
|
422
|
+
const runId = ctx?.runId || getHarnessRunId() || undefined;
|
|
410
423
|
const mode: BrowserReadMode = args.mode ?? 'text';
|
|
411
424
|
const selector = typeof args.selector === 'string' ? args.selector.trim() : '';
|
|
412
425
|
const maxChars = Math.min(
|
|
@@ -419,12 +432,12 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
|
|
|
419
432
|
client = await deps.getClient();
|
|
420
433
|
} catch (err) {
|
|
421
434
|
const error = err instanceof Error ? err.message : String(err);
|
|
422
|
-
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'error' : 'not-requested' });
|
|
435
|
+
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'error' : 'not-requested' }, runId);
|
|
423
436
|
throw err;
|
|
424
437
|
}
|
|
425
438
|
if (!client) {
|
|
426
439
|
const availability = getBrowserCdpAvailability();
|
|
427
|
-
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error: 'chrome-unavailable', attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'unavailable' : 'not-requested' });
|
|
440
|
+
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error: 'chrome-unavailable', attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'unavailable' : 'not-requested' }, runId);
|
|
428
441
|
return {
|
|
429
442
|
output: `# BrowserRead: Chrome unavailable\n${availability.note}`,
|
|
430
443
|
mode,
|
|
@@ -435,7 +448,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
|
|
|
435
448
|
try {
|
|
436
449
|
const png = await client.screenshot({ format: 'png' });
|
|
437
450
|
const b64 = png.toString('base64');
|
|
438
|
-
observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: true, bytes: png.byteLength, base64Length: b64.length, attachmentRef: null, captureOutcome: 'inline-base64' });
|
|
451
|
+
observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: true, bytes: png.byteLength, base64Length: b64.length, attachmentRef: null, captureOutcome: 'inline-base64' }, runId);
|
|
439
452
|
return {
|
|
440
453
|
output: `# BrowserRead: screenshot (${png.byteLength} bytes PNG, ${b64.length} chars base64)`,
|
|
441
454
|
mode,
|
|
@@ -443,7 +456,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
|
|
|
443
456
|
};
|
|
444
457
|
} catch (err) {
|
|
445
458
|
const error = err instanceof Error ? err.message : String(err);
|
|
446
|
-
observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: false, error, attachmentRef: null, captureOutcome: 'error' });
|
|
459
|
+
observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: false, error, attachmentRef: null, captureOutcome: 'error' }, runId);
|
|
447
460
|
return {
|
|
448
461
|
output: `# BrowserRead: screenshot error\n${error}`,
|
|
449
462
|
mode,
|
|
@@ -462,7 +475,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
|
|
|
462
475
|
value = v == null ? '' : String(v);
|
|
463
476
|
} catch (err) {
|
|
464
477
|
const error = err instanceof Error ? err.message : String(err);
|
|
465
|
-
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: 'not-requested' });
|
|
478
|
+
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: 'not-requested' }, runId);
|
|
466
479
|
return {
|
|
467
480
|
output: `# BrowserRead: evaluate error\n${error}`,
|
|
468
481
|
mode,
|
|
@@ -472,7 +485,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
|
|
|
472
485
|
const truncated = value.length > maxChars;
|
|
473
486
|
const out = truncated ? value.slice(0, maxChars) : value;
|
|
474
487
|
|
|
475
|
-
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: true, charLength: value.length, returnedChars: out.length, truncated, attachmentRef: null, captureOutcome: 'not-requested' });
|
|
488
|
+
observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: true, charLength: value.length, returnedChars: out.length, truncated, attachmentRef: null, captureOutcome: 'not-requested' }, runId);
|
|
476
489
|
return {
|
|
477
490
|
output: [
|
|
478
491
|
`# BrowserRead (${mode}${selector ? ` · selector=${selector}` : ''})`,
|
|
@@ -490,8 +503,8 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
|
|
|
490
503
|
export const browserReadRuntime: ToolRuntime<BrowserReadArgs, BrowserReadResult> = {
|
|
491
504
|
id: 'browser_read',
|
|
492
505
|
spec: buildBrowserReadTool(),
|
|
493
|
-
async run(req,
|
|
494
|
-
return dispatchBrowserRead(req);
|
|
506
|
+
async run(req, ctx: ToolRuntimeContext) {
|
|
507
|
+
return dispatchBrowserRead(req, ctx);
|
|
495
508
|
},
|
|
496
509
|
};
|
|
497
510
|
|