elanous 0.2.42 → 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/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
- 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/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
- 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/1306.967240ede9a0f757.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.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/{6632.0eac1c554f8f2ef3.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/1850-522de4ee34957210.js +1 -0
- 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/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
- 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/2216.802962c04f40a26e.js +64 -0
- 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/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
- 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/2954.bbefc95d6b20e0d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
- 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/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
- 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/4393.28fa5228d0eec217.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.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/{1262.e804feb8fd1acb8c.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/{1063.2fb8a9dc55c731f2.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/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
- package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.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/5439.3fec6dbce29ecb36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
- 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/5790.5eb06a653ebd8571.js +34 -0
- 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/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.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/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.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/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
- 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/7010.1bbd17a7f2b3e376.js +1 -0
- 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/7679.32c40cdd14f20b4a.js +1 -0
- 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/{8138.6c10b2a356d52fca.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/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
- 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/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
- 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/9398.1f56e3f17795f43f.js +1 -0
- 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-da787e8a10b8a82e.js +1 -0
- 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/_next/static/css/d1f8bb401740a549.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/external-commands.yaml +5 -3
- package/catalog/meta/catalogVersion.yaml +2 -1
- package/catalog/signing/catalog-signing-public.pem +3 -0
- package/graphs/intake/intake-daily.yaml +16 -0
- package/graphs/intake/news-sources.yaml +1 -0
- package/graphs/intake/recipes.yaml +7 -0
- package/graphs/overlays/README.md +6 -0
- package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/release/release-loop.yaml +33 -17
- package/graphs/units/verbs/make-doc.yaml +1 -0
- package/package.json +6 -2
- package/plugins/demo-absorption-briefing/plugin.json +18 -0
- package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
- package/plugins/demo-browser-hand/plugin.json +13 -0
- package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
- package/plugins/demo-linear-secretary/plugin.json +15 -0
- package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
- package/plugins/demo-plugin-wizard/plugin.json +11 -0
- package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
- package/plugins/demo-research/plugin.json +16 -0
- package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
- package/plugins/demo-video-briefing/plugin.json +15 -0
- package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
- package/scripts/bench-metering-plan.ts +229 -0
- package/scripts/build-signed-catalog.ts +48 -0
- package/scripts/ci-typecheck-main-delta.sh +88 -0
- package/scripts/codex-fallback-live-probe.ts +1 -1
- package/scripts/demo/demo1104-parallel-host.ts +56 -0
- package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
- package/scripts/demo/demo1104-parallel.ts +72 -0
- package/scripts/demo/demo1104-stage.config.ts +21 -0
- package/scripts/demo/demo1104-stage.ts +316 -0
- package/scripts/goal-method-audit.ts +17 -1
- package/scripts/graph-units/land-enqueue.ts +90 -0
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/landing-heal/land-plan.ts +57 -0
- package/scripts/public-leak-baseline.txt +0 -1
- package/scripts/release-loop/auto-approve-node.ts +1 -1
- package/scripts/release-loop/docs-node.ts +4 -2
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- package/scripts/release-loop/gate-image-pin.ts +116 -2
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node.ts +395 -43
- package/scripts/release-loop/gate-progress-sim.ts +73 -0
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/notes-repair.ts +18 -1
- package/scripts/release-loop/preflight.ts +544 -10
- 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/unattended-release.ts +20 -9
- package/scripts/release-loop/warm-control-forward.ts +178 -0
- package/scripts/retro-cycle.ts +30 -8
- package/scripts/rhythm/daily.ts +39 -4
- package/scripts/rhythm/linear-progress-sync.ts +311 -0
- package/scripts/ux-sim.ts +7 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +35 -7
- package/src/acp/agent-manager.ts +1 -0
- package/src/acp/codex-app-server-agent.ts +33 -0
- package/src/acp/codex-app-server-client.ts +153 -16
- package/src/acp/core-turn-bridge.ts +17 -12
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -0
- package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
- package/src/agent-mission/claude-headless.ts +4 -1
- package/src/agent-mission/codex-exec.ts +105 -0
- package/src/agent-mission/driver.ts +192 -11
- package/src/agent-mission/grok-auth-status.ts +107 -0
- package/src/agent-mission/hand-hooks.ts +101 -0
- package/src/agent-mission/mission-cli.ts +56 -21
- package/src/agent-mission/mission-hand-reply.ts +118 -0
- package/src/agent-mission/mission-line.ts +180 -0
- package/src/agent-mission/mission-out.ts +256 -18
- package/src/agent-mission/tool-install.ts +122 -11
- package/src/agent-substrate/pr-reviewer.ts +147 -11
- package/src/agent-substrate/self-review-cli.ts +10 -2
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-fanout.ts +221 -0
- package/src/auto-research/research-turn.ts +362 -31
- package/src/autopilot/mission-codebase-gate.ts +7 -3
- package/src/autopilot/pr-manager.ts +31 -3
- package/src/boot/daemon-tools/self-implement.ts +3 -1
- package/src/boot/daemon-tools/web-search.ts +1 -2
- package/src/briefing/brief-items.ts +55 -11
- package/src/cli/agent-cli.ts +2 -1
- package/src/cli/catalog-cli.ts +31 -0
- package/src/cli/connector-cli.ts +16 -0
- package/src/cli/control-cli.ts +15 -6
- package/src/cli/doctor-fix.ts +2 -2
- package/src/cli/intake-source-cli.ts +44 -8
- package/src/cli/log-event-names.ts +8 -0
- package/src/cli/msg-cli.ts +32 -3
- package/src/cli/pr-cli.ts +21 -1
- package/src/cli/pr-land-heavy-remote.ts +44 -6
- package/src/cli/pr-land-overlap-evidence.ts +13 -1
- package/src/cli/pr-land-pod-shadow-job.ts +143 -5
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +44 -16
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +9 -0
- package/src/cli/setup-cli.ts +166 -6
- package/src/cli/setup-keys.ts +199 -0
- package/src/cli/task-plugin-wizard-host.ts +114 -0
- package/src/cli/tasks-cli.ts +54 -9
- package/src/cli/tui-test-cli.ts +190 -0
- package/src/config.ts +4 -2
- package/src/connectors/linear-daily-progress.ts +228 -0
- package/src/connectors/linear-projector.ts +34 -12
- package/src/connectors/linear.ts +151 -7
- 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/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +43 -0
- package/src/core-turn/run-core-turn.ts +488 -51
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
- package/src/dashboard/classic-sidetab-mission.ts +169 -5
- package/src/dashboard/index.ts +387 -14
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
- package/src/dashboard/mission-cli-consumer.ts +20 -8
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/sidetab-runtime.ts +3 -1
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/visible-mission-diagnostics.ts +16 -0
- package/src/decisions/linear-progress-summary.ts +78 -0
- package/src/decisions/linear-progress-sync.ts +152 -0
- package/src/domains/outbound-alert.ts +49 -11
- 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/domains/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-cli.ts +24 -1
- package/src/graph-runner/graph-grow-llm.ts +3 -1
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/runner.ts +310 -46
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/harness/dispatch-backpressure.ts +54 -1
- package/src/harness/dispatch-shadow-compare.ts +74 -0
- package/src/harness/harness-cli-command.ts +15 -3
- package/src/harness/harness-pod-dispatch.ts +3 -0
- package/src/harness/skill-exec.ts +21 -9
- package/src/harness/skill-select.ts +1 -1
- package/src/hooks/error-report-cloud.ts +101 -0
- package/src/hooks/receiver.ts +29 -2
- package/src/index.ts +129 -12
- package/src/intake-plane/actions.ts +354 -0
- package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
- package/src/intake-plane/intake-sources.ts +78 -8
- package/src/intake-plane/items.ts +14 -4
- package/src/intake-plane/linear-mission-sync.ts +80 -0
- package/src/intake-plane/linear-secretary-runtime.ts +178 -0
- package/src/intake-plane/linear-wish.ts +227 -1
- package/src/life/life-cli.ts +168 -0
- package/src/life/life-kinds.ts +160 -0
- package/src/live-supply/budget-consumer.ts +78 -0
- package/src/live-supply/read.ts +3 -0
- package/src/live-supply/snapshot.ts +45 -0
- package/src/llm/child-first-llm-observation.ts +112 -0
- package/src/llm/provider-credentials.ts +68 -6
- package/src/llm/provider-failure-evidence.ts +44 -0
- package/src/llm.ts +172 -12
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/mcp/client.ts +7 -0
- package/src/mcp/proxy-runtime.ts +6 -1
- package/src/mcp/server.ts +54 -0
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +36 -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/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -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 +22 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/grokbot-adapter.ts +71 -0
- package/src/nexus/outbound/router.ts +121 -16
- package/src/nexus/setup-status.ts +9 -0
- package/src/nexus/state/state.ts +3 -0
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-owner-mirror.ts +81 -0
- package/src/oauth/codex.ts +17 -2
- package/src/oauth/fallback-chain.ts +47 -17
- package/src/onboarding/first-run-doctor.ts +8 -1
- package/src/onboarding/first-run.ts +126 -29
- package/src/onboarding/key-setup.ts +103 -0
- package/src/onboarding/menu-answer.ts +13 -0
- package/src/onboarding/secret-prompt.ts +37 -0
- package/src/plugins/install/plugin-install.ts +59 -0
- package/src/pr-tool/census.ts +130 -0
- package/src/preview/terminal.ts +22 -7
- package/src/prompt-enhance/enhance.ts +10 -0
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-write-provenance.ts +21 -3
- package/src/pty-shell/registry.ts +9 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/release-loop/proposal-auto-place.ts +83 -0
- package/src/research/axis-fanout.ts +79 -29
- package/src/research/lenses/second-order.ts +312 -0
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/dev-cli.ts +7 -2
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- package/src/self-dev/draft-sweep.ts +31 -10
- package/src/self-dev/draft-triage-rules.ts +60 -3
- package/src/self-dev/graph-front-nodes.ts +2 -1
- package/src/self-dev/graph-journey-route.ts +76 -21
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +1 -1
- package/src/self-dev/run-supervisor.ts +152 -2
- package/src/self-dev/shard-aggregate.ts +4 -0
- package/src/self-dev/shard-run.ts +36 -15
- package/src/self-implement/abandoned-classification.ts +12 -3
- package/src/self-implement/budget-gate.ts +7 -0
- package/src/self-implement/child-llm-preference.ts +10 -1
- package/src/self-implement/doctor-visit.ts +30 -8
- package/src/self-implement/elanous-tui-spawn.ts +3 -0
- package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
- package/src/self-implement/gate-artifacts.ts +2 -1
- package/src/self-implement/goal-author-cli.ts +4 -2
- package/src/self-implement/goal-author.ts +549 -10
- package/src/self-implement/graph-overlay-yaml.ts +181 -4
- package/src/self-implement/graph-overlay.ts +3 -1
- package/src/self-implement/graph-profile-yaml.ts +107 -0
- package/src/self-implement/graph-yaml.ts +94 -5
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +298 -26
- package/src/self-implement/run-chart.ts +6 -3
- package/src/self-implement/run-ledger.ts +51 -1
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/tdd-evidence-tags.ts +9 -0
- package/src/self-implement/test-scenario-request.ts +37 -6
- package/src/self-implement/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +6 -4
- package/src/session/session-fanout.ts +2 -0
- package/src/session/streaming/acp-stream-sink.ts +2 -1
- package/src/session/streaming/chunk-producer.ts +6 -0
- package/src/session/streaming/stream-compositor.ts +3 -2
- package/src/session-runtime/index.ts +74 -6
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/setup/llm-env-detect.ts +3 -0
- package/src/setup/service-key-catalog.ts +46 -0
- package/src/setup/service-keys.ts +241 -0
- 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 +182 -48
- package/src/skills/tools/agent.ts +23 -4
- package/src/skills/tools/omni-search.ts +127 -27
- package/src/task-agent/parent-host.ts +29 -1
- package/src/task-agent/recall-inject.ts +98 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +46 -14
- package/src/task-orchestrator/dispatcher.ts +14 -1
- package/src/task-orchestrator/linear-capture-events.ts +55 -0
- package/src/task-orchestrator/store.ts +16 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
- package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
- package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
- package/src/task-orchestrator/types.ts +14 -0
- package/src/telegram.ts +14 -16
- package/src/terminal/coding-agent.ts +14 -5
- package/src/terminal/session-registry.ts +1 -1
- package/src/tool-hints/gate.ts +46 -14
- package/src/tool-hints/signals.ts +1 -1
- package/src/tool-hints/types.ts +2 -0
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/browser-hand-runtime.ts +391 -0
- package/src/tool-runtime/browser-runtime.ts +33 -19
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/types.ts +5 -0
- package/src/tui/entry.ts +51 -8
- package/src/tui/sidetab/attach.ts +252 -11
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui/sidetab/list.ts +3 -2
- package/src/tui-client/next-dashboard-runtime.ts +52 -0
- package/src/user-config.ts +34 -9
- package/src/user-intent/types.ts +4 -3
- package/src/ux-sim/browser-hand.ts +165 -0
- package/src/ux-sim/draft-inventory-builder.ts +199 -0
- package/src/ux-sim/fake-browser-page.ts +81 -0
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/graph-engine-sim.ts +47 -0
- package/src/ux-sim/linear-secretary.ts +208 -0
- package/src/ux-sim/mock-scenario-catalog.json +81 -26
- package/src/ux-sim/mock-scenario-catalog.ts +175 -5
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/release-sim-rig.ts +62 -18
- package/src/ux-sim/scenario.ts +70 -26
- package/src/ux-sim/service-key-setup.ts +113 -0
- package/src/ux-sim/term-slash-device.ts +74 -0
- package/src/ux-sim/turn-throw-sim.ts +31 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/index.ts +30 -9
- package/src/web-search/provider.ts +4 -1
- package/src/web-search/x-intent.ts +5 -0
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
- package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
- package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
|
@@ -548,10 +548,37 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
548
548
|
return fail('PR changed before superseding draft');
|
|
549
549
|
const newRef = `refs/heads/${input.branch}`;
|
|
550
550
|
if (!run('git', ['-C', cwd, 'check-ref-format', '--branch', input.branch]).ok) return fail('new run branch name invalid');
|
|
551
|
-
const newRemote = run('git', ['-C', cwd, 'ls-remote', '--heads', 'origin', newRef]);
|
|
552
|
-
if (!newRemote.ok || newRemote.out.trim()) return fail('new run branch already exists or remote unreadable');
|
|
553
551
|
const localHead = run('git', ['-C', cwd, 'rev-parse', 'HEAD']);
|
|
554
|
-
|
|
552
|
+
const localHeadSha = localHead.out.trim();
|
|
553
|
+
if (!localHead.ok || !/^[0-9a-f]{40}$/i.test(localHeadSha)) return fail('new run head unreadable');
|
|
554
|
+
const newRemote = run('git', ['-C', cwd, 'ls-remote', '--heads', 'origin', newRef]);
|
|
555
|
+
if (!newRemote.ok) return fail('new run branch already exists or remote unreadable');
|
|
556
|
+
let retryBranchAlreadyExists = false;
|
|
557
|
+
if (newRemote.out.trim()) {
|
|
558
|
+
if (newRemote.out.trim() !== `${localHeadSha}\t${newRef}`) return fail('new run branch already exists or remote unreadable');
|
|
559
|
+
const existingDrafts = run('gh', ['pr', 'list', '--head', input.branch, '--state', 'open', '--json', 'url'], { cwd });
|
|
560
|
+
let existingRows: Array<{ url?: unknown }>;
|
|
561
|
+
try { existingRows = JSON.parse(existingDrafts.out) as Array<{ url?: unknown }>; }
|
|
562
|
+
catch { return fail('existing retry draft listing malformed'); }
|
|
563
|
+
if (!existingDrafts.ok) return fail('existing retry draft lookup failed');
|
|
564
|
+
if (!existingRows.length) retryBranchAlreadyExists = true;
|
|
565
|
+
else {
|
|
566
|
+
if (existingRows.length !== 1 || typeof existingRows[0]?.url !== 'string') return fail('existing retry draft lookup ambiguous');
|
|
567
|
+
const existingUrl = existingRows[0].url;
|
|
568
|
+
const existingView = run('gh', ['pr', 'view', existingUrl, '--json', 'state,isDraft,headRefOid,headRefName,body,url'], { cwd });
|
|
569
|
+
let existingFields: Record<string, unknown>;
|
|
570
|
+
try { existingFields = JSON.parse(existingView.out) as Record<string, unknown>; }
|
|
571
|
+
catch { return fail('existing retry draft identity malformed'); }
|
|
572
|
+
if (!existingView.ok || existingFields.state !== 'OPEN' || existingFields.isDraft !== true
|
|
573
|
+
|| existingFields.headRefOid !== localHeadSha || existingFields.headRefName !== input.branch
|
|
574
|
+
|| existingFields.url !== existingUrl || typeof existingFields.body !== 'string'
|
|
575
|
+
|| cellIdFromBody(existingFields.body) !== cellIdFromBody(input.body)
|
|
576
|
+
|| cardIdFromBody(existingFields.body) !== cardIdFromBody(input.body))
|
|
577
|
+
return fail('existing retry draft identity mismatch');
|
|
578
|
+
return { ok: true, url: existingUrl, reused: true };
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
if (!retryBranchAlreadyExists) {
|
|
555
582
|
// Upload the commit through a unique scratch ref. GitHub's create-ref API then
|
|
556
583
|
// atomically refuses a concurrent writer of the intended branch name.
|
|
557
584
|
const runKey = input.runId ? runSuffixKey(input.runId) : null;
|
|
@@ -590,6 +617,7 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
590
617
|
: { ok: false, out: '', err: 'repository identity unavailable' };
|
|
591
618
|
reapScratchRef(createdRef.ok ? 'branch-created' : 'create-refused');
|
|
592
619
|
if (!createdRef.ok) return fail(`new run branch create refused: ${(createdRef.err || createdRef.out).slice(0, 220)}`);
|
|
620
|
+
}
|
|
593
621
|
const stateLabels = new Set(labelsForAxis('state').map(label => label.name));
|
|
594
622
|
const labels = [...new Set([...(input.labels ?? []).filter(label => !stateLabels.has(label as typeof PR_LABEL_NAMES.running)),
|
|
595
623
|
PR_LABEL_NAMES.running, ...(input.seat ? [`seat:${input.seat}`] : [])])];
|
|
@@ -30,7 +30,7 @@ import { debug } from '../../debug/log.js';
|
|
|
30
30
|
import { globalAgentRegistry, type AgentRegistry } from '../../agent/registry.js';
|
|
31
31
|
import type { TaskNotificationQueue } from '../../agent/task-notification.js';
|
|
32
32
|
import { effectiveInstanceRoot } from '../../instance/resolve.js';
|
|
33
|
-
import { writeAuthoredGoal } from '../../self-implement/goal-author.js';
|
|
33
|
+
import { resolveGoalAuthorReviewerPrecheckEnabled, writeAuthoredGoal } from '../../self-implement/goal-author.js';
|
|
34
34
|
import { selfAnswerOrAssumeGoalDocumentClarifications, type GoalClarificationSelfResolver } from '../../self-implement/goal-author-clarification.js';
|
|
35
35
|
import { writeGoalDocumentAtomic } from '../../self-implement/goal-document-write.js';
|
|
36
36
|
import { DecisionLedger } from '../../decisions/decision-ledger.js';
|
|
@@ -220,6 +220,7 @@ type SelfImplementGoalAuthor = (ask: string, cwd: string, deps?: {
|
|
|
220
220
|
goalTitle?: string;
|
|
221
221
|
decomposeSteps?: (objective: string, opts?: { context?: string }) => Promise<readonly string[]>;
|
|
222
222
|
onProgress?: (phase: import('../../self-implement/goal-author.js').GoalAuthorPhase, event: 'start' | 'end') => void;
|
|
223
|
+
reviewerPrecheckEnabled?: boolean;
|
|
223
224
|
}) => Promise<{ path: string }>;
|
|
224
225
|
|
|
225
226
|
const GOAL_ORIGINAL_TEXT_LIMIT = null;
|
|
@@ -328,6 +329,7 @@ export async function dispatchSelfImplement(
|
|
|
328
329
|
const recentStepCounts = readRecentStepCountsFailOpen(recentStepCountReader);
|
|
329
330
|
goalFile = (await authorGoal(goalSourceText, ctx.cwd, {
|
|
330
331
|
goalTitle: feature,
|
|
332
|
+
reviewerPrecheckEnabled: resolveGoalAuthorReviewerPrecheckEnabled(),
|
|
331
333
|
decomposeSteps: createDecomposeSteps(ctx.signal, {
|
|
332
334
|
repositoryRoot: ctx.cwd,
|
|
333
335
|
...(adversarialReview !== undefined ? { adversarialReview } : {}),
|
|
@@ -40,8 +40,7 @@ export function buildWebSearchTool(): LLMToolSpec {
|
|
|
40
40
|
return {
|
|
41
41
|
name: 'WebSearch',
|
|
42
42
|
description:
|
|
43
|
-
'Search the public web via
|
|
44
|
-
'Firecrawl / etc.). When no key is available, falls back to keyless DuckDuckGo. ' +
|
|
43
|
+
'Search the public web via Exa then Firecrawl; X/Twitter intent may use Grok. ' +
|
|
45
44
|
'Returns a ranked list of URLs + titles + snippets. ' +
|
|
46
45
|
'For fact questions, answer directly from the snippets and URLs; read the full body only when insufficient. ' +
|
|
47
46
|
'Pair with a follow-up Read or external WebFetch when the model needs ' +
|
|
@@ -32,6 +32,10 @@ export interface BriefItem {
|
|
|
32
32
|
deadline: string | null;
|
|
33
33
|
evidence: string | null;
|
|
34
34
|
source: string;
|
|
35
|
+
/** Existing Linear issue identifier; this is the secretary contract key. */
|
|
36
|
+
issue_ref?: string | null;
|
|
37
|
+
/** Parent Linear issue UUID used by the Linear comment projector. */
|
|
38
|
+
linearIssueId?: string | null;
|
|
35
39
|
created_at: string;
|
|
36
40
|
sent_at: string | null;
|
|
37
41
|
}
|
|
@@ -43,6 +47,9 @@ export interface AddBriefItem {
|
|
|
43
47
|
deadline?: string | null;
|
|
44
48
|
evidence?: string | null;
|
|
45
49
|
source: string;
|
|
50
|
+
/** Reuses the Linear secretary issue identifier; no intake-specific key is created. */
|
|
51
|
+
issueRef?: string | null;
|
|
52
|
+
linearIssueId?: string;
|
|
46
53
|
createdAt?: string;
|
|
47
54
|
/** Optional normalized claim identity and time window for repeat observations. */
|
|
48
55
|
dedupeKey?: string;
|
|
@@ -185,6 +192,7 @@ function itemLine(item: BriefItem): string {
|
|
|
185
192
|
const extra = [
|
|
186
193
|
item.deadline ? `마감: ${item.deadline}` : '',
|
|
187
194
|
item.evidence ? `근거: ${item.evidence}` : '',
|
|
195
|
+
item.issue_ref ? `관련 이슈: ${item.issue_ref}` : '',
|
|
188
196
|
`출처: ${item.source}`,
|
|
189
197
|
].filter(Boolean).join(' · ');
|
|
190
198
|
return `- [${item.priority}] ${item.text} (${extra})`;
|
|
@@ -207,6 +215,7 @@ function migrateLegacyItems(db: Database, log: (category: string, event: string,
|
|
|
207
215
|
deadline TEXT,
|
|
208
216
|
evidence TEXT,
|
|
209
217
|
source TEXT NOT NULL,
|
|
218
|
+
linear_issue_id TEXT,
|
|
210
219
|
created_at TEXT NOT NULL,
|
|
211
220
|
sent_at TEXT
|
|
212
221
|
)`);
|
|
@@ -222,6 +231,12 @@ function migrateLegacyItems(db: Database, log: (category: string, event: string,
|
|
|
222
231
|
log('briefing.items', 'migrated-legacy', { rows: (db.query('SELECT COUNT(*) AS n FROM items_v1').get() as { n: number }).n });
|
|
223
232
|
}
|
|
224
233
|
|
|
234
|
+
function briefItem(row: BriefItem): BriefItem {
|
|
235
|
+
if (row.issue_ref != null) return row;
|
|
236
|
+
const { issue_ref: _issueRef, ...legacy } = row;
|
|
237
|
+
return legacy;
|
|
238
|
+
}
|
|
239
|
+
|
|
225
240
|
/** Append-only briefing item ledger at `<state>/briefing/items.sqlite`. */
|
|
226
241
|
export class BriefItemsLedger {
|
|
227
242
|
readonly path: string;
|
|
@@ -251,6 +266,8 @@ export class BriefItemsLedger {
|
|
|
251
266
|
deadline TEXT,
|
|
252
267
|
evidence TEXT,
|
|
253
268
|
source TEXT NOT NULL,
|
|
269
|
+
issue_ref TEXT,
|
|
270
|
+
linear_issue_id TEXT,
|
|
254
271
|
created_at TEXT NOT NULL,
|
|
255
272
|
sent_at TEXT
|
|
256
273
|
);
|
|
@@ -284,8 +301,11 @@ export class BriefItemsLedger {
|
|
|
284
301
|
update_id TEXT NOT NULL,
|
|
285
302
|
PRIMARY KEY (bot_id, chat_id, update_id)
|
|
286
303
|
);`);
|
|
287
|
-
|
|
288
|
-
|
|
304
|
+
const columns = db.query("SELECT name FROM pragma_table_info('items')").all() as { name: string }[];
|
|
305
|
+
if (!columns.some(column => column.name === 'dedupe_key')) db.exec('ALTER TABLE items ADD COLUMN dedupe_key TEXT');
|
|
306
|
+
if (!columns.some(column => column.name === 'issue_ref')) db.exec('ALTER TABLE items ADD COLUMN issue_ref TEXT');
|
|
307
|
+
if (!columns.some(column => column.name === 'linear_issue_id')) {
|
|
308
|
+
db.exec('ALTER TABLE items ADD COLUMN linear_issue_id TEXT');
|
|
289
309
|
}
|
|
290
310
|
db.exec('CREATE INDEX IF NOT EXISTS items_dedupe ON items(source, dedupe_key, created_at)');
|
|
291
311
|
return work(db);
|
|
@@ -301,6 +321,9 @@ export class BriefItemsLedger {
|
|
|
301
321
|
if (!(BRIEF_DOMAINS as readonly string[]).includes(input.domain)) throw new BriefItemsInputError('invalid domain');
|
|
302
322
|
if (!(BRIEF_PRIORITIES as readonly string[]).includes(input.priority)) throw new BriefItemsInputError('invalid priority');
|
|
303
323
|
const source = required(input.source, 'source');
|
|
324
|
+
if (input.linearIssueId !== undefined && !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(input.linearIssueId)) {
|
|
325
|
+
throw new BriefItemsInputError('invalid Linear issue UUID');
|
|
326
|
+
}
|
|
304
327
|
const deadline = optional(input.deadline, 'deadline');
|
|
305
328
|
// Every field that reaches the composed Markdown is one line, so no stored item can forge a heading or entry (ACP must-fix).
|
|
306
329
|
for (const [field, value] of [['source', source], ['evidence', input.evidence ?? null], ['deadline', deadline]] as const) {
|
|
@@ -311,6 +334,8 @@ export class BriefItemsLedger {
|
|
|
311
334
|
if (!format.test(deadline) || !Number.isFinite(Date.parse(deadline))) throw new BriefItemsInputError('invalid deadline');
|
|
312
335
|
}
|
|
313
336
|
const evidence = optional(input.evidence, 'evidence');
|
|
337
|
+
const issueRef = optional(input.issueRef, 'issueRef');
|
|
338
|
+
if (issueRef !== null && /[\r\n]/.test(issueRef)) throw new BriefItemsInputError('issueRef must be a single line');
|
|
314
339
|
const createdAt = input.createdAt ?? this.now().toISOString();
|
|
315
340
|
if (!Number.isFinite(Date.parse(createdAt))) throw new BriefItemsInputError('invalid createdAt');
|
|
316
341
|
const dedupeKey = input.dedupeKey === undefined ? null : normalizeClaim(required(input.dedupeKey, 'dedupeKey'));
|
|
@@ -319,7 +344,7 @@ export class BriefItemsLedger {
|
|
|
319
344
|
throw new BriefItemsInputError('invalid dedupe window');
|
|
320
345
|
}
|
|
321
346
|
const selected = this.using(db => {
|
|
322
|
-
const select = 'SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items WHERE id = ?';
|
|
347
|
+
const select = 'SELECT id, text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id AS linearIssueId, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items WHERE id = ?';
|
|
323
348
|
db.exec('BEGIN IMMEDIATE');
|
|
324
349
|
try {
|
|
325
350
|
if (dedupeKey !== null && windowMs !== undefined) {
|
|
@@ -329,15 +354,15 @@ export class BriefItemsLedger {
|
|
|
329
354
|
AND julianday(created_at) <= julianday(?) ORDER BY id DESC LIMIT 1`)
|
|
330
355
|
.get(source, dedupeKey, createdAt, windowMs, createdAt) as { id: number } | null;
|
|
331
356
|
if (existing) {
|
|
332
|
-
const item = db.query(select).get(existing.id) as BriefItem;
|
|
357
|
+
const item = briefItem(db.query(select).get(existing.id) as BriefItem);
|
|
333
358
|
db.exec('COMMIT');
|
|
334
359
|
return { item, added: false };
|
|
335
360
|
}
|
|
336
361
|
}
|
|
337
362
|
const result = db.query(
|
|
338
|
-
'INSERT INTO items (text, domain, priority, deadline, evidence, source, created_at, sent_at, dedupe_key) VALUES (?, ?, ?, ?, ?, ?, ?, NULL, ?)',
|
|
339
|
-
).run(text, input.domain, input.priority, deadline, evidence, source, createdAt, dedupeKey);
|
|
340
|
-
const item = db.query(select).get(result.lastInsertRowid) as BriefItem;
|
|
363
|
+
'INSERT INTO items (text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id, created_at, sent_at, dedupe_key) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?)',
|
|
364
|
+
).run(text, input.domain, input.priority, deadline, evidence, source, issueRef, input.linearIssueId ?? null, createdAt, dedupeKey);
|
|
365
|
+
const item = briefItem(db.query(select).get(result.lastInsertRowid) as BriefItem);
|
|
341
366
|
db.exec('COMMIT');
|
|
342
367
|
return { item, added: true };
|
|
343
368
|
} catch (cause) {
|
|
@@ -434,9 +459,13 @@ export class BriefItemsLedger {
|
|
|
434
459
|
|
|
435
460
|
/** Insertion order. Optional domain filter. Item text is the stored original. */
|
|
436
461
|
list(filters: { domain?: BriefDomain } = {}): BriefItem[] {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
462
|
+
const rows = this.using(db => {
|
|
463
|
+
const select = 'SELECT id, text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id AS linearIssueId, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items';
|
|
464
|
+
return filters.domain === undefined
|
|
465
|
+
? db.query(`${select} ORDER BY id`).all()
|
|
466
|
+
: db.query(`${select} WHERE domain = ? ORDER BY id`).all(filters.domain);
|
|
467
|
+
}) as BriefItem[];
|
|
468
|
+
return rows.map(briefItem);
|
|
440
469
|
}
|
|
441
470
|
|
|
442
471
|
/**
|
|
@@ -450,7 +479,7 @@ export class BriefItemsLedger {
|
|
|
450
479
|
}
|
|
451
480
|
|
|
452
481
|
private itemsFromDb(db: Database): BriefItem[] {
|
|
453
|
-
return db.query('SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all() as BriefItem[];
|
|
482
|
+
return (db.query('SELECT id, text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id AS linearIssueId, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all() as BriefItem[]).map(briefItem);
|
|
454
483
|
}
|
|
455
484
|
|
|
456
485
|
private pageFromDb(db: Database, slot: BriefSendSlot): { markdown: string; ids: number[] } {
|
|
@@ -562,3 +591,18 @@ export class BriefItemsLedger {
|
|
|
562
591
|
return this.using(db => db.transaction(() => this.markSentInDb(db, ids, slot))());
|
|
563
592
|
}
|
|
564
593
|
}
|
|
594
|
+
|
|
595
|
+
export interface IntakeDailyBrief {
|
|
596
|
+
orchestrationId: string;
|
|
597
|
+
markdown: string;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
function orchestrationId(): string {
|
|
601
|
+
return globalThis.crypto?.randomUUID?.() ?? `intake-brief-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/** Graph entrypoint for the daily 08:30 briefing; requirement-funnel items stay ephemeral. */
|
|
605
|
+
export function composeIntakeDailyBrief(options: BriefItemsOptions = {}): IntakeDailyBrief {
|
|
606
|
+
const ledger = new BriefItemsLedger(options);
|
|
607
|
+
return { orchestrationId: orchestrationId(), markdown: ledger.compose('08:30') };
|
|
608
|
+
}
|
package/src/cli/agent-cli.ts
CHANGED
|
@@ -540,7 +540,7 @@ export async function runChatTurnCli(opts: {
|
|
|
540
540
|
tools = built;
|
|
541
541
|
dispatchTool = (name, args) => built.dispatch(name, args, { signal: toolAbort.signal });
|
|
542
542
|
enabledToolNames = built.specs.map(s => s.name);
|
|
543
|
-
process.
|
|
543
|
+
process.on('SIGINT', abortToolsOnSigint);
|
|
544
544
|
}
|
|
545
545
|
// Wire the universal preamble (project anchor + project tree +
|
|
546
546
|
// family addendum + session-specific guidance) into every CLI system
|
|
@@ -600,6 +600,7 @@ export async function runChatTurnCli(opts: {
|
|
|
600
600
|
userConfig: opts.cfg,
|
|
601
601
|
sessionId: session.id,
|
|
602
602
|
userText: opts.userText,
|
|
603
|
+
...(opts.surface === 'ask' ? { utteranceSurface: 'ask' as const } : {}),
|
|
603
604
|
systemPrompt: agentSystemPrompt,
|
|
604
605
|
onDelta: (d) => {
|
|
605
606
|
replyChunks.push(d);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { refreshServerCatalog } from '../registry/catalog-server.js';
|
|
3
|
+
import { reloadCatalog } from '../registry/loader.js';
|
|
4
|
+
|
|
5
|
+
export interface CatalogCliDeps {
|
|
6
|
+
refresh?: typeof refreshServerCatalog;
|
|
7
|
+
reload?: typeof reloadCatalog;
|
|
8
|
+
write?: (line: string) => void;
|
|
9
|
+
setExitCode?: (code: number) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function registerCatalogCommands(program: Command, deps: CatalogCliDeps = {}): void {
|
|
13
|
+
const catalog = program.command('catalog').description('서명된 LLM 모델 카탈로그 관리');
|
|
14
|
+
catalog.command('refresh')
|
|
15
|
+
.description('서버 카탈로그를 서명·판 검증 후 로컬 캐시에 갱신')
|
|
16
|
+
.option('--json', '구조화 결과')
|
|
17
|
+
.option('--url <url>', '카탈로그 서버 주소 재정의(검증된 서명만 수용)')
|
|
18
|
+
.action(async (opts: { json?: boolean; url?: string }) => {
|
|
19
|
+
const result = await (deps.refresh ?? refreshServerCatalog)(opts.url ? { url: opts.url } : {});
|
|
20
|
+
const write = deps.write ?? ((line: string) => console.log(line));
|
|
21
|
+
if (result.ok) {
|
|
22
|
+
(deps.reload ?? reloadCatalog)();
|
|
23
|
+
const output = { outcome: 'updated', catalogVersion: result.payload.catalogVersion };
|
|
24
|
+
write(opts.json ? JSON.stringify(output) : `카탈로그 갱신 완료 · v${output.catalogVersion}`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const output = { outcome: 'failed', reason: result.reason };
|
|
28
|
+
write(opts.json ? JSON.stringify(output) : `카탈로그 갱신 실패 · ${output.reason}`);
|
|
29
|
+
(deps.setExitCode ?? ((code: number) => { process.exitCode = code; }))(1);
|
|
30
|
+
});
|
|
31
|
+
}
|
package/src/cli/connector-cli.ts
CHANGED
|
@@ -28,6 +28,7 @@ export interface ConnectorCliDeps {
|
|
|
28
28
|
log?: typeof debug.log;
|
|
29
29
|
bearerToken?: string;
|
|
30
30
|
readKey?: () => Promise<string>;
|
|
31
|
+
stateDir?: string;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
async function setLinearSecret(id: string, deps: ConnectorCliDeps): Promise<number> {
|
|
@@ -202,3 +203,18 @@ export async function runLinearSync(opts: ConnectorSyncOptions, deps: ConnectorC
|
|
|
202
203
|
const events = await fetchLinearIssues({ apiKey: key, teamKey: opts.team, labelOrPrefix: opts.prefix, fetch: deps.fetch ?? fetch, ledger: deps.ledger });
|
|
203
204
|
return applyLinearEvents(events, opts, deps);
|
|
204
205
|
}
|
|
206
|
+
|
|
207
|
+
export async function runLinearDailyProgress(opts: { send?: boolean; json?: boolean; version?: string }, deps: ConnectorCliDeps = {}): Promise<number> {
|
|
208
|
+
const { syncLinearDailyProgress } = await import('../connectors/linear-daily-progress.js');
|
|
209
|
+
const result = await syncLinearDailyProgress({
|
|
210
|
+
dryRun: !opts.send,
|
|
211
|
+
...(opts.version ? { version: opts.version } : {}),
|
|
212
|
+
...(deps.stateDir ? { stateDir: deps.stateDir } : {}),
|
|
213
|
+
...(deps.getSecret ? { getSecret: deps.getSecret } : {}),
|
|
214
|
+
...(deps.fetch ? { fetch: deps.fetch } : {}),
|
|
215
|
+
...(deps.log ? { log: deps.log } : {}),
|
|
216
|
+
});
|
|
217
|
+
(deps.output ?? console.log)(opts.json ? JSON.stringify(result) :
|
|
218
|
+
`connector linear daily-summary: ${result.dryRun ? 'dry-run' : 'send'} · planned ${result.plan.length} · posted ${result.posted} · duplicate ${result.skipped} · failed ${result.failed}`);
|
|
219
|
+
return result.failed ? 1 : 0;
|
|
220
|
+
}
|
package/src/cli/control-cli.ts
CHANGED
|
@@ -12,8 +12,9 @@ import { runLightMember, type LightResource } from '../control-plane/light-membe
|
|
|
12
12
|
import { RESOURCE_KINDS, type ResourceKind } from '../control-plane/ledger.js';
|
|
13
13
|
import { runControlJoin, type ControlJoinOptions } from './control-join-cli.js';
|
|
14
14
|
import type { ResourceView } from '../control-plane/ledger.js';
|
|
15
|
-
import { issueMemberToken, revokeMemberToken, listMemberTokens } from '../control-plane/member-tokens.js';
|
|
15
|
+
import { issueMemberToken, issueMemberTokenToFile, revokeMemberToken, listMemberTokens } from '../control-plane/member-tokens.js';
|
|
16
16
|
import { collectControlStatus, readControlHqLease } from '../control/control-status.js';
|
|
17
|
+
import { debug } from '../debug/log.js';
|
|
17
18
|
import { getUserConfig } from '../user-config.js';
|
|
18
19
|
|
|
19
20
|
function controlPort(flag?: string): number {
|
|
@@ -98,7 +99,7 @@ export async function runResourcesQuery(options: { where?: string; kind?: string
|
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
|
|
101
|
-
export async function runControlServe(options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string;
|
|
102
|
+
export async function runControlServe(options: { port?: string; host?: string; allowClusterBind?: boolean; followLease?: boolean; followHqLease?: boolean; bucket?: string;
|
|
102
103
|
read?: (bucket: string) => RoleLeaseRead | Promise<RoleLeaseRead>; machine?: string;
|
|
103
104
|
readHq?: typeof readControlHqLease; hqHostName?: string;
|
|
104
105
|
/** 시험 seam — 이 신호로 멈춘다. ⛔ 시험이 `process.emit('SIGTERM')` 로 멈추면 같은 프로세스의 다른 SIGTERM 처리기
|
|
@@ -131,7 +132,10 @@ export async function runControlServe(options: { port?: string; host?: string; f
|
|
|
131
132
|
},
|
|
132
133
|
}) : undefined;
|
|
133
134
|
let server: ReturnType<typeof startControlServer>;
|
|
134
|
-
|
|
135
|
+
if (options.allowClusterBind && options.host === '0.0.0.0') {
|
|
136
|
+
debug.log('control-plane', 'cluster-bind-enabled', { hostname: options.host, port, exposure: 'operator-restricted-cluster-service' });
|
|
137
|
+
}
|
|
138
|
+
try { server = startControlServer({ port, hostname: options.host, allowClusterBind: options.allowClusterBind, ...(leaseView ? { leaseView, requireKnownLeaseForWrites: true } : {}) }); }
|
|
135
139
|
catch (error) { console.error(`관제부 시작 실패: ${reasonFor(error)}`); process.exitCode = 2; return; }
|
|
136
140
|
await new Promise<void>(resolve => {
|
|
137
141
|
const stop = () => {
|
|
@@ -214,10 +218,11 @@ export function registerControlCommands(program: Command): void {
|
|
|
214
218
|
control.command('serve').description('관제부를 포그라운드에서 실행')
|
|
215
219
|
.option('--port <n>', '리스닝 포트(0=임시 포트)')
|
|
216
220
|
.option('--host <addr>', '루프백 또는 tailnet 바인드 주소')
|
|
221
|
+
.option('--allow-cluster-bind', '클러스터 내부 Service용 0.0.0.0 바인드를 명시 허용')
|
|
217
222
|
.option('--follow-lease', '임대 보유자일 때만 쓰기')
|
|
218
223
|
.option('--follow-hq-lease', 'HQ 임대 보유자일 때만 쓰기')
|
|
219
224
|
.option('--bucket <bucket>', 'GCS 임대 버킷')
|
|
220
|
-
.action((options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string }) => runControlServe(options));
|
|
225
|
+
.action((options: { port?: string; host?: string; allowClusterBind?: boolean; followLease?: boolean; followHqLease?: boolean; bucket?: string }) => runControlServe(options));
|
|
221
226
|
control.command('member').description('합류 기계의 자원을 포그라운드에서 등록·심박')
|
|
222
227
|
.option('--resource <kind:name=url>', '등록할 자원', (value: string, previous: string[]) => [...previous, value], [] as string[])
|
|
223
228
|
.option('--interval <seconds>', '심박 간격(초)')
|
|
@@ -244,8 +249,12 @@ export function registerControlCommands(program: Command): void {
|
|
|
244
249
|
});
|
|
245
250
|
const token = control.command('token').description('기계별 범위 토큰 관리');
|
|
246
251
|
token.command('issue <machine>').description('기계 토큰 발급 또는 교체')
|
|
247
|
-
.
|
|
248
|
-
|
|
252
|
+
.option('--token-file <path>', '토큰을 새 0600 파일로만 쓰고 stdout에 출력하지 않음')
|
|
253
|
+
.action((machine: string, options: { tokenFile?: string }) => {
|
|
254
|
+
try {
|
|
255
|
+
if (options.tokenFile) issueMemberTokenToFile(machine, options.tokenFile);
|
|
256
|
+
else console.log(issueMemberToken(machine));
|
|
257
|
+
}
|
|
249
258
|
catch (error) { console.error(reasonFor(error)); process.exitCode = 2; }
|
|
250
259
|
});
|
|
251
260
|
token.command('revoke <machine>').description('기계 토큰 폐기')
|
package/src/cli/doctor-fix.ts
CHANGED
|
@@ -442,8 +442,8 @@ export function nodePtyRebuildPlan(deps: DoctorFixDeps): { versionDir: string; p
|
|
|
442
442
|
try {
|
|
443
443
|
const versionDir = (deps.realpath ?? realpathSync)(join(readiness.installPrefix, 'current'));
|
|
444
444
|
const packageDir = join(versionDir, 'node_modules', 'elanous');
|
|
445
|
-
const pkg = JSON.parse((deps.readFile ?? ((path: string) => readFileSync(path, 'utf8')))(join(packageDir, 'package.json'))) as { dependencies?: Record<string, string>; optionalDependencies?: Record<string, string> };
|
|
446
|
-
const version = pkg.optionalDependencies?.['node-pty'] ?? pkg.dependencies?.['node-pty'];
|
|
445
|
+
const pkg = JSON.parse((deps.readFile ?? ((path: string) => readFileSync(path, 'utf8')))(join(packageDir, 'package.json'))) as { dependencies?: Record<string, string>; optionalDependencies?: Record<string, string>; peerDependencies?: Record<string, string>; elanousOptionalIntegrations?: Record<string, string> };
|
|
446
|
+
const version = pkg.elanousOptionalIntegrations?.['node-pty'] ?? pkg.optionalDependencies?.['node-pty'] ?? pkg.dependencies?.['node-pty'] ?? pkg.peerDependencies?.['node-pty'];
|
|
447
447
|
if (!version) return undefined;
|
|
448
448
|
// RFC #20265 A2 amzn2: node-pty 는 C++20(gcc10) · node-gyp 는 Python 3.8+ 를 요구한다.
|
|
449
449
|
const env: Record<string, string> = readiness.distro === 'amzn2' ? { CC: 'gcc10-gcc', CXX: 'gcc10-g++', PYTHON: 'python3.8' } : {};
|
|
@@ -1,23 +1,44 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
3
4
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
4
|
-
import { addSource, canonicalSeat, dueSources, expiredSource, listSources, removeSource, runDue, type SourceKind } from '../intake-plane/intake-sources.js';
|
|
5
|
+
import { addSource, canonicalSeat, dueSources, expiredSource, listSources, removeSource, runDue, type RunDueDeps, type SourceKind } from '../intake-plane/intake-sources.js';
|
|
6
|
+
import { projectTopicBriefing, subscribeTopicSearch, type SubscribeTopicSearchInput } from '../intake-plane/actions.js';
|
|
7
|
+
import { runIntakeIssueBriefing } from '../intake-plane/actions.js';
|
|
5
8
|
|
|
6
|
-
export function registerIntakeSourceCommands(intake: Command, root: () => string = effectiveInstanceRoot
|
|
9
|
+
export function registerIntakeSourceCommands(intake: Command, root: () => string = effectiveInstanceRoot,
|
|
10
|
+
deps: { subscribeTopicSearch?: (input: SubscribeTopicSearchInput, options?: { stateDir?: string; runDeps?: RunDueDeps }) => ReturnType<typeof subscribeTopicSearch> } = {}): void {
|
|
7
11
|
const source = intake.command('source').description('자리별 흡수 원천과 주기 등록·조회·실행');
|
|
8
12
|
const fail = (error: unknown) => { console.error(error instanceof Error ? error.message : String(error)); process.exitCode = 2; };
|
|
9
13
|
source.command('add')
|
|
10
14
|
.requiredOption('--seat <id>', '자리 id 또는 별칭')
|
|
11
|
-
.requiredOption('--kind <kind>', 'github-query | rss | command')
|
|
15
|
+
.requiredOption('--kind <kind>', 'github-query | rss | command | topic-search')
|
|
12
16
|
.requiredOption('--spec <spec>', 'GitHub 질의 · 피드 URL · 명령')
|
|
13
17
|
.requiredOption('--every <cadence>', 'Nh | Nd | Nw')
|
|
14
18
|
.option('--until <date>', '만료 시작 날짜 YYYY-MM-DD (UTC)')
|
|
15
19
|
.option('--why <reason>', '등록 이유')
|
|
16
20
|
.option('--id <id>', '원천 id')
|
|
17
|
-
.
|
|
21
|
+
.option('--linear-issue-id <uuid>', 'topic-search parent Linear issue UUID')
|
|
22
|
+
.option('--schedule-cron <expression>', 'topic-search schedule registry cron (e.g. 0 8 * * 1)')
|
|
23
|
+
.option('--telegram-dry-run-file <path>', 'Telegram 브리핑 본문을 이 파일에 기록하고 실제 발송은 하지 않음 (topic-search)')
|
|
24
|
+
.action(async (opts: { seat: string; kind: string; spec: string; every: string; until?: string; why?: string; id?: string; linearIssueId?: string; scheduleCron?: string; telegramDryRunFile?: string }) => {
|
|
18
25
|
try {
|
|
26
|
+
if (opts.kind === 'topic-search') {
|
|
27
|
+
if (!opts.linearIssueId || !opts.scheduleCron) throw new Error('topic-search 는 --linear-issue-id 와 --schedule-cron 이 필요하다');
|
|
28
|
+
const telegramDryRunFile = opts.telegramDryRunFile ? resolve(opts.telegramDryRunFile) : undefined;
|
|
29
|
+
const result = await (deps.subscribeTopicSearch ?? subscribeTopicSearch)({ seat: opts.seat, topic: opts.spec,
|
|
30
|
+
linearIssueId: opts.linearIssueId, every: opts.every, scheduleCron: opts.scheduleCron,
|
|
31
|
+
...(telegramDryRunFile ? { telegramDryRunFile } : {}) },
|
|
32
|
+
{ stateDir: root(), runDeps: { projectTopicBriefing: telegramDryRunFile
|
|
33
|
+
? (registered, items, stateDir) => projectTopicBriefing(registered, items, stateDir, { telegramDryRunFile })
|
|
34
|
+
: projectTopicBriefing } });
|
|
35
|
+
console.log(`${result.source.id} ${result.source.seat} topic-search ${result.source.every} schedule=${result.scheduleId} immediate=${result.immediate.ran.map(row => row.items).join(',')}`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
19
38
|
const added = addSource({ id: opts.id ?? `src-${randomUUID().slice(0, 8)}`, seat: opts.seat, kind: opts.kind as SourceKind,
|
|
20
|
-
spec: opts.spec, every: opts.every, ...(opts.until ? { until: opts.until } : {}), ...(opts.why ? { why: opts.why } : {})
|
|
39
|
+
spec: opts.spec, every: opts.every, ...(opts.until ? { until: opts.until } : {}), ...(opts.why ? { why: opts.why } : {}),
|
|
40
|
+
...(opts.linearIssueId ? { linearIssueId: opts.linearIssueId } : {}),
|
|
41
|
+
...(opts.scheduleCron ? { scheduleCron: opts.scheduleCron } : {}) }, root());
|
|
21
42
|
console.log(`${added.id} ${added.seat} ${added.kind} ${added.every}`);
|
|
22
43
|
} catch (error) { fail(error); }
|
|
23
44
|
});
|
|
@@ -38,18 +59,33 @@ export function registerIntakeSourceCommands(intake: Command, root: () => string
|
|
|
38
59
|
});
|
|
39
60
|
source.command('run-due')
|
|
40
61
|
.option('--seat <id>', '자리 id 또는 별칭')
|
|
62
|
+
.option('--source-id <id>', '단일 입력원만 실행 (스케줄 레지스트리 호출용)')
|
|
63
|
+
.option('--project-issue-briefing', 'topic-search 결과를 관련 Linear 이슈의 Telegram·코멘트에 투영')
|
|
64
|
+
.option('--telegram-dry-run-file <path>', 'Telegram 브리핑 본문을 이 파일에 기록하고 실제 발송은 하지 않음')
|
|
41
65
|
.option('--dry-run', '기한 원천 목록만 · 수집·원장·마지막 실행 시각 무변')
|
|
42
66
|
.option('--json', 'JSON 출력')
|
|
43
|
-
.action(async (opts: { seat?: string; dryRun?: boolean; json?: boolean }) => {
|
|
67
|
+
.action(async (opts: { seat?: string; sourceId?: string; projectIssueBriefing?: boolean; telegramDryRunFile?: string; dryRun?: boolean; json?: boolean }) => {
|
|
44
68
|
try {
|
|
45
69
|
const seat = opts.seat === undefined ? undefined : canonicalSeat(opts.seat);
|
|
46
70
|
if (opts.dryRun) {
|
|
47
|
-
const sources = dueSources(new Date(), root()).filter((entry) => seat === undefined || entry.seat === seat);
|
|
71
|
+
const sources = dueSources(new Date(), root(), opts.sourceId).filter((entry) => seat === undefined || entry.seat === seat);
|
|
48
72
|
if (opts.json) console.log(JSON.stringify(sources));
|
|
49
73
|
else for (const entry of sources) console.log(`${entry.id} ${entry.seat} ${entry.kind} ${entry.every}`);
|
|
50
74
|
return;
|
|
51
75
|
}
|
|
52
|
-
const
|
|
76
|
+
const telegramDryRunFile = opts.telegramDryRunFile ? resolve(opts.telegramDryRunFile) : undefined;
|
|
77
|
+
const result = await runDue({ seat, sourceId: opts.sourceId, deps: { stateDir: root(),
|
|
78
|
+
...(opts.projectIssueBriefing || telegramDryRunFile ? { projectTopicBriefing: telegramDryRunFile
|
|
79
|
+
? (registered, items, stateDir) => projectTopicBriefing(registered, items, stateDir, { telegramDryRunFile })
|
|
80
|
+
: projectTopicBriefing } : {}),
|
|
81
|
+
onCollected: async (source, raws) => {
|
|
82
|
+
if (!source.issueRef) return;
|
|
83
|
+
await runIntakeIssueBriefing({
|
|
84
|
+
issueRef: source.issueRef, topic: source.spec, state: 'open', collected: true,
|
|
85
|
+
evidence: raws.filter(raw => typeof raw.url === 'string' && raw.url.trim().length > 0)
|
|
86
|
+
.map(raw => ({ title: raw.title || source.spec, url: raw.url!, summary: raw.text || raw.title || source.spec })),
|
|
87
|
+
}, { stateDir: root() });
|
|
88
|
+
} } });
|
|
53
89
|
if (opts.json) console.log(JSON.stringify(result));
|
|
54
90
|
else for (const row of result.ran) console.log(`${row.id} ${row.items}${row.error ? ` 실패: ${row.error}` : ''}`);
|
|
55
91
|
if (result.ran.some((row) => row.error)) process.exitCode = 1;
|
|
@@ -108,6 +108,12 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
108
108
|
"auto-merge-head-guard",
|
|
109
109
|
"auto-merged",
|
|
110
110
|
"auto-review-labeled",
|
|
111
|
+
"author.dialog.closed",
|
|
112
|
+
"author.reviewer-precheck.skipped",
|
|
113
|
+
"author.reviewer-precheck.completed",
|
|
114
|
+
"author.reviewer-precheck.revision-rejected",
|
|
115
|
+
"author.reviewer-precheck.failed-soft",
|
|
116
|
+
"author.reviewer.round",
|
|
111
117
|
"auto-worktree-prepared",
|
|
112
118
|
"autoproceed",
|
|
113
119
|
"autoroute.decision",
|
|
@@ -1417,6 +1423,8 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1417
1423
|
"superseded-goal-file-bypassed",
|
|
1418
1424
|
"superseded-goal-file-rejected",
|
|
1419
1425
|
"supervisor-plan-revision-recorded",
|
|
1426
|
+
"supervisor.reauthor-request",
|
|
1427
|
+
"supervisor.reauthor-unjoined",
|
|
1420
1428
|
"suppressed",
|
|
1421
1429
|
"suppressed.frustration",
|
|
1422
1430
|
"surface-capped",
|
package/src/cli/msg-cli.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { mkdirSync } from 'node:fs';
|
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
4
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
5
5
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
6
|
-
import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
6
|
+
import { canonicalMessageAddress, canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
7
7
|
import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
|
|
8
8
|
import { acquireLockSync } from '../storage/file-lock.js';
|
|
9
9
|
import { GitHubMsgMirrorTransport } from '../msg/msg-mirror-github.js';
|
|
@@ -325,7 +325,8 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
325
325
|
const from = seat(opts.from, '--from');
|
|
326
326
|
const unsupported = opts.to === undefined ? null : unsupportedLoopAddressNotice(opts.to);
|
|
327
327
|
if (unsupported) out.error(unsupported);
|
|
328
|
-
|
|
328
|
+
if (opts.to === undefined) throw new Error('--to is required');
|
|
329
|
+
const to = canonicalMessageAddress(opts.to);
|
|
329
330
|
// Validate the auto-reply target before saving — a mismatched flag must not leave a stored message behind.
|
|
330
331
|
const agentAddress = agentReplyAddress(opts.agentReply);
|
|
331
332
|
if (agentAddress !== null) requireAgentTarget(agentAddress, to);
|
|
@@ -364,7 +365,7 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
364
365
|
msg.command('route <address>').description('Show how a post to this address is read (replyBody) and woken (wake)')
|
|
365
366
|
.option('--json')
|
|
366
367
|
.action((address: string, opts: CommonOptions) => run(() => {
|
|
367
|
-
const to =
|
|
368
|
+
const to = canonicalMessageAddress(address);
|
|
368
369
|
const wake = resolveWake(to, deps.wakeDeps);
|
|
369
370
|
const row = { msgAddress: to, replyBody: messageRouteFor(to)?.replyBody ?? null, ...wake };
|
|
370
371
|
emit(row, opts.json, () => out.log(`${to}\treplyBody=${row.replyBody ?? '모름'}\twake=${wake.wake}`
|
|
@@ -372,6 +373,34 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
372
373
|
+ `\t(${wake.source}${wake.reason ? `: ${wake.reason}` : ''})`));
|
|
373
374
|
})());
|
|
374
375
|
|
|
376
|
+
const group = msg.command('group').description('Manage local message group subscriptions');
|
|
377
|
+
group.command('create <name>').description('Create a group and subscribe its owner')
|
|
378
|
+
.requiredOption('--from <seat>', 'seat creating and owning the group').option('--json')
|
|
379
|
+
.action((name: string, opts: { from: string; json?: boolean }) => run(() => {
|
|
380
|
+
const address = withStore(store => store.createGroup(name, opts.from));
|
|
381
|
+
emit({ address, owner: canonicalSeatId(opts.from) }, opts.json, () => out.log(`${address} created; ${canonicalSeatId(opts.from)} subscribed`));
|
|
382
|
+
})());
|
|
383
|
+
group.command('join <name>').description('Subscribe a seat to a group')
|
|
384
|
+
.requiredOption('--seat <seat>').option('--json')
|
|
385
|
+
.action((name: string, opts: { seat: string; json?: boolean }) => run(() => {
|
|
386
|
+
const joined = withStore(store => store.joinGroup(name, opts.seat));
|
|
387
|
+
const row = { group: canonicalMessageAddress(name.startsWith('group:') ? name : `group:${name}`), seat: canonicalSeatId(opts.seat), joined };
|
|
388
|
+
emit(row, opts.json, () => out.log(`${row.seat} ${row.joined ? 'joined' : 'already subscribed'} ${row.group}`));
|
|
389
|
+
})());
|
|
390
|
+
group.command('leave <name>').description('Unsubscribe a seat from a group')
|
|
391
|
+
.requiredOption('--seat <seat>').option('--json')
|
|
392
|
+
.action((name: string, opts: { seat: string; json?: boolean }) => run(() => {
|
|
393
|
+
const left = withStore(store => store.leaveGroup(name, opts.seat));
|
|
394
|
+
const row = { group: canonicalMessageAddress(name.startsWith('group:') ? name : `group:${name}`), seat: canonicalSeatId(opts.seat), left };
|
|
395
|
+
emit(row, opts.json, () => out.log(`${row.seat} ${row.left ? 'left' : 'was not subscribed to'} ${row.group}`));
|
|
396
|
+
})());
|
|
397
|
+
group.command('list').description('List a seat’s active group subscriptions')
|
|
398
|
+
.requiredOption('--seat <seat>').option('--json')
|
|
399
|
+
.action((opts: { seat: string; json?: boolean }) => run(() => {
|
|
400
|
+
const groups = withStore(store => store.listGroups(opts.seat));
|
|
401
|
+
emit(groups, opts.json, () => { if (!groups.length) out.log('No groups.'); else for (const address of groups) out.log(address); });
|
|
402
|
+
})());
|
|
403
|
+
|
|
375
404
|
msg.command('list').description('List messages for one recipient or one thread without acknowledging them')
|
|
376
405
|
.option('--to <seat>').option('--thread <id>', 'request ID; list it and its replies, regardless of recipient')
|
|
377
406
|
.option('--after <id>', 'exclusive message ID (default: acknowledged cursor for a recipient, 0 for a thread)')
|
package/src/cli/pr-cli.ts
CHANGED
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
type CmdRunner,
|
|
38
38
|
type PrManager,
|
|
39
39
|
} from '../autopilot/pr-manager.js';
|
|
40
|
+
import { observePrLineage } from '../pr-tool/census.js';
|
|
40
41
|
import {
|
|
41
42
|
collectBaseLandingCommits,
|
|
42
43
|
computeGranularityStats,
|
|
@@ -68,6 +69,7 @@ import { ensurePrLandHeavyRemote, type HeavyRemoteInput, type HeavyRemoteResult
|
|
|
68
69
|
import { readPrBaseNameWithRetry } from './pr-land-base-read.js';
|
|
69
70
|
import { runHeavyOnPodShadow } from './pr-land-pod-shadow.js';
|
|
70
71
|
import type { LandingPodShadowInput, LandingPodShadowVerdict } from './pr-land-pod-shadow-job.js';
|
|
72
|
+
import { recordWarmReuseEvidence, warmReuseEvidencePath } from '../task-orchestrator/surfaces/warm-reuse-evidence.js';
|
|
71
73
|
import { readTaskAgentState, taskAgentStatePath, type TaskCard } from '../task-agent/task-hand.js';
|
|
72
74
|
import { INFLIGHT_REGISTRY_FILE, removeInflightForPr } from '../pr-tool/inflight-registry.js';
|
|
73
75
|
import { PR_LABEL_NAMES } from '../github/pr-labels.js';
|
|
@@ -1899,10 +1901,19 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
1899
1901
|
local: { measured: verdict.rootPlan != null, ok: verdict.ok, rootPlan: verdict.rootPlan ?? null },
|
|
1900
1902
|
runPod: async () => {
|
|
1901
1903
|
const runPod = deps.runLandingPodShadow ?? (await import('./pr-land-pod-shadow-job.js')).runLandingPodShadowJob;
|
|
1902
|
-
return runPod({ head: opts.expectedHead!, main });
|
|
1904
|
+
return runPod({ pr: Number(opts.pr), repo: cwd, host: verdict.host ?? '', head: opts.expectedHead!, main });
|
|
1903
1905
|
},
|
|
1904
1906
|
log: (category, event, data) => debug.log(category, event, { ...data, main, phase: 'initial' }),
|
|
1905
1907
|
warn: (message) => out.error(`⚠ heavy-on-pod-shadow: ${message}`),
|
|
1908
|
+
onShadow: ({ pod, agree }) => {
|
|
1909
|
+
const shadow = pod && typeof pod === 'object' ? pod as LandingPodShadowVerdict : undefined;
|
|
1910
|
+
const warm = shadow?.warmEvidence;
|
|
1911
|
+
recordWarmReuseEvidence(warmReuseEvidencePath(), {
|
|
1912
|
+
schema: 1, consumer: 'land', pr: Number(opts.pr), head: opts.expectedHead!, main, recordedAt: new Date().toISOString(),
|
|
1913
|
+
...(warm ? { ...warm, agree: warm.agree && agree } : {}),
|
|
1914
|
+
...(!warm ? { reason: shadow?.warmReason ?? 'warm-shadow-unmeasured' } : {}),
|
|
1915
|
+
});
|
|
1916
|
+
},
|
|
1906
1917
|
});
|
|
1907
1918
|
}
|
|
1908
1919
|
}
|
|
@@ -2536,6 +2547,15 @@ export function registerPrCommands(program: Command, deps: PrLandDeps = {}, queu
|
|
|
2536
2547
|
try { await supersedeMerged(number, opts.cwd ?? process.cwd()); }
|
|
2537
2548
|
catch (error) { prToolOut.error(`✗ supersede-drafts: ${String(error)}`); prToolExit(1); }
|
|
2538
2549
|
});
|
|
2550
|
+
pr.command('lineage <pr>')
|
|
2551
|
+
.description('PR 계보의 관측 사실만 JSON으로 읽기 (첫 조각 · 닫기 판정 없음)')
|
|
2552
|
+
.requiredOption('--json', 'JSON 관측 결과 출력')
|
|
2553
|
+
.option('--cwd <path>', '저장소 경로')
|
|
2554
|
+
.action((rawPr: string, opts: { cwd?: string }) => {
|
|
2555
|
+
const result = observePrLineage({ pr: Number(rawPr), run: prToolRun, cwd: opts.cwd });
|
|
2556
|
+
prToolOut.log(JSON.stringify(result));
|
|
2557
|
+
if (result.status === 'unknown') prToolExit(1);
|
|
2558
|
+
});
|
|
2539
2559
|
pr.command('census')
|
|
2540
2560
|
.description('열린 PR 전체·골 문서만·2일 무커밋 draft·미닫힌 superseded 집계')
|
|
2541
2561
|
.option('--cwd <path>', '저장소 경로')
|