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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
3
|
import { execFile, spawnSync } from 'node:child_process';
|
|
3
4
|
import { existsSync, linkSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
5
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
@@ -33,6 +34,15 @@ import { releaseResumeAcceptedRegressions, releaseResumeGateExecutor, releaseRes
|
|
|
33
34
|
import { resolveChildAllowance } from './arg-allowance.js';
|
|
34
35
|
|
|
35
36
|
type BashRun = WorkflowDeps['runBash'];
|
|
37
|
+
|
|
38
|
+
export type GraphGrowthScope = 'harness' | 'task-agent';
|
|
39
|
+
export const GRAPH_GROWTH_SCOPE_ENV = 'ELANOUS_GRAPH_GROWTH_SCOPE';
|
|
40
|
+
const graphGrowthScope = new AsyncLocalStorage<GraphGrowthScope>();
|
|
41
|
+
|
|
42
|
+
/** Scope implicit graph growth to an approved in-process harness dispatch. */
|
|
43
|
+
export function withGraphGrowthScope<T>(scope: GraphGrowthScope, work: () => T): T {
|
|
44
|
+
return graphGrowthScope.run(scope, work);
|
|
45
|
+
}
|
|
36
46
|
const DEFAULT_BASH_TIMEOUT_MS = 5 * 60 * 1_000;
|
|
37
47
|
// Independent of graph YAML and recipe snapshots: an already-wrong saved binding must fail closed.
|
|
38
48
|
const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?: string }>> = {
|
|
@@ -41,12 +51,14 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
41
51
|
cutoff: { recipe: 'cmd:cutoff', command: 'bun scripts/release-loop/node-verdict.ts cutoff' },
|
|
42
52
|
'checklist-gate': { recipe: 'cmd:checklist-gate', command: 'bun scripts/release-loop/checklist-gate-node.ts' },
|
|
43
53
|
prefetch: { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
|
|
54
|
+
'pre-gate-join': { recipe: 'none' },
|
|
44
55
|
gate: { recipe: 'cmd:gate', command: 'bun scripts/release-loop/gate-node.ts --json' },
|
|
45
56
|
'traffic-gate-passed': { recipe: 'cmd:traffic-gate-passed', command: 'bun scripts/release-loop/traffic-node.ts traffic-gate-passed' },
|
|
46
57
|
'gate-triage': { recipe: 'cmd:gate-triage', command: 'bun scripts/release-loop/gate-triage-node.ts' },
|
|
47
58
|
'mac-smoke': { recipe: 'cmd:mac-smoke', command: 'bun scripts/release-loop/mac-smoke-node.ts' },
|
|
48
59
|
'export-check': { recipe: 'cmd:export-check', command: 'bun scripts/release-loop/export-check-node.ts' },
|
|
49
60
|
pwa: { recipe: 'cmd:pwa', command: 'bun scripts/release-loop/node-verdict.ts pwa' },
|
|
61
|
+
'pre-prepare-join': { recipe: 'none' },
|
|
50
62
|
prepare: { recipe: 'cmd:prepare', command: 'bun scripts/release-loop/prepare-node.ts' },
|
|
51
63
|
upgrade: { recipe: 'cmd:upgrade', command: 'bun scripts/release-loop/upgrade-node.ts' },
|
|
52
64
|
tui: { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
|
|
@@ -60,6 +72,7 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
60
72
|
publish: { recipe: 'cmd:publish-command', command: 'bun scripts/release-loop/publish-node.ts' },
|
|
61
73
|
'npm-publish': { recipe: 'cmd:npm-publish', command: 'bun scripts/release-loop/npm-publish-node.ts' },
|
|
62
74
|
'traffic-npm-published': { recipe: 'cmd:traffic-npm-published', command: 'bun scripts/release-loop/traffic-node.ts traffic-npm-published' },
|
|
75
|
+
'release-post-publish-join': { recipe: 'none' },
|
|
63
76
|
'docs-land': { recipe: 'cmd:docs-land', command: 'bun scripts/release-loop/docs-land-node.ts' },
|
|
64
77
|
verify: { recipe: 'cmd:verify', command: 'bun scripts/release-loop/verify-node.ts' },
|
|
65
78
|
'traffic-verify-complete': { recipe: 'cmd:traffic-verify-complete', command: 'bun scripts/release-loop/traffic-node.ts traffic-verify-complete' },
|
|
@@ -68,7 +81,6 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
68
81
|
'release-story': { recipe: 'cmd:release-story', command: 'bun scripts/release-story/draft.ts --graph' },
|
|
69
82
|
'ops-upgrade': { recipe: 'cmd:ops-upgrade', command: 'bun scripts/release-loop/ops-upgrade-node.ts' },
|
|
70
83
|
'version-dev-bump': { recipe: 'cmd:version-dev-bump', command: 'bun scripts/release-loop/version-node.ts dev-bump --json' },
|
|
71
|
-
'version-dev-bump-after-failure': { recipe: 'cmd:version-dev-bump', command: 'bun scripts/release-loop/version-node.ts dev-bump --json' },
|
|
72
84
|
done: { recipe: 'none' },
|
|
73
85
|
failed: { recipe: 'none' },
|
|
74
86
|
};
|
|
@@ -150,6 +162,8 @@ export interface GraphRunState {
|
|
|
150
162
|
/** Original named terminal when status is its canonical done/failed mapping. */
|
|
151
163
|
reason?: string;
|
|
152
164
|
path: string[];
|
|
165
|
+
/** Dry-run path with each fan-out branch's planned writes expanded before its join. */
|
|
166
|
+
plannedPath?: string[];
|
|
153
167
|
/** startedAt/endedAt (ISO) and seconds are written when the node runs; ledgers before GRAPH-NODE-TIMES (0.2.19) have none. */
|
|
154
168
|
nodes: Array<{ nodeId: string; ok: boolean; exit: number | null; executed: boolean; output?: unknown; error?: string; reason?: string;
|
|
155
169
|
failure?: { errorCode: string; message: string; stage: string }; decidedBy?: string; decidedAt?: string;
|
|
@@ -169,11 +183,20 @@ export interface GraphRunState {
|
|
|
169
183
|
/** The entry chosen by a parent call; absent for existing single-entry runs. */
|
|
170
184
|
entryNodeId?: string;
|
|
171
185
|
unitCalls?: Array<{ node: string; unit: string; version: number; hash: string; childRunId: string; exit: string; steps: number; entry?: string; visit?: number; enteredAtMs?: number; exitedAtMs?: number; durationMs?: number }>;
|
|
186
|
+
/** Persisted fan-out child identities and terminal results; successful branches are immutable on resume. */
|
|
187
|
+
fanOuts?: Record<string, { from: string; join: string; branches: Record<string, {
|
|
188
|
+
runId: string; status: 'running' | 'done' | 'failed'; startedAt: string; endedAt?: string;
|
|
189
|
+
artifactSha256?: string; output?: unknown; error?: string; path?: string[];
|
|
190
|
+
}> }>;
|
|
172
191
|
/** Highest visit number handed to each unit in this run; not rewound by a restart, so
|
|
173
192
|
* a resumed run never reuses a (runId, unit, visit) span. */
|
|
174
193
|
unitVisitSeq?: Record<string, number>;
|
|
175
194
|
growth?: GraphGrowth[];
|
|
176
195
|
growthRejections?: Array<{ from: string; outcome: string; reason: string }>;
|
|
196
|
+
growthAttempts?: number;
|
|
197
|
+
/** `rejected` can represent a cap refusal before proposer invocation; `proposal` means the proposer was actually called.
|
|
198
|
+
* Legacy parked states without this field resume append-only, so their first recorded event may be applied/rejected. */
|
|
199
|
+
growthEvents?: Array<{ phase: 'proposal' | 'parked' | 'applied' | 'rejected' | 'undo-available'; from: string; outcome: string; at: string; nodeId?: string; kind?: string; reason?: string; undo?: GraphGrowth['undo'] }>;
|
|
177
200
|
growthPark?: { from: string; outcome: string; reason: string; decisionId: string; decisionRef: string; growth: GraphGrowth; command?: GrowthCommand; approval?: string };
|
|
178
201
|
resume?: { from: string; at: string; previousStatus: GraphRunState['status']; graph?: 'snapshot' | 'current' };
|
|
179
202
|
/** GATE-HOST-EXECUTOR — every explicit input change a resume made (what was set and what it replaced), oldest first. */
|
|
@@ -263,9 +286,15 @@ export interface GraphRunOptions {
|
|
|
263
286
|
pinChildUniverse?: boolean;
|
|
264
287
|
/** Release resume: command checkout and cut tip, checked before every Bash dispatch. */
|
|
265
288
|
releaseCommandSource?: { root: string; cutTip: string; git?: (args: string[]) => string };
|
|
289
|
+
/** Internal fan-out child: the parent release ledger's verified cut tip. */
|
|
290
|
+
branchCutTip?: string;
|
|
291
|
+
/** Internal fan-out child: the original release graph snapshot (its entry-only graph is synthetic). */
|
|
292
|
+
branchGraphSnapshot?: { graphSha: string; recipesSha: string };
|
|
293
|
+
/** Parent outputs visible to a fan-out child, before its branch-local outputs. */
|
|
294
|
+
branchParentOutputs?: Readonly<Record<string, unknown>>;
|
|
266
295
|
/** Optional per-run Bloom edge policy hook. */
|
|
267
296
|
researchEdgeDecisionRegistry?: ResearchEdgeDecisionRegistry;
|
|
268
|
-
deps?: { root?: string; runBash?: BashRun; callLLM?: (prompt: string) => Promise<string>; log?: (event: string, data: Record<string, unknown>) => void; beforeNode?: () => void; processStartMs?: (pid: number) => number | null; monotonicMs?: () => number; growthProposer?: GrowthProposer; growthLLM?: (prompt: string) => Promise<string>; classifyGrowthRecipe?: (node: GraphNodeSpec, resolved: { command?: string; approval?: string }) => GrowthRecipeEffect; growthDecision?: GrowthDecisionDeps & { list?: (filters: { status: 'all' }) => DecisionEntry[] }; inProcessHandlers?: InProcessHandlerRegistry };
|
|
297
|
+
deps?: { root?: string; runBash?: BashRun; callLLM?: (prompt: string) => Promise<string>; log?: (event: string, data: Record<string, unknown>) => void; beforeNode?: () => void; processStartMs?: (pid: number) => number | null; monotonicMs?: () => number; growthProposer?: GrowthProposer; growthLLM?: (prompt: string) => Promise<string>; growthScope?: GraphGrowthScope; classifyGrowthRecipe?: (node: GraphNodeSpec, resolved: { command?: string; approval?: string }) => GrowthRecipeEffect; growthDecision?: GrowthDecisionDeps & { list?: (filters: { status: 'all' }) => DecisionEntry[] }; inProcessHandlers?: InProcessHandlerRegistry };
|
|
269
298
|
}
|
|
270
299
|
|
|
271
300
|
/** The command directory must itself be the checkout at the cut tip. */
|
|
@@ -616,6 +645,38 @@ export function nextNode(edges: readonly GraphEdgeSpec[], nodeId: string, exitOu
|
|
|
616
645
|
return edge.map?.[exitOutcome] ?? edge.fallback?.[0]?.node;
|
|
617
646
|
}
|
|
618
647
|
|
|
648
|
+
function releaseRouteReachesKnownIssues(edges: readonly GraphEdgeSpec[], startAt: string): boolean {
|
|
649
|
+
const forbidden = new Set(['publish', 'approve-publish']);
|
|
650
|
+
const seen = new Set<string>();
|
|
651
|
+
let cursor: string | undefined = startAt;
|
|
652
|
+
while (cursor && cursor !== 'known-issues' && !seen.has(cursor)) {
|
|
653
|
+
if (forbidden.has(cursor)) return false;
|
|
654
|
+
seen.add(cursor);
|
|
655
|
+
const edge = edges.find((candidate) => candidate.from === cursor);
|
|
656
|
+
if (!edge) return false;
|
|
657
|
+
if (edge.branches) {
|
|
658
|
+
if (Object.values(edge.branches).flat().some((nodeId) => forbidden.has(nodeId))) return false;
|
|
659
|
+
cursor = edge.join;
|
|
660
|
+
} else {
|
|
661
|
+
cursor = nextNode(edges, cursor, 'ok', 'ok');
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return cursor === 'known-issues' && ![...seen].some((nodeId) => forbidden.has(nodeId));
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
function fanOutGraphSource(source: string, graph: GraphTemplateSpec, branchNode: string): string {
|
|
668
|
+
const document = parseYaml(source) as Record<string, unknown>;
|
|
669
|
+
const terminals = graph.terminalNodes;
|
|
670
|
+
const done = graph.unit ? terminals.find((terminal) => terminal === 'done')
|
|
671
|
+
: terminals.find((terminal) => topLevelTerminalStatus(graph.graphId, terminal) === 'done');
|
|
672
|
+
const failed = graph.unit ? terminals.find((terminal) => terminal === 'failed')
|
|
673
|
+
: terminals.find((terminal) => topLevelTerminalStatus(graph.graphId, terminal) === 'failed');
|
|
674
|
+
if (!done || !failed) throw new Error(`fan-out requires declared success and failure terminals: ${graph.graphId}`);
|
|
675
|
+
document.entry_node = branchNode;
|
|
676
|
+
document.edges = [{ from: branchNode, on: 'outcome', map: { ok: done, fail: failed, error: failed } }];
|
|
677
|
+
return stringifyYaml(document);
|
|
678
|
+
}
|
|
679
|
+
|
|
619
680
|
type ResolvedUnit = ResolvedGraphUnit;
|
|
620
681
|
export const resolveUnit = resolveGraphUnit;
|
|
621
682
|
|
|
@@ -657,6 +718,12 @@ function validateUnitCallsWithResolver(graph: GraphTemplateSpec, path: string, a
|
|
|
657
718
|
}
|
|
658
719
|
|
|
659
720
|
export async function runGraph(path: string, options: GraphRunOptions = {}): Promise<GraphRunState> {
|
|
721
|
+
const scopedContext = options.deps?.growthScope ?? graphGrowthScope.getStore();
|
|
722
|
+
const envGrowthScope = process.env[GRAPH_GROWTH_SCOPE_ENV];
|
|
723
|
+
// A separate Pod process cannot inherit AsyncLocalStorage. Only the explicit
|
|
724
|
+
// harness handoff is trusted from env; task-agent remains an in-process scope.
|
|
725
|
+
const growthScope = scopedContext ?? (envGrowthScope === 'harness' ? 'harness' : undefined);
|
|
726
|
+
const rejectedGrowthScopeEnv = scopedContext === undefined && envGrowthScope !== undefined && envGrowthScope !== 'harness';
|
|
660
727
|
if (options.resumeRunId && options.runId) throw new Error('runId and resumeRunId cannot be combined');
|
|
661
728
|
if (options.fromNodeId && !options.resumeRunId) throw new Error('--from requires --resume');
|
|
662
729
|
if (options.useCurrentGraph && !options.resumeRunId) throw new Error('--use-current-graph requires --resume');
|
|
@@ -720,7 +787,9 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
720
787
|
})),
|
|
721
788
|
edges: graph.edges.map((edge, index) => ({
|
|
722
789
|
...((document.edges as Record<string, unknown>[])[index] ?? {}), from: edge.from,
|
|
723
|
-
...(edge.to === undefined ? { on: edge.on,
|
|
790
|
+
...(edge.to === undefined ? { on: edge.on, ...(edge.map ? { map: edge.map } : {}),
|
|
791
|
+
...(edge.branches ? { branches: edge.branches, join: edge.join,
|
|
792
|
+
...(edge.warningBranches ? { warning_branches: edge.warningBranches } : {}) } : {}) } : { to: edge.to }),
|
|
724
793
|
...(edge.fallback ? { fallback: edge.fallback } : {}),
|
|
725
794
|
})),
|
|
726
795
|
}) : source;
|
|
@@ -819,17 +888,22 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
819
888
|
...(options.input === undefined ? {} : { input: options.input }),
|
|
820
889
|
...(options.unitContext?.entryNodeId === undefined ? {} : { entryNodeId: options.unitContext.entryNodeId }),
|
|
821
890
|
executed: 0, dryRun: options.dryRun === true, statePath };
|
|
891
|
+
const branchResume = options.fromNodeId ? Object.values(state.fanOuts ?? {}).flatMap((fanout) =>
|
|
892
|
+
fanout.branches[options.fromNodeId!] !== undefined ? [{ fanout, branchId: options.fromNodeId! }] : [])[0] : undefined;
|
|
893
|
+
if (branchResume) {
|
|
894
|
+
throw new Error(`--from cannot resume fan-out branch '${branchResume.branchId}'; resume from fan-out source '${branchResume.fanout.from}' instead`);
|
|
895
|
+
}
|
|
822
896
|
const verifyReleaseSource = (): string | undefined => {
|
|
823
897
|
const source = options.releaseCommandSource;
|
|
824
898
|
if (!source) return undefined;
|
|
825
|
-
const savedCutTip = lastJsonObject(state.nodes.find((node) => node.nodeId === 'version-release')?.output)?.commit;
|
|
826
|
-
if (graphId !== 'release-loop' || !options.resumeRunId || typeof savedCutTip !== 'string' || source.cutTip !== savedCutTip) {
|
|
899
|
+
const savedCutTip = lastJsonObject(state.nodes.find((node) => node.nodeId === 'version-release')?.output)?.commit ?? options.branchCutTip;
|
|
900
|
+
if (graphId !== 'release-loop' || (!options.resumeRunId && !options.branchCutTip) || typeof savedCutTip !== 'string' || source.cutTip !== savedCutTip) {
|
|
827
901
|
throw new Error('release command source differs from the saved cut tip');
|
|
828
902
|
}
|
|
829
903
|
const commandRoot = verifyReleaseCommandRoot(source.root, savedCutTip, source.git);
|
|
830
904
|
// The ledger snapshot must be the recipe that the cut checkout actually carries.
|
|
831
905
|
// HEAD alone does not bind a saved graph to that checkout.
|
|
832
|
-
verifyReleaseRecipeSnapshot(commandRoot, state.graphSnapshot);
|
|
906
|
+
verifyReleaseRecipeSnapshot(commandRoot, options.branchGraphSnapshot ?? state.graphSnapshot);
|
|
833
907
|
return commandRoot;
|
|
834
908
|
};
|
|
835
909
|
verifyReleaseSource();
|
|
@@ -862,8 +936,16 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
862
936
|
if (i > 0) {
|
|
863
937
|
const prior = state.nodes[i - 1]!;
|
|
864
938
|
const reported = lastJsonObject(prior.output)?.outcome;
|
|
865
|
-
const
|
|
866
|
-
|
|
939
|
+
const priorEdge = graph.edges.find((candidate) => candidate.from === prior.nodeId);
|
|
940
|
+
const exitOutcome = prior.ok ? 'ok' : 'fail';
|
|
941
|
+
const namedOutcome = typeof reported === 'string' ? reported : undefined;
|
|
942
|
+
const branchOutcome = priorEdge?.branches && namedOutcome && Object.hasOwn(priorEdge.branches, namedOutcome)
|
|
943
|
+
? namedOutcome : priorEdge?.branches && Object.hasOwn(priorEdge.branches, exitOutcome) ? exitOutcome : undefined;
|
|
944
|
+
const next = branchOutcome !== undefined && priorEdge?.join
|
|
945
|
+
? priorEdge.join : nextNode(graph.edges, prior.nodeId, exitOutcome, namedOutcome);
|
|
946
|
+
if (next !== recorded.nodeId) {
|
|
947
|
+
throw new Error(`saved run path does not follow graph edges: ${prior.nodeId} -> ${recorded.nodeId}, expected ${next ?? '<terminal>'}`);
|
|
948
|
+
}
|
|
867
949
|
} else if (recorded.nodeId !== unitEntryNode) throw new Error('saved run path does not start at entry node');
|
|
868
950
|
if (i < from && !recorded.ok) {
|
|
869
951
|
// A warning-only node explicitly sends every outcome to the same next
|
|
@@ -896,23 +978,15 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
896
978
|
const checked = releaseResumeWaiver(state, { from: options.fromNodeId, waive: options.releaseWaiver.nodeId, reason: options.releaseWaiver.reason, acceptedRegressions: options.releaseWaiver.requestedRegressions });
|
|
897
979
|
if (!checked || JSON.stringify(checked.acceptedRegressions) !== JSON.stringify(options.releaseWaiver.acceptedRegressions) ||
|
|
898
980
|
checked.unmeasured !== options.releaseWaiver.unmeasured) throw new Error('release waiver input changed before restart');
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
while (cursor && !route.has(cursor) && cursor !== 'known-issues') {
|
|
902
|
-
route.add(cursor);
|
|
903
|
-
cursor = nextNode(graph.edges, cursor, 'ok', 'ok');
|
|
981
|
+
if (!releaseRouteReachesKnownIssues(graph.edges, nextNode(graph.edges, options.fromNodeId, 'ok', 'ok') ?? '')) {
|
|
982
|
+
throw new Error('waived node must reach known-issues before publication');
|
|
904
983
|
}
|
|
905
|
-
if (cursor !== 'known-issues' || route.has('publish') || route.has('approve-publish')) throw new Error('waived node must reach known-issues before publication');
|
|
906
984
|
}
|
|
907
985
|
if (options.releaseAcceptedRegressions) {
|
|
908
986
|
if (graphId !== 'release-loop') throw new Error('accepted regressions require the release-loop graph');
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
while (cursor && !route.has(cursor) && cursor !== 'known-issues') {
|
|
912
|
-
route.add(cursor);
|
|
913
|
-
cursor = nextNode(graph.edges, cursor, 'ok', 'ok');
|
|
987
|
+
if (!releaseRouteReachesKnownIssues(graph.edges, options.fromNodeId)) {
|
|
988
|
+
throw new Error('accepted regressions must reach known-issues before publication');
|
|
914
989
|
}
|
|
915
|
-
if (cursor !== 'known-issues' || route.has('publish') || route.has('approve-publish')) throw new Error('accepted regressions must reach known-issues before publication');
|
|
916
990
|
const checked = releaseResumeAcceptedRegressions(state, options.releaseAcceptedRegressions.requested, options.fromNodeId);
|
|
917
991
|
if (JSON.stringify(checked) !== JSON.stringify(options.releaseAcceptedRegressions.acceptedRegressions)) throw new Error('accepted regressions changed before restart');
|
|
918
992
|
state.input = { ...(state.input as Record<string, unknown>), acceptedRegressions: checked };
|
|
@@ -1003,7 +1077,16 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1003
1077
|
graph = withGrowth(graph, [parked.growth]);
|
|
1004
1078
|
state.growth ??= [];
|
|
1005
1079
|
state.growth.push(parked.growth);
|
|
1080
|
+
state.growthEvents ??= [];
|
|
1081
|
+
state.growthEvents.push({ phase: 'applied', from: parked.from, outcome: parked.outcome, at: new Date().toISOString(),
|
|
1082
|
+
nodeId: parked.growth.node.nodeId, kind: parked.growth.node.kind });
|
|
1083
|
+
state.growthEvents.push({ phase: 'undo-available', from: parked.from, outcome: parked.outcome, at: new Date().toISOString(),
|
|
1084
|
+
nodeId: parked.growth.node.nodeId, undo: parked.growth.undo });
|
|
1006
1085
|
state.growthRejections!.pop();
|
|
1086
|
+
} else {
|
|
1087
|
+
state.growthEvents ??= [];
|
|
1088
|
+
state.growthEvents.push({ phase: 'rejected', from: parked.from, outcome: parked.outcome, at: new Date().toISOString(),
|
|
1089
|
+
nodeId: parked.growth.node.nodeId, kind: parked.growth.node.kind, reason: 'human rejected growth proposal' });
|
|
1007
1090
|
}
|
|
1008
1091
|
resumedGrowth = true;
|
|
1009
1092
|
delete state.pending;
|
|
@@ -1042,6 +1125,9 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1042
1125
|
const log = options.unitContext
|
|
1043
1126
|
? (event: string, data: Record<string, unknown>) => baseLog(event, { ...data, parentRunId: options.unitContext!.parentRunId })
|
|
1044
1127
|
: baseLog;
|
|
1128
|
+
if (rejectedGrowthScopeEnv && document.grow === 'on') {
|
|
1129
|
+
log('growth-scope-rejected', { graphId, runId, source: 'env', reason: 'not-allowlisted' });
|
|
1130
|
+
}
|
|
1045
1131
|
const visits = new Map<string, number>();
|
|
1046
1132
|
for (const nodeId of state.path) visits.set(nodeId, (visits.get(nodeId) ?? 0) + 1);
|
|
1047
1133
|
// GRAPH-UNIT-SPAN-DURATION: visit index per unit within this run, so enter/exit of
|
|
@@ -1051,6 +1137,9 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1051
1137
|
const unitVisits = new Map<string, number>(Object.entries(state.unitVisitSeq ?? {}));
|
|
1052
1138
|
const monotonicMs = options.deps?.monotonicMs ?? (() => performance.now());
|
|
1053
1139
|
let current: string | undefined = options.fromNodeId ?? state.pending?.nodeId ?? state.path.at(-1) ?? unitEntryNode;
|
|
1140
|
+
let growthScopeSkipLogged = false;
|
|
1141
|
+
let growthCapReachedLogged = state.growthRejections?.some((item) =>
|
|
1142
|
+
item.reason === 'growth proposal limit 8 reached' || item.reason === 'growth limit 3 reached') ?? false;
|
|
1054
1143
|
if (!options.resumeRunId) {
|
|
1055
1144
|
mkdirSync(dirname(statePath), { recursive: true });
|
|
1056
1145
|
if (readdirSync(dirname(statePath)).some((file) => file.startsWith(`${runId}.json.`) && file.endsWith('.decision.json'))) {
|
|
@@ -1131,17 +1220,25 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1131
1220
|
publishInsideEvent({ kind: 'node', graphId, runId, nodeId: current, phase: 'start' });
|
|
1132
1221
|
log('node-start', { graphId, runId, nodeId: current, visit: visits.get(current), dryRun: state.dryRun });
|
|
1133
1222
|
persist();
|
|
1134
|
-
|
|
1223
|
+
const joinedFanout = Object.values(state.fanOuts ?? {}).find((fanout) => fanout.join === current &&
|
|
1224
|
+
Object.values(fanout.branches).every((branch) => branch.status === 'done' || branch.status === 'failed'));
|
|
1225
|
+
const warningBranches = joinedFanout
|
|
1226
|
+
? graph.edges.find((edge) => edge.from === joinedFanout.from)?.warningBranches ?? [] : [];
|
|
1227
|
+
let ok = approval && !state.dryRun ? state.pending?.decision === 'approved' : joinedFanout
|
|
1228
|
+
? Object.entries(joinedFanout.branches).every(([branchId, branch]) => branch.status === 'done' || warningBranches.includes(branchId)) : true;
|
|
1135
1229
|
let exit: number | null = null;
|
|
1136
1230
|
let error: string | undefined;
|
|
1137
1231
|
let commandFailureReason: string | undefined;
|
|
1138
1232
|
let output: unknown;
|
|
1233
|
+
if (joinedFanout) output = JSON.stringify({ outcome: ok ? 'ok' : 'fail', branches: joinedFanout.branches });
|
|
1139
1234
|
const waiving = options.releaseWaiver?.nodeId === current && waivedRecord !== undefined;
|
|
1140
1235
|
const inProcessHandler = requireInProcessHandler(node.recipe, current, options.deps?.inProcessHandlers);
|
|
1141
1236
|
let handlerExecuted = false;
|
|
1142
1237
|
if (inProcessHandler && !waiving && !state.dryRun && !resumingCompleted) {
|
|
1143
|
-
const outputs: Record<string, unknown> = Object.create(null);
|
|
1238
|
+
const outputs: Record<string, unknown> = Object.assign(Object.create(null), options.branchParentOutputs ?? {});
|
|
1144
1239
|
for (const previous of state.nodes) outputs[previous.nodeId] = lastJsonObject(previous.output) ?? previous.output ?? null;
|
|
1240
|
+
for (const fanout of Object.values(state.fanOuts ?? {})) for (const [branchId, branch] of Object.entries(fanout.branches))
|
|
1241
|
+
if (branch.output !== undefined) outputs[branchId] = lastJsonObject(branch.output) ?? branch.output;
|
|
1145
1242
|
handlerExecuted = true;
|
|
1146
1243
|
debug.log('graph.run', 'handler-dispatch', { graphId, runId, nodeId: current, recipe: node.recipe });
|
|
1147
1244
|
try {
|
|
@@ -1163,9 +1260,11 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1163
1260
|
state.executed++;
|
|
1164
1261
|
}
|
|
1165
1262
|
if (command && !waiving && (!approval || state.dryRun || ok) && (!state.dryRun || command.dry_run_command) && !resumingCompleted) {
|
|
1166
|
-
const outputs: Record<string, unknown> = Object.create(null);
|
|
1263
|
+
const outputs: Record<string, unknown> = Object.assign(Object.create(null), options.branchParentOutputs ?? {});
|
|
1167
1264
|
// 구조 산출(마지막 JSON 줄)이 있으면 그것을, 없으면 원문을 준다 — 다음 노드가 판단을 «값»으로 받는다.
|
|
1168
1265
|
for (const previous of state.nodes) outputs[previous.nodeId] = lastJsonObject(previous.output) ?? previous.output ?? null;
|
|
1266
|
+
for (const fanout of Object.values(state.fanOuts ?? {})) for (const [branchId, branch] of Object.entries(fanout.branches))
|
|
1267
|
+
if (branch.output !== undefined) outputs[branchId] = lastJsonObject(branch.output) ?? branch.output;
|
|
1169
1268
|
const contextPath = join(`${statePath}.contexts`, `${state.path.length}.json`);
|
|
1170
1269
|
mkdirSync(dirname(contextPath), { recursive: true });
|
|
1171
1270
|
writeFileSync(contextPath, JSON.stringify({ graphId, runId, startedAt: state.startedAt, nodeId: current, input: state.input ?? null, outputs }, null, 2) + '\n');
|
|
@@ -1451,7 +1550,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1451
1550
|
delete state.pending;
|
|
1452
1551
|
delete state.approvalSourceHash;
|
|
1453
1552
|
}
|
|
1454
|
-
const reported: unknown = waiving || harnessLoopRoute || units.has(current) || handlerExecuted || (resumingCompleted && inProcessHandler) || (prompt && !state.dryRun) || (command && (!state.dryRun || command.dry_run_command)) ? lastJsonObject(resumingCompleted ? completed?.output : output)?.outcome : undefined;
|
|
1553
|
+
const reported: unknown = joinedFanout || waiving || harnessLoopRoute || units.has(current) || handlerExecuted || (resumingCompleted && inProcessHandler) || (prompt && !state.dryRun) || (command && (!state.dryRun || command.dry_run_command)) ? lastJsonObject(resumingCompleted ? completed?.output : output)?.outcome : undefined;
|
|
1455
1554
|
const namedOutcome: string | undefined = typeof reported === 'string' ? reported : undefined;
|
|
1456
1555
|
if (!options.quiet) console.error(`[graph] ${current} ${ok ? 'ok' : 'fail'} (${seconds.toFixed(2)}s)`);
|
|
1457
1556
|
const nodeFailure = state.nodes.at(-1)?.nodeId === current ? state.nodes.at(-1)?.failure : undefined;
|
|
@@ -1487,30 +1586,62 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1487
1586
|
}
|
|
1488
1587
|
const fromNodeId = current;
|
|
1489
1588
|
const edge = graph.edges.find((candidate) => candidate.from === current);
|
|
1490
|
-
if (!resumedGrowth && document.grow === 'on' && !state.dryRun && namedOutcome !== undefined &&
|
|
1589
|
+
if (!growthScope && !growthScopeSkipLogged && !resumedGrowth && document.grow === 'on' && !state.dryRun && namedOutcome !== undefined &&
|
|
1590
|
+
(state.growthAttempts ?? 0) < 8 && (state.growth?.length ?? 0) < 3 &&
|
|
1591
|
+
edge?.on === 'outcome' && edge.map && !Object.hasOwn(edge.map, namedOutcome) &&
|
|
1592
|
+
!state.growth?.some((item) => item.undo.removeOutcome.from === current && item.undo.removeOutcome.outcome === namedOutcome) &&
|
|
1593
|
+
!state.growthRejections?.some((item) => item.from === current && item.outcome === namedOutcome)) {
|
|
1594
|
+
growthScopeSkipLogged = true;
|
|
1595
|
+
log('growth-skipped-no-scope', { graphId, runId, from: current, outcome: namedOutcome });
|
|
1596
|
+
}
|
|
1597
|
+
if (growthScope && !growthCapReachedLogged && !resumedGrowth && document.grow === 'on' && !state.dryRun && namedOutcome !== undefined &&
|
|
1491
1598
|
edge?.on === 'outcome' && edge.map && !Object.hasOwn(edge.map, namedOutcome) &&
|
|
1492
1599
|
!state.growth?.some((item) => item.undo.removeOutcome.from === current && item.undo.removeOutcome.outcome === namedOutcome) &&
|
|
1493
1600
|
!state.growthRejections?.some((item) => item.from === current && item.outcome === namedOutcome)) {
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1601
|
+
state.growthEvents ??= [];
|
|
1602
|
+
let result: Awaited<ReturnType<typeof proposeGrowth>>;
|
|
1603
|
+
if ((state.growthAttempts ?? 0) >= 8) result = { ok: false, reason: 'growth proposal limit 8 reached' };
|
|
1604
|
+
else if ((state.growth?.length ?? 0) >= 3) result = { ok: false, reason: 'growth limit 3 reached' };
|
|
1605
|
+
else {
|
|
1606
|
+
const at = new Date().toISOString();
|
|
1607
|
+
const input = { graph, nodeId: current, outcome: namedOutcome, runId, output: state.nodes.at(-1)?.output };
|
|
1608
|
+
state.growthEvents.push({ phase: 'proposal', from: current, outcome: namedOutcome, at });
|
|
1609
|
+
state.growthAttempts = (state.growthAttempts ?? 0) + 1;
|
|
1610
|
+
persist();
|
|
1611
|
+
const allowedKinds = new Set(['agent', 'observe', 'judge']);
|
|
1612
|
+
const proposer = options.deps?.growthProposer ?? createLLMGrowthProposer(options.deps?.growthLLM);
|
|
1613
|
+
// Enforce the vocabulary at the runner boundary even when a caller injects a non-LLM proposer.
|
|
1614
|
+
const constrainedProposer: GrowthProposer = async (proposalInput) => {
|
|
1615
|
+
const proposal = await proposer(proposalInput);
|
|
1616
|
+
return proposal && allowedKinds.has(proposal.node.kind) ? proposal : undefined;
|
|
1617
|
+
};
|
|
1618
|
+
result = await proposeGrowth(input, constrainedProposer, (candidate) => {
|
|
1497
1619
|
const resolved = resolveNodeRecipe(candidate, recipes, catalogRoles);
|
|
1498
1620
|
if (!resolved.command && !resolved.approval && candidate.recipe !== 'none') return 'unknown';
|
|
1499
1621
|
return { effect: resolved.approval ? 'unknown' : options.deps?.classifyGrowthRecipe?.(candidate, { command: resolved.command?.command }) ?? 'unknown',
|
|
1500
1622
|
command: resolved.command, approval: resolved.approval?.approval };
|
|
1501
1623
|
}, { ...options.deps?.growthDecision, root }, options.researchEdgeDecisionRegistry);
|
|
1624
|
+
}
|
|
1502
1625
|
if (result.ok) {
|
|
1503
1626
|
graph = result.graph;
|
|
1504
1627
|
state.growth ??= [];
|
|
1505
1628
|
state.growth.push(result.growth);
|
|
1629
|
+
state.growthEvents.push({ phase: 'applied', from: current, outcome: namedOutcome, at: new Date().toISOString(),
|
|
1630
|
+
nodeId: result.growth.node.nodeId, kind: result.growth.node.kind });
|
|
1631
|
+
state.growthEvents.push({ phase: 'undo-available', from: current, outcome: namedOutcome, at: new Date().toISOString(),
|
|
1632
|
+
nodeId: result.growth.node.nodeId, undo: result.growth.undo });
|
|
1506
1633
|
persist();
|
|
1507
1634
|
log('edge-added', { graphId, runId, from: current, outcome: namedOutcome, to: result.growth.node.nodeId });
|
|
1508
1635
|
debug.log('graph.run', 'edge-added', { graphId, runId, from: current, outcome: namedOutcome, to: result.growth.node.nodeId });
|
|
1509
1636
|
publishInsideEvent({ kind: 'edge-added', graphId, runId, from: current, outcome: namedOutcome, to: result.growth.node.nodeId });
|
|
1510
1637
|
} else {
|
|
1511
1638
|
state.growthRejections ??= [];
|
|
1639
|
+
const capped = result.reason === 'growth proposal limit 8 reached' || result.reason === 'growth limit 3 reached';
|
|
1640
|
+
if (capped) growthCapReachedLogged = true;
|
|
1512
1641
|
state.growthRejections.push({ from: current, outcome: namedOutcome, reason: result.reason });
|
|
1513
1642
|
if (result.park && result.growth && result.decisionId && result.decisionRef) {
|
|
1643
|
+
state.growthEvents.push({ phase: 'parked', from: current, outcome: namedOutcome, at: new Date().toISOString(), reason: result.reason,
|
|
1644
|
+
nodeId: result.growth.node.nodeId, kind: result.growth.node.kind, undo: result.growth.undo });
|
|
1514
1645
|
state.status = 'awaiting-approval';
|
|
1515
1646
|
state.pending = { nodeId: current, message: result.reason, since: new Date().toISOString() };
|
|
1516
1647
|
state.growthPark = { from: current, outcome: namedOutcome, reason: result.reason,
|
|
@@ -1519,12 +1650,66 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1519
1650
|
persist();
|
|
1520
1651
|
break;
|
|
1521
1652
|
}
|
|
1653
|
+
state.growthEvents.push({ phase: 'rejected', from: current, outcome: namedOutcome, at: new Date().toISOString(), reason: result.reason,
|
|
1654
|
+
...(result.growth ? { nodeId: result.growth.node.nodeId, kind: result.growth.node.kind, undo: result.growth.undo } : {}) });
|
|
1522
1655
|
}
|
|
1523
1656
|
persist();
|
|
1524
1657
|
}
|
|
1525
1658
|
// A planned harness loop follows its route directly: `changed-files` edges have no runner condition.
|
|
1526
|
-
|
|
1527
|
-
|
|
1659
|
+
const edgeOutcome: 'ok' | 'fail' = state.dryRun && !command?.dry_run_command ? 'ok' : ok ? 'ok' : 'fail';
|
|
1660
|
+
const outgoing = graph.edges.find((candidate) => candidate.from === current);
|
|
1661
|
+
const branchOutcome: string | undefined = namedOutcome !== undefined && outgoing?.branches && Object.hasOwn(outgoing.branches, namedOutcome)
|
|
1662
|
+
? namedOutcome : outgoing?.branches && Object.hasOwn(outgoing.branches, edgeOutcome) ? edgeOutcome : undefined;
|
|
1663
|
+
if (!plannedStep && outgoing?.branches && branchOutcome !== undefined && outgoing.join) {
|
|
1664
|
+
const destinations = outgoing.branches[branchOutcome]!;
|
|
1665
|
+
const fanOutKey: string = `${current}:${branchOutcome}`;
|
|
1666
|
+
const fanout: NonNullable<GraphRunState['fanOuts']>[string] = state.fanOuts?.[fanOutKey] ?? { from: current, join: outgoing.join, branches: {} };
|
|
1667
|
+
if (fanout.join !== outgoing.join) throw new Error(`fan-out state conflicts with graph: ${fanOutKey}`);
|
|
1668
|
+
const runningBranch = destinations.find((id) => fanout.branches[id]?.status === 'running');
|
|
1669
|
+
if (runningBranch) throw new Error(`fan-out branch ${runningBranch} is still marked running; crashed-child recovery is not supported`);
|
|
1670
|
+
state.fanOuts ??= {};
|
|
1671
|
+
state.fanOuts[fanOutKey] = fanout;
|
|
1672
|
+
const selected = destinations.filter((branchId) => fanout.branches[branchId]?.status !== 'done');
|
|
1673
|
+
const launches = selected.map((branchId) => {
|
|
1674
|
+
const runId = randomUUID();
|
|
1675
|
+
fanout.branches[branchId] = { runId, status: 'running', startedAt: new Date().toISOString() };
|
|
1676
|
+
return { branchId, runId };
|
|
1677
|
+
});
|
|
1678
|
+
persist();
|
|
1679
|
+
await Promise.all(launches.map(async ({ branchId, runId }) => {
|
|
1680
|
+
const branch = fanout.branches[branchId]!;
|
|
1681
|
+
try {
|
|
1682
|
+
const child = await runGraph(path, { runId, graphSource: fanOutGraphSource(variantSource, graph, branchId), input: state.input,
|
|
1683
|
+
dryRun: state.dryRun, quiet: true, signal: options.signal, pinChildUniverse: options.pinChildUniverse,
|
|
1684
|
+
releaseCommandSource: options.releaseCommandSource,
|
|
1685
|
+
branchCutTip: lastJsonObject(state.nodes.find((record) => record.nodeId === 'version-release')?.output)?.commit as string | undefined,
|
|
1686
|
+
branchGraphSnapshot: state.graphSnapshot,
|
|
1687
|
+
branchParentOutputs: Object.fromEntries(state.nodes.map((record) => [record.nodeId, lastJsonObject(record.output) ?? record.output ?? null])),
|
|
1688
|
+
researchEdgeDecisionRegistry: options.researchEdgeDecisionRegistry,
|
|
1689
|
+
deps: options.deps });
|
|
1690
|
+
const record = child.nodes.find((item) => item.nodeId === branchId);
|
|
1691
|
+
if (state.dryRun) branch.path = child.path;
|
|
1692
|
+
branch.status = child.status === 'done' && record?.ok ? 'done' : 'failed';
|
|
1693
|
+
if (record?.output !== undefined) {
|
|
1694
|
+
branch.output = record.output;
|
|
1695
|
+
branch.artifactSha256 = createHash('sha256').update(typeof record.output === 'string' ? record.output : JSON.stringify(record.output)).digest('hex');
|
|
1696
|
+
}
|
|
1697
|
+
if (record?.error) branch.error = record.error;
|
|
1698
|
+
else if (child.status !== 'done') branch.error = `branch child run ended ${child.status}`;
|
|
1699
|
+
} catch (cause) {
|
|
1700
|
+
branch.status = 'failed';
|
|
1701
|
+
branch.error = cause instanceof Error ? cause.message : String(cause);
|
|
1702
|
+
}
|
|
1703
|
+
branch.endedAt = new Date().toISOString();
|
|
1704
|
+
persist();
|
|
1705
|
+
return branchId;
|
|
1706
|
+
}));
|
|
1707
|
+
persist();
|
|
1708
|
+
current = outgoing.join;
|
|
1709
|
+
} else {
|
|
1710
|
+
current = plannedStep ? plannedStep.to
|
|
1711
|
+
: nextNode(graph.edges, current, edgeOutcome, namedOutcome);
|
|
1712
|
+
}
|
|
1528
1713
|
resumedGrowth = false;
|
|
1529
1714
|
if (current !== undefined) publishInsideEvent({ kind: 'edge', graphId, runId, from: fromNodeId, to: current });
|
|
1530
1715
|
if (current === undefined) {
|
|
@@ -1535,6 +1720,17 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1535
1720
|
}
|
|
1536
1721
|
}
|
|
1537
1722
|
}
|
|
1723
|
+
if (state.dryRun && Object.keys(state.fanOuts ?? {}).length > 0) {
|
|
1724
|
+
const fanoutsBySource = new Map<string, NonNullable<GraphRunState['fanOuts']>[string][]>();
|
|
1725
|
+
for (const fanout of Object.values(state.fanOuts!)) {
|
|
1726
|
+
const group = fanoutsBySource.get(fanout.from) ?? [];
|
|
1727
|
+
group.push(fanout);
|
|
1728
|
+
fanoutsBySource.set(fanout.from, group);
|
|
1729
|
+
}
|
|
1730
|
+
state.plannedPath = state.path.flatMap((nodeId) => [nodeId, ...(fanoutsBySource.get(nodeId) ?? []).flatMap((fanout) =>
|
|
1731
|
+
Object.values(fanout.branches).flatMap((branch) => (branch.path ?? []).filter((branchNode) => !graph.terminalNodes.includes(branchNode))))]);
|
|
1732
|
+
persist();
|
|
1733
|
+
}
|
|
1538
1734
|
return state;
|
|
1539
1735
|
} finally {
|
|
1540
1736
|
if (options.resumeRunId && existsSync(resumeLock)) rmdirSync(resumeLock);
|
|
@@ -69,6 +69,7 @@ import { intakeTakesQueue, readJourneyEdge, recordJourneyEdge } from '../self-de
|
|
|
69
69
|
import { appendBenchLedger, BENCH_LOG_CATEGORY, benchBaseBranch, defaultBenchGitRun, ensureBenchBase, nextBenchRound, parseBenchSpec, readBenchLedger, type BenchBase, type BenchGitRun } from '../bench/bench.js';
|
|
70
70
|
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
71
71
|
import { codeRevision } from '../version/code-revision.js';
|
|
72
|
+
import { withGraphGrowthScope } from '../graph-runner/runner.js';
|
|
72
73
|
|
|
73
74
|
let harnessPlanRfcForTesting: typeof runHarnessPlanRfc | undefined;
|
|
74
75
|
let harnessAskMarkerInspectorForTesting: ((ask: string) => readonly string[]) | undefined;
|
|
@@ -4003,7 +4004,8 @@ export function installHarnessCliCommand(program: Command, deps: HarnessCliComma
|
|
|
4003
4004
|
process.exitCode = 2;
|
|
4004
4005
|
return Promise.resolve();
|
|
4005
4006
|
}
|
|
4006
|
-
return resolved.substrate === 'pod' ? onPod(stampedOpts, 'cli-harness-ask', goalPath, resolved.pool!, deps.podDispatchTask)
|
|
4007
|
+
return resolved.substrate === 'pod' ? onPod(stampedOpts, 'cli-harness-ask', goalPath, resolved.pool!, deps.podDispatchTask)
|
|
4008
|
+
: withGraphGrowthScope('harness', () => { announceLocalChildProvider(stampedOpts); return ask(goalPath, normalizeHarnessAskSayOptions(stampedOpts)); });
|
|
4007
4009
|
},
|
|
4008
4010
|
deps.launchGate, queueDeps, immediateLaunch, queueDeps.launch ? undefined : immediateExit, deps.bench,
|
|
4009
4011
|
);
|
|
@@ -4049,7 +4051,7 @@ export function installHarnessCliCommand(program: Command, deps: HarnessCliComma
|
|
|
4049
4051
|
}
|
|
4050
4052
|
return resolved.substrate === 'pod'
|
|
4051
4053
|
? onPod(stampedOpts, 'cli-harness-say', sentence.join(' '), resolved.pool!, deps.podDispatchTask, !(opts as HarnessSubstrateOpts).repairCommitOnly && harnessAuthorOnPod())
|
|
4052
|
-
: (announceLocalChildProvider(stampedOpts)
|
|
4054
|
+
: withGraphGrowthScope('harness', () => { announceLocalChildProvider(stampedOpts); return say(sentence, normalizeHarnessAskSayOptions(stampedOpts)); });
|
|
4053
4055
|
},
|
|
4054
4056
|
deps.launchGate, queueDeps, immediateLaunch, queueDeps.launch ? undefined : immediateExit, deps.bench,
|
|
4055
4057
|
);
|
|
@@ -173,6 +173,9 @@ export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDi
|
|
|
173
173
|
return 2;
|
|
174
174
|
}
|
|
175
175
|
const env = { ...process.env, ...oldDoorInternalEnv('self-orchestrate') };
|
|
176
|
+
// harness ask/say is the only Pod entry admitted to implicit graph growth.
|
|
177
|
+
// Replace inherited values so callers cannot smuggle another scope through.
|
|
178
|
+
env.ELANOUS_GRAPH_GROWTH_SCOPE = 'harness';
|
|
176
179
|
// POD-OBS(10-06): 자식 orchestrate 는 트리 파생 우주에서 돈다 — Pod 원장 재방출을 «발사한 집»의 logs.db 에도 남기게 경로를 넘긴다.
|
|
177
180
|
env[POD_REEMIT_LOGS_DB_ENV] = logsDbPath();
|
|
178
181
|
let tempDir: string | undefined;
|
package/src/index.ts
CHANGED
|
@@ -5515,10 +5515,10 @@ const selfOrchestrateCmd = selfCmd
|
|
|
5515
5515
|
const quotaPolicy = resolvedQuota.policy;
|
|
5516
5516
|
const { normalizeFallbackChain } = await import('./oauth/fallback-chain.js');
|
|
5517
5517
|
const fallbackEnabled = codexPolicyAllowsFallback(quotaPolicy)
|
|
5518
|
-
&& normalizeFallbackChain(launchPolicy.llm?.fallbackChain).chain.includes('grok');
|
|
5518
|
+
&& normalizeFallbackChain(launchPolicy.llm?.fallbackChain, launchPolicy.llm?.provider).chain.includes('grok');
|
|
5519
5519
|
// CODEX-CREDITS-STEP — 체인 마지막 칸(크레딧). 켜져 있을 때만 grok 잔량을 잰다(발사 관문과 같은 80% 상한).
|
|
5520
5520
|
// Pod 는 «grok 뒤» 순서(문서화된 배치)만 따른다 — grok 앞에 둔 체인은 Pod 계획에서 크레딧 칸을 쓰지 않는다.
|
|
5521
|
-
const launchChain = normalizeFallbackChain(launchPolicy.llm?.fallbackChain).chain;
|
|
5521
|
+
const launchChain = normalizeFallbackChain(launchPolicy.llm?.fallbackChain, launchPolicy.llm?.provider).chain;
|
|
5522
5522
|
const codexCreditsStep = codexPolicyAllowsFallback(quotaPolicy)
|
|
5523
5523
|
&& launchChain.includes('codex-credits')
|
|
5524
5524
|
&& (!launchChain.includes('grok') || launchChain.indexOf('codex-credits') > launchChain.indexOf('grok'));
|