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
|
@@ -4,7 +4,8 @@ import { sanitizeForPtyInput } from '../agent-mission/provision.js';
|
|
|
4
4
|
|
|
5
5
|
export interface VisibleMissionPty {
|
|
6
6
|
snapshot(): string;
|
|
7
|
-
write
|
|
7
|
+
/** A false result means the PTY input handle rejected the write. */
|
|
8
|
+
write(bytes: string): boolean | number | void;
|
|
8
9
|
isAlive(): boolean;
|
|
9
10
|
}
|
|
10
11
|
|
|
@@ -15,11 +16,17 @@ export interface VisibleMissionResult {
|
|
|
15
16
|
firstLine?: string;
|
|
16
17
|
promptReady: boolean;
|
|
17
18
|
missionVisible: boolean;
|
|
19
|
+
/** Every UTF-8 byte in the mission prompt was accepted by the PTY input handle. */
|
|
20
|
+
missionTyped?: boolean;
|
|
21
|
+
/** Enter was accepted only after the complete mission became visible. */
|
|
22
|
+
missionSubmitted?: boolean;
|
|
18
23
|
promptReturned: boolean;
|
|
19
24
|
completionMarker: boolean;
|
|
20
25
|
/** Bounded first PTY frame, retained to diagnose startup screens that intercepted input. */
|
|
21
26
|
initialScreen?: string;
|
|
22
27
|
startupScreen?: AgentStartupScreen;
|
|
28
|
+
failureStage?: 'prompt-readiness' | 'mission-write' | 'mission-visibility' | 'mission-submit' | 'mission-completion' | 'result-read' | 'marker-write' | 'marker-visibility' | 'marker-submit' | 'marker-completion' | 'pty-error';
|
|
29
|
+
failureScreen?: string;
|
|
23
30
|
error?: string;
|
|
24
31
|
}
|
|
25
32
|
|
|
@@ -42,6 +49,30 @@ export interface VisibleMissionDeps {
|
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
const sleepDefault = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));
|
|
52
|
+
const INPUT_CHUNK_BYTES = 256;
|
|
53
|
+
const INPUT_CHUNK_DELAY_MS = 10;
|
|
54
|
+
|
|
55
|
+
async function writeMissionInput(text: string, pty: VisibleMissionPty, sleep: (ms: number) => Promise<void>): Promise<{ complete: boolean; acceptedBytes: number; totalBytes: number }> {
|
|
56
|
+
let chunk = '';
|
|
57
|
+
let chunkBytes = 0;
|
|
58
|
+
let acceptedBytes = 0;
|
|
59
|
+
const totalBytes = Buffer.byteLength(text, 'utf8');
|
|
60
|
+
for (const char of text) {
|
|
61
|
+
const charBytes = Buffer.byteLength(char, 'utf8');
|
|
62
|
+
if (chunk && chunkBytes + charBytes > INPUT_CHUNK_BYTES) {
|
|
63
|
+
if (pty.write(chunk) === false) return { complete: false, acceptedBytes, totalBytes };
|
|
64
|
+
acceptedBytes += chunkBytes;
|
|
65
|
+
await sleep(INPUT_CHUNK_DELAY_MS);
|
|
66
|
+
chunk = '';
|
|
67
|
+
chunkBytes = 0;
|
|
68
|
+
}
|
|
69
|
+
chunk += char;
|
|
70
|
+
chunkBytes += charBytes;
|
|
71
|
+
}
|
|
72
|
+
if (chunk && pty.write(chunk) === false) return { complete: false, acceptedBytes, totalBytes };
|
|
73
|
+
acceptedBytes += chunkBytes;
|
|
74
|
+
return { complete: true, acceptedBytes, totalBytes };
|
|
75
|
+
}
|
|
45
76
|
|
|
46
77
|
export function isAgentInputPrompt(screen: string): boolean {
|
|
47
78
|
const plain = stripAnsi(screen);
|
|
@@ -66,12 +97,22 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
|
|
|
66
97
|
const readFile = deps.readFile ?? ((path: string) => readFileSync(path, 'utf8'));
|
|
67
98
|
let promptReady = false;
|
|
68
99
|
let missionVisible = false;
|
|
100
|
+
let missionTyped = false;
|
|
101
|
+
let missionSubmitted = false;
|
|
69
102
|
let promptReturned = false;
|
|
70
103
|
let completionMarker = false;
|
|
71
104
|
let initialScreen: string | undefined;
|
|
72
105
|
let startupScreen: AgentStartupScreen | undefined;
|
|
73
106
|
let codexUpdateSkipSent = false;
|
|
74
107
|
let startupScreenReported = false;
|
|
108
|
+
let lastObservedScreen = '';
|
|
109
|
+
const completionDeadline = Date.now() + (deps.completionTimeoutMs ?? 300_000);
|
|
110
|
+
const stageDeadline = (timeoutMs: number): number => Math.min(completionDeadline, Date.now() + timeoutMs);
|
|
111
|
+
const snapshot = (): string => { lastObservedScreen = deps.pty.snapshot(); return lastObservedScreen; };
|
|
112
|
+
const safeSnapshot = (): string => { try { return snapshot(); } catch { return lastObservedScreen; } };
|
|
113
|
+
const failure = (result: Omit<VisibleMissionResult, 'ok' | 'failureStage' | 'failureScreen'>, stage: NonNullable<VisibleMissionResult['failureStage']>, screen = safeSnapshot()): VisibleMissionResult => ({
|
|
114
|
+
...result, missionTyped, missionSubmitted, ok: false, failureStage: stage, failureScreen: screenTail(screen),
|
|
115
|
+
});
|
|
75
116
|
const observeStartupScreen = (screen: string): AgentStartupScreen | undefined => {
|
|
76
117
|
const detected = classifyAgentStartupScreen(deps.agent, screen);
|
|
77
118
|
// This field describes the blocker present in the current/final frame,
|
|
@@ -86,7 +127,10 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
|
|
|
86
127
|
return detected;
|
|
87
128
|
};
|
|
88
129
|
try {
|
|
89
|
-
|
|
130
|
+
// Readiness is settled by the observed prompt/input echo; this is only one
|
|
131
|
+
// shared safety cap, not a per-stage 60s/5s guess.
|
|
132
|
+
const safetyCapMs = deps.completionTimeoutMs ?? 300_000;
|
|
133
|
+
const readyDeadline = stageDeadline(deps.readyTimeoutMs ?? safetyCapMs);
|
|
90
134
|
let lastScreen = '';
|
|
91
135
|
|
|
92
136
|
while (Date.now() < readyDeadline) {
|
|
@@ -94,14 +138,14 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
|
|
|
94
138
|
// The process may exit before the first poll; its final frame can still
|
|
95
139
|
// identify the startup screen that prevented the prompt from appearing.
|
|
96
140
|
try {
|
|
97
|
-
lastScreen =
|
|
98
|
-
initialScreen ??= lastScreen.slice(-1_200);
|
|
141
|
+
lastScreen = snapshot();
|
|
142
|
+
initialScreen ??= redactSensitive(stripAnsi(lastScreen)).slice(-1_200);
|
|
99
143
|
observeStartupScreen(lastScreen);
|
|
100
144
|
} catch { /* an exited remote PTY may no longer expose its final frame */ }
|
|
101
|
-
return {
|
|
145
|
+
return failure({ path: deps.outputPath, promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false, ...(initialScreen ? { initialScreen } : {}), ...(startupScreen ? { startupScreen } : {}), error: 'Agent PTY exited before its prompt appeared' }, 'prompt-readiness', lastScreen);
|
|
102
146
|
}
|
|
103
|
-
lastScreen =
|
|
104
|
-
initialScreen ??= lastScreen.slice(-1_200);
|
|
147
|
+
lastScreen = snapshot();
|
|
148
|
+
initialScreen ??= redactSensitive(stripAnsi(lastScreen)).slice(-1_200);
|
|
105
149
|
const detectedScreen = observeStartupScreen(lastScreen);
|
|
106
150
|
if (detectedScreen) {
|
|
107
151
|
if (detectedScreen === 'codex-update-choice') {
|
|
@@ -128,43 +172,49 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
|
|
|
128
172
|
await sleep(pollMs);
|
|
129
173
|
}
|
|
130
174
|
if (!promptReady) {
|
|
131
|
-
return {
|
|
132
|
-
|
|
175
|
+
return failure({
|
|
176
|
+
path: deps.outputPath, promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false,
|
|
133
177
|
initialScreen,
|
|
134
178
|
...(startupScreen ? { startupScreen } : {}),
|
|
135
|
-
error: 'Agent input prompt was not observed before the startup
|
|
136
|
-
};
|
|
179
|
+
error: 'Agent input prompt was not observed before the startup safety cap',
|
|
180
|
+
}, 'prompt-readiness', lastScreen);
|
|
137
181
|
}
|
|
138
182
|
|
|
139
183
|
const mission = sanitizeForPtyInput(deps.mission, 4_000);
|
|
140
|
-
if (!mission) return {
|
|
184
|
+
if (!mission) return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Mission text is empty after input sanitization' }, 'mission-write');
|
|
141
185
|
try {
|
|
142
186
|
readFile(deps.outputPath);
|
|
143
|
-
return {
|
|
187
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Result path already exists; refusing to reuse a previous mission file' }, 'result-read');
|
|
144
188
|
} catch (error) {
|
|
145
189
|
if (!isFileNotFound(error)) {
|
|
146
|
-
return {
|
|
190
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: `Could not verify a fresh result path: ${error instanceof Error ? error.message : String(error)}` }, 'result-read');
|
|
147
191
|
}
|
|
148
192
|
}
|
|
149
193
|
const missionPrompt = `Write the result to the exact file path ${deps.outputPath} (create parent directories if needed). ${mission}`;
|
|
150
|
-
deps.pty
|
|
151
|
-
|
|
152
|
-
|
|
194
|
+
const missionWrite = await writeMissionInput(missionPrompt, deps.pty, sleep);
|
|
195
|
+
missionTyped = missionWrite.complete;
|
|
196
|
+
if (!missionTyped) {
|
|
197
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: `Mission input write was rejected after ${missionWrite.acceptedBytes}/${missionWrite.totalBytes} UTF-8 bytes` }, 'mission-write');
|
|
198
|
+
}
|
|
199
|
+
const visibleMissionTail = Array.from(mission).slice(-24).join('');
|
|
200
|
+
const visibilityDeadline = stageDeadline(deps.visibilityTimeoutMs ?? safetyCapMs);
|
|
153
201
|
while (Date.now() < visibilityDeadline) {
|
|
154
|
-
const visibleText = normalizeVisibleText(
|
|
202
|
+
const visibleText = normalizeVisibleText(snapshot());
|
|
155
203
|
if (visibleText.includes(normalizeVisibleText(visibleMissionTail))) { missionVisible = true; break; }
|
|
156
204
|
await sleep(Math.min(pollMs || 25, Math.max(1, visibilityDeadline - Date.now())));
|
|
157
205
|
}
|
|
158
206
|
if (!missionVisible) {
|
|
159
|
-
return {
|
|
207
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: 'Mission text was not visible in the agent PTY before submission' }, 'mission-visibility');
|
|
160
208
|
}
|
|
161
|
-
deps.pty.write('\r')
|
|
209
|
+
if (deps.pty.write('\r') === false) {
|
|
210
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: 'Mission submit key was rejected by the agent PTY' }, 'mission-submit');
|
|
211
|
+
}
|
|
212
|
+
missionSubmitted = true;
|
|
162
213
|
|
|
163
|
-
const completionDeadline = Date.now() + (deps.completionTimeoutMs ?? 300_000);
|
|
164
214
|
let resultFileObserved = false;
|
|
165
215
|
while (Date.now() < completionDeadline) {
|
|
166
216
|
if (!deps.pty.isAlive()) break;
|
|
167
|
-
lastScreen =
|
|
217
|
+
lastScreen = snapshot();
|
|
168
218
|
if (deps.handleTrust(lastScreen, bytes => deps.pty.write(bytes))) {
|
|
169
219
|
await sleep(500);
|
|
170
220
|
continue;
|
|
@@ -179,40 +229,44 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
|
|
|
179
229
|
await sleep(pollMs);
|
|
180
230
|
}
|
|
181
231
|
if (!resultFileObserved) {
|
|
182
|
-
return {
|
|
232
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not create a non-empty result file before the timeout' }, 'mission-completion', lastScreen);
|
|
183
233
|
}
|
|
184
234
|
if (!promptReturned) {
|
|
185
|
-
return {
|
|
235
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not return to its input prompt after writing the result file' }, 'mission-completion', lastScreen);
|
|
186
236
|
}
|
|
187
237
|
|
|
188
238
|
let content: string;
|
|
189
239
|
try { content = readFile(deps.outputPath); }
|
|
190
240
|
catch (error) {
|
|
191
|
-
return {
|
|
241
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: `Result file disappeared after the agent returned: ${error instanceof Error ? error.message : String(error)}` }, 'result-read', safeSnapshot());
|
|
192
242
|
}
|
|
193
243
|
const firstLine = content.split(/\r?\n/).map(line => line.trim()).find(Boolean);
|
|
194
|
-
if (!firstLine) return {
|
|
244
|
+
if (!firstLine) return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Result file is empty' }, 'result-read');
|
|
195
245
|
|
|
196
246
|
// Keep the marker request separate and short: the marker itself never occurs
|
|
197
247
|
// in the mission prompt, so only the agent's final output can satisfy it.
|
|
198
248
|
const completionMarkerText = `M-${randomUUID().replaceAll('-', '').slice(0, 12)}`;
|
|
199
249
|
const completionMarkerPath = `${deps.outputPath}.completion-${completionMarkerText}`;
|
|
200
250
|
const markerPrompt = `Say ${completionMarkerText} alone and write it to the exact file path ${completionMarkerPath}.`;
|
|
201
|
-
deps.pty.write(markerPrompt)
|
|
202
|
-
|
|
251
|
+
if (deps.pty.write(markerPrompt) === false) {
|
|
252
|
+
return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker input write was rejected by the agent PTY' }, 'marker-write');
|
|
253
|
+
}
|
|
254
|
+
const markerVisibleDeadline = stageDeadline(deps.visibilityTimeoutMs ?? safetyCapMs);
|
|
203
255
|
let markerRequestVisible = false;
|
|
204
256
|
while (Date.now() < markerVisibleDeadline) {
|
|
205
|
-
const markerInputScreen = stripAnsi(
|
|
257
|
+
const markerInputScreen = stripAnsi(snapshot()).replace(/\s+/g, ' ');
|
|
206
258
|
if (markerInputScreen.includes(completionMarkerText)) { markerRequestVisible = true; break; }
|
|
207
259
|
await sleep(Math.min(pollMs || 25, Math.max(1, markerVisibleDeadline - Date.now())));
|
|
208
260
|
}
|
|
209
261
|
if (!markerRequestVisible) {
|
|
210
|
-
return {
|
|
262
|
+
return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker request was not visible in the agent PTY' }, 'marker-visibility');
|
|
263
|
+
}
|
|
264
|
+
if (screenShowsCompletionMarker(snapshot(), completionMarkerText)) {
|
|
265
|
+
return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker appeared in the PTY input before submission' }, 'marker-submit');
|
|
211
266
|
}
|
|
212
|
-
if (
|
|
213
|
-
return {
|
|
267
|
+
if (deps.pty.write('\r') === false) {
|
|
268
|
+
return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker submit key was rejected by the agent PTY' }, 'marker-submit');
|
|
214
269
|
}
|
|
215
|
-
deps.pty.write('\r');
|
|
216
270
|
|
|
217
271
|
while (Date.now() < completionDeadline) {
|
|
218
272
|
try {
|
|
@@ -220,26 +274,16 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
|
|
|
220
274
|
} catch { /* the agent has not written the completion marker file yet */ }
|
|
221
275
|
if (!deps.pty.isAlive()) break;
|
|
222
276
|
try {
|
|
223
|
-
if (screenShowsCompletionMarker(
|
|
277
|
+
if (screenShowsCompletionMarker(snapshot(), completionMarkerText)) { completionMarker = true; break; }
|
|
224
278
|
} catch { /* detached PTYs may no longer expose a screen snapshot */ }
|
|
225
279
|
await sleep(pollMs);
|
|
226
280
|
}
|
|
227
281
|
if (!completionMarker) {
|
|
228
|
-
return {
|
|
282
|
+
return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not show its completion marker before the timeout' }, 'marker-completion');
|
|
229
283
|
}
|
|
230
|
-
return { ok: true, path: deps.outputPath, content, firstLine, promptReady, missionVisible, promptReturned, completionMarker, initialScreen, ...(startupScreen ? { startupScreen } : {}) };
|
|
284
|
+
return { ok: true, path: deps.outputPath, content, firstLine, promptReady, missionVisible, missionTyped, missionSubmitted, promptReturned, completionMarker, initialScreen, ...(startupScreen ? { startupScreen } : {}) };
|
|
231
285
|
} catch (error) {
|
|
232
|
-
return {
|
|
233
|
-
ok: false,
|
|
234
|
-
path: deps.outputPath,
|
|
235
|
-
promptReady,
|
|
236
|
-
missionVisible,
|
|
237
|
-
promptReturned,
|
|
238
|
-
completionMarker,
|
|
239
|
-
...(initialScreen ? { initialScreen } : {}),
|
|
240
|
-
...(startupScreen ? { startupScreen } : {}),
|
|
241
|
-
error: error instanceof Error ? error.message : String(error),
|
|
242
|
-
};
|
|
286
|
+
return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker, ...(initialScreen ? { initialScreen } : {}), ...(startupScreen ? { startupScreen } : {}), error: error instanceof Error ? error.message : String(error) }, 'pty-error');
|
|
243
287
|
}
|
|
244
288
|
}
|
|
245
289
|
|
|
@@ -248,6 +292,20 @@ function screenShowsCompletionMarker(screen: string, marker: string): boolean {
|
|
|
248
292
|
return new RegExp(`^\\s*(?:(?:[•⏺└│╰⎿])\\s*)?${escaped}\\s*$`, 'm').test(stripAnsi(screen));
|
|
249
293
|
}
|
|
250
294
|
|
|
295
|
+
function screenTail(screen: string): string {
|
|
296
|
+
return redactSensitive(stripAnsi(screen)).slice(-1_200);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function redactSensitive(screen: string): string {
|
|
300
|
+
return screen
|
|
301
|
+
.replace(/(authorization\s*:\s*(?:basic|bearer|token|apikey|api[- ]key)\s+)(?:"[^"\r\n]*"|'[^'\r\n]*'|\S+)/gi, '$1[redacted]')
|
|
302
|
+
.replace(/((?:[A-Z0-9_]*(?:api[_-]?key|api[_-]?token|access[_-]?key|secret|password|credential|auth[_-]?token|refresh[_-]?token)))\s*[:=]\s*(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\r\n]*)/gi, '$1=[redacted credential]')
|
|
303
|
+
.replace(/Bearer\s+\S+/gi, 'Bearer [redacted]')
|
|
304
|
+
.replace(/(?:sk|xai|gsk|gh[pousr])-[A-Za-z0-9_-]{8,}/g, '[redacted credential]')
|
|
305
|
+
.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[redacted email]')
|
|
306
|
+
.replace(/(account[-_ ]+token)\s*[:=]?\s*(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,;]+)/gi, '$1=[redacted credential]');
|
|
307
|
+
}
|
|
308
|
+
|
|
251
309
|
function stripAnsi(screen: string): string {
|
|
252
310
|
return screen.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g, '')
|
|
253
311
|
.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '');
|
|
@@ -40,6 +40,7 @@ export type OmniSearchEngineEvent =
|
|
|
40
40
|
| { engine: string; phase: 'complete'; hits: number; durationMs: number; error?: string };
|
|
41
41
|
|
|
42
42
|
export interface OmniSearchDispatchOpts {
|
|
43
|
+
signal?: AbortSignal;
|
|
43
44
|
/** Observational only: callback failures must not interrupt a provider search. */
|
|
44
45
|
onEngine?: (event: OmniSearchEngineEvent) => void;
|
|
45
46
|
onSource?: (source: WebSearchHit & { engine: string }) => void;
|
|
@@ -239,10 +240,11 @@ async function dispatchWithProviders(
|
|
|
239
240
|
: remainingMs;
|
|
240
241
|
if (timeoutMs <= 0) throw new DOMException('Research search budget exhausted', 'TimeoutError');
|
|
241
242
|
const controller = new AbortController();
|
|
243
|
+
const signal = opts.signal ? AbortSignal.any([controller.signal, opts.signal]) : controller.signal;
|
|
242
244
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
243
245
|
try {
|
|
244
246
|
result = await Promise.race([
|
|
245
|
-
p.search(query,
|
|
247
|
+
p.search(query, signal),
|
|
246
248
|
new Promise<never>((_, reject) => {
|
|
247
249
|
timer = setTimeout(() => {
|
|
248
250
|
controller.abort();
|
|
@@ -254,7 +256,7 @@ async function dispatchWithProviders(
|
|
|
254
256
|
if (timer !== undefined) clearTimeout(timer);
|
|
255
257
|
}
|
|
256
258
|
} else {
|
|
257
|
-
result = await p.search(query);
|
|
259
|
+
result = await p.search(query, opts.signal);
|
|
258
260
|
}
|
|
259
261
|
perEngine[p.id] = { hits: result.hits, durationMs: Date.now() - start };
|
|
260
262
|
for (const hit of result.hits) {
|
|
@@ -281,6 +281,7 @@ export interface ParentHostPreflight { ok: boolean; gaps: string[]; warnings: st
|
|
|
281
281
|
export function preflightScript(target: ParentHostConfig): string {
|
|
282
282
|
const elanous = remotePath(target.elanous ?? DEFAULT_REMOTE_ELANOUS);
|
|
283
283
|
const configDir = remotePath(target.configDir ?? DEFAULT_REMOTE_CONFIG_DIR);
|
|
284
|
+
const codexCliMirrorDir = remotePath(REMOTE_CODEX_CLI_MIRROR_DIR);
|
|
284
285
|
const grokCredentialFloorSeconds = Math.ceil(PARENT_CHILD_CREDENTIAL_MIN_REMAINING_MS / 1_000);
|
|
285
286
|
return [
|
|
286
287
|
`echo "version=$(${elanous} --version 2>/dev/null | tail -1 | cut -d' ' -f1)"`,
|
|
@@ -290,7 +291,10 @@ export function preflightScript(target: ParentHostConfig): string {
|
|
|
290
291
|
`command -v kubectl >/dev/null 2>&1 && echo kubectl=1`,
|
|
291
292
|
`{ command -v grok >/dev/null 2>&1 || [ -x "$HOME/.grok/bin/grok" ]; } && echo grokCli=1`,
|
|
292
293
|
`{ command -v codex >/dev/null 2>&1 || [ -x "$HOME/.local/bin/codex" ]; } && echo codexCli=1`,
|
|
293
|
-
|
|
294
|
+
// Default auth retains its historical provider-profile count, including expired entries.
|
|
295
|
+
// The CLI mirror is access-only; unusable/expired profiles do not count and duplicates do not count twice.
|
|
296
|
+
// A missing remote Bun is reported as unknown rather than a misleading zero.
|
|
297
|
+
`codexCount=$(grep -Ec '^[[:space:]]*"openai-codex(:[^"]*)?"[[:space:]]*:[[:space:]]*\\{' ${configDir}/auth.json 2>/dev/null); codexAccountsDefault=\${codexCount:-0}; if command -v bun >/dev/null 2>&1; then codexProbe=$(bun -e 'const fs=require("node:fs");const read=(p)=>{try{return JSON.parse(fs.readFileSync(p,"utf8"))}catch{return {}}};const isCodex=(key)=>/^openai-codex(?::[^\"]+)?$/.test(key);const parent=read(process.argv[1]).providers||{};const mirror=read(process.argv[2]).providers||{};const activeMirror=Object.entries(mirror).filter(([key,p])=>isCodex(key)&&typeof p?.tokens?.accessToken==="string"&&p.tokens.accessToken.length>0&&!p.tokens.refreshToken&&!p.tokens.refresh_token&&typeof p.tokens.expiresAt==="number"&&Number.isFinite(p.tokens.expiresAt)&&p.tokens.expiresAt>Date.now());const additional=activeMirror.filter(([key])=>!Object.prototype.hasOwnProperty.call(parent,key)).length;process.stdout.write([activeMirror.length,additional].join("|"))' ${configDir}/auth.json ${codexCliMirrorDir}/auth.json 2>/dev/null); codexProbeStatus=measured; else codexProbe=''; codexProbeStatus=unknown; fi; case "$codexProbe" in *'|'*) codexAccountsMirror=\${codexProbe%%|*}; codexAccountsMirrorAdditional=\${codexProbe#*|};; *) codexProbeStatus=unknown; codexAccountsMirror=unknown; codexAccountsMirrorAdditional=0;; esac; codexAccounts=$((codexAccountsDefault + codexAccountsMirrorAdditional)); echo "codexAccountsDefault=\${codexAccountsDefault}"; echo "codexAccountsMirror=\${codexAccountsMirror}"; echo "codexAccountsMirrorAdditional=\${codexAccountsMirrorAdditional}"; echo "codexAccountsMirrorStatus=\${codexProbeStatus}"; echo "codexAccounts=\${codexAccounts}"`,
|
|
294
298
|
`{ grep -Eq '"key"[[:space:]]*:[[:space:]]*"[^"]+"' "$HOME/.grok/auth.json" 2>/dev/null || [ -n "\${XAI_API_KEY:-}\${GROK_API_KEY:-}\${GROK_CODE_XAI_API_KEY:-}" ]; } && echo grok=1`,
|
|
295
299
|
// The remote host owns its device-auth session. Ignore the legacy HQ mirror entry; it can outlive and mask the host credential.
|
|
296
300
|
// Read only expiry metadata, never credential values, and compare against the shared minimum lifetime.
|
|
@@ -366,6 +370,7 @@ export function judgeParentHostCredentials(facts: Record<string, string>): strin
|
|
|
366
370
|
if (facts.unreachable) return [];
|
|
367
371
|
const warnings: string[] = [];
|
|
368
372
|
if (!(Number(facts.codexAccounts) > 1)) warnings.push('codex-accounts-low');
|
|
373
|
+
if (facts.codexAccountsMirrorStatus === 'unknown') warnings.push('codex-account-mirror-unmeasured');
|
|
369
374
|
if (facts.grok !== '1') warnings.push('grok-credential-missing');
|
|
370
375
|
if (facts.openrouter !== '1') warnings.push('openrouter-key-missing');
|
|
371
376
|
return warnings;
|
|
@@ -391,6 +396,19 @@ export function preflightParentHost(input: PreflightInput): ParentHostPreflight
|
|
|
391
396
|
} catch { /* fail-soft */ }
|
|
392
397
|
}
|
|
393
398
|
const warnings = judgeParentHostCredentials(facts);
|
|
399
|
+
try {
|
|
400
|
+
debug.log('task-agent.parent-host', 'codex-account-candidates', {
|
|
401
|
+
host: input.target.host,
|
|
402
|
+
sources: [
|
|
403
|
+
{ path: `${input.target.configDir ?? '~/.elanous'}/auth.json`, count: Number(facts.codexAccountsDefault) || 0 },
|
|
404
|
+
{ path: `${REMOTE_CODEX_CLI_MIRROR_DIR.replace(/^\$HOME/, '~')}/auth.json`,
|
|
405
|
+
count: facts.codexAccountsMirrorStatus === 'unknown' ? null : Number(facts.codexAccountsMirror) || 0,
|
|
406
|
+
additional: facts.codexAccountsMirrorStatus === 'unknown' ? null : Number(facts.codexAccountsMirrorAdditional) || 0 },
|
|
407
|
+
],
|
|
408
|
+
mirrorStatus: facts.codexAccountsMirrorStatus ?? 'unknown',
|
|
409
|
+
totalCandidates: Number(facts.codexAccounts) || 0,
|
|
410
|
+
});
|
|
411
|
+
} catch { /* fail-soft */ }
|
|
394
412
|
if (warnings.length) {
|
|
395
413
|
try {
|
|
396
414
|
debug.log('task-agent.parent-host', 'credential-warning', {
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { readPriorMustFix, PRIOR_RESULT_NOT_RECOVERED } from './review-prior-fix.js';
|
|
3
|
+
import type { TaskCard } from './task-hand.js';
|
|
4
|
+
|
|
5
|
+
export const RECALL_MAX_ITEMS = 8;
|
|
6
|
+
export const RECALL_MAX_CHARS = 2000;
|
|
7
|
+
|
|
8
|
+
export interface PriorLessons {
|
|
9
|
+
block?: string;
|
|
10
|
+
priorCards: number;
|
|
11
|
+
items: number;
|
|
12
|
+
chars: number;
|
|
13
|
+
truncated: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type ReviewResultReader = (path: string) => string;
|
|
17
|
+
|
|
18
|
+
function compact(value: string): string {
|
|
19
|
+
return value.replace(/\s+/gu, ' ').trim();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Same-cell failure and review lessons for the next hand; no broad memory query. */
|
|
23
|
+
export function priorLessonsFor(
|
|
24
|
+
checklistId: string,
|
|
25
|
+
cards: readonly TaskCard[],
|
|
26
|
+
readReviewResult: ReviewResultReader = (path) => readFileSync(path, 'utf8'),
|
|
27
|
+
): PriorLessons {
|
|
28
|
+
const prior = cards
|
|
29
|
+
.filter((card) => card.checklistId === checklistId)
|
|
30
|
+
.slice()
|
|
31
|
+
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
32
|
+
const candidates: Array<{ cardId: string; text: string }> = [];
|
|
33
|
+
|
|
34
|
+
for (const card of prior) {
|
|
35
|
+
if (card.status === 'failed' || card.status === 'launch-failed') {
|
|
36
|
+
const failure = [...card.history].reverse().find((event) => ['failed', 'run-failed', 'launch-failed',
|
|
37
|
+
'graph-run-failed', 'tier-split-failed', 'device-first-launch-failed'].includes(event.event));
|
|
38
|
+
const reason = compact(failure?.detail ?? failure?.reason ?? '');
|
|
39
|
+
candidates.push({ cardId: card.id, text: `${card.status} 사유: ${reason || '실패 사유 미기록'}` });
|
|
40
|
+
}
|
|
41
|
+
for (const request of card.reviewRequests ?? []) {
|
|
42
|
+
const result = readPriorMustFix(request.resultPath, request.pr, request.head, readReviewResult);
|
|
43
|
+
if (result.status === 'recovered') {
|
|
44
|
+
for (const finding of result.items) {
|
|
45
|
+
const normalized = compact(finding);
|
|
46
|
+
if (normalized) candidates.push({ cardId: card.id, text: `PR #${request.pr} must-fix: ${normalized}` });
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
candidates.push({ cardId: card.id, text: `PR #${request.pr} · ${PRIOR_RESULT_NOT_RECOVERED} (${result.reason})` });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (candidates.length === 0) return { priorCards: prior.length, items: 0, chars: 0, truncated: false };
|
|
55
|
+
|
|
56
|
+
const itemLimited = candidates.length > RECALL_MAX_ITEMS;
|
|
57
|
+
const itemMarker = `… 항목 상한 ${RECALL_MAX_ITEMS}건 초과분 생략`;
|
|
58
|
+
const charMarker = `… 글자 상한 ${RECALL_MAX_CHARS}자에서 나머지 생략`;
|
|
59
|
+
const selected: typeof candidates = [];
|
|
60
|
+
const pool = candidates.slice(0, RECALL_MAX_ITEMS);
|
|
61
|
+
const headingFor = (items: typeof candidates) => items.length
|
|
62
|
+
? `## 앞선 교훈(같은 칸 · 카드 ${[...new Set(items.map((item) => item.cardId))].join(', ')})`
|
|
63
|
+
: '## 앞선 교훈(같은 칸)';
|
|
64
|
+
let charLimited = false;
|
|
65
|
+
for (const candidate of pool) {
|
|
66
|
+
const next = [...selected, candidate];
|
|
67
|
+
const heading = headingFor(next);
|
|
68
|
+
const lines = [heading, ...next.map((item) => `- ${item.cardId}: ${item.text}`)];
|
|
69
|
+
const reserve = [...(itemLimited ? [itemMarker] : []), charMarker];
|
|
70
|
+
if ([...lines, ...reserve].join('\n').length > RECALL_MAX_CHARS) {
|
|
71
|
+
charLimited = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
selected.push(candidate);
|
|
75
|
+
}
|
|
76
|
+
const heading = headingFor(selected);
|
|
77
|
+
const lines = [heading, ...selected.map((item) => `- ${item.cardId}: ${item.text}`)];
|
|
78
|
+
const markers = [
|
|
79
|
+
...(itemLimited ? [itemMarker] : []),
|
|
80
|
+
...(charLimited || selected.length < pool.length ? [charMarker] : []),
|
|
81
|
+
];
|
|
82
|
+
// A single oversized card is omitted as a whole, never sliced through its id or lesson text.
|
|
83
|
+
if (!selected.length) markers.unshift(`… 첫 항목이 ${RECALL_MAX_CHARS}자 상한을 넘어 생략`);
|
|
84
|
+
let block = [...lines, ...markers].join('\n');
|
|
85
|
+
while (block.length > RECALL_MAX_CHARS && selected.length) {
|
|
86
|
+
selected.pop();
|
|
87
|
+
charLimited = true;
|
|
88
|
+
const shortenedHeading = headingFor(selected);
|
|
89
|
+
const shortenedLines = [shortenedHeading, ...selected.map((item) => `- ${item.cardId}: ${item.text}`)];
|
|
90
|
+
const shortenedMarkers = [
|
|
91
|
+
...(itemLimited ? [itemMarker] : []), charMarker,
|
|
92
|
+
...(!selected.length ? [`… 첫 항목이 ${RECALL_MAX_CHARS}자 상한을 넘어 생략`] : []),
|
|
93
|
+
];
|
|
94
|
+
block = [...shortenedLines, ...shortenedMarkers].join('\n');
|
|
95
|
+
}
|
|
96
|
+
return { block, priorCards: prior.length, items: selected.length,
|
|
97
|
+
chars: block.length, truncated: itemLimited || charLimited };
|
|
98
|
+
}
|
|
@@ -23,6 +23,7 @@ import { readBudgetInputsLive, type BudgetInputs } from '../self-implement/budge
|
|
|
23
23
|
import { HARNESS_RUN_ID_ENV, mintRunId, normalizeRunId } from '../harness/harness-space.js';
|
|
24
24
|
import { newLaunchUtteranceId, recordLaunchUtterance } from '../harness/launch-utterance-ledger.js';
|
|
25
25
|
import { debug } from '../debug/log.js';
|
|
26
|
+
import { priorLessonsFor } from './recall-inject.js';
|
|
26
27
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
27
28
|
import { LAUNCH_DOOR_RECEIPT_ENV, openLaunchRequestDoor, type LaunchRequestDoor } from '../execution-loop/launch-gate.js';
|
|
28
29
|
import { withFileLockSync } from '../storage/file-lock.js';
|
|
@@ -1280,6 +1281,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1280
1281
|
const { normalizeEvidenceCommandLines } = await import('./evidence-command-normalize.js');
|
|
1281
1282
|
const normalized = normalizeEvidenceCommandLines(opts.text.trim());
|
|
1282
1283
|
let text = normalized.text;
|
|
1284
|
+
let metadataText = text;
|
|
1283
1285
|
if (!text) throw new Error('과제 한 줄이 비어 있다');
|
|
1284
1286
|
for (const warning of normalized.warnings) {
|
|
1285
1287
|
console.error(`⚠ ${warning}`);
|
|
@@ -1319,6 +1321,18 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1319
1321
|
const completion = opts.completion ?? 'code-pr';
|
|
1320
1322
|
const now = (opts.now ?? (() => new Date()))();
|
|
1321
1323
|
const id = opts.id ?? `${TASK_CARD_PREFIX}${now.toISOString().slice(0, 10).replaceAll('-', '')}-${randomBytes(3).toString('hex')}`;
|
|
1324
|
+
if (opts.checklistId) {
|
|
1325
|
+
const priorCards = withFileLockSync(`${path}.lock`, () =>
|
|
1326
|
+
Object.values(readState(path).tasks ?? {}).filter((card) => card.id !== id));
|
|
1327
|
+
const recall = priorLessonsFor(opts.checklistId, priorCards);
|
|
1328
|
+
if (recall.block) {
|
|
1329
|
+
text = `${text}\n\n${recall.block}`;
|
|
1330
|
+
}
|
|
1331
|
+
try {
|
|
1332
|
+
debug.log('task-agent', 'recall-inject-filled', { card: id, checklistId: opts.checklistId,
|
|
1333
|
+
priorCards: recall.priorCards, items: recall.items, chars: recall.chars, truncated: recall.truncated });
|
|
1334
|
+
} catch { /* fail-soft observation */ }
|
|
1335
|
+
}
|
|
1322
1336
|
let project: TaskCard['project'];
|
|
1323
1337
|
let targetIsGit: boolean | null = null;
|
|
1324
1338
|
if (opts.project) {
|
|
@@ -1449,17 +1463,19 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1449
1463
|
// Injected launchers are test seams and opt in explicitly at the contract test.
|
|
1450
1464
|
if (opts.live && opts.preflightGoalDoneBoundary && !selectionFailure && tierSplitBlocked === undefined && move?.kind === 'launch') {
|
|
1451
1465
|
readTaskAgentState(path);
|
|
1452
|
-
const
|
|
1466
|
+
const metadataBeforeDraft = metadataText;
|
|
1467
|
+
const drafted = draftMissingGoalDoneBoundary(metadataText, targetPaths);
|
|
1453
1468
|
if (drafted.added.length > 0) {
|
|
1454
|
-
|
|
1469
|
+
metadataText = drafted.document;
|
|
1470
|
+
text = `${text}${drafted.document.slice(metadataBeforeDraft.length)}`;
|
|
1455
1471
|
card = { ...card, text };
|
|
1456
1472
|
move = graphRun && graphRunPath ? { kind: 'launch' as const, command: ['graph', 'run', graphRunPath], reason: `조합 launcher graph-run — ${graphRun.file}` } : nextMoveFor(card, opts.landed);
|
|
1457
1473
|
try { debug.log('task-agent.hand', 'boundary-autodrafted', { taskId: id, labels: drafted.added, targetPathCount: targetPaths.length }); } catch { /* fail-soft */ }
|
|
1458
1474
|
}
|
|
1459
|
-
const { missing } = inspectGoalDoneBoundary(
|
|
1475
|
+
const { missing } = inspectGoalDoneBoundary(metadataText);
|
|
1460
1476
|
if (missing.length > 0) throw new Error(`goal-revision-required: 완료 경계 누락 ${missing.join(' · ')}`);
|
|
1461
1477
|
// ENTRANCE-EVIDENCE-COMMAND-ONLY — 존재 검사와 구분된 형태 판정: 증거 명령 줄은 명령 원문만 받는다.
|
|
1462
|
-
const formViolations = goalEvidenceCommandFormViolations(
|
|
1478
|
+
const formViolations = goalEvidenceCommandFormViolations(metadataText);
|
|
1463
1479
|
if (formViolations.length > 0) {
|
|
1464
1480
|
throw new Error(`goal-revision-required: 완료 경계 증거 명령은 명령 원문이어야 한다 ${formViolations.join(' · ')} — 증거 명령 줄에 설명 접미(예: → 0 fail)나 백틱 장식을 붙이지 말고 명령만 적은 뒤 다시 넘기세요`);
|
|
1465
1481
|
}
|
|
@@ -1520,6 +1536,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1520
1536
|
runId,
|
|
1521
1537
|
input: { ask: text, context: project ? { worktree: project.target } : {}, prior: {} },
|
|
1522
1538
|
quiet: true,
|
|
1539
|
+
deps: { growthScope: 'task-agent' },
|
|
1523
1540
|
});
|
|
1524
1541
|
} catch (error) {
|
|
1525
1542
|
// 조합 파일·대상 node가 없으면 runGraph 가 구체 사유로 던진다 — 임의 성공 처리하지 않는다.
|
|
@@ -1705,13 +1722,15 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1705
1722
|
writeCard(path, launched);
|
|
1706
1723
|
// INFLIGHT-REGISTRY — 출발 때 맥락을 남긴다(머지 때 같은 파일 줄의 의도를 스마트 머지가 읽는다 · 착지하면 지운다).
|
|
1707
1724
|
try {
|
|
1708
|
-
|
|
1725
|
+
// Preserve any completion-boundary draft while keeping the recall-only suffix out of intent/path metadata.
|
|
1726
|
+
const inflightText = metadataText;
|
|
1727
|
+
const [head = '', ...rest] = inflightText.split(/\r?\n/);
|
|
1709
1728
|
const intentLines = (/^\s*(?:대상\s*경로|target\s*paths?)\s*[::]/i.test(head) ? rest : [head, ...rest])
|
|
1710
1729
|
.filter((line) => !/^\s*(?:[-*]\s*)?완료 경계 (?:코드|실물|증거 명령)\s*:/.test(line));
|
|
1711
1730
|
registerInflight({
|
|
1712
1731
|
runId: boundRunId ?? runId, cell: card.checklistId ?? card.id, cardId: card.id,
|
|
1713
|
-
intent: intentLines.join(' ').trim() ||
|
|
1714
|
-
files: parseAskTargetPathHints(
|
|
1732
|
+
intent: intentLines.join(' ').trim() || inflightText,
|
|
1733
|
+
files: parseAskTargetPathHints(inflightText),
|
|
1715
1734
|
}, { path: join(dirname(path), INFLIGHT_REGISTRY_FILE), ...(opts.now ? { now: opts.now } : {}) });
|
|
1716
1735
|
} catch (error) {
|
|
1717
1736
|
try { debug.log('pr-tool.inflight', 'register-failed', { taskId: id, error: String((error as Error)?.message ?? error).slice(0, 200) }, { level: 'warn' }); } catch { /* fail-soft */ }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
3
|
import { gunzipSync } from 'node:zlib';
|
|
4
|
-
import { debug } from '../../debug/log.js';
|
|
4
|
+
import { debug, redactSecretText } from '../../debug/log.js';
|
|
5
5
|
import { getDefaultLogStore, type LogStore } from '../../mss/logging/log-store.js';
|
|
6
6
|
import { fromJsonl, type LogRecord } from '../../mss/logging/record.js';
|
|
7
7
|
|
|
@@ -118,6 +118,24 @@ export function podNoResultDiagnostic(ledger: string): string | null {
|
|
|
118
118
|
return stage ? `child terminal result missing; last ledger stage=${stage}; round=${round ?? 'unknown'}; mustFix=${mustFix ?? 'unknown'}` : null;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
/** A failed child can lose its terminal JSON line after recording the actionable PR-open error. */
|
|
122
|
+
export function podNoResultChildError(ledger: string): string | null {
|
|
123
|
+
let error = '';
|
|
124
|
+
for (const line of ledger.split(/\r?\n/)) {
|
|
125
|
+
try {
|
|
126
|
+
const entry = JSON.parse(line) as { event?: unknown; data?: Record<string, unknown> };
|
|
127
|
+
if (entry?.event === 'pr-open-failed' && entry.data && typeof entry.data === 'object') {
|
|
128
|
+
error = typeof entry.data.error === 'string' ? entry.data.error : '';
|
|
129
|
+
}
|
|
130
|
+
// A later successful PR open proves the earlier guard failure was recovered.
|
|
131
|
+
if (entry?.event === 'pr-opened') error = '';
|
|
132
|
+
} catch { /* malformed lines do not replace a valid failure row */ }
|
|
133
|
+
}
|
|
134
|
+
if (!error) return null;
|
|
135
|
+
const line = redactSecretText(error).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').replace(/\s+/gu, ' ').trim();
|
|
136
|
+
return line.length > 240 ? `${line.slice(0, 228)}…[truncated]` : line;
|
|
137
|
+
}
|
|
138
|
+
|
|
121
139
|
/** Import valid JSONL log records into the launching host store, with durable per-job line receipts. */
|
|
122
140
|
export function importPodLogs(bytes: Buffer, job: string, store: LogStore | null = getDefaultLogStore()): { imported: number; skipped: number } {
|
|
123
141
|
if (!store) return { imported: 0, skipped: 0 };
|
|
@@ -139,6 +139,18 @@ export interface PodProviderFailureFact {
|
|
|
139
139
|
readonly httpStatusCode?: number;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
export interface PodFirstLlmFact {
|
|
143
|
+
readonly status: 'started' | 'ok' | 'error';
|
|
144
|
+
readonly provider: string;
|
|
145
|
+
readonly model: string;
|
|
146
|
+
readonly accountName: string | null;
|
|
147
|
+
readonly startedAt: string;
|
|
148
|
+
readonly respondedAt?: string;
|
|
149
|
+
readonly httpStatus?: number;
|
|
150
|
+
readonly errorFirstLine?: string;
|
|
151
|
+
readonly firstToolCallAt?: string;
|
|
152
|
+
}
|
|
153
|
+
|
|
142
154
|
export const POD_EXIT_CLASSES = ['oom-killed', 'deadline-exceeded', 'gh-login-failed', 'pod-secret', 'ask-reprompt', 'provider-error', 'child-unconverged', 'child-error', 'no-result-line', 'unknown'] as const;
|
|
143
155
|
|
|
144
156
|
export type PodExitClass = typeof POD_EXIT_CLASSES[number];
|
|
@@ -163,6 +175,8 @@ export function podChildEvidenceLedgerRow(input: {
|
|
|
163
175
|
podTermination?: PodTermination | null;
|
|
164
176
|
/** OBS-GAP-BATCH-1030 — 실패 행에만 붙는 두 스칼라(provider · HTTP status). 없으면 종전 행 그대로. */
|
|
165
177
|
providerFailure?: PodProviderFailureFact | null;
|
|
178
|
+
/** POD-CHILD-FIRST-LLM-CALL-OBS — collected child-ledger first-call timeline. */
|
|
179
|
+
firstLlm?: PodFirstLlmFact | null;
|
|
166
180
|
}): Record<string, unknown> | null {
|
|
167
181
|
const { result } = input;
|
|
168
182
|
const persist = input.state === 'failed' || input.state === 'aborted' || input.noResultLogEvidence != null
|
|
@@ -185,6 +199,7 @@ export function podChildEvidenceLedgerRow(input: {
|
|
|
185
199
|
job: input.job,
|
|
186
200
|
...(input.providerFailure?.provider ? { provider: input.providerFailure.provider } : {}),
|
|
187
201
|
...(input.providerFailure?.httpStatusCode !== undefined ? { httpStatusCode: input.providerFailure.httpStatusCode } : {}),
|
|
202
|
+
...(input.firstLlm ? { firstLlm: input.firstLlm } : {}),
|
|
188
203
|
...(input.podTermination ? { podTermination: input.podTermination } : {}),
|
|
189
204
|
...(childResult && Object.keys(childResult).length > 0 ? { childResult } : {}),
|
|
190
205
|
};
|