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
package/scripts/rhythm/daily.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
3
4
|
import { spawnSync } from 'node:child_process';
|
|
4
5
|
import { Database } from 'bun:sqlite';
|
|
5
6
|
import { dirname, join } from 'node:path';
|
|
@@ -537,6 +538,7 @@ function sendNewsAfterReview(delivery: DeliveryResult, file: string, markdown: s
|
|
|
537
538
|
}
|
|
538
539
|
|
|
539
540
|
export type DailyDeps = { now?: () => Date; root?: string; vaultRoot?: string | null; sendEnabled?: boolean; repoRoot?: string; repoName?: string;
|
|
541
|
+
runId?: string;
|
|
540
542
|
landings?: (now: Date) => Promise<Landing[]>; release?: () => Promise<Release>; loops?: () => Promise<Loop[]>;
|
|
541
543
|
grid?: () => Promise<Seat[]>; decisions?: () => Promise<Pending[]>; news?: () => Promise<News[]>;
|
|
542
544
|
cooAdmin?: (now: Date) => Promise<string>;
|
|
@@ -569,6 +571,7 @@ function copyToVault(markdown: string, now: Date, deps: DailyDeps): { vaultError
|
|
|
569
571
|
|
|
570
572
|
export async function runDaily(options: { dryRun?: boolean; noNews?: boolean; stage?: 'collect' | 'compose' | 'deliver' } = {}, deps: DailyDeps = {}) {
|
|
571
573
|
const now = (deps.now ?? (() => new Date()))();
|
|
574
|
+
const runId = deps.runId ?? randomUUID();
|
|
572
575
|
const receiptKey = `RHYTHM-DAILY:${kstDay(now)}`;
|
|
573
576
|
if (options.stage === 'compose' || options.stage === 'deliver') {
|
|
574
577
|
const file = join(deps.root ?? effectiveInstanceRoot(), 'rhythm', 'daily', `${kstDay(now)}.md`);
|
|
@@ -628,7 +631,7 @@ export async function runDaily(options: { dryRun?: boolean; noNews?: boolean; st
|
|
|
628
631
|
if (deps.log) deps.log('loop.rhythm-daily', 'linear-progress-config-blocked', { reason: 'issue-allowlist-missing' });
|
|
629
632
|
else loopEvent('rhythm-daily', 'linear-progress-config-blocked', { reason: 'issue-allowlist-missing' });
|
|
630
633
|
} else {
|
|
631
|
-
linearProgress = await (deps.linearProgressSync ?? runLinearProgressSync)({ version: checklistDevVersion(devVersion()), now, root: deps.root,
|
|
634
|
+
linearProgress = await (deps.linearProgressSync ?? runLinearProgressSync)({ version: checklistDevVersion(devVersion()), now, root: deps.root, runId,
|
|
632
635
|
apply: true, allowIssueIdentifiers,
|
|
633
636
|
log: (event, data) => deps.log ? deps.log('loop.rhythm-daily.linear-progress', event, data)
|
|
634
637
|
: loopEvent('rhythm-daily.linear-progress', event, data) });
|
|
@@ -11,6 +11,8 @@ import { acquireLockAsync } from '../../src/storage/file-lock.js';
|
|
|
11
11
|
|
|
12
12
|
export type ProgressIssue = {
|
|
13
13
|
id: string; identifier: string; title: string; url: string; description: string; state: string;
|
|
14
|
+
/** Verified Linear team key; live writes fail closed unless this is DEMO. */
|
|
15
|
+
teamKey: string;
|
|
14
16
|
};
|
|
15
17
|
export type ProgressLink = { issue: ProgressIssue; cells: ChecklistItem[]; decisions: DecisionEntry[]; sources: Array<{ cellId: string; field: string }> };
|
|
16
18
|
export type ProgressPreview = { identifier: string; body: string; sources: Array<{ cellId: string; field: string }> };
|
|
@@ -107,10 +109,10 @@ export function renderProgressPreview(link: ProgressLink, checklist: Checklist,
|
|
|
107
109
|
return { identifier: link.issue.identifier, body, sources: link.sources };
|
|
108
110
|
}
|
|
109
111
|
|
|
110
|
-
async function fetchTeamIssues(apiKey: string, teamKey: string): Promise<ProgressIssue[]> {
|
|
112
|
+
async function fetchTeamIssues(apiKey: string, teamKey: string, fetchFn: typeof fetch = fetch): Promise<ProgressIssue[]> {
|
|
111
113
|
const query = `query LinearProgressIssues($teamKey: String!, $after: String) {
|
|
112
114
|
issues(filter: { team: { key: { eq: $teamKey } } }, first: 100, after: $after) {
|
|
113
|
-
nodes { id identifier title url description state { name } }
|
|
115
|
+
nodes { id identifier title url description state { name } team { key } }
|
|
114
116
|
pageInfo { hasNextPage endCursor }
|
|
115
117
|
}
|
|
116
118
|
}`;
|
|
@@ -118,7 +120,7 @@ async function fetchTeamIssues(apiKey: string, teamKey: string): Promise<Progres
|
|
|
118
120
|
const cursors = new Set<string>();
|
|
119
121
|
let after: string | null = null;
|
|
120
122
|
do {
|
|
121
|
-
const response = await
|
|
123
|
+
const response = await fetchFn('https://api.linear.app/graphql', {
|
|
122
124
|
method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' },
|
|
123
125
|
body: JSON.stringify({ query, variables: { teamKey, after } }),
|
|
124
126
|
});
|
|
@@ -129,8 +131,10 @@ async function fetchTeamIssues(apiKey: string, teamKey: string): Promise<Progres
|
|
|
129
131
|
for (const node of page.nodes) {
|
|
130
132
|
if (typeof node.id !== 'string' || typeof node.identifier !== 'string' || typeof node.title !== 'string' || typeof node.url !== 'string') continue;
|
|
131
133
|
const state = node.state && typeof node.state === 'object' ? (node.state as { name?: unknown }).name : undefined;
|
|
134
|
+
const team = node.team && typeof node.team === 'object' ? (node.team as { key?: unknown }).key : undefined;
|
|
132
135
|
issues.push({ id: node.id, identifier: node.identifier, title: node.title, url: node.url,
|
|
133
|
-
description: typeof node.description === 'string' ? node.description : '', state: typeof state === 'string' ? state : 'unknown'
|
|
136
|
+
description: typeof node.description === 'string' ? node.description : '', state: typeof state === 'string' ? state : 'unknown',
|
|
137
|
+
teamKey: typeof team === 'string' ? team : '' });
|
|
134
138
|
}
|
|
135
139
|
const info = page.pageInfo;
|
|
136
140
|
if (info?.hasNextPage && (!info.endCursor || cursors.has(info.endCursor))) throw new Error(`Linear ${teamKey} cursor missing or repeated`);
|
|
@@ -140,11 +144,11 @@ async function fetchTeamIssues(apiKey: string, teamKey: string): Promise<Progres
|
|
|
140
144
|
return issues;
|
|
141
145
|
}
|
|
142
146
|
|
|
143
|
-
async function fetchAllowlistedIssue(apiKey: string, identifier: string): Promise<ProgressIssue | null> {
|
|
147
|
+
async function fetchAllowlistedIssue(apiKey: string, identifier: string, fetchFn: typeof fetch = fetch): Promise<ProgressIssue | null> {
|
|
144
148
|
const query = `query LinearAllowlistedProgressIssue($identifier: String!) {
|
|
145
|
-
issue(id: $identifier) { id identifier title url description state { name } }
|
|
149
|
+
issue(id: $identifier) { id identifier title url description state { name } team { key } }
|
|
146
150
|
}`;
|
|
147
|
-
const response = await
|
|
151
|
+
const response = await fetchFn('https://api.linear.app/graphql', {
|
|
148
152
|
method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' },
|
|
149
153
|
body: JSON.stringify({ query, variables: { identifier } }),
|
|
150
154
|
});
|
|
@@ -154,11 +158,13 @@ async function fetchAllowlistedIssue(apiKey: string, identifier: string): Promis
|
|
|
154
158
|
if (result.errors?.length) throw new Error(`Linear ${identifier} lookup failed`);
|
|
155
159
|
if (!node || typeof node.id !== 'string' || typeof node.identifier !== 'string' || typeof node.title !== 'string' || typeof node.url !== 'string') return null;
|
|
156
160
|
const state = node.state && typeof node.state === 'object' ? (node.state as { name?: unknown }).name : undefined;
|
|
161
|
+
const team = node.team && typeof node.team === 'object' ? (node.team as { key?: unknown }).key : undefined;
|
|
157
162
|
return { id: node.id, identifier: node.identifier, title: node.title, url: node.url,
|
|
158
|
-
description: typeof node.description === 'string' ? node.description : '', state: typeof state === 'string' ? state : 'unknown'
|
|
163
|
+
description: typeof node.description === 'string' ? node.description : '', state: typeof state === 'string' ? state : 'unknown',
|
|
164
|
+
teamKey: typeof team === 'string' ? team : '' };
|
|
159
165
|
}
|
|
160
166
|
|
|
161
|
-
async function countMarker(apiKey: string, issueId: string, marker: string): Promise<number> {
|
|
167
|
+
async function countMarker(apiKey: string, issueId: string, marker: string, fetchFn: typeof fetch = fetch): Promise<number> {
|
|
162
168
|
const query = `query LinearProgressComments($id: String!, $after: String) {
|
|
163
169
|
issue(id: $id) { comments(first: 100, after: $after) { nodes { body } pageInfo { hasNextPage endCursor } } }
|
|
164
170
|
}`;
|
|
@@ -166,7 +172,7 @@ async function countMarker(apiKey: string, issueId: string, marker: string): Pro
|
|
|
166
172
|
let after: string | null = null;
|
|
167
173
|
let count = 0;
|
|
168
174
|
do {
|
|
169
|
-
const response = await
|
|
175
|
+
const response = await fetchFn('https://api.linear.app/graphql', {
|
|
170
176
|
method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' },
|
|
171
177
|
body: JSON.stringify({ query, variables: { id: issueId, after } }),
|
|
172
178
|
});
|
|
@@ -184,10 +190,11 @@ async function countMarker(apiKey: string, issueId: string, marker: string): Pro
|
|
|
184
190
|
}
|
|
185
191
|
|
|
186
192
|
export async function runLinearProgressSync(options: {
|
|
187
|
-
version: string; now?: Date; root?: string; apply?: boolean;
|
|
193
|
+
version: string; now?: Date; root?: string; runId?: string; apply?: boolean;
|
|
188
194
|
allowIssueIdentifiers?: readonly string[];
|
|
189
195
|
checklist?: Checklist; issues?: readonly ProgressIssue[]; decisions?: readonly DecisionEntry[];
|
|
190
196
|
getApiKey?: (id: string) => Promise<string | undefined>;
|
|
197
|
+
fetch?: typeof fetch;
|
|
191
198
|
countMarker?: (issue: ProgressIssue, marker: string) => Promise<number>;
|
|
192
199
|
postComment?: (issue: ProgressIssue, body: string) => Promise<void>;
|
|
193
200
|
log?: (event: string, data: Record<string, unknown>) => void;
|
|
@@ -199,6 +206,7 @@ export async function runLinearProgressSync(options: {
|
|
|
199
206
|
const decisions = options.decisions ?? new DecisionLedger({ stateDir: root }).list({ status: 'all' });
|
|
200
207
|
const apiKey = (options.getApiKey ?? getSecretAsync)('connector.linear.apiKey');
|
|
201
208
|
const resolvedKey = await apiKey;
|
|
209
|
+
const fetchFn = options.fetch ?? fetch;
|
|
202
210
|
if (!resolvedKey) throw new Error('connector.linear.apiKey missing');
|
|
203
211
|
const allowedIdentifiers = [...new Set(options.allowIssueIdentifiers ?? [])];
|
|
204
212
|
const lookupFailures: Array<{ identifier: string; reason: string }> = [];
|
|
@@ -207,7 +215,7 @@ export async function runLinearProgressSync(options: {
|
|
|
207
215
|
else if (options.apply) {
|
|
208
216
|
const lookups = await Promise.all(allowedIdentifiers.map(async identifier => {
|
|
209
217
|
try {
|
|
210
|
-
const issue = await fetchAllowlistedIssue(resolvedKey, identifier);
|
|
218
|
+
const issue = await fetchAllowlistedIssue(resolvedKey, identifier, fetchFn);
|
|
211
219
|
if (!issue) lookupFailures.push({ identifier, reason: 'allowlisted issue not found' });
|
|
212
220
|
return issue;
|
|
213
221
|
} catch (error) {
|
|
@@ -216,7 +224,7 @@ export async function runLinearProgressSync(options: {
|
|
|
216
224
|
}
|
|
217
225
|
}));
|
|
218
226
|
issues = lookups.filter((issue): issue is ProgressIssue => issue !== null);
|
|
219
|
-
} else issues =
|
|
227
|
+
} else issues = await fetchTeamIssues(resolvedKey, 'DEMO', fetchFn);
|
|
220
228
|
const links = resolveExplicitProgressLinks(issues, checklist, decisions);
|
|
221
229
|
const previews = links.map(link => renderProgressPreview(link, checklist, day));
|
|
222
230
|
const linkedIdentifiers = new Set(links.map(link => link.issue.identifier));
|
|
@@ -229,16 +237,21 @@ export async function runLinearProgressSync(options: {
|
|
|
229
237
|
const unresolvedApproved = [...lookupFailures, ...missingApproved, ...unlinkedApproved];
|
|
230
238
|
const result: ProgressSyncResult = { day, candidates: previews, posted: [], alreadyPresent: [], skipped: [], failures: unresolvedApproved };
|
|
231
239
|
const log = (event: string, data: Record<string, unknown>) => {
|
|
232
|
-
const enriched = { day, ...data };
|
|
240
|
+
const enriched = { day, ...data, ...(options.runId ? { runId: options.runId } : {}) };
|
|
233
241
|
if (options.log) options.log(event, enriched);
|
|
234
242
|
else debug.log('loop.rhythm-daily.linear-progress', event, enriched);
|
|
235
243
|
};
|
|
236
|
-
const check = options.countMarker ?? ((issue: ProgressIssue, marker: string) => countMarker(resolvedKey, issue.id, marker));
|
|
244
|
+
const check = options.countMarker ?? ((issue: ProgressIssue, marker: string) => countMarker(resolvedKey, issue.id, marker, fetchFn));
|
|
237
245
|
const post = options.postComment ?? ((issue: ProgressIssue, body: string) => commentLinearIssue({ apiKey: resolvedKey, issueId: issue.id, body }));
|
|
238
246
|
for (const failure of unresolvedApproved) log('approved-issue-unresolved', failure);
|
|
239
247
|
for (const preview of previews) {
|
|
240
248
|
const issue = links.find(link => link.issue.identifier === preview.identifier)!.issue;
|
|
241
249
|
const marker = `<!-- elanous-linear-progress:${day}:${issue.identifier} -->`;
|
|
250
|
+
if (issue.teamKey !== 'DEMO') {
|
|
251
|
+
result.skipped.push(issue.identifier);
|
|
252
|
+
log('not-demo-team', { identifier: issue.identifier, teamKey: issue.teamKey || 'unknown', sources: preview.sources });
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
242
255
|
let release: (() => void) | undefined;
|
|
243
256
|
let stillHeld: (() => boolean) | undefined;
|
|
244
257
|
try {
|
package/scripts/ux-sim.ts
CHANGED
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
// bun scripts/ux-sim.ts emit child-error-long --json # 사건 주입(L0): 격리 우주 원장에 주입 줄 → 소비자 목록
|
|
22
22
|
//
|
|
23
23
|
// catalog list/show 는 재사용 장치의 참조를 보여 준다. 선언된 TUI 장면은 실제 위젯 render() 를 부른다 — 흉내 렌더러가 아니다.
|
|
24
|
+
// catalog devices 는 장치별 진입 명령·logs/event·최근 사용 메타데이터를 읽기 전용으로 출력한다.
|
|
24
25
|
import { simRenderLogFrame } from '../src/ux-sim/render-frame.js';
|
|
25
26
|
import { simTypeaheadState, type TurnPhase, type TurnSimSpec } from '../src/ux-sim/turn-states.js';
|
|
26
27
|
import { renderTurnTypeaheadQueueRow, renderTurnTypeaheadEcho } from '../src/chat/turn-typeahead.js';
|
|
27
|
-
import { loadMockScenarioCatalog, renderMockScenarioDetails, renderMockScenarioList } from '../src/ux-sim/mock-scenario-catalog.js';
|
|
28
|
+
import { loadMockScenarioCatalog, renderMockScenarioDetails, renderMockScenarioDevices, renderMockScenarioList } from '../src/ux-sim/mock-scenario-catalog.js';
|
|
28
29
|
|
|
29
30
|
const PHASES: TurnPhase[] = [
|
|
30
31
|
'idle', 'thinking', 'streaming', 'streaming-with-subagents', 'harness-child', 'interrupted',
|
|
@@ -37,6 +38,11 @@ if (argv[0] === 'list') {
|
|
|
37
38
|
console.log(renderMockScenarioList(loadMockScenarioCatalog()).join('\n'));
|
|
38
39
|
process.exit(0);
|
|
39
40
|
}
|
|
41
|
+
if (argv[0] === 'devices') {
|
|
42
|
+
if (argv.length !== 1) { console.error('usage: bun scripts/ux-sim.ts devices'); process.exit(2); }
|
|
43
|
+
console.log(renderMockScenarioDevices(loadMockScenarioCatalog()).join('\n'));
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
40
46
|
if (argv[0] === 'show') {
|
|
41
47
|
if (argv.length !== 2) { console.error('usage: bun scripts/ux-sim.ts show <MS-id>'); process.exit(2); }
|
|
42
48
|
try {
|
|
@@ -16,6 +16,7 @@ type JsonObject = Record<string, unknown>;
|
|
|
16
16
|
|
|
17
17
|
export interface WarmPoolProviderConfig {
|
|
18
18
|
candidates: WarmWorkerCandidate[];
|
|
19
|
+
expandPoolTemplatesToQuota: boolean;
|
|
19
20
|
poolTemplates: Array<{
|
|
20
21
|
host: string;
|
|
21
22
|
tier: 'lite' | 'standard';
|
|
@@ -137,6 +138,9 @@ export function assembleWarmPoolProviderConfig(input: AssembleWarmPoolProviderCo
|
|
|
137
138
|
const imageRepository = text(pool.imageRepository, 'pod.warmPool.imageRepository').replace(/\/$/, '');
|
|
138
139
|
const imageDigest = text(pool.imageDigest, 'pod.warmPool.imageDigest');
|
|
139
140
|
if (!DIGEST.test(imageDigest)) throw new Error('pod.warmPool.imageDigest must be a sha256 digest');
|
|
141
|
+
const expandPoolTemplatesToQuota = pool.expandPoolTemplatesToQuota;
|
|
142
|
+
if (expandPoolTemplatesToQuota !== undefined && typeof expandPoolTemplatesToQuota !== 'boolean')
|
|
143
|
+
throw new Error('pod.warmPool.expandPoolTemplatesToQuota must be a boolean');
|
|
140
144
|
const lockHash = text(pool.lockHash, 'pod.warmPool.lockHash');
|
|
141
145
|
if (!LOCK_HASH.test(lockHash)) throw new Error('pod.warmPool.lockHash must be a 64-character SHA-256');
|
|
142
146
|
const architecture = text(pool.architecture, 'pod.warmPool.architecture');
|
|
@@ -170,7 +174,8 @@ export function assembleWarmPoolProviderConfig(input: AssembleWarmPoolProviderCo
|
|
|
170
174
|
},
|
|
171
175
|
};
|
|
172
176
|
});
|
|
173
|
-
return { candidates: [],
|
|
177
|
+
return { candidates: [], expandPoolTemplatesToQuota: expandPoolTemplatesToQuota === true,
|
|
178
|
+
poolTemplates, profileConfig: { pod: { warmPoolProfile: profile } },
|
|
174
179
|
controlUrl: controlUrl(input.controlUrl), memberToken: token(input.memberToken, 'member token'), machineTokens };
|
|
175
180
|
}
|
|
176
181
|
|
|
@@ -2,46 +2,106 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
export
|
|
5
|
+
export type GrokProbeStage = 'spawn' | 'first-byte' | 'auth' | 'connect' | 'response' | 'exit';
|
|
6
|
+
export interface GrokLoginProbeResult { ok: boolean; reason?: string; stage?: GrokProbeStage; durationMs?: number }
|
|
7
|
+
export interface GrokAuthProbeResult { status: number | null; stdout?: string; stderr?: string; error?: Error; stage?: GrokProbeStage; durationMs?: number }
|
|
8
|
+
export type GrokAuthProbe = (timeoutMs: number) => Promise<GrokAuthProbeResult> | GrokAuthProbeResult;
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
type ProbeChild = ReturnType<typeof spawn>;
|
|
11
|
+
type ProbeSpawner = typeof spawn;
|
|
12
|
+
|
|
13
|
+
export const runAuthProbe: (timeoutMs: number, spawnProcess?: ProbeSpawner) => Promise<GrokAuthProbeResult> = (timeoutMs, spawnProcess = spawn) => new Promise((resolve) => {
|
|
14
|
+
const startedAt = Date.now();
|
|
15
|
+
let stage: GrokProbeStage = 'spawn';
|
|
9
16
|
let stdout = '';
|
|
10
17
|
let stderr = '';
|
|
18
|
+
let pendingStderrLine = '';
|
|
19
|
+
let discardStderrLine = false;
|
|
11
20
|
let settled = false;
|
|
12
|
-
const
|
|
21
|
+
const capturedStderr = () => sanitizeStderr(`${stderr}${pendingStderrLine}`).slice(-8_000);
|
|
22
|
+
const appendStderr = (chunk: string) => {
|
|
23
|
+
let remaining = chunk;
|
|
24
|
+
if (discardStderrLine) {
|
|
25
|
+
const newline = remaining.indexOf('\n');
|
|
26
|
+
if (newline < 0) return;
|
|
27
|
+
remaining = remaining.slice(newline + 1);
|
|
28
|
+
discardStderrLine = false;
|
|
29
|
+
}
|
|
30
|
+
const lines = `${pendingStderrLine}${remaining}`.split('\n');
|
|
31
|
+
pendingStderrLine = lines.pop() ?? '';
|
|
32
|
+
if (lines.length) stderr = sanitizeStderr(`${stderr}${lines.join('\n')}`).slice(-8_000);
|
|
33
|
+
if (pendingStderrLine.length > 64_000) {
|
|
34
|
+
if (/(?:authorization\s*:\s*(?:basic|bearer|token|apikey|api[- ]key)|(?:api[_-]?key|api[_-]?token|access[_-]?key|secret|password|credential|auth[_-]?token|refresh[_-]?token))\s*[:=]/i.test(pendingStderrLine)) {
|
|
35
|
+
pendingStderrLine = '';
|
|
36
|
+
discardStderrLine = true;
|
|
37
|
+
} else {
|
|
38
|
+
pendingStderrLine = pendingStderrLine.slice(-8_000);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const finish = (result: GrokAuthProbeResult) => {
|
|
13
43
|
if (settled) return;
|
|
14
44
|
settled = true;
|
|
15
45
|
clearTimeout(timer);
|
|
16
|
-
resolve(result);
|
|
46
|
+
resolve({ ...result, stderr: capturedStderr(), stage: result.stage ?? stage, durationMs: Date.now() - startedAt });
|
|
17
47
|
};
|
|
18
|
-
const child =
|
|
48
|
+
const child: ProbeChild = spawnProcess(join(homedir(), '.grok', 'bin', 'grok'), ['-p', 'reply with just OK'], {
|
|
19
49
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
20
50
|
});
|
|
51
|
+
child.once('spawn', () => { stage = 'first-byte'; });
|
|
21
52
|
const timer = setTimeout(() => {
|
|
22
53
|
child.kill('SIGTERM');
|
|
23
|
-
finish({ status: null, stdout, stderr, error: new Error('Grok subscribed-access probe timed out') });
|
|
54
|
+
finish({ status: null, stdout, stderr: capturedStderr(), stage: classifyStage(capturedStderr(), stdout, stage), error: new Error('Grok subscribed-access probe timed out') });
|
|
24
55
|
}, Math.max(1, timeoutMs));
|
|
25
|
-
child.stdout?.setEncoding('utf8').on('data', (chunk: string) => { stdout = `${stdout}${chunk}`.slice(-8_000); });
|
|
26
|
-
child.stderr?.setEncoding('utf8').on('data', (chunk: string) => {
|
|
27
|
-
child.once('error', (error) => finish({ status: null, stdout, stderr, error }));
|
|
28
|
-
child.once('close', (status) => finish({ status, stdout, stderr }));
|
|
56
|
+
child.stdout?.setEncoding('utf8').on('data', (chunk: string) => { stage = 'response'; stdout = `${stdout}${chunk}`.slice(-8_000); });
|
|
57
|
+
child.stderr?.setEncoding('utf8').on('data', (chunk: string) => { appendStderr(chunk); stage = classifyStage(capturedStderr(), stdout, stage); });
|
|
58
|
+
child.once('error', (error) => finish({ status: null, stdout, stderr, stage, error }));
|
|
59
|
+
child.once('close', (status) => finish({ status, stdout, stderr, stage: classifyStage(stderr, stdout, 'exit') }));
|
|
29
60
|
});
|
|
30
61
|
|
|
31
62
|
/** Quick, credential-safe subscribed-access probe; whoami needs an interactive TTY in this CLI. */
|
|
32
63
|
export async function probeGrokLogin(run: GrokAuthProbe = runAuthProbe, timeoutMs = 45_000): Promise<GrokLoginProbeResult> {
|
|
33
64
|
const result = await run(timeoutMs);
|
|
65
|
+
const stage = result.stage ?? classifyStage(result.stderr ?? '', result.stdout ?? '', result.error ? 'first-byte' : 'exit');
|
|
66
|
+
const duration = result.durationMs === undefined ? {} : { durationMs: result.durationMs };
|
|
67
|
+
const details = formatDiagnostics(stage, result.durationMs, result.stderr);
|
|
34
68
|
if (result.error?.name === 'TimeoutError' || /timed out|ETIMEDOUT/i.test(result.error?.message ?? '')) {
|
|
35
|
-
return { ok: false, reason:
|
|
69
|
+
return { ok: false, stage, ...duration, reason: `Grok subscribed-access probe timed out ${details}` };
|
|
36
70
|
}
|
|
37
|
-
if (result.error) return { ok: false, reason:
|
|
71
|
+
if (result.error) return { ok: false, stage, ...duration, reason: `grok CLI could not be started ${details}` };
|
|
38
72
|
const output = `${result.stdout ?? ''}\n${result.stderr ?? ''}`.trim();
|
|
39
73
|
if (result.status !== 0 || /login required|not authenticated|unauthori[sz]ed|authentication failed/i.test(output)) {
|
|
40
74
|
const reason = /login required|not authenticated|unauthori[sz]ed|authentication failed/i.test(output)
|
|
41
|
-
?
|
|
42
|
-
: `Grok subscribed-access probe exited ${result.status ?? 'without a status'}`;
|
|
43
|
-
return { ok: false, reason };
|
|
75
|
+
? `Grok login unavailable; run grok login ${formatDiagnostics('auth', result.durationMs, result.stderr)}`
|
|
76
|
+
: `Grok subscribed-access probe exited ${result.status ?? 'without a status'} ${details}`;
|
|
77
|
+
return { ok: false, stage: /login required|not authenticated|unauthori[sz]ed|authentication failed/i.test(output) ? 'auth' : stage, ...duration, reason };
|
|
44
78
|
}
|
|
45
|
-
if (!/^OK\s*$/i.test((result.stdout ?? '').trim())) return { ok: false, reason:
|
|
46
|
-
return { ok: true };
|
|
79
|
+
if (!/^OK\s*$/i.test((result.stdout ?? '').trim())) return { ok: false, stage, ...duration, reason: `Grok subscribed-access probe did not return the expected OK reply ${details}` };
|
|
80
|
+
return { ok: true, stage, ...duration };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function classifyStage(stderr: string, stdout: string, fallback: GrokProbeStage): GrokProbeStage {
|
|
84
|
+
if (/login required|not authenticated|unauthori[sz]ed|authentication failed/i.test(stderr)) return 'auth';
|
|
85
|
+
if (/ECONN|ENOTFOUND|EHOST|network|connect(?:ion)? (?:refused|failed|timeout)|TLS|certificate/i.test(stderr)) return 'connect';
|
|
86
|
+
// Stderr can contain pre-response warnings; only stdout proves that a reply
|
|
87
|
+
// byte reached the caller.
|
|
88
|
+
if (stdout) return 'response';
|
|
89
|
+
return fallback;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function formatDiagnostics(stage: GrokProbeStage, durationMs?: number, stderr?: string): string {
|
|
93
|
+
const safeStderr = sanitizeStderr(stderr);
|
|
94
|
+
return `(${stage}${durationMs === undefined ? '' : ` after ${durationMs}ms`}${safeStderr ? `; stderr: ${safeStderr}` : '; stderr: <empty>'})`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function sanitizeStderr(stderr?: string): string {
|
|
98
|
+
return (stderr ?? '')
|
|
99
|
+
.replace(/(authorization\s*:\s*(?:basic|bearer|token|apikey|api[- ]key)\s+)\S+/gi, '$1[redacted]')
|
|
100
|
+
.replace(/(?:[A-Z0-9_]*(?:api[_-]?key|access[_-]?key|secret|password|credential|auth[_-]?token|refresh[_-]?token))\s*[:=]\s*(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\r\n]*)/gi, '[redacted credential]')
|
|
101
|
+
.replace(/Bearer\s+\S+/gi, 'Bearer [redacted]')
|
|
102
|
+
.replace(/(?:sk|xai|gsk|gh[pousr])-[A-Za-z0-9_-]{8,}/g, '[redacted-token]')
|
|
103
|
+
.replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[redacted-email]')
|
|
104
|
+
.replace(/\s+/g, ' ')
|
|
105
|
+
.trim()
|
|
106
|
+
.slice(-500);
|
|
47
107
|
}
|
|
@@ -6,7 +6,7 @@ import type { Command } from 'commander';
|
|
|
6
6
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
7
7
|
import type { AsyncLockHandle } from '../storage/file-lock.js';
|
|
8
8
|
import { stateDirSourceForChild } from '../agent/identity-env.js';
|
|
9
|
-
import { createMissionLineStore, MissionLineHttpError, postMissionLineEvent, type MissionLineType } from './mission-line.js';
|
|
9
|
+
import { createMissionLineStore, MissionLineHttpError, postMissionLineEvent, type MissionLineEvent, type MissionLineType } from './mission-line.js';
|
|
10
10
|
import type { LinearMissionLink } from '../intake-plane/linear-mission-sync.js';
|
|
11
11
|
|
|
12
12
|
const MISSION_CONTEXT_ENV = 'ELANOUS_MISSION_CONTEXT';
|
|
@@ -747,7 +747,7 @@ export function registerMissionOutCommand(program: Command, deps: {
|
|
|
747
747
|
...(opts.stop !== undefined ? { stop: opts.stop } : {}),
|
|
748
748
|
...(opts.priority !== undefined ? { priority: opts.priority } : {}),
|
|
749
749
|
};
|
|
750
|
-
let event: MissionReplyEvent;
|
|
750
|
+
let event: MissionReplyEvent | MissionLineEvent;
|
|
751
751
|
try {
|
|
752
752
|
const lineEvent = await postMissionLineEvent({
|
|
753
753
|
lineId, missionId, attemptId: lineAttemptId, agent: lineAgent,
|