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,6 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { debug } from '../debug/log.js';
|
|
4
5
|
import type { ClassicSidetabMissionDispatchContext, ClassicSidetabMissionPairSessionRegistry, ClassicSidetabMissionResult } from './classic-sidetab-mission.js';
|
|
5
6
|
import { redactMissionResultPath } from './mission-cli-consumer.js';
|
|
6
7
|
import type { ClassicMissionNotificationEnqueue } from './classic-sidetab-mission-job.js';
|
|
@@ -70,10 +71,10 @@ function renderTrioSynthesis(mission: string, results: Record<ClassicMissionAgen
|
|
|
70
71
|
...candidates,
|
|
71
72
|
'',
|
|
72
73
|
'## 채택 결과',
|
|
73
|
-
'_부모 응답에서
|
|
74
|
+
'_최종 채택문은 알림을 받은 부모 응답에서 작성한다. 성공 후보가 있으면 이 후보들만 근거로 채택하고, 성공 후보가 하나면 그 결과를 그대로 채택한다._',
|
|
74
75
|
'',
|
|
75
76
|
'## 채택 근거',
|
|
76
|
-
'_
|
|
77
|
+
'_후보별 상태와 원문은 위 표에 기록했다. 실패한 손은 채택 근거에서 제외한다._',
|
|
77
78
|
'',
|
|
78
79
|
].join('\n');
|
|
79
80
|
}
|
|
@@ -124,12 +125,14 @@ export async function startClassicSidetabMissionTrio<Session extends TrioSession
|
|
|
124
125
|
const missionIds = [...ids.values()];
|
|
125
126
|
deps.registry.register(missionIds, sessionIds);
|
|
126
127
|
const outcomes = new Map<ClassicMissionAgent, Promise<MissionOutcome>>();
|
|
128
|
+
const completedOutcomes = new Map<ClassicMissionAgent, MissionOutcome>();
|
|
127
129
|
for (const agent of agents) {
|
|
128
130
|
const session = sessions.get(agent) ?? null;
|
|
129
131
|
if (agent === 'grok' && !session) continue;
|
|
130
|
-
|
|
132
|
+
const outcome = Promise.resolve().then(() => deps.runVisible(agent, deps.mission, session, ids.get(agent))).catch((error): MissionOutcome => ({
|
|
131
133
|
ok: false, status: 'failed', error: error instanceof Error ? error.message : String(error),
|
|
132
|
-
}))
|
|
134
|
+
}));
|
|
135
|
+
outcomes.set(agent, outcome.then((result) => { completedOutcomes.set(agent, result); return result; }));
|
|
133
136
|
}
|
|
134
137
|
const members: Record<ClassicMissionAgent, ClassicSidetabMissionResult> = {
|
|
135
138
|
codex: sessions.get('codex') ? { ok: true, status: 'running', interactionId: ids.get('codex') } : { ok: false, status: 'failed', error: 'Codex sidetab PTY could not start' },
|
|
@@ -146,7 +149,7 @@ export async function startClassicSidetabMissionTrio<Session extends TrioSession
|
|
|
146
149
|
}, timeoutMs);
|
|
147
150
|
});
|
|
148
151
|
const settled = Promise.all([...outcomes].map(async ([agent, promise]) => [agent, await promise] as const));
|
|
149
|
-
const completion = Promise.race([settled.then((results) => ({ didTimeout: false, results })), timedOut.then(() => ({ didTimeout: true, results: [] as const }))]).then(({ didTimeout, results }) => {
|
|
152
|
+
const completion = Promise.race([settled.then((results) => ({ didTimeout: false, results })), timedOut.then(() => ({ didTimeout: true, results: [...completedOutcomes.entries()] as const }))]).then(({ didTimeout, results }) => {
|
|
150
153
|
const finishedAt = now();
|
|
151
154
|
const all: Record<ClassicMissionAgent, MissionOutcome> = {
|
|
152
155
|
codex: { ...members.codex, ...(members.codex.status === 'running' ? { error: undefined } : {}) },
|
|
@@ -173,27 +176,47 @@ export async function startClassicSidetabMissionTrio<Session extends TrioSession
|
|
|
173
176
|
} else {
|
|
174
177
|
synthesisError = 'no sidetab workspace was available for the synthesis record';
|
|
175
178
|
}
|
|
176
|
-
const timeoutReason = didTimeout ? 'mission exceeded the
|
|
179
|
+
const timeoutReason = didTimeout ? 'mission exceeded the configured safety timeout' : undefined;
|
|
177
180
|
const answer = (agent: ClassicMissionAgent): string => {
|
|
178
181
|
const result = all[agent];
|
|
179
182
|
const screen = result.finalScreen?.trim();
|
|
180
183
|
const screenRecord = screen ? `\n\n${agent} final raw PTY screen:\n${screen.length > MAX_FINAL_SCREEN_CHARS ? `${screen.slice(-MAX_FINAL_SCREEN_CHARS)}\n[screen tail truncated]` : screen}` : '';
|
|
181
184
|
const initial = result.initialScreen?.trim();
|
|
182
185
|
const initialRecord = initial ? `\n\n${agent} first PTY snapshot:\n${initial.length > 1_200 ? `${initial.slice(-1_200)}\n[first screen tail truncated]` : initial}` : '';
|
|
183
|
-
if (timeoutReason &&
|
|
186
|
+
if (timeoutReason && result.status === 'running') return `${agent}: ${timeoutReason}${initialRecord}${screenRecord}`;
|
|
184
187
|
if (!result.ok) return `${agent}: ${result.error ?? 'failed; no answer returned'}${initialRecord}${screenRecord}`;
|
|
185
188
|
const content = result.content?.trim();
|
|
186
189
|
if (!content) return `${agent}: completed without an answer${screenRecord}`;
|
|
187
190
|
const safe = redactMissionResultPath(content, result.path);
|
|
188
191
|
return `${agent} candidate:\n${safe.length > MAX_ANSWER_CHARS ? `${safe.slice(0, MAX_ANSWER_CHARS)}\n[answer truncated]` : safe}${initialRecord}${screenRecord}`;
|
|
189
192
|
};
|
|
190
|
-
const grokFailed = !all.grok.ok;
|
|
193
|
+
const grokFailed = Boolean(grokFallback) || !all.grok.ok;
|
|
194
|
+
// When Grok cannot start, the run is explicitly a two-hand fallback;
|
|
195
|
+
// do not count the unstarted Grok hand as missing coverage or a failure.
|
|
196
|
+
const expectedAgents = grokFallback ? (['codex', 'claude'] as const) : (['codex', 'claude', 'grok'] as const);
|
|
197
|
+
const candidateAgents = expectedAgents.filter((agent) => all[agent].ok && Boolean(all[agent].content?.trim()));
|
|
198
|
+
const failedMembers = expectedAgents
|
|
199
|
+
.filter((agent) => !candidateAgents.includes(agent))
|
|
200
|
+
.map((agent) => ({
|
|
201
|
+
agent,
|
|
202
|
+
reason: timeoutReason && all[agent].status === 'running'
|
|
203
|
+
? timeoutReason
|
|
204
|
+
: all[agent].error ?? (all[agent].ok ? 'completed without an answer' : all[agent].status ?? 'failed'),
|
|
205
|
+
}));
|
|
206
|
+
// A completed notification with at least one candidate lets the parent
|
|
207
|
+
// synthesize/adopt the available work. `coverage` describes partial runs;
|
|
208
|
+
// state and JSON status intentionally share the same done/error value.
|
|
209
|
+
const notificationStatus = candidateAgents.length > 0 ? 'done' : 'error';
|
|
210
|
+
const coverage = candidateAgents.length === 0 ? 'none' : candidateAgents.length === expectedAgents.length ? 'complete' : 'partial';
|
|
191
211
|
const body = [
|
|
192
212
|
`Three-hand comparison · same goal · ${grokFailed ? `Grok unavailable; continued with Codex + Claude (${all.grok.error ?? 'failed'})` : 'Codex + Claude + Grok results'}`,
|
|
213
|
+
`Coverage: ${coverage}; successful candidates: ${candidateAgents.length ? candidateAgents.join(', ') : 'none'}; failed members: ${failedMembers.length ? failedMembers.map(({ agent, reason }) => `${agent} (${reason})`).join('; ') : 'none'}.`,
|
|
193
214
|
synthesisPath ? `Synthesis record: ${synthesisPath}` : `Synthesis record unavailable: ${synthesisError ?? 'unknown write failure'}`,
|
|
194
|
-
|
|
215
|
+
candidateAgents.length > 0
|
|
216
|
+
? 'Adopt or synthesize the final answer from the successful candidates only. If exactly one candidate succeeded, adopt it directly. Name failed members and never imply they succeeded.'
|
|
217
|
+
: 'No candidate succeeded; explicitly report that no result can be adopted.',
|
|
195
218
|
'', answer('codex'), '', answer('claude'), '', answer('grok'), '',
|
|
196
|
-
|
|
219
|
+
candidateAgents.length > 0 ? 'Present a non-empty adopted result and a short reason.' : 'Leave the adopted result explicitly unavailable; do not fabricate one.',
|
|
197
220
|
].join('\n');
|
|
198
221
|
try {
|
|
199
222
|
deps.enqueue({
|
|
@@ -201,8 +224,8 @@ export async function startClassicSidetabMissionTrio<Session extends TrioSession
|
|
|
201
224
|
...(deps.context?.parentSessionId ? { parentSessionId: deps.context.parentSessionId } : {}),
|
|
202
225
|
agentName: grokFailed ? 'Codex + Claude (Grok fallback)' : 'Codex + Claude + Grok',
|
|
203
226
|
label: 'sidetab mission comparison',
|
|
204
|
-
state:
|
|
205
|
-
output: JSON.stringify({ status:
|
|
227
|
+
state: notificationStatus,
|
|
228
|
+
output: JSON.stringify({ status: notificationStatus, coverage, successfulMembers: candidateAgents, failedMembers, body, artifacts: synthesisPath ? [synthesisPath] : [], id: ids.get('codex') ?? ids.get('claude') ?? taskId, grokFallback: grokFailed ? all.grok.error : undefined }),
|
|
206
229
|
...(synthesisPath ? { resultPath: synthesisPath } : {}),
|
|
207
230
|
truncated: body.includes('[answer truncated]'),
|
|
208
231
|
durationMs: Math.max(0, finishedAt - startedAt),
|
|
@@ -30,6 +30,8 @@ export interface ClassicSidetabMissionResult {
|
|
|
30
30
|
finalScreen?: string;
|
|
31
31
|
/** First child PTY frame, retained to explain startup menus and input interception. */
|
|
32
32
|
initialScreen?: string;
|
|
33
|
+
failureStage?: string;
|
|
34
|
+
failureScreen?: string;
|
|
33
35
|
}
|
|
34
36
|
export interface ClassicSidetabMissionToolResult {
|
|
35
37
|
status: 'running' | 'done' | 'error' | 'aborted';
|
package/src/dashboard/index.ts
CHANGED
|
@@ -973,6 +973,7 @@ import {
|
|
|
973
973
|
} from './context-menu-action-runtime.js';
|
|
974
974
|
import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
|
|
975
975
|
import { createDashboardSidetabRuntime, mergeLocalAgentSessions, runDashboardAgentMission } from './sidetab-runtime.js';
|
|
976
|
+
import { visibleMissionFailureLogData } from './visible-mission-diagnostics.js';
|
|
976
977
|
import { CLASSIC_SIDETAB_MISSION_TOOL_NAME, createClassicSidetabMissionIntegration, createClassicSidetabMissionPairSessionRegistry, type ClassicSidetabHandReplyInput, type ClassicSidetabMissionAgent, type ClassicSidetabMissionDispatchContext, type ClassicSidetabMissionIntegration, type ClassicSidetabMissionPairResult, type ClassicSidetabMissionResult, type ClassicSidetabMissionTrioResult } from './classic-sidetab-mission.js';
|
|
977
978
|
import { cancelClassicMissionCli, startClassicMissionCli } from './mission-cli-consumer.js';
|
|
978
979
|
import { enqueueClassicSidetabMissionCompletion } from './classic-sidetab-mission-job.js';
|
|
@@ -13861,7 +13862,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13861
13862
|
error: `${agent}: 설치·로그인 상태를 확인하지 못했습니다`,
|
|
13862
13863
|
};
|
|
13863
13864
|
}
|
|
13864
|
-
|
|
13865
|
+
const result = await runDashboardAgentMission({
|
|
13865
13866
|
agent,
|
|
13866
13867
|
requestedOutputPath,
|
|
13867
13868
|
open: () => TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open() ?? undefined,
|
|
@@ -13886,6 +13887,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13886
13887
|
if (terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
|
|
13887
13888
|
},
|
|
13888
13889
|
});
|
|
13890
|
+
const failure = visibleMissionFailureLogData(agent, result);
|
|
13891
|
+
if (failure) debug.log('classic-sidetab.mission', 'failed', failure, { level: 'warn' });
|
|
13892
|
+
return result;
|
|
13889
13893
|
},
|
|
13890
13894
|
detach: (row) => {
|
|
13891
13895
|
if (row?.currentProcess) {
|
|
@@ -14073,6 +14077,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14073
14077
|
const result = await resultPromise.finally(() => { missionFinished = true; });
|
|
14074
14078
|
await askMonitor;
|
|
14075
14079
|
handReplyTargets.delete(missionId!);
|
|
14080
|
+
const failure = visibleMissionFailureLogData(member, result, missionId);
|
|
14081
|
+
if (failure) debug.log('classic-sidetab.mission-pair', 'member-failed', failure, { level: 'warn' });
|
|
14076
14082
|
if (result.ok) await missionStore.complete(missionId!);
|
|
14077
14083
|
else await missionStore.finish(missionId!, { status: 'failed', error: result.error ?? 'visible mission failed' });
|
|
14078
14084
|
return { ...result, status: result.ok ? 'completed' as const : 'failed' as const, interactionId: missionId };
|
|
@@ -14144,6 +14150,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14144
14150
|
outputPath,
|
|
14145
14151
|
handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
|
|
14146
14152
|
});
|
|
14153
|
+
const failure = visibleMissionFailureLogData(member, result, missionId);
|
|
14154
|
+
if (failure) debug.log('classic-sidetab.mission-trio', 'member-failed', failure, { level: 'warn' });
|
|
14147
14155
|
return { ...result, status: result.ok ? 'completed' : 'failed', interactionId: missionId, finalScreen: session.preview.renderForLLM() };
|
|
14148
14156
|
} catch (error) {
|
|
14149
14157
|
return {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { VisibleMissionResult } from '../sidetab-core/visible-agent-mission.js';
|
|
2
|
+
|
|
3
|
+
/** Keep failure logs to the bounded, redacted diagnostic fields produced by the visible-mission runner. */
|
|
4
|
+
export function visibleMissionFailureLogData(
|
|
5
|
+
agent: string,
|
|
6
|
+
result: Pick<VisibleMissionResult, 'ok' | 'failureStage' | 'failureScreen'>,
|
|
7
|
+
interactionId?: string,
|
|
8
|
+
): { agent: string; failureStage: string | null; failureScreen: string | null; interactionId?: string } | null {
|
|
9
|
+
if (result.ok) return null;
|
|
10
|
+
return {
|
|
11
|
+
agent,
|
|
12
|
+
failureStage: result.failureStage ?? null,
|
|
13
|
+
failureScreen: result.failureScreen ?? null,
|
|
14
|
+
...(interactionId ? { interactionId } : {}),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import type { RetroPeriod } from './retro-aggregate.js';
|
|
3
|
+
|
|
4
|
+
export interface RetroCycleLifecycleReport {
|
|
5
|
+
period: RetroPeriod;
|
|
6
|
+
reportPath: string;
|
|
7
|
+
hasProposal: boolean;
|
|
8
|
+
proposalId?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface RetroCycleActionRefs {
|
|
12
|
+
runId: string;
|
|
13
|
+
reportPath: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type RetroCycleLog = (category: string, event: string, data: Record<string, unknown>) => void;
|
|
17
|
+
|
|
18
|
+
export interface RetroCycleLifecycleDeps {
|
|
19
|
+
recordAction: (refs: RetroCycleActionRefs) => void;
|
|
20
|
+
log: RetroCycleLog;
|
|
21
|
+
createId?: () => string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Assign one run identity and propagate it through the action record and queryable events. */
|
|
25
|
+
export function finishRetroCycleRun(report: RetroCycleLifecycleReport, deps: RetroCycleLifecycleDeps): string {
|
|
26
|
+
const runId = `retro-${(deps.createId ?? randomUUID)()}`;
|
|
27
|
+
deps.recordAction({ runId, reportPath: report.reportPath });
|
|
28
|
+
deps.log('retro.cycle', 'collected', {
|
|
29
|
+
runId,
|
|
30
|
+
period: report.period,
|
|
31
|
+
reportPath: report.reportPath,
|
|
32
|
+
hasProposal: report.hasProposal,
|
|
33
|
+
});
|
|
34
|
+
if (report.hasProposal) {
|
|
35
|
+
deps.log('retro.cycle', 'proposed', {
|
|
36
|
+
runId,
|
|
37
|
+
period: report.period,
|
|
38
|
+
reportPath: report.reportPath,
|
|
39
|
+
proposalId: report.proposalId ?? null,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return runId;
|
|
43
|
+
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { aggregatePeriod, type RetroDeps, type RetroPeriod, type PeriodSummary } from './retro-aggregate.js';
|
|
8
8
|
import { renderReflectionMd, reflectionFilename } from './retro-report.js';
|
|
9
9
|
import { proposeRebalance, checkProposal, hitlNotice, type PromotionCandidate, type RebalanceProposal } from './retro-rebalance.js';
|
|
10
|
+
import { buildRetroFeatureProposals, renderRetroFeatureProposals, type RetroFeatureProposal, type RetroProposalSignal } from './retro-proposals.js';
|
|
10
11
|
import type { CheckerVerdict } from './loop-contract.js';
|
|
11
12
|
|
|
12
13
|
export interface RetroCycleDeps {
|
|
@@ -15,6 +16,7 @@ export interface RetroCycleDeps {
|
|
|
15
16
|
writeReport: (filename: string, md: string) => string; // 저장 → 경로 반환
|
|
16
17
|
narrate?: (summary: PeriodSummary) => Promise<string | undefined> | string | undefined; // LLM 서사 opt-in(비동기 허용)
|
|
17
18
|
notify?: (text: string) => void; // HITL 승인 요청 발송
|
|
19
|
+
featureSignals?: (from: string, to: string) => readonly RetroProposalSignal[];
|
|
18
20
|
now?: () => string;
|
|
19
21
|
}
|
|
20
22
|
|
|
@@ -26,17 +28,26 @@ export interface RetroCycleReport {
|
|
|
26
28
|
/** 독립 sanity check 판정(Phase C · builder≠checker 대칭). */
|
|
27
29
|
sanity: CheckerVerdict;
|
|
28
30
|
highlights: string[];
|
|
31
|
+
featureProposals: RetroFeatureProposal[];
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
/** 회고 1회 실행(오케스트레이터). 리포트 저장 + 제안 있으면 HITL 알림. narrate 비동기 허용. */
|
|
32
35
|
export async function runRetroCycle(deps: RetroCycleDeps, period: RetroPeriod): Promise<RetroCycleReport> {
|
|
33
36
|
const now = deps.now?.() ?? new Date().toISOString();
|
|
34
37
|
const summary = aggregatePeriod(deps.retro, period, now);
|
|
38
|
+
const featureProposals = buildRetroFeatureProposals(
|
|
39
|
+
deps.featureSignals?.(summary.window.from, summary.window.to) ?? [],
|
|
40
|
+
{ from: summary.window.from, to: summary.window.to, minimumRuns: 2 },
|
|
41
|
+
);
|
|
35
42
|
const candidates = deps.candidates();
|
|
36
43
|
const proposal: RebalanceProposal = proposeRebalance(summary, candidates);
|
|
37
44
|
const sanity = checkProposal(proposal); // ★ builder(proposeRebalance)와 분리된 독립 검증
|
|
38
45
|
const narrative = await deps.narrate?.(summary);
|
|
39
|
-
const md = renderReflectionMd(summary, {
|
|
46
|
+
const md = renderReflectionMd(summary, {
|
|
47
|
+
narrative,
|
|
48
|
+
proposalMd: proposal.proposalMd,
|
|
49
|
+
featureProposalMd: renderRetroFeatureProposals(featureProposals),
|
|
50
|
+
});
|
|
40
51
|
const reportPath = deps.writeReport(reflectionFilename(summary), md);
|
|
41
52
|
|
|
42
53
|
const hasProposal = proposal.deltas.length > 0;
|
|
@@ -46,5 +57,5 @@ export async function runRetroCycle(deps: RetroCycleDeps, period: RetroPeriod):
|
|
|
46
57
|
deps.notify(notice);
|
|
47
58
|
}
|
|
48
59
|
|
|
49
|
-
return { period, reportPath, hasProposal, proposalId: proposal.id, sanity, highlights: summary.highlights };
|
|
60
|
+
return { period, reportPath, hasProposal, proposalId: proposal.id, sanity, highlights: summary.highlights, featureProposals };
|
|
50
61
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { redactSecretText } from '../debug/log.js';
|
|
3
|
+
|
|
4
|
+
export type RetroProposalSignalSource = 'incident' | 'doctor-visit';
|
|
5
|
+
|
|
6
|
+
/** Minimal, redacted signals from durable ledgers; raw log text is deliberately excluded. */
|
|
7
|
+
export interface RetroProposalSignal {
|
|
8
|
+
readonly runId: string;
|
|
9
|
+
readonly symptom: string;
|
|
10
|
+
readonly at: string;
|
|
11
|
+
readonly source: RetroProposalSignalSource;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface RetroFeatureProposal {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly title: string;
|
|
17
|
+
readonly symptom: string;
|
|
18
|
+
readonly evidence: {
|
|
19
|
+
readonly runIds: readonly string[];
|
|
20
|
+
readonly incidents: number;
|
|
21
|
+
readonly doctorVisits: number;
|
|
22
|
+
};
|
|
23
|
+
readonly expectedEffect: string;
|
|
24
|
+
readonly decisionSignal: string;
|
|
25
|
+
readonly costPeak: { readonly status: 'unknown'; readonly reason: string };
|
|
26
|
+
readonly localAndGlobalScope: { readonly status: 'unknown'; readonly reason: string };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface BuildRetroFeatureProposalsOptions {
|
|
30
|
+
readonly from?: string;
|
|
31
|
+
readonly to?: string;
|
|
32
|
+
readonly minimumRuns?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Build deterministic proposal cards from repeated, recorded symptoms only. */
|
|
36
|
+
export function buildRetroFeatureProposals(
|
|
37
|
+
signals: readonly RetroProposalSignal[],
|
|
38
|
+
options: BuildRetroFeatureProposalsOptions = {},
|
|
39
|
+
): RetroFeatureProposal[] {
|
|
40
|
+
const minimumRuns = options.minimumRuns ?? 2;
|
|
41
|
+
if (!Number.isSafeInteger(minimumRuns) || minimumRuns < 2) throw new Error('minimumRuns must be an integer >= 2');
|
|
42
|
+
const from = options.from ? Date.parse(`${options.from}T00:00:00.000Z`) : -Infinity;
|
|
43
|
+
const to = options.to ? Date.parse(`${options.to}T23:59:59.999Z`) : Infinity;
|
|
44
|
+
if (Number.isNaN(from) || Number.isNaN(to)) throw new Error('from and to must be valid YYYY-MM-DD dates');
|
|
45
|
+
if (from > to) throw new Error('from must be on or before to');
|
|
46
|
+
|
|
47
|
+
const grouped = new Map<string, RetroProposalSignal[]>();
|
|
48
|
+
for (const signal of signals) {
|
|
49
|
+
if (signal.source !== 'incident' && signal.source !== 'doctor-visit') continue;
|
|
50
|
+
const symptom = redactSecretText(signal.symptom).replace(/[\r\n\t]+/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 160);
|
|
51
|
+
const at = Date.parse(signal.at);
|
|
52
|
+
const runId = signal.runId.trim().replace(/[^\w.-]/g, '').slice(0, 100);
|
|
53
|
+
if (!runId || !symptom || !Number.isFinite(at) || at < from || at > to) continue;
|
|
54
|
+
const rows = grouped.get(symptom) ?? [];
|
|
55
|
+
rows.push({ ...signal, runId, symptom });
|
|
56
|
+
grouped.set(symptom, rows);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return [...grouped.entries()].flatMap(([symptom, rows]) => {
|
|
60
|
+
const runIds = [...new Set(rows.map((row) => row.runId))].sort();
|
|
61
|
+
if (runIds.length < minimumRuns) return [];
|
|
62
|
+
const incidents = rows.filter((row) => row.source === 'incident').length;
|
|
63
|
+
const doctorVisits = rows.filter((row) => row.source === 'doctor-visit').length;
|
|
64
|
+
const id = createHash('sha256').update(`${symptom}\n${runIds.join('\n')}`).digest('hex').slice(0, 12);
|
|
65
|
+
return [{
|
|
66
|
+
id,
|
|
67
|
+
title: `반복 증상 제안: ${symptom}`,
|
|
68
|
+
symptom,
|
|
69
|
+
evidence: { runIds, incidents, doctorVisits },
|
|
70
|
+
expectedEffect: `다음 회고 기간의 '${symptom}' 고유 런 수 감소`,
|
|
71
|
+
decisionSignal: `다음 기간에 같은 증상으로 기록된 고유 runId 수 < ${runIds.length}`,
|
|
72
|
+
costPeak: { status: 'unknown', reason: '비용 정본 필드가 확인되지 않아 측정 불가' },
|
|
73
|
+
localAndGlobalScope: { status: 'unknown', reason: '로컬/광역 사례 저장 정본이 확인되지 않아 범위 미정' },
|
|
74
|
+
} satisfies RetroFeatureProposal];
|
|
75
|
+
}).sort((a, b) => b.evidence.runIds.length - a.evidence.runIds.length
|
|
76
|
+
|| (a.symptom < b.symptom ? -1 : a.symptom > b.symptom ? 1 : 0));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function renderRetroFeatureProposals(cards: readonly RetroFeatureProposal[]): string | undefined {
|
|
80
|
+
if (cards.length === 0) return undefined;
|
|
81
|
+
const lines = ['## 반복 증상 피처 제안 (근거 기반 · 초안)'];
|
|
82
|
+
for (const card of cards) {
|
|
83
|
+
lines.push(`### ${card.title} · ${card.id}`);
|
|
84
|
+
lines.push(`- 증상: ${card.symptom}`);
|
|
85
|
+
lines.push(`- 근거: ${card.evidence.runIds.length}개 고유 런 (${card.evidence.runIds.join(', ')}) · incident ${card.evidence.incidents} · doctor visit ${card.evidence.doctorVisits}`);
|
|
86
|
+
lines.push(`- 예상 효과: ${card.expectedEffect}`);
|
|
87
|
+
lines.push(`- 판정 신호: ${card.decisionSignal}`);
|
|
88
|
+
lines.push(`- 비용 정점: 모름 (${card.costPeak.reason})`);
|
|
89
|
+
lines.push(`- 로컬/광역 두 층: 모름 (${card.localAndGlobalScope.reason})`);
|
|
90
|
+
}
|
|
91
|
+
return lines.join('\n');
|
|
92
|
+
}
|
|
@@ -16,7 +16,7 @@ export function reflectionFilename(summary: PeriodSummary): string {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/** 결정론 마크다운 리포트(순수). LLM 서사는 opts.narrative 로 주입(opt-in). */
|
|
19
|
-
export function renderReflectionMd(summary: PeriodSummary, opts: { narrative?: string; proposalMd?: string } = {}): string {
|
|
19
|
+
export function renderReflectionMd(summary: PeriodSummary, opts: { narrative?: string; proposalMd?: string; featureProposalMd?: string } = {}): string {
|
|
20
20
|
const { window: w, backtest: b, regime: r, trades: t, highlights } = summary;
|
|
21
21
|
const L: string[] = [];
|
|
22
22
|
L.push(`# ${PERIOD_KO[w.period]} 회고 — ${w.from} ~ ${w.to}`);
|
|
@@ -84,6 +84,11 @@ export function renderReflectionMd(summary: PeriodSummary, opts: { narrative?: s
|
|
|
84
84
|
L.push('');
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
if (opts.featureProposalMd && opts.featureProposalMd.trim()) {
|
|
88
|
+
L.push(opts.featureProposalMd.trim());
|
|
89
|
+
L.push('');
|
|
90
|
+
}
|
|
91
|
+
|
|
87
92
|
L.push('---');
|
|
88
93
|
L.push(`_${PERIOD_KO[w.period]} 회고 · 페이퍼·disarmed · 실집행/리밸런싱은 대표 HITL 승인_`);
|
|
89
94
|
return L.join('\n');
|
|
@@ -55,6 +55,29 @@ export function registerGraphCommands(program: Command, runsDeps: {
|
|
|
55
55
|
process.exitCode = 1;
|
|
56
56
|
}
|
|
57
57
|
});
|
|
58
|
+
graph.command('promote')
|
|
59
|
+
.description('Evaluate an injected ARG promotion fixture; this command never applies or writes an overlay')
|
|
60
|
+
.command('evaluate')
|
|
61
|
+
.requiredOption('--fixture <path>', 'JSON fixture containing trigger, candidate and injected evidence events')
|
|
62
|
+
.option('--json', 'Print the mock-only decision and proposal as JSON')
|
|
63
|
+
.action(async (opts: { fixture: string; json?: boolean }) => {
|
|
64
|
+
try {
|
|
65
|
+
const parsed: unknown = JSON.parse(readFileSync(resolve(opts.fixture), 'utf8'));
|
|
66
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('fixture root must be an object');
|
|
67
|
+
const fixture = parsed as Record<string, unknown>;
|
|
68
|
+
if (typeof fixture.trigger !== 'string' || fixture.candidate === null || typeof fixture.candidate !== 'object'
|
|
69
|
+
|| Array.isArray(fixture.candidate) || !Array.isArray(fixture.events)) {
|
|
70
|
+
throw new Error('fixture requires trigger, candidate object and events array');
|
|
71
|
+
}
|
|
72
|
+
const { evaluateArgPromotionFixture } = await import('../self-implement/graph-overlay-yaml.js');
|
|
73
|
+
const result = evaluateArgPromotionFixture(fixture as Parameters<typeof evaluateArgPromotionFixture>[0]);
|
|
74
|
+
if (opts.json) await writeStdoutJson(JSON.stringify(result) + '\n');
|
|
75
|
+
else console.log(`graph promote: ${result.verdict} · mockOnly=${result.mockOnly} · wroteOverlay=false · ${JSON.stringify(result.metrics)}${result.blockers.length ? ` · blockers=${result.blockers.join(',')}` : ''}`);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.error(`graph promote evaluate: ${error instanceof Error ? error.message : String(error)}`);
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
58
81
|
graph.command('wizard-run <request>')
|
|
59
82
|
.description('Run one request through the smart wizard graph and stop at its approval gate')
|
|
60
83
|
.option('--json', 'Print run identity and transitions as JSON')
|
|
@@ -95,7 +118,7 @@ export function registerGraphCommands(program: Command, runsDeps: {
|
|
|
95
118
|
}
|
|
96
119
|
const state = await runGraph(file, { ...(opts.resume ? { resumeRunId: opts.resume } : { dryRun: opts.dryRun }), ...(opts.from ? { fromNodeId: opts.from } : {}), useCurrentGraph: opts.useCurrentGraph, ...(input === undefined ? {} : { input }) });
|
|
97
120
|
if (opts.json) await writeStdoutJson(JSON.stringify(state) + '\n');
|
|
98
|
-
else console.log(`${state.graphId} ${state.runId}: ${state.status} (${state.path.join(' → ')}, executed: ${state.executed})${state.pending ? ` — ${state.pending.message}` : ''}`);
|
|
121
|
+
else console.log(`${state.graphId} ${state.runId}: ${state.status} (${(state.plannedPath ?? state.path).join(' → ')}, executed: ${state.executed})${state.pending ? ` — ${state.pending.message}` : ''}`);
|
|
99
122
|
if (state.status !== 'done' && state.status !== 'awaiting-approval') process.exitCode = 1;
|
|
100
123
|
} catch (error) {
|
|
101
124
|
console.error(`graph run: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -26,7 +26,7 @@ export function createLLMGrowthProposer(callLLM: GrowthLLM = defaultGrowthLLM):
|
|
|
26
26
|
const serializedOutput = typeof input.output === 'string' ? input.output : input.output === undefined ? '' : JSON.stringify(input.output);
|
|
27
27
|
const prompt = [
|
|
28
28
|
'Propose exactly one new contracted graph node to handle the unseen outcome and one return edge to an existing node.',
|
|
29
|
-
'Reply with only JSON: {"node":{"nodeId":"...","kind":"agent","recipe":"none","maxVisits":1,"contract":{"inputs":[],"tools":"read-only","outputs":[]}},"returnTo":"existing-node-id","reason":"..."}.',
|
|
29
|
+
'Reply with only JSON: {"node":{"nodeId":"...","kind":"agent","recipe":"none","maxVisits":1,"contract":{"inputs":[],"tools":"read-only","outputs":[]}},"returnTo":"existing-node-id","reason":"..."}. The only allowed kinds are agent, observe, and judge.',
|
|
30
30
|
'Use only an existing recipe type (none, an existing cmd:/approval: recipe ID, or a catalog role); never invent commands. The missing-outcome edge and the return edge are built from node and returnTo after validation.',
|
|
31
31
|
'Do not alter existing nodes or edges. The proposal will be validated independently; do not assume a recipe is safe.',
|
|
32
32
|
`Graph snapshot: ${JSON.stringify(input.graph)}`,
|
|
@@ -42,6 +42,8 @@ export function createLLMGrowthProposer(callLLM: GrowthLLM = defaultGrowthLLM):
|
|
|
42
42
|
const proposal = parsed as Record<string, unknown>;
|
|
43
43
|
if (!proposal.node || typeof proposal.node !== 'object' || Array.isArray(proposal.node) ||
|
|
44
44
|
typeof proposal.reason !== 'string' || !proposal.reason.trim() || typeof proposal.returnTo !== 'string') return undefined;
|
|
45
|
+
const node = proposal.node as Record<string, unknown>;
|
|
46
|
+
if (typeof node.kind !== 'string' || !['agent', 'observe', 'judge'].includes(node.kind)) return undefined;
|
|
45
47
|
return { node: proposal.node, reason: proposal.reason, returnTo: proposal.returnTo } as GrowthProposal;
|
|
46
48
|
};
|
|
47
49
|
}
|