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
|
@@ -43,6 +43,157 @@ export interface OverlayParseResult {
|
|
|
43
43
|
readonly errors: readonly GraphParseIssue[];
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/** Injected ARG promotion evidence used by the graph-promote rehearsal.
|
|
47
|
+
* This input is deliberately separate from the production run ledger: a fixture
|
|
48
|
+
* can exercise the decision path, but its output is always labelled mock-only. */
|
|
49
|
+
export interface ArgPromotionEvidenceEvent {
|
|
50
|
+
readonly runId: string;
|
|
51
|
+
readonly timestamp: string;
|
|
52
|
+
readonly trigger: string;
|
|
53
|
+
readonly phase: 'adaptation' | 'baseline' | 'shadow';
|
|
54
|
+
readonly landed?: boolean;
|
|
55
|
+
readonly shadowAccepted?: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface ArgPromotionCandidate {
|
|
59
|
+
readonly overlayId: string;
|
|
60
|
+
readonly target: string;
|
|
61
|
+
readonly appliesWhen: string;
|
|
62
|
+
readonly patch: readonly OverlayPatchOp[];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface ArgPromotionEvaluation {
|
|
66
|
+
readonly mockOnly: true;
|
|
67
|
+
readonly verdict: 'eligible-for-human-pr' | 'held';
|
|
68
|
+
readonly blockers: readonly string[];
|
|
69
|
+
readonly metrics: {
|
|
70
|
+
readonly trigger: string;
|
|
71
|
+
readonly adaptationRuns: number;
|
|
72
|
+
readonly adaptationLandingRate: number | null;
|
|
73
|
+
readonly baselineRuns: number;
|
|
74
|
+
readonly baselineLandingRate: number | null;
|
|
75
|
+
readonly landingDelta: number | null;
|
|
76
|
+
readonly adaptationWindowDays: number | null;
|
|
77
|
+
readonly shadowObservations: number;
|
|
78
|
+
readonly shadowWindowDays: number | null;
|
|
79
|
+
};
|
|
80
|
+
readonly proposal?: {
|
|
81
|
+
readonly action: 'proposal-only';
|
|
82
|
+
readonly promoted_from: readonly string[];
|
|
83
|
+
readonly evidence: Readonly<Record<string, unknown>>;
|
|
84
|
+
readonly overlay: {
|
|
85
|
+
readonly overlay_id: string;
|
|
86
|
+
readonly target: string;
|
|
87
|
+
readonly stage: 'launch';
|
|
88
|
+
readonly applies_when: string;
|
|
89
|
+
readonly patch: readonly OverlayPatchOp[];
|
|
90
|
+
};
|
|
91
|
+
readonly rollback: 'open a human-reviewed demotion PR if the 7-day landing rate declines';
|
|
92
|
+
readonly patentReview: 'ELA-53 human review pending';
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const PROMOTION_DAY_MS = 24 * 60 * 60 * 1000;
|
|
97
|
+
|
|
98
|
+
function promotionSpanDays(events: readonly ArgPromotionEvidenceEvent[]): number | null {
|
|
99
|
+
if (events.length < 2) return null;
|
|
100
|
+
const times = events.map((event) => Date.parse(event.timestamp));
|
|
101
|
+
if (times.some((time) => !Number.isFinite(time))) return null;
|
|
102
|
+
return (Math.max(...times) - Math.min(...times)) / PROMOTION_DAY_MS;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Evaluate injected evidence without reading a production ledger, writing an overlay, or opening a PR. */
|
|
106
|
+
export function evaluateArgPromotionFixture(input: {
|
|
107
|
+
readonly trigger: string;
|
|
108
|
+
readonly candidate: ArgPromotionCandidate;
|
|
109
|
+
readonly events: readonly ArgPromotionEvidenceEvent[];
|
|
110
|
+
}): ArgPromotionEvaluation {
|
|
111
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new Error('ARG promotion fixture root must be an object');
|
|
112
|
+
const { trigger, candidate, events } = input;
|
|
113
|
+
if (typeof trigger !== 'string' || typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)
|
|
114
|
+
|| typeof candidate.overlayId !== 'string' || typeof candidate.target !== 'string' || typeof candidate.appliesWhen !== 'string'
|
|
115
|
+
|| !Array.isArray(candidate.patch) || !Array.isArray(events)) {
|
|
116
|
+
throw new Error('ARG promotion fixture requires trigger, candidate object, patch array and events array');
|
|
117
|
+
}
|
|
118
|
+
if (!trigger.trim() || !candidate.overlayId.trim() || !candidate.target.trim() || !candidate.appliesWhen.trim()) {
|
|
119
|
+
throw new Error('ARG promotion fixture requires trigger, overlayId, target and appliesWhen');
|
|
120
|
+
}
|
|
121
|
+
if (candidate.patch.length === 0) throw new Error('ARG promotion candidate patch must not be empty');
|
|
122
|
+
for (const operation of candidate.patch) {
|
|
123
|
+
if (operation === null || typeof operation !== 'object' || !['add', 'replace', 'remove'].includes(operation.op)
|
|
124
|
+
|| typeof operation.path !== 'string' || !operation.path.startsWith('/')
|
|
125
|
+
|| (operation.op !== 'remove' && !('value' in operation))) {
|
|
126
|
+
throw new Error('ARG promotion candidate contains an invalid JSON Patch operation');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const runIds = new Set<string>();
|
|
130
|
+
for (const rawEvent of events) {
|
|
131
|
+
if (rawEvent === null || typeof rawEvent !== 'object' || Array.isArray(rawEvent)) throw new Error('ARG promotion fixture contains a non-object event');
|
|
132
|
+
const event = rawEvent as ArgPromotionEvidenceEvent;
|
|
133
|
+
if (typeof event.runId !== 'string' || !event.runId.trim() || typeof event.timestamp !== 'string'
|
|
134
|
+
|| !Number.isFinite(Date.parse(event.timestamp)) || typeof event.trigger !== 'string' || !event.trigger.trim()
|
|
135
|
+
|| !['adaptation', 'baseline', 'shadow'].includes(event.phase)) {
|
|
136
|
+
throw new Error('ARG promotion fixture contains an invalid event');
|
|
137
|
+
}
|
|
138
|
+
if (runIds.has(event.runId)) throw new Error(`ARG promotion fixture repeats runId ${event.runId}`);
|
|
139
|
+
runIds.add(event.runId);
|
|
140
|
+
if ((event.phase === 'adaptation' || event.phase === 'baseline') && typeof event.landed !== 'boolean') {
|
|
141
|
+
throw new Error(`ARG promotion ${event.phase} event requires landed`);
|
|
142
|
+
}
|
|
143
|
+
if (event.phase === 'shadow' && typeof event.shadowAccepted !== 'boolean') {
|
|
144
|
+
throw new Error('ARG promotion shadow event requires shadowAccepted');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const matching = events.filter((event) => event.trigger === trigger);
|
|
149
|
+
const adaptations = matching.filter((event) => event.phase === 'adaptation');
|
|
150
|
+
const baseline = matching.filter((event) => event.phase === 'baseline');
|
|
151
|
+
const shadow = matching.filter((event) => event.phase === 'shadow');
|
|
152
|
+
const rate = (rows: readonly ArgPromotionEvidenceEvent[]): number | null => rows.length === 0
|
|
153
|
+
? null : rows.filter((event) => event.landed === true).length / rows.length;
|
|
154
|
+
const adaptationLandingRate = rate(adaptations);
|
|
155
|
+
const baselineLandingRate = rate(baseline);
|
|
156
|
+
const landingDelta = adaptationLandingRate === null || baselineLandingRate === null
|
|
157
|
+
? null : adaptationLandingRate - baselineLandingRate;
|
|
158
|
+
const adaptationSpanDays = promotionSpanDays(adaptations);
|
|
159
|
+
const baselineSpanDays = promotionSpanDays(baseline);
|
|
160
|
+
const adaptationWindowDays = adaptationSpanDays === null || baselineSpanDays === null
|
|
161
|
+
? null : Math.min(adaptationSpanDays, baselineSpanDays);
|
|
162
|
+
const shadowWindowDays = promotionSpanDays(shadow);
|
|
163
|
+
const evidenceEnd = Math.max(...[...adaptations, ...baseline].map((event) => Date.parse(event.timestamp)));
|
|
164
|
+
const shadowStart = Math.min(...shadow.map((event) => Date.parse(event.timestamp)));
|
|
165
|
+
const blockers: string[] = [];
|
|
166
|
+
if (adaptations.length < 5) blockers.push('same-trigger-adaptations-below-5');
|
|
167
|
+
if (baseline.length === 0) blockers.push('same-trigger-baseline-missing');
|
|
168
|
+
if (landingDelta === null || landingDelta < 0.2 - Number.EPSILON) blockers.push('landing-improvement-below-20pp');
|
|
169
|
+
if (adaptationWindowDays === null || adaptationWindowDays < 7) blockers.push('adaptation-evidence-window-under-7-days');
|
|
170
|
+
if (shadow.length < 2 || shadowWindowDays === null || shadowWindowDays < 7) blockers.push('shadow-window-under-7-days');
|
|
171
|
+
if (!Number.isFinite(evidenceEnd) || !Number.isFinite(shadowStart) || shadowStart < evidenceEnd) blockers.push('shadow-starts-before-evidence-window');
|
|
172
|
+
if (shadow.some((event) => event.shadowAccepted !== true)) blockers.push('shadow-evaluation-declined');
|
|
173
|
+
|
|
174
|
+
const metrics = { trigger, adaptationRuns: adaptations.length, adaptationLandingRate,
|
|
175
|
+
baselineRuns: baseline.length, baselineLandingRate, landingDelta, adaptationWindowDays,
|
|
176
|
+
shadowObservations: shadow.length, shadowWindowDays };
|
|
177
|
+
if (blockers.length > 0) return { mockOnly: true, verdict: 'held', blockers, metrics };
|
|
178
|
+
const promotedFrom = adaptations.map((event) => event.runId).sort();
|
|
179
|
+
return {
|
|
180
|
+
mockOnly: true, verdict: 'eligible-for-human-pr', blockers, metrics,
|
|
181
|
+
proposal: {
|
|
182
|
+
action: 'proposal-only', promoted_from: promotedFrom,
|
|
183
|
+
evidence: {
|
|
184
|
+
source: 'injected-mock-fixture', trigger, adaptationRuns: promotedFrom,
|
|
185
|
+
baselineRuns: baseline.map((event) => event.runId).sort(),
|
|
186
|
+
adaptationLandingRate, baselineLandingRate, landingDelta,
|
|
187
|
+
adaptationWindowDays, shadowRunIds: shadow.map((event) => event.runId).sort(), shadowWindowDays,
|
|
188
|
+
},
|
|
189
|
+
overlay: { overlay_id: candidate.overlayId, target: candidate.target, stage: 'launch',
|
|
190
|
+
applies_when: candidate.appliesWhen, patch: candidate.patch },
|
|
191
|
+
rollback: 'open a human-reviewed demotion PR if the 7-day landing rate declines',
|
|
192
|
+
patentReview: 'ELA-53 human review pending',
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
46
197
|
const STAGES = new Set<OverlayStage>(['launch', 'runtime', 'heal']);
|
|
47
198
|
const OPS = new Set(['add', 'replace', 'remove']);
|
|
48
199
|
|
|
@@ -50,6 +50,11 @@ export interface GraphEdgeSpec {
|
|
|
50
50
|
/** 조건부 엣지 — 라우터가 읽는 «상태 키». ⛔ 값은 코드가 낸다(RFC §4.3 ⑵). */
|
|
51
51
|
readonly on?: string;
|
|
52
52
|
readonly map?: Readonly<Record<string, string>>;
|
|
53
|
+
/** Explicit fan-out destinations keyed by outcome. Each selected branch runs concurrently and joins at `join`. */
|
|
54
|
+
readonly branches?: Readonly<Record<string, readonly string[]>>;
|
|
55
|
+
readonly join?: string;
|
|
56
|
+
/** Failed warning branches remain visible in the join output but do not fail the barrier. */
|
|
57
|
+
readonly warningBranches?: readonly string[];
|
|
53
58
|
/** 심이 «주입 안 됐을 때» 내려가는 순서. `requires` 는 그 심 이름들. */
|
|
54
59
|
readonly fallback?: readonly { readonly node: string; readonly requires: readonly string[]; readonly observed?: number }[];
|
|
55
60
|
readonly observed?: number;
|
|
@@ -273,14 +278,19 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
273
278
|
if (!known.has(from)) { errors.push({ path: `${at}/from`, message: `'${from}' 은 선언된 노드가 아니다` }); continue; }
|
|
274
279
|
const hasTo = typeof e.to === 'string';
|
|
275
280
|
const hasMap = e.map !== null && typeof e.map === 'object';
|
|
281
|
+
const hasBranches = e.branches !== null && typeof e.branches === 'object' && !Array.isArray(e.branches);
|
|
276
282
|
if (e.when !== undefined && (typeof e.when !== 'string' || !parseOverlayCondition(e.when).ok))
|
|
277
283
|
errors.push({ path: `${at}/when`, message: 'when 은 오버레이 조건 한 개(key op literal)여야 한다' });
|
|
278
284
|
if (e.when !== undefined && (L1_PROTECTED_ROUTE_NODES.has(from) || nodes.some(node => node.nodeId === from && node.kind === 'gate') || terminalNodes.includes(from)))
|
|
279
285
|
errors.push({ path: `${at}/when`, message: `'${from}' 의 필수 검증·착지 결과는 when 간선으로 덮을 수 없다` });
|
|
280
286
|
if (e.when !== undefined && (!hasTo || hasMap || e.on !== undefined))
|
|
281
287
|
errors.push({ path: `${at}/when`, message: 'when 은 to 간선에서만 쓴다' });
|
|
282
|
-
if (hasTo
|
|
283
|
-
errors.push({ path: at, message: 'to
|
|
288
|
+
if (!hasTo && !hasMap && !hasBranches) {
|
|
289
|
+
errors.push({ path: at, message: 'to 또는 map/branches 조합을 써야 한다' });
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (hasTo && (hasMap || hasBranches)) {
|
|
293
|
+
errors.push({ path: at, message: 'to 는 map·branches 와 함께 쓸 수 없다' });
|
|
284
294
|
continue;
|
|
285
295
|
}
|
|
286
296
|
const map: Record<string, string> = {};
|
|
@@ -292,6 +302,35 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
292
302
|
}
|
|
293
303
|
if (typeof e.on !== 'string') errors.push({ path: `${at}/on`, message: 'map 을 쓰면 on(라우터가 읽는 상태 키)이 필요하다' });
|
|
294
304
|
}
|
|
305
|
+
let branches: Record<string, readonly string[]> | undefined;
|
|
306
|
+
let warningBranches: readonly string[] | undefined;
|
|
307
|
+
if (hasBranches) {
|
|
308
|
+
branches = {};
|
|
309
|
+
for (const [outcome, destinations] of Object.entries(e.branches as Record<string, unknown>)) {
|
|
310
|
+
if (!Array.isArray(destinations) || destinations.length < 2 || !destinations.every((value) => typeof value === 'string')) {
|
|
311
|
+
errors.push({ path: `${at}/branches/${outcome}`, message: 'branches 목적지는 두 개 이상의 노드 id 목록이어야 한다' });
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (new Set(destinations).size !== destinations.length)
|
|
315
|
+
errors.push({ path: `${at}/branches/${outcome}`, message: 'branches 목적지는 중복될 수 없다' });
|
|
316
|
+
for (const [index, destination] of destinations.entries()) {
|
|
317
|
+
if (!known.has(destination)) errors.push({ path: `${at}/branches/${outcome}/${index}`, message: `'${destination}' 는 선언된 노드가 아니다` });
|
|
318
|
+
}
|
|
319
|
+
branches[outcome] = destinations as string[];
|
|
320
|
+
}
|
|
321
|
+
if (typeof e.on !== 'string' || typeof e.join !== 'string' || !known.has(e.join))
|
|
322
|
+
errors.push({ path: at, message: 'branches 에는 on 과 선언된 join 노드가 필요하다' });
|
|
323
|
+
if (e.fallback !== undefined || e.when !== undefined) errors.push({ path: at, message: 'branches 는 fallback·when 과 함께 쓸 수 없다' });
|
|
324
|
+
if (hasMap && Object.keys(map).some((outcome) => Object.hasOwn(e.branches as object, outcome)))
|
|
325
|
+
errors.push({ path: `${at}/branches`, message: 'map 과 branches 의 outcome 키는 겹칠 수 없다' });
|
|
326
|
+
if (e.warning_branches !== undefined) {
|
|
327
|
+
if (!Array.isArray(e.warning_branches) || e.warning_branches.some((branch) => typeof branch !== 'string' || !branch.trim()) ||
|
|
328
|
+
new Set(e.warning_branches).size !== e.warning_branches.length ||
|
|
329
|
+
e.warning_branches.some((branch) => !Object.values(branches!).some((destinations) => destinations.includes(branch as string)))) {
|
|
330
|
+
errors.push({ path: `${at}/warning_branches`, message: 'warning_branches 는 중복 없는 branches 목적지 목록이어야 한다' });
|
|
331
|
+
} else warningBranches = e.warning_branches as string[];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
295
334
|
if (hasTo && !known.has(e.to as string)) { errors.push({ path: `${at}/to`, message: `'${String(e.to)}' 는 선언된 노드가 아니다` }); continue; }
|
|
296
335
|
|
|
297
336
|
const fallback = asArray(e.fallback).flatMap((f, fi) => {
|
|
@@ -309,6 +348,7 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
309
348
|
from,
|
|
310
349
|
...(hasTo ? { to: e.to as string } : {}),
|
|
311
350
|
...(hasMap ? { on: String(e.on), map } : {}),
|
|
351
|
+
...(branches ? { on: String(e.on), branches, join: String(e.join), ...(warningBranches ? { warningBranches } : {}) } : {}),
|
|
312
352
|
...(fallback.length > 0 ? { fallback } : {}),
|
|
313
353
|
...(typeof e.observed === 'number' ? { observed: e.observed } : {}),
|
|
314
354
|
...(typeof e.when === 'string' ? { when: e.when } : {}),
|
|
@@ -326,6 +366,25 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
326
366
|
if (!edges.some(candidate => candidate.from === edge.from && candidate.when === undefined))
|
|
327
367
|
errors.push({ path: `${label}/edges/${edge.from}/when`, message: 'when 간선에는 모호·미관측 때 탈 무조건 기본 간선이 필요하다' });
|
|
328
368
|
}
|
|
369
|
+
const fanOutDestinations = new Map<string, string>();
|
|
370
|
+
const fanOutJoins = new Map<string, string>();
|
|
371
|
+
for (const edge of edges) {
|
|
372
|
+
if (!edge.branches || !edge.join) continue;
|
|
373
|
+
const sourceNode = nodes.find(node => node.nodeId === edge.from);
|
|
374
|
+
if (sourceNode && sourceNode.maxVisits !== 1) errors.push({ path: `${label}/edges/${edge.from}/branches`, message: 'fan-out 출발 노드는 재방문할 수 없어 max_visits: 1 이어야 한다' });
|
|
375
|
+
if (fanOutJoins.has(edge.join) && fanOutJoins.get(edge.join) !== edge.from) errors.push({ path: `${label}/edges/${edge.from}/join`, message: 'join 노드는 하나의 fan-out barrier만 소유할 수 있다' });
|
|
376
|
+
fanOutJoins.set(edge.join, edge.from);
|
|
377
|
+
if (edge.join === edge.from || Object.values(edge.branches).some((branches) => branches.includes(edge.join!)))
|
|
378
|
+
errors.push({ path: `${label}/edges/${edge.from}/join`, message: 'join 노드는 fan-out source나 branch 목적지일 수 없다' });
|
|
379
|
+
for (const branch of new Set(Object.values(edge.branches).flat())) {
|
|
380
|
+
if (fanOutDestinations.has(branch) && fanOutDestinations.get(branch) !== edge.from) errors.push({ path: `${label}/edges/${edge.from}/branches`, message: `branch '${branch}' 는 하나의 fan-out source 에서만 실행할 수 있다` });
|
|
381
|
+
fanOutDestinations.set(branch, edge.from);
|
|
382
|
+
if (edges.some(candidate => candidate.from === branch)) errors.push({ path: `${label}/edges/${edge.from}/branches`, message: `branch '${branch}' 는 단일 노드만 지원하며 후속 간선은 허용되지 않는다` });
|
|
383
|
+
}
|
|
384
|
+
const joinEdge = edges.find((candidate) => candidate.from === edge.join && candidate.on === 'outcome');
|
|
385
|
+
if (!joinEdge?.map || !Object.hasOwn(joinEdge.map, 'ok') || !Object.hasOwn(joinEdge.map, 'fail'))
|
|
386
|
+
errors.push({ path: `${label}/edges/${edge.join}`, message: 'fan-out join 은 ok·fail 출구를 모두 선언해야 한다' });
|
|
387
|
+
}
|
|
329
388
|
|
|
330
389
|
if (entryNode !== undefined && !known.has(entryNode)) errors.push({ path: `${label}/entry_node`, message: `'${entryNode}' 는 선언된 노드가 아니다` });
|
|
331
390
|
for (const t of terminalNodes) if (!known.has(t)) errors.push({ path: `${label}/terminal_nodes`, message: `'${t}' 는 선언된 노드가 아니다` });
|
|
@@ -535,6 +594,13 @@ export function edgeMapOf(template: GraphTemplateSpec): Record<string, string[]>
|
|
|
535
594
|
const push = (t: string) => { if (!targets.includes(t)) targets.push(t); };
|
|
536
595
|
if (edge.to) push(edge.to);
|
|
537
596
|
for (const t of Object.values(edge.map ?? {})) push(t);
|
|
597
|
+
for (const destinations of Object.values(edge.branches ?? {})) for (const destination of destinations) {
|
|
598
|
+
push(destination);
|
|
599
|
+
if (edge.join) {
|
|
600
|
+
const branchTargets = edges[destination] ?? (edges[destination] = []);
|
|
601
|
+
if (!branchTargets.includes(edge.join)) branchTargets.push(edge.join);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
538
604
|
for (const fb of edge.fallback ?? []) push(fb.node);
|
|
539
605
|
}
|
|
540
606
|
return edges;
|
|
@@ -117,7 +117,7 @@ import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSuper
|
|
|
117
117
|
import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
118
118
|
import { homedir } from 'node:os';
|
|
119
119
|
import { enqueueControlMemo, readSoftStopRequestStatus, type SoftStopRequestRead } from '../harness/control-inbox.js';
|
|
120
|
-
import { debug } from '../debug/log.js';
|
|
120
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
121
121
|
import { enterJourneyNode, exitJourneyNode, journeyJoinFields, withJourneyNode } from '../self-dev/graph-journey-nodes.js';
|
|
122
122
|
import { classifyGateEnvDeficit, DEFAULT_GATE_ENV_RETRY, GATE_ENV_DEFICIT_HARVESTABLE_MARK, type GateEnvDeficitKind } from './gate-env-retry.js';
|
|
123
123
|
import { recordFailureEvent } from './heal-intake.js';
|
|
@@ -2412,7 +2412,9 @@ export interface SelfImplementResult {
|
|
|
2412
2412
|
/** Additive hard-cap disposition; outcome remains the stable public terminal contract. */
|
|
2413
2413
|
salvage?: 'launched' | 'parked';
|
|
2414
2414
|
/** Rework stopped on exclusively baseline/flaky/precondition failures; do not retry this goal against the same base. */
|
|
2415
|
-
terminationReason?:
|
|
2415
|
+
terminationReason?: string;
|
|
2416
|
+
/** Child's concrete stop summary when implementation did not converge before TDD evidence adjudication. */
|
|
2417
|
+
terminationDetail?: string;
|
|
2416
2418
|
/** Structured TDD failure survives child JSON/result truncation and parent-ledger mapping. */
|
|
2417
2419
|
tddEvidenceFailure?: { reason: 'tdd-evidence-missing'; round: number; missing: readonly TddRecordTag[] };
|
|
2418
2420
|
sessionId?: string;
|
|
@@ -3035,6 +3037,15 @@ type PreparedPrBody = {
|
|
|
3035
3037
|
const PR_BODY_TRUNCATION_MARKER_MAX_CHARS = 1_024;
|
|
3036
3038
|
|
|
3037
3039
|
type ChildProviderErrorQueryResult = Exclude<Awaited<ReturnType<NonNullable<SelfImplementSeams['queryChildProviderErrors']>>>, undefined>;
|
|
3040
|
+
type ChildProviderErrorDetail = {
|
|
3041
|
+
provider?: string;
|
|
3042
|
+
model?: string;
|
|
3043
|
+
message?: string;
|
|
3044
|
+
observedAt?: string;
|
|
3045
|
+
httpStatus?: number;
|
|
3046
|
+
providerErrorCode?: string;
|
|
3047
|
+
providerErrorType?: string;
|
|
3048
|
+
};
|
|
3038
3049
|
|
|
3039
3050
|
/** Aggregates only router-produced structured records; provider messages are never reparsed. */
|
|
3040
3051
|
export function queryStructuredChildProviderErrors(
|
|
@@ -3054,8 +3065,8 @@ export function queryStructuredChildProviderErrors(
|
|
|
3054
3065
|
});
|
|
3055
3066
|
if (rows.length === 0) return { status: 'none' };
|
|
3056
3067
|
let credentialFailureCount = 0;
|
|
3057
|
-
let lastProviderError:
|
|
3058
|
-
let lastCredentialFailure:
|
|
3068
|
+
let lastProviderError: ChildProviderErrorDetail | undefined;
|
|
3069
|
+
let lastCredentialFailure: ChildProviderErrorDetail | undefined;
|
|
3059
3070
|
for (const row of rows) {
|
|
3060
3071
|
let data: Record<string, unknown> | undefined;
|
|
3061
3072
|
try {
|
|
@@ -3067,6 +3078,9 @@ export function queryStructuredChildProviderErrors(
|
|
|
3067
3078
|
...(typeof data?.model === 'string' ? { model: data.model } : {}),
|
|
3068
3079
|
...(typeof data?.message === 'string' ? { message: data.message } : {}),
|
|
3069
3080
|
...(typeof row.ts === 'string' ? { observedAt: row.ts } : {}),
|
|
3081
|
+
...(typeof data?.httpStatus === 'number' ? { httpStatus: data.httpStatus } : {}),
|
|
3082
|
+
...(typeof data?.providerErrorCode === 'string' ? { providerErrorCode: data.providerErrorCode } : {}),
|
|
3083
|
+
...(typeof data?.providerErrorType === 'string' ? { providerErrorType: data.providerErrorType } : {}),
|
|
3070
3084
|
};
|
|
3071
3085
|
lastProviderError = detail;
|
|
3072
3086
|
if (data?.authRejected === true) {
|
|
@@ -3878,8 +3892,8 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3878
3892
|
const latestVerdictSeq = (): number => Math.max(lastFailedGateSeq, lastMustFixReviewSeq);
|
|
3879
3893
|
const hasCurrentProviderError = (): boolean => providerErrorCount > 0 && lastProviderErrorSeq > latestVerdictSeq();
|
|
3880
3894
|
const hasCurrentCredentialFailure = (): boolean => credentialFailureCount > 0 && lastCredentialFailureSeq > latestVerdictSeq();
|
|
3881
|
-
let lastProviderError:
|
|
3882
|
-
let lastCredentialFailure:
|
|
3895
|
+
let lastProviderError: ChildProviderErrorDetail | undefined;
|
|
3896
|
+
let lastCredentialFailure: ChildProviderErrorDetail | undefined;
|
|
3883
3897
|
let childProviderErrorQueryStatus: 'found' | 'none' | 'unavailable' | 'not-configured' = 'not-configured';
|
|
3884
3898
|
let queriedProviderErrorCount = 0;
|
|
3885
3899
|
let queriedCredentialFailureCount = 0;
|
|
@@ -3929,8 +3943,22 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3929
3943
|
credentialFailureCount,
|
|
3930
3944
|
queriedProviderErrorCount,
|
|
3931
3945
|
queriedCredentialFailureCount,
|
|
3932
|
-
lastProviderError: lastProviderError ? {
|
|
3933
|
-
|
|
3946
|
+
lastProviderError: lastProviderError ? {
|
|
3947
|
+
provider: lastProviderError.provider ?? null,
|
|
3948
|
+
model: lastProviderError.model ?? null,
|
|
3949
|
+
observedAt: lastProviderError.observedAt ?? null,
|
|
3950
|
+
...(typeof lastProviderError.httpStatus === 'number' ? { httpStatus: lastProviderError.httpStatus } : {}),
|
|
3951
|
+
...(typeof lastProviderError.providerErrorCode === 'string' ? { providerErrorCode: lastProviderError.providerErrorCode } : {}),
|
|
3952
|
+
...(typeof lastProviderError.providerErrorType === 'string' ? { providerErrorType: lastProviderError.providerErrorType } : {}),
|
|
3953
|
+
} : null,
|
|
3954
|
+
lastCredentialFailure: lastCredentialFailure ? {
|
|
3955
|
+
provider: lastCredentialFailure.provider ?? null,
|
|
3956
|
+
model: lastCredentialFailure.model ?? null,
|
|
3957
|
+
observedAt: lastCredentialFailure.observedAt ?? null,
|
|
3958
|
+
...(typeof lastCredentialFailure.httpStatus === 'number' ? { httpStatus: lastCredentialFailure.httpStatus } : {}),
|
|
3959
|
+
...(typeof lastCredentialFailure.providerErrorCode === 'string' ? { providerErrorCode: lastCredentialFailure.providerErrorCode } : {}),
|
|
3960
|
+
...(typeof lastCredentialFailure.providerErrorType === 'string' ? { providerErrorType: lastCredentialFailure.providerErrorType } : {}),
|
|
3961
|
+
} : null,
|
|
3934
3962
|
lastProviderErrorSeq,
|
|
3935
3963
|
lastCredentialFailureSeq,
|
|
3936
3964
|
lastFailedGateSeq,
|
|
@@ -3945,7 +3973,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3945
3973
|
if (record.category !== 'llm.router.error') return;
|
|
3946
3974
|
const data = record.data;
|
|
3947
3975
|
if (!data || typeof data !== 'object') return;
|
|
3948
|
-
const { provider, model, message } = data as Record<string, unknown>;
|
|
3976
|
+
const { provider, model, message, httpStatus, providerErrorCode, providerErrorType } = data as Record<string, unknown>;
|
|
3949
3977
|
providerErrorCount++;
|
|
3950
3978
|
lastProviderErrorSeq = ++failureSequence;
|
|
3951
3979
|
lastProviderError = {
|
|
@@ -3953,6 +3981,9 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3953
3981
|
...(typeof model === 'string' ? { model } : {}),
|
|
3954
3982
|
...(typeof message === 'string' ? { message } : {}),
|
|
3955
3983
|
...(typeof record.ts === 'string' ? { observedAt: record.ts } : {}),
|
|
3984
|
+
...(typeof httpStatus === 'number' ? { httpStatus } : {}),
|
|
3985
|
+
...(typeof providerErrorCode === 'string' ? { providerErrorCode } : {}),
|
|
3986
|
+
...(typeof providerErrorType === 'string' ? { providerErrorType } : {}),
|
|
3956
3987
|
};
|
|
3957
3988
|
// ⛔⭐⭐⭐ 자격 거부는 「프로바이더 오류」의 부분집합이지만 ***사람이 할 다음 행동이 다르다***
|
|
3958
3989
|
// (2026-08-14 실측 · `[T]` 83차): grok 자식 «둘»이 401 로 죽었는데 부모가 남긴 것은
|
|
@@ -4798,6 +4829,14 @@ function safeErrorDescription(error: unknown): string {
|
|
|
4798
4829
|
}
|
|
4799
4830
|
}
|
|
4800
4831
|
|
|
4832
|
+
function safePreservationFailure(error: unknown): string {
|
|
4833
|
+
const detail = redactSecretText(safeErrorDescription(error))
|
|
4834
|
+
.replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ')
|
|
4835
|
+
.trim()
|
|
4836
|
+
.slice(0, 400);
|
|
4837
|
+
return detail || '[empty preservation error]';
|
|
4838
|
+
}
|
|
4839
|
+
|
|
4801
4840
|
|
|
4802
4841
|
/** ⛔ 회전 스냅샷이 «이미 갖고 있는» 값을 증거 칸으로 옮기는 순수 사상.
|
|
4803
4842
|
*
|
|
@@ -6489,7 +6528,7 @@ async function runSelfImplementInner(
|
|
|
6489
6528
|
}
|
|
6490
6529
|
}
|
|
6491
6530
|
} catch (error) {
|
|
6492
|
-
pushError =
|
|
6531
|
+
pushError = new Error(safePreservationFailure(error));
|
|
6493
6532
|
}
|
|
6494
6533
|
}
|
|
6495
6534
|
observe('rework-blocked-draft-pr', {
|
|
@@ -6503,9 +6542,10 @@ async function runSelfImplementInner(
|
|
|
6503
6542
|
}, pushError ? { level: 'warn' } : undefined);
|
|
6504
6543
|
if (pushError) {
|
|
6505
6544
|
const failure = preservationErrorStep === 'worktree' ? '워크트리 부재로 보존 실패' : preservationErrorStep === 'commit' ? '로컬 브랜치 커밋 실패' : '원격 브랜치 보존 실패';
|
|
6506
|
-
|
|
6545
|
+
const failedStep = preservationErrorStep ?? 'push';
|
|
6546
|
+
progress('aborted', `환경 탓 중단 — ${failure}: ${wt.branch} (stage=${failedStep}; error=${pushError.message}; worktree: ${wt.path})`);
|
|
6507
6547
|
if (preservationErrorStep === 'worktree') return undefined;
|
|
6508
|
-
throw new Error(`환경 탓 중단 — ${failure}: ${wt.branch} (worktree: ${wt.path})`, { cause: pushError });
|
|
6548
|
+
throw new Error(`환경 탓 중단 — ${failure}: ${wt.branch} (stage=${failedStep}; error=${pushError.message}; worktree: ${wt.path})`, { cause: pushError });
|
|
6509
6549
|
}
|
|
6510
6550
|
if (worktreeOnly) {
|
|
6511
6551
|
progress(stage, artifactPath
|
|
@@ -7931,8 +7971,13 @@ async function runSelfImplementInner(
|
|
|
7931
7971
|
readonly judgment: ReturnType<typeof judgeTddEvidence>;
|
|
7932
7972
|
readonly implementation: typeof impl;
|
|
7933
7973
|
}): { readonly transcript: string; readonly judgment: ReturnType<typeof judgeTddEvidence> } => {
|
|
7934
|
-
|
|
7935
|
-
|
|
7974
|
+
const skippedReason = !input.judgment.planned ? 'not-planned'
|
|
7975
|
+
: input.judgment.red.observed ? 'child-red-present'
|
|
7976
|
+
: !input.implementation.ok ? 'impl-not-ok'
|
|
7977
|
+
: input.implementation.terminalStatus?.reached !== true ? 'terminal-not-reached' : undefined;
|
|
7978
|
+
if (skippedReason) {
|
|
7979
|
+
observe('tdd-base-test', { round: input.round, status: 'skipped', reason: skippedReason,
|
|
7980
|
+
...(skippedReason === 'impl-not-ok' ? { implementationFailure: input.implementation.summary.slice(0, 240) } : {}) }, { level: 'warn' });
|
|
7936
7981
|
return { transcript: input.transcript, judgment: input.judgment };
|
|
7937
7982
|
}
|
|
7938
7983
|
if (!wt.resolvedBase) {
|
|
@@ -8272,9 +8317,11 @@ async function runSelfImplementInner(
|
|
|
8272
8317
|
salvageStatusExpected: false,
|
|
8273
8318
|
...(abort.terminalStatus ? { terminalStatus: abort.terminalStatus } : {}),
|
|
8274
8319
|
});
|
|
8320
|
+
const implementationStop = impl.summary.split(/\r?\n/u, 1)[0]?.trim().slice(0, 240);
|
|
8275
8321
|
return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }),
|
|
8276
8322
|
...(tddEvidenceFailure ? { terminationReason: tddEvidenceFailure.reason, tddEvidenceFailure }
|
|
8277
|
-
: goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const }
|
|
8323
|
+
: goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const }
|
|
8324
|
+
: { terminationReason: implementationStop || 'implementation-did-not-converge', terminationDetail: implementationStop || 'implementation did not converge' }),
|
|
8278
8325
|
sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: blockedDraftPrFailure ?? impl.summary,
|
|
8279
8326
|
...(blockedDraftPrFailureKind ? { detailKind: blockedDraftPrFailureKind } : {}) };
|
|
8280
8327
|
}
|
|
@@ -28,6 +28,8 @@ export interface TestScenarioRequestInput {
|
|
|
28
28
|
readonly registeredMethodologies: readonly string[];
|
|
29
29
|
/** 라이브 명령의 «출처» — 보통 저작 중인 골 문서의 경로. 없으면 measured 로 못 간다. */
|
|
30
30
|
readonly commandSource?: string;
|
|
31
|
+
/** Multiple authoritative source candidates are retained for review, never chosen by priority. */
|
|
32
|
+
readonly commandSourceCandidates?: readonly string[];
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
export type TestScenarioLiveStatus = 'measured' | 'unmeasured';
|
|
@@ -61,7 +63,25 @@ export function requestTestScenario(input: TestScenarioRequestInput): TestScenar
|
|
|
61
63
|
const canLaunch = input.launch !== null
|
|
62
64
|
&& (input.launch.port !== undefined || (input.launch.entrypoint ?? '').trim() !== '');
|
|
63
65
|
const methodologyAvailable = input.registeredMethodologies.includes(LAUNCH_METHODOLOGY);
|
|
64
|
-
const
|
|
66
|
+
const commandSourceCandidates = [...new Set((input.commandSourceCandidates ?? [])
|
|
67
|
+
.map((candidate) => candidate.trim())
|
|
68
|
+
.filter((candidate) => /^[^:\s]+:[^:\s]+$/u.test(candidate)))];
|
|
69
|
+
const explicitCommandSource = input.commandSource?.trim() || undefined;
|
|
70
|
+
const candidateConflict = commandSourceCandidates.length > 1
|
|
71
|
+
|| (commandSourceCandidates.length === 1 && explicitCommandSource !== undefined && commandSourceCandidates[0] !== explicitCommandSource);
|
|
72
|
+
const commandSource = candidateConflict
|
|
73
|
+
? undefined
|
|
74
|
+
: explicitCommandSource || commandSourceCandidates[0];
|
|
75
|
+
// Ambiguous declarations must use file:key tokens. Preserve a legacy explicit
|
|
76
|
+
// document path as a labeled source token rather than emitting a malformed item.
|
|
77
|
+
const explicitAmbiguityCandidate = explicitCommandSource
|
|
78
|
+
? (/^[^:\s]+:[^:\s]+$/u.test(explicitCommandSource) ? explicitCommandSource : `${explicitCommandSource}:explicit-command-source`)
|
|
79
|
+
: undefined;
|
|
80
|
+
const ambiguityCandidates = [...new Set([
|
|
81
|
+
...commandSourceCandidates,
|
|
82
|
+
...(candidateConflict && explicitAmbiguityCandidate ? [explicitAmbiguityCandidate] : []),
|
|
83
|
+
])];
|
|
84
|
+
const commandSourceAmbiguous = candidateConflict || (!commandSource && commandSourceCandidates.length > 1);
|
|
65
85
|
|
|
66
86
|
if (canLaunch && methodologyAvailable && commandSource) {
|
|
67
87
|
return {
|
|
@@ -76,15 +96,17 @@ export function requestTestScenario(input: TestScenarioRequestInput): TestScenar
|
|
|
76
96
|
}
|
|
77
97
|
|
|
78
98
|
// ⛔ 사유를 «가장 바깥 원인»으로 고른다 — 선언이 없으면 방법론·명령출처를 따질 자리가 아니다.
|
|
79
|
-
const reason =
|
|
80
|
-
? '
|
|
99
|
+
const reason = commandSourceAmbiguous
|
|
100
|
+
? 'ambiguous-command-source'
|
|
101
|
+
: !canLaunch
|
|
102
|
+
? 'no-launch-declaration'
|
|
81
103
|
: !methodologyAvailable
|
|
82
104
|
? 'no-methodology'
|
|
83
105
|
: 'no-command-source';
|
|
84
106
|
return {
|
|
85
107
|
sections: [
|
|
86
108
|
scenarioSection(UNKNOWN_DELIVERABLE, input.acceptanceCriteria),
|
|
87
|
-
unmeasuredLiveSection(reason),
|
|
109
|
+
unmeasuredLiveSection(reason, reason === 'ambiguous-command-source' ? ambiguityCandidates : [], reason === 'ambiguous-command-source' && candidateConflict ? explicitCommandSource : undefined),
|
|
88
110
|
resultReportSection(),
|
|
89
111
|
],
|
|
90
112
|
deliverableType: UNKNOWN_DELIVERABLE,
|
|
@@ -138,13 +160,22 @@ function measuredLiveSection(methodology: string, commandSource: string, launch:
|
|
|
138
160
|
}
|
|
139
161
|
|
|
140
162
|
/** L 층(측정 불가) — ⛔ 방법론·명령출처·기동·눈·기대를 «싣지 않는다»(파서가 금지한다). */
|
|
141
|
-
function unmeasuredLiveSection(reason: string): string {
|
|
163
|
+
function unmeasuredLiveSection(reason: string, candidates: readonly string[] = [], explicitSource?: string): string {
|
|
164
|
+
const prerequisite = reason === 'no-launch-declaration'
|
|
165
|
+
? '골이 `## 산출물을 어떻게 켜나` 절에 `Port:` 또는 `Entrypoint:` 를 선언했으면 됐다'
|
|
166
|
+
: reason === 'ambiguous-command-source'
|
|
167
|
+
? '골이 후보 중 하나를 권위 있는 명령 출처로 확정했으면 됐다'
|
|
168
|
+
: reason === 'no-methodology'
|
|
169
|
+
? '호출자가 등록 방법론 레지스트리에 `deliverable-verify` 를 등록했으면 됐다'
|
|
170
|
+
: '골이 권위 있는 명령 출처를 선언했으면 됐다';
|
|
142
171
|
return [
|
|
143
172
|
'## L. 라이브',
|
|
144
173
|
'',
|
|
145
174
|
'### 상태 `unmeasured`',
|
|
146
175
|
`- 사유: \`${reason}\``,
|
|
147
|
-
'-
|
|
176
|
+
...(reason.startsWith('ambiguous-') ? [`- 후보 목록: ${candidates.join(', ')}`] : []),
|
|
177
|
+
...(explicitSource ? [`- 원래 명시 출처(후보와 별도): \`${explicitSource}\``] : []),
|
|
178
|
+
`- 무엇이 있었으면 됐나: ${prerequisite}`,
|
|
148
179
|
'',
|
|
149
180
|
'> ⚠️ ⛔ 「측정 불가」는 「결함 없음」이 «아니다». 이 골은 라이브 층을 «안 본 채» 끝난다.',
|
|
150
181
|
].join('\n');
|
package/src/session/chat.ts
CHANGED
|
@@ -20,7 +20,7 @@ import { debug } from '../debug/log.js';
|
|
|
20
20
|
import { createRequestSizeGuard, formatRequestSizeStatus, type RequestSizeGuard } from './request-size-guard.js';
|
|
21
21
|
import type { InputSourceKind } from '../input/input-source-kind.js';
|
|
22
22
|
import {
|
|
23
|
-
|
|
23
|
+
getProviderForConfigAsync, streamLLMWithTools, type LLMMessage, type LLMOpts, type LLMProvider,
|
|
24
24
|
type LLMToolSpec, type ContentBlock,
|
|
25
25
|
} from '../llm.js';
|
|
26
26
|
import type { UserConfig } from '../user-config.js';
|
|
@@ -407,7 +407,7 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
407
407
|
reasoningEffort: llmOpts?.reasoningEffort ?? null,
|
|
408
408
|
});
|
|
409
409
|
}
|
|
410
|
-
const provider = opts.provider ??
|
|
410
|
+
const provider = opts.provider ?? await getProviderForConfigAsync(opts.userConfig, llmOpts?.model);
|
|
411
411
|
|
|
412
412
|
// 2) Assemble, trim, call. When images are attached for THIS turn,
|
|
413
413
|
// swap the string content of the latest user message for
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { buildGitSnapshot } from '../git-fs/index.js';
|
|
2
|
+
import { classifyTuiChatIntent } from '../core-turn/short-question.js';
|
|
2
3
|
import { debug } from '../debug/log.js';
|
|
3
4
|
import { isResearchAgentIntent } from '../tool-hints/signals.js';
|
|
4
5
|
import { resolve } from 'node:path';
|
|
@@ -225,6 +226,16 @@ interface SessionToolFamilyRule {
|
|
|
225
226
|
isAvailable?(toolName: string): boolean;
|
|
226
227
|
}
|
|
227
228
|
|
|
229
|
+
// Keep generic approvals (for example, Herdr session approvals) out of the decision-ledger lookup.
|
|
230
|
+
const DECISION_PENDING_LOOKUP_TERMS = [
|
|
231
|
+
'결정 카드', '결정카드', '미결 결정', '열린 결정', '대기 결정', '결정 대기', '결정 승인 대기',
|
|
232
|
+
'pending decision', 'open decision', 'decision inbox',
|
|
233
|
+
] as const;
|
|
234
|
+
const OPS_SEATS_LOOKUP_TERMS = [
|
|
235
|
+
'자리 현황', '자리별 현황', '자리 상태', '자리별 상태', '좌석 현황',
|
|
236
|
+
'seat status', 'seat overview',
|
|
237
|
+
] as const;
|
|
238
|
+
|
|
228
239
|
const SESSION_TOOL_FAMILY_RULES: SessionToolFamilyRule[] = [
|
|
229
240
|
{
|
|
230
241
|
id: 'structural-search',
|
|
@@ -1871,13 +1882,34 @@ export function buildSessionRuntimeToolSpecs(opts: {
|
|
|
1871
1882
|
optionalTools: opts.optionalTools ?? [],
|
|
1872
1883
|
toolAvailability: opts.toolAvailability,
|
|
1873
1884
|
});
|
|
1885
|
+
// These owner-read facts tools are valid ACP lookup targets, but are too
|
|
1886
|
+
// specific to carry on every dashboard turn. Keep the advertised catalog
|
|
1887
|
+
// aligned with the current question so a routed lookup can actually call it.
|
|
1888
|
+
const lookupRoute = classifyTuiChatIntent(opts.userText).route === '조회';
|
|
1889
|
+
const normalizedIntentText = opts.userText.toLowerCase();
|
|
1890
|
+
const intentHostNames = lookupRoute ? [
|
|
1891
|
+
...(hasAny(normalizedIntentText, DECISION_PENDING_LOOKUP_TERMS) ? ['decisions_pending'] : []),
|
|
1892
|
+
...(hasAny(normalizedIntentText, OPS_SEATS_LOOKUP_TERMS) ? ['ops_seats'] : []),
|
|
1893
|
+
] : [];
|
|
1894
|
+
const hostByName = new Map(opts.hostTools.map(tool => [tool.name, tool] as const));
|
|
1895
|
+
const intentHostSpecs = intentHostNames
|
|
1896
|
+
.filter(name => isToolAvailable(name, opts.toolAvailability))
|
|
1897
|
+
.map(name => hostByName.get(name))
|
|
1898
|
+
.filter((tool): tool is LLMToolDef => !!tool)
|
|
1899
|
+
.map(toSpec);
|
|
1874
1900
|
const droppedNames = new Set(['Edit', 'Write']);
|
|
1875
|
-
const
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1901
|
+
const dropWriteTools = hasDevHarnessIntent(opts.userText);
|
|
1902
|
+
const droppedWriteSpecs = dropWriteTools
|
|
1903
|
+
? essentialSpecs.filter(spec => droppedNames.has(spec.name))
|
|
1904
|
+
: [];
|
|
1905
|
+
const finalSpecs: LLMToolSpec[] = [...new Map(
|
|
1906
|
+
[...essentialSpecs, ...intentHostSpecs]
|
|
1907
|
+
.filter(spec => !dropWriteTools || !droppedNames.has(spec.name))
|
|
1908
|
+
.map(spec => [spec.name, spec] as const),
|
|
1909
|
+
).values()];
|
|
1910
|
+
if (droppedWriteSpecs.length > 0) {
|
|
1879
1911
|
debug.log('session-runtime.tools', 'harness-phrase-write-tools-dropped', {
|
|
1880
|
-
dropped:
|
|
1912
|
+
dropped: droppedWriteSpecs.map(spec => spec.name),
|
|
1881
1913
|
});
|
|
1882
1914
|
}
|
|
1883
1915
|
// Forensic — final tool list returned to streamLLMWithTools. Lets
|