elanous 0.2.42 → 0.2.43
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 → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
- package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1406.a1dc2ab6f8449374.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 2573.387a707f6f9d720c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 3072.01338851ca21a6f7.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.js → 3113.d7472bbc27d580c7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3557ac4a.c8931684475018ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 363bfab3.9623b9f89363541f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
- package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2690.0521c738b7749931.js → 4445.7990c76b3751a918.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
- package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 5930.8b4df3b46c32b05a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
- package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 6944.309f4e3ea54d1537.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
- package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
- package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +41 -0
- package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 8986.8e2e4efbfa655c59.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
- package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
- package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
- package/apps/pwa/out/_next/static/chunks/aa57532f.510551854ff239b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.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/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -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/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-scenes.ts +301 -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/release-loop/auto-approve-node.ts +1 -1
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node.ts +180 -20
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/preflight.ts +362 -8
- package/scripts/release-loop/unattended-release.ts +20 -9
- package/scripts/rhythm/daily.ts +36 -4
- package/scripts/rhythm/linear-progress-sync.ts +298 -0
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +29 -6
- 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 +47 -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/agents/general-purpose.md +1 -1
- package/src/auto-research/research-turn.ts +95 -10
- 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/doctor-fix.ts +2 -2
- package/src/cli/intake-source-cli.ts +44 -8
- 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 +187 -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 +186 -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/core-turn/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +37 -0
- package/src/core-turn/run-core-turn.ts +320 -30
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +103 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
- package/src/dashboard/classic-sidetab-mission.ts +167 -5
- package/src/dashboard/index.ts +378 -13
- 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 +1 -1
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- 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/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/runner.ts +85 -17
- 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 +11 -1
- 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 +127 -10
- 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/provider-credentials.ts +8 -2
- package/src/llm.ts +2 -1
- package/src/maturity/feature-maturity.ts +3 -3
- 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/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -0
- package/src/nexus/index.ts +7 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/router.ts +98 -13
- 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 +44 -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 +85 -26
- 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/pty-shell/pty-control-ipc.ts +4 -1
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/research/axis-fanout.ts +43 -28
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/dev-cli.ts +4 -1
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- 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/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 +358 -4
- package/src/self-implement/graph-overlay-yaml.ts +30 -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 +26 -3
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +240 -15
- 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/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +4 -2
- 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 +37 -1
- 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/visible-agent-mission.ts +98 -22
- package/src/skills/tools/agent.ts +23 -4
- package/src/skills/tools/omni-search.ts +123 -25
- package/src/task-agent/parent-host.ts +10 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +20 -7
- 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 +4 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- 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-provider.ts +35 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
- 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 +1 -0
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/browser-hand-runtime.ts +381 -0
- package/src/tool-runtime/browser-runtime.ts +2 -1
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -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 +3 -0
- package/src/tui/entry.ts +24 -1
- package/src/tui/sidetab/attach.ts +140 -11
- package/src/tui/sidetab/herdr-portal.ts +225 -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 +198 -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 +216 -0
- package/src/ux-sim/mock-scenario-catalog.json +75 -23
- package/src/ux-sim/mock-scenario-catalog.ts +120 -2
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/scenario.ts +70 -26
- package/src/ux-sim/service-key-setup.ts +50 -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/1345-31427b833438f521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.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/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/2160.a097e7b138ae1c55.js +0 -23
- 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/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/2974.595d1e29d040cb6a.js +0 -64
- 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/4768-8eac183fd291ca53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
- 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/5431-72a1dbde59400691.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/5885.0a3e52c8faccec98.js +0 -287
- 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/6377.bc7df239edbff244.js +0 -1
- 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/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/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/9415.69e4a21c60c7d2db.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/9832.f4a98c878ecf2c0a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.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/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 → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
|
@@ -21,7 +21,7 @@ import { createWorktree, resolveMainRepoRoot, type CreateWorktreeOpts } from '..
|
|
|
21
21
|
import { configuredWorktreeRoot, getUserConfig } from '../user-config.js';
|
|
22
22
|
import { worktreeHasChanges, commitWorktree, changedFiles } from '../self-implement/seams.js';
|
|
23
23
|
import { streamLLM, type LLMMessage } from '../llm.js';
|
|
24
|
-
import { debug } from '../debug/log.js';
|
|
24
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
25
25
|
import { emitPtyDecision, type DecisionInput } from './pty-decision.js';
|
|
26
26
|
import { observeExternalEvent } from '../context-bus/external-events.js';
|
|
27
27
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
@@ -42,8 +42,10 @@ import { checkClaudeSubscription } from './claude-subscription.js';
|
|
|
42
42
|
import { handoffMission, waitForHumanLogin, type HandoffOperations } from './handoff.js';
|
|
43
43
|
import { dispatchOpenPullRequest } from '../tool-runtime/git-pr-runtime.js';
|
|
44
44
|
import { runClaudeHeadless } from './claude-headless.js';
|
|
45
|
+
import { runCodexExec } from './codex-exec.js';
|
|
45
46
|
import { installPluginInsideAgent, type PluginRequest, type PluginDeps } from './in-agent-plugin.js';
|
|
46
47
|
import { planMissionResources, type ResourceLadderDeps, type ResourcePlan } from './resource-ladder.js';
|
|
48
|
+
import type { InProcessHandler, InProcessHandlerContext } from '../graph-runner/in-process-registry.js';
|
|
47
49
|
import { ensureRunId } from '../harness/harness-space.js';
|
|
48
50
|
import { recordHarnessWorktreeProvenance } from '../harness/harness-worktree-add.js';
|
|
49
51
|
import { resolveInstanceName } from '../instance-identity.js';
|
|
@@ -190,6 +192,9 @@ export const codexBackend: AgentBackend = {
|
|
|
190
192
|
args: ['--yolo', '-c', 'check_for_update_on_startup=false'],
|
|
191
193
|
scrubEnv: ['OPENAI_API_KEY'],
|
|
192
194
|
handleTrust: (screen, write) => {
|
|
195
|
+
// Compatibility for non-sidetab callers; runVisibleAgentMission handles
|
|
196
|
+
// this screen with a one-shot Escape when agent='codex' is supplied.
|
|
197
|
+
if (/update available/i.test(screen) && /\besc(?:ape)?\s+(?:to\s+)?skip\b/i.test(screen)) { write('\u001b'); return true; }
|
|
193
198
|
if (screenNeedsTrust(screen)) { write('1\r'); return true; }
|
|
194
199
|
return false;
|
|
195
200
|
},
|
|
@@ -217,6 +222,7 @@ export const claudeBackend: AgentBackend = {
|
|
|
217
222
|
name: 'claude',
|
|
218
223
|
cmd: 'claude',
|
|
219
224
|
args: ['--dangerously-skip-permissions'],
|
|
225
|
+
env: { DISABLE_AUTOUPDATER: '1' },
|
|
220
226
|
// CLAUDE_CODE_OAUTH_TOKEN: a launching Claude Code session exports its own token; the child must use the
|
|
221
227
|
// machine's stored login, never the parent session's (09-29 🅞: status read `oauth_token` → «api-key» · 대표 R2).
|
|
222
228
|
scrubEnv: ['ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN', 'CLAUDE_CODE_USE_BEDROCK', 'CLAUDE_CODE_USE_VERTEX', 'CLAUDE_CODE_USE_FOUNDRY'],
|
|
@@ -298,6 +304,13 @@ export const grokBackend: AgentBackend = {
|
|
|
298
304
|
cmd: 'grok',
|
|
299
305
|
args: ['--always-approve'],
|
|
300
306
|
scrubEnv: ['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'],
|
|
307
|
+
// Grok Build's first-run data-use dialog can cover its composer. Keep the
|
|
308
|
+
// product's default privacy setting: move to Opt out, then confirm.
|
|
309
|
+
handleTrust: (screen, write) => {
|
|
310
|
+
if (!/Help improve Grok/i.test(screen) || !/\[?Opt out\]?/i.test(screen) || !/\[?Opt in\]?/i.test(screen)) return false;
|
|
311
|
+
write('\u001b[D\r');
|
|
312
|
+
return true;
|
|
313
|
+
},
|
|
301
314
|
};
|
|
302
315
|
|
|
303
316
|
/** Aside Browser agent backend — `aside exec --help` confirms `--effort low`; `ultrabrowse` enables the highest thinking level and proactive mode. */
|
|
@@ -452,9 +465,18 @@ export function agentBackendNames(): string[] {
|
|
|
452
465
|
*/
|
|
453
466
|
export function resolveDefaultBackend(
|
|
454
467
|
/** ⛔ 테스트 심 — 실 스토어·실 자격 없이 판정을 주입한다. */
|
|
455
|
-
deps: { readonly decide?: () => { action: string; backend?: string } } = {},
|
|
468
|
+
deps: { readonly decide?: () => { action: string; backend?: string }; readonly configuredProvider?: string } = {},
|
|
456
469
|
): AgentBackend {
|
|
457
470
|
try {
|
|
471
|
+
const { getUserConfig } = require('../user-config.js') as typeof import('../user-config.js');
|
|
472
|
+
const provider = deps.configuredProvider ?? getUserConfig().llm.provider;
|
|
473
|
+
if (provider === 'grok') {
|
|
474
|
+
debug.log('agent-mission.backend', 'configured-provider', { provider: 'grok', reason: 'user-configured' });
|
|
475
|
+
return grokBackend;
|
|
476
|
+
}
|
|
477
|
+
if (provider === 'openrouter' || provider === 'glm') {
|
|
478
|
+
throw new Error(`Codex required: agent mission uses a Codex/PTY backend; configured LLM provider '${provider}' is API-only`);
|
|
479
|
+
}
|
|
458
480
|
const decide = deps.decide
|
|
459
481
|
?? (() => {
|
|
460
482
|
// ⛔ 지연 로드 — 이 모듈은 부팅 초기에 읽히는데 oauth 축은 스토어·config 를 건드린다.
|
|
@@ -467,11 +489,15 @@ export function resolveDefaultBackend(
|
|
|
467
489
|
debug.log('agent-mission.backend', 'fallback-switch', { from: 'codex', to: decision.backend, reason: 'codex-exhausted' });
|
|
468
490
|
return decision.backend === 'claude' ? claudeBackend : grokBackend;
|
|
469
491
|
}
|
|
492
|
+
if (decision.action === 'switch-backend' && (decision.backend === 'openrouter' || decision.backend === 'zai')) {
|
|
493
|
+
throw new Error(`Codex required: agent mission CLI cannot run API provider '${decision.backend}' as a PTY backend`);
|
|
494
|
+
}
|
|
470
495
|
if (decision.action === 'codex-credits') {
|
|
471
496
|
// CODEX-CREDITS-STEP — 체인 마지막 칸: codex 로 «돌아와» 선불 크레딧으로 계속(판정 쪽이 이미 관측을 남겼다).
|
|
472
497
|
debug.log('agent-mission.backend', 'fallback-codex-credits', { from: 'codex', to: 'codex', reason: 'chain-last-step' });
|
|
473
498
|
}
|
|
474
499
|
} catch (err) {
|
|
500
|
+
if (err instanceof Error && err.message.startsWith('Codex required:')) throw err;
|
|
475
501
|
debug.log('agent-mission.backend', 'fallback-failed', { message: (err as Error)?.message }, { level: 'warn' });
|
|
476
502
|
}
|
|
477
503
|
return codexBackend;
|
|
@@ -541,6 +567,12 @@ export function decideRuntimeFallback(
|
|
|
541
567
|
return home ? { ...codexBackend, env: { CODEX_HOME: home } } : codexBackend;
|
|
542
568
|
}
|
|
543
569
|
if (decision.action !== 'switch-backend') return null;
|
|
570
|
+
if (decision.backend === 'openrouter' || decision.backend === 'zai') {
|
|
571
|
+
debug.log('agent-mission.backend', 'runtime-fallback-unsupported-api-backend', {
|
|
572
|
+
currentStep, backend: decision.backend, attemptedChainSteps: [...state.attemptedSteps],
|
|
573
|
+
}, { level: 'warn' });
|
|
574
|
+
return null;
|
|
575
|
+
}
|
|
544
576
|
const nextStep = decision.backend === 'grok' ? 'grok' : decision.backend === 'claude' ? 'claude-pty' : null;
|
|
545
577
|
if (!nextStep || state.attemptedSteps.has(nextStep)) return null;
|
|
546
578
|
return nextStep === 'claude-pty' ? claudeBackend : grokBackend;
|
|
@@ -575,6 +607,8 @@ export interface AgentMissionSpec {
|
|
|
575
607
|
agent?: AgentBackend;
|
|
576
608
|
/** Claude CLI 비대화형 stream-json 실행. 다른 backend 에서는 거부. */
|
|
577
609
|
headless?: boolean;
|
|
610
|
+
/** Optional second user turn sent by resuming the same Claude/Codex CLI session. */
|
|
611
|
+
followUp?: string;
|
|
578
612
|
/** Install in the agent's own UI before sending the mission. */
|
|
579
613
|
plugin?: Pick<PluginRequest, 'plugin' | 'marketplace'>;
|
|
580
614
|
/** Pre-mission resource judgment; off skips it. */
|
|
@@ -662,6 +696,7 @@ export interface AgentMissionDeps {
|
|
|
662
696
|
reemitPtyUsage?: typeof reemitPtyUsage;
|
|
663
697
|
checkClaudeSubscription?: typeof checkClaudeSubscription;
|
|
664
698
|
runClaudeHeadless?: typeof runClaudeHeadless;
|
|
699
|
+
runCodexExec?: typeof runCodexExec;
|
|
665
700
|
checkEvidence?: typeof checkEvidence;
|
|
666
701
|
commitWorktree?: typeof commitWorktree;
|
|
667
702
|
dispatchOpenPullRequest?: typeof dispatchOpenPullRequest;
|
|
@@ -1626,10 +1661,13 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
1626
1661
|
if (spec.chain && spec.commit === false && spec.chain.includes('elanous')) throw new Error('elanous PR handoff requires commit authorization');
|
|
1627
1662
|
if (spec.headless && spec.chain) throw new Error('--headless cannot run a PTY handoff chain');
|
|
1628
1663
|
if (spec.headless && backend.name !== 'claude') throw new Error('--headless 는 --backend claude 전용입니다');
|
|
1629
|
-
if (spec.
|
|
1664
|
+
if (spec.followUp !== undefined && (!spec.followUp.trim() || (backend.name !== 'claude' && backend.name !== 'codex'))) throw new Error('--follow-up 은 비어 있지 않은 Claude/Codex 후속 프롬프트여야 합니다');
|
|
1665
|
+
if (spec.followUp !== undefined && spec.chain) throw new Error('--follow-up cannot run a PTY handoff chain');
|
|
1666
|
+
if (spec.plugin && (spec.headless || spec.followUp !== undefined || (backend.name !== 'codex' && backend.name !== 'claude'))) throw new Error('--plugin 은 codex/claude 대화형 backend 전용입니다');
|
|
1630
1667
|
if (spec.workdir && spec.chain) throw new Error('workdir 모드는 넘기기 사슬을 쓰지 않는다');
|
|
1668
|
+
const llmConfig = getUserConfig().llm;
|
|
1631
1669
|
const runtimeFallback = deps.runtimeFallback ?? {
|
|
1632
|
-
...initialRuntimeFallback(backend, normalizeFallbackChain(
|
|
1670
|
+
...initialRuntimeFallback(backend, normalizeFallbackChain(llmConfig?.fallbackChain, llmConfig?.provider).chain),
|
|
1633
1671
|
fallbackEligible: spec.agent === undefined && !spec.chain,
|
|
1634
1672
|
};
|
|
1635
1673
|
const spawnPty = deps.startPty ?? startPty;
|
|
@@ -1717,7 +1755,7 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
1717
1755
|
if (deps.isMissionAborted?.()) throw new Error('MISSION_ABORTED');
|
|
1718
1756
|
const runId = ensureRunId();
|
|
1719
1757
|
env.ELANOUS_RUN_ID = runId;
|
|
1720
|
-
if (spec.headless === true) {
|
|
1758
|
+
if (spec.headless === true || spec.followUp !== undefined) {
|
|
1721
1759
|
// The non-interactive child receives the mission on stdin, never via a PTY or argv.
|
|
1722
1760
|
// Keep the same enhancement and additive memory policy as the interactive mission.
|
|
1723
1761
|
let prompt = spec.mission;
|
|
@@ -1741,17 +1779,52 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
1741
1779
|
else debug.log('agent-mission', 'memory', { injected: false });
|
|
1742
1780
|
}
|
|
1743
1781
|
if (deps.isMissionAborted?.()) throw new Error('MISSION_ABORTED');
|
|
1744
|
-
|
|
1745
|
-
|
|
1782
|
+
type SessionRunResult = {
|
|
1783
|
+
ok: boolean; reason: string; exitCode: number | null; sessionId: string | null; numTurns: number | null;
|
|
1784
|
+
toolEvents?: number; malformedLines?: number; durationMs?: number | null;
|
|
1785
|
+
};
|
|
1786
|
+
const firstRun: Promise<SessionRunResult> = backend.name === 'claude'
|
|
1787
|
+
? (deps.runClaudeHeadless ?? runClaudeHeadless)({ cwd: wt.path, prompt, env: envLiteral(env), maxTurns: maxRounds, onSpawn: deps.onHeadlessStarted })
|
|
1788
|
+
: (deps.runCodexExec ?? runCodexExec)({ cwd: wt.path, prompt, env: envLiteral(env), onSpawn: deps.onHeadlessStarted });
|
|
1789
|
+
let result: SessionRunResult = await (deps.awaitMission ? deps.awaitMission(firstRun) : firstRun);
|
|
1790
|
+
const sessionId = result.sessionId;
|
|
1791
|
+
if (spec.followUp !== undefined) debug.log('agent-mission', 'session-turn', {
|
|
1792
|
+
backend: backend.name, turn: 'initial', ok: result.ok, reason: result.reason, sessionId: result.sessionId, numTurns: result.numTurns,
|
|
1793
|
+
});
|
|
1794
|
+
if (result.ok && spec.followUp !== undefined) {
|
|
1795
|
+
if (!sessionId) {
|
|
1796
|
+
result = { ...result, ok: false, reason: 'no-session', exitCode: result.exitCode };
|
|
1797
|
+
} else if (deps.isMissionAborted?.()) {
|
|
1798
|
+
return { ok: false, reason: 'aborted', worktree: wt.path, branch: wt.branch,
|
|
1799
|
+
rounds: result.numTurns ?? 0, evidencePath: null, committed: false, usedOmniCrawl: false, detail: 'aborted' };
|
|
1800
|
+
} else {
|
|
1801
|
+
debug.log('agent-mission', 'session-resume-start', { backend: backend.name, resumeSessionId: sessionId });
|
|
1802
|
+
const followRun: Promise<SessionRunResult> = backend.name === 'claude'
|
|
1803
|
+
? (deps.runClaudeHeadless ?? runClaudeHeadless)({ cwd: wt.path, prompt: spec.followUp, resumeSessionId: sessionId, env: envLiteral(env), maxTurns: maxRounds, onSpawn: deps.onHeadlessStarted })
|
|
1804
|
+
: (deps.runCodexExec ?? runCodexExec)({ cwd: wt.path, prompt: spec.followUp, resumeSessionId: sessionId, env: envLiteral(env), onSpawn: deps.onHeadlessStarted });
|
|
1805
|
+
const resumed: SessionRunResult = await (deps.awaitMission ? deps.awaitMission(followRun) : followRun);
|
|
1806
|
+
debug.log('agent-mission', 'session-resume-result', {
|
|
1807
|
+
backend: backend.name, ok: resumed.ok, reason: resumed.reason, expectedSessionId: sessionId,
|
|
1808
|
+
returnedSessionId: resumed.sessionId, numTurns: resumed.numTurns,
|
|
1809
|
+
});
|
|
1810
|
+
if (!resumed.ok || resumed.sessionId !== sessionId) {
|
|
1811
|
+
const missingResumedSession = resumed.reason === 'no-session';
|
|
1812
|
+
result = { ...resumed, ok: false,
|
|
1813
|
+
reason: resumed.ok || missingResumedSession ? 'session-mismatch' : resumed.reason, sessionId };
|
|
1814
|
+
} else {
|
|
1815
|
+
result = { ...resumed, sessionId, numTurns: (result.numTurns ?? 0) + (resumed.numTurns ?? 0) };
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1746
1819
|
debug.log('agent-mission', 'headless-result', {
|
|
1747
1820
|
ok: result.ok, reason: result.reason, exitCode: result.exitCode,
|
|
1748
|
-
sessionId: result.sessionId, numTurns: result.numTurns,
|
|
1749
|
-
|
|
1821
|
+
sessionId: result.sessionId, numTurns: result.numTurns, malformedLines: result.malformedLines,
|
|
1822
|
+
...(backend.name === 'claude' ? { toolEvents: result.toolEvents, durationMs: result.durationMs } : {}),
|
|
1750
1823
|
});
|
|
1751
1824
|
if (!result.ok) return {
|
|
1752
1825
|
ok: false, worktree: wt.path, branch: wt.branch, rounds: result.numTurns ?? 0,
|
|
1753
1826
|
evidencePath: null, committed: false, usedOmniCrawl: false,
|
|
1754
|
-
detail:
|
|
1827
|
+
detail: `${backend.name} session failed (${result.reason}; exit ${result.exitCode ?? 'unknown'}). Check the CLI and retry.`,
|
|
1755
1828
|
};
|
|
1756
1829
|
if (deps.isMissionAborted?.()) return { ok: false, reason: 'aborted', worktree: wt.path, branch: wt.branch,
|
|
1757
1830
|
rounds: result.numTurns ?? 0, evidencePath: null, committed: false, usedOmniCrawl: false, detail: 'aborted' };
|
|
@@ -1770,7 +1843,7 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
1770
1843
|
}
|
|
1771
1844
|
let committed = false;
|
|
1772
1845
|
if (!deps.isMissionAborted?.() && !spec.workdir && (spec.commit ?? true)) {
|
|
1773
|
-
const c = (deps.commitWorktree ?? commitWorktree)(wt.path, `chore(agent-mission): ${spec.branch} —
|
|
1846
|
+
const c = (deps.commitWorktree ?? commitWorktree)(wt.path, `chore(agent-mission): ${spec.branch} — ${backend.name} resumable session 산출`);
|
|
1774
1847
|
committed = c.ok;
|
|
1775
1848
|
debug.log('agent-mission', 'commit', { ok: c.ok, out: c.out.slice(0, 120) });
|
|
1776
1849
|
if (!c.ok) {
|
|
@@ -2406,3 +2479,111 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
2406
2479
|
|
|
2407
2480
|
/** @deprecated codex 특정 이름 — runAgentMission 을 쓰라(codex 는 기본 backend). */
|
|
2408
2481
|
export const runCodexMission = runAgentMission;
|
|
2482
|
+
|
|
2483
|
+
export interface ResearchGraphHandNodeInput {
|
|
2484
|
+
question: string;
|
|
2485
|
+
/** Optional focused task for this hand; otherwise the question is paired with the agent's default role. */
|
|
2486
|
+
codexMission?: string;
|
|
2487
|
+
claudeMission?: string;
|
|
2488
|
+
}
|
|
2489
|
+
|
|
2490
|
+
export interface ResearchGraphHandNodeOptions {
|
|
2491
|
+
agent: 'codex' | 'claude';
|
|
2492
|
+
/** Small role-specific focus added when the graph input does not provide an explicit mission. */
|
|
2493
|
+
focus?: string;
|
|
2494
|
+
maxRounds?: number;
|
|
2495
|
+
}
|
|
2496
|
+
|
|
2497
|
+
export interface ResearchGraphHandNodeDeps {
|
|
2498
|
+
runMission?: typeof runAgentMission;
|
|
2499
|
+
resolveBackend?: typeof resolveBackend;
|
|
2500
|
+
readResultFile?: (path: string) => string;
|
|
2501
|
+
}
|
|
2502
|
+
|
|
2503
|
+
const RESEARCH_HAND_REPORT = '.elanous/mission-results/hand-result.md';
|
|
2504
|
+
const RESEARCH_HAND_REPORT_MAX_CHARS = 12_000;
|
|
2505
|
+
|
|
2506
|
+
function graphSegment(value: string): string {
|
|
2507
|
+
const safe = value.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 48);
|
|
2508
|
+
return safe || 'run';
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2511
|
+
function researchHandInput(input: unknown, agent: 'codex' | 'claude'): { question: string; mission?: string } | undefined {
|
|
2512
|
+
if (typeof input === 'string' && input.trim()) return { question: input.trim() };
|
|
2513
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) return undefined;
|
|
2514
|
+
const record = input as Record<string, unknown>;
|
|
2515
|
+
const question = typeof record.question === 'string' ? record.question.trim() : '';
|
|
2516
|
+
if (!question) return undefined;
|
|
2517
|
+
const requestedMission = record[`${agent}Mission`];
|
|
2518
|
+
return { question, ...(typeof requestedMission === 'string' && requestedMission.trim() ? { mission: requestedMission.trim() } : {}) };
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2521
|
+
/**
|
|
2522
|
+
* Build one graph hand node around the existing PTY mission driver. Register one handler per agent
|
|
2523
|
+
* (`handler:research-hand`) in the graph's run-scoped in-process registry; the next node receives a
|
|
2524
|
+
* bounded, redacted report plus the durable report path in `outputs[handNodeId].evidence`.
|
|
2525
|
+
*/
|
|
2526
|
+
export function createResearchGraphHandNodeHandler(
|
|
2527
|
+
options: ResearchGraphHandNodeOptions,
|
|
2528
|
+
deps: ResearchGraphHandNodeDeps = {},
|
|
2529
|
+
): InProcessHandler {
|
|
2530
|
+
if (options.agent !== 'codex' && options.agent !== 'claude') throw new Error('research hand agent must be codex or claude');
|
|
2531
|
+
const maxRounds = options.maxRounds ?? 16;
|
|
2532
|
+
if (!Number.isSafeInteger(maxRounds) || maxRounds <= 0) throw new Error('research hand maxRounds must be a positive integer');
|
|
2533
|
+
const focus = options.focus?.trim() || (options.agent === 'codex'
|
|
2534
|
+
? '데이터를 수집하고 필요한 계산 코드를 작성·실행해 핵심 근거를 정리하라.'
|
|
2535
|
+
: '주장에 대한 반대 근거와 누락된 전제를 검토하고 검토 보고서를 작성하라.');
|
|
2536
|
+
const runMission = deps.runMission ?? runAgentMission;
|
|
2537
|
+
const backend = (deps.resolveBackend ?? resolveBackend)(options.agent);
|
|
2538
|
+
|
|
2539
|
+
return async (context: InProcessHandlerContext) => {
|
|
2540
|
+
const request = researchHandInput(context.input, options.agent);
|
|
2541
|
+
if (!request) return { ok: false, outcome: 'fail', error: 'research hand node requires a non-empty question in graph input' };
|
|
2542
|
+
const branch = `research-hand-${graphSegment(context.graphId)}-${graphSegment(context.runId)}-${graphSegment(context.nodeId)}-${options.agent}`;
|
|
2543
|
+
const decisionMissionId = `research:${graphSegment(context.graphId)}:${graphSegment(context.runId)}`;
|
|
2544
|
+
const reportPath = join(RESEARCH_HAND_REPORT);
|
|
2545
|
+
const mission = [
|
|
2546
|
+
`연구 질문: ${request.question}`,
|
|
2547
|
+
request.mission ? `이 손의 과제: ${request.mission}` : `역할: ${focus}`,
|
|
2548
|
+
`결과 보고서를 ${reportPath} 에 작성하라. 핵심 결과, 근거와 출처, 불확실성, 다음 취합자가 알아야 할 제한을 간결하게 담고 파일을 비우지 마라.`,
|
|
2549
|
+
].join('\n\n');
|
|
2550
|
+
const result = await runMission({
|
|
2551
|
+
mission,
|
|
2552
|
+
branch,
|
|
2553
|
+
agent: backend,
|
|
2554
|
+
decisionMissionId,
|
|
2555
|
+
evidence: { kind: 'doc', dirRel: '.elanous/mission-results', glob: /^hand-result[.]md$/i },
|
|
2556
|
+
maxRounds,
|
|
2557
|
+
commit: true,
|
|
2558
|
+
enhance: false,
|
|
2559
|
+
memory: false,
|
|
2560
|
+
resources: 'off',
|
|
2561
|
+
entry: 'external-verbatim',
|
|
2562
|
+
});
|
|
2563
|
+
const absoluteReportPath = join(result.worktree, reportPath);
|
|
2564
|
+
let report = '';
|
|
2565
|
+
if (result.ok) {
|
|
2566
|
+
try { report = (deps.readResultFile ?? ((path) => readFileSync(path, 'utf8')))(absoluteReportPath).trim(); }
|
|
2567
|
+
catch { report = ''; }
|
|
2568
|
+
}
|
|
2569
|
+
const ok = result.ok && report.length > 0;
|
|
2570
|
+
return {
|
|
2571
|
+
ok,
|
|
2572
|
+
outcome: ok ? 'ok' : 'fail',
|
|
2573
|
+
...(ok ? {} : { error: redactSecretText(result.detail || 'research hand report was missing or empty').slice(0, 500) }),
|
|
2574
|
+
evidence: {
|
|
2575
|
+
hand: options.agent,
|
|
2576
|
+
missionId: decisionMissionId,
|
|
2577
|
+
nodeId: context.nodeId,
|
|
2578
|
+
branch,
|
|
2579
|
+
question: request.question,
|
|
2580
|
+
status: ok ? 'completed' : 'failed',
|
|
2581
|
+
worktree: result.worktree,
|
|
2582
|
+
reportPath: absoluteReportPath,
|
|
2583
|
+
report: ok ? redactSecretText(report).slice(0, RESEARCH_HAND_REPORT_MAX_CHARS) : null,
|
|
2584
|
+
evidencePath: result.evidencePath,
|
|
2585
|
+
detail: redactSecretText(result.detail).slice(0, 500),
|
|
2586
|
+
},
|
|
2587
|
+
};
|
|
2588
|
+
};
|
|
2589
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
|
|
5
|
+
export interface GrokLoginProbeResult { ok: boolean; reason?: string }
|
|
6
|
+
export type GrokAuthProbe = (timeoutMs: number) => Promise<{ status: number | null; stdout?: string; stderr?: string; error?: Error }> | { status: number | null; stdout?: string; stderr?: string; error?: Error };
|
|
7
|
+
|
|
8
|
+
const runAuthProbe: GrokAuthProbe = (timeoutMs) => new Promise((resolve) => {
|
|
9
|
+
let stdout = '';
|
|
10
|
+
let stderr = '';
|
|
11
|
+
let settled = false;
|
|
12
|
+
const finish = (result: { status: number | null; stdout?: string; stderr?: string; error?: Error }) => {
|
|
13
|
+
if (settled) return;
|
|
14
|
+
settled = true;
|
|
15
|
+
clearTimeout(timer);
|
|
16
|
+
resolve(result);
|
|
17
|
+
};
|
|
18
|
+
const child = spawn(join(homedir(), '.grok', 'bin', 'grok'), ['-p', 'reply with just OK'], {
|
|
19
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
20
|
+
});
|
|
21
|
+
const timer = setTimeout(() => {
|
|
22
|
+
child.kill('SIGTERM');
|
|
23
|
+
finish({ status: null, stdout, stderr, error: new Error('Grok subscribed-access probe timed out') });
|
|
24
|
+
}, Math.max(1, timeoutMs));
|
|
25
|
+
child.stdout?.setEncoding('utf8').on('data', (chunk: string) => { stdout = `${stdout}${chunk}`.slice(-8_000); });
|
|
26
|
+
child.stderr?.setEncoding('utf8').on('data', (chunk: string) => { stderr = `${stderr}${chunk}`.slice(-8_000); });
|
|
27
|
+
child.once('error', (error) => finish({ status: null, stdout, stderr, error }));
|
|
28
|
+
child.once('close', (status) => finish({ status, stdout, stderr }));
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/** Quick, credential-safe subscribed-access probe; whoami needs an interactive TTY in this CLI. */
|
|
32
|
+
export async function probeGrokLogin(run: GrokAuthProbe = runAuthProbe, timeoutMs = 45_000): Promise<GrokLoginProbeResult> {
|
|
33
|
+
const result = await run(timeoutMs);
|
|
34
|
+
if (result.error?.name === 'TimeoutError' || /timed out|ETIMEDOUT/i.test(result.error?.message ?? '')) {
|
|
35
|
+
return { ok: false, reason: 'Grok subscribed-access probe timed out' };
|
|
36
|
+
}
|
|
37
|
+
if (result.error) return { ok: false, reason: 'grok CLI could not be started' };
|
|
38
|
+
const output = `${result.stdout ?? ''}\n${result.stderr ?? ''}`.trim();
|
|
39
|
+
if (result.status !== 0 || /login required|not authenticated|unauthori[sz]ed|authentication failed/i.test(output)) {
|
|
40
|
+
const reason = /login required|not authenticated|unauthori[sz]ed|authentication failed/i.test(output)
|
|
41
|
+
? 'Grok login unavailable; run grok login'
|
|
42
|
+
: `Grok subscribed-access probe exited ${result.status ?? 'without a status'}`;
|
|
43
|
+
return { ok: false, reason };
|
|
44
|
+
}
|
|
45
|
+
if (!/^OK\s*$/i.test((result.stdout ?? '').trim())) return { ok: false, reason: 'Grok subscribed-access probe did not return the expected OK reply' };
|
|
46
|
+
return { ok: true };
|
|
47
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { MissionLineEvent, MissionLineInput, postMissionLineEvent } from './mission-line.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* HAND-HOOKS-NEXUS-STATUS 재수리 — OP #54582 승인 · TC #54571 계약 (2026-10-30).
|
|
6
|
+
*
|
|
7
|
+
* 손(hook) 클라이언트: TC 소유 수신기·서버·별도 endpoint는 여기에 없다. 기존 계약
|
|
8
|
+
* `POST /v1/missions/{missionId}/line`(`src/agent-mission/mission-line.ts` 의
|
|
9
|
+
* `postMissionLineEvent`)만 지나간다. Claude Code 훅(SessionStart·UserPromptSubmit·Stop·
|
|
10
|
+
* StopFailure·PreToolUse)과 Codex notify 는 **progress 만** 보낸다. final 은 명시적
|
|
11
|
+
* `mission reply --done` 전용이며 ask/answer/correct 는 예약(구현하지 않는다).
|
|
12
|
+
* 인증: missionId+attemptId+손별 Bearer. token(ELANOUS_HAND_TOKEN)은 child env 에만
|
|
13
|
+
* 둔다 — 인자·파일·다른 저장 위치를 쓰지 않는다. 각 훅 호출은 한 건의 progress 만
|
|
14
|
+
* 보내고 병렬 송신 경로를 만들지 않는다(Pod concurrency=1).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Claude Code 훅 이벤트 중 progress 를 보낼 때 허용되는 목록. */
|
|
18
|
+
export const CLAUDE_CODE_PROGRESS_EVENTS = ['SessionStart', 'UserPromptSubmit', 'Stop', 'StopFailure', 'PreToolUse'] as const;
|
|
19
|
+
|
|
20
|
+
export interface HandProgressInput {
|
|
21
|
+
missionId: string;
|
|
22
|
+
attemptId: string;
|
|
23
|
+
agent: 'codex' | 'claude';
|
|
24
|
+
source: string;
|
|
25
|
+
text: string;
|
|
26
|
+
state?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function renderClaudeHandSource(event: string): string {
|
|
30
|
+
return `claude-code:${event}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function renderCodexHandSource(tool: string): string {
|
|
34
|
+
return `codex-notify:${tool}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 손(hook) 발화 한 건을 progress 로 기존 mission-line 계약에 싣는다.
|
|
39
|
+
* lineId 는 이 계약이 새로 발급하고, token 은 env(deps.env ?? process.env)에서만 읽는다.
|
|
40
|
+
*/
|
|
41
|
+
export async function postHandProgress(
|
|
42
|
+
input: HandProgressInput,
|
|
43
|
+
deps: { fetch?: typeof fetch; env?: NodeJS.ProcessEnv } = {},
|
|
44
|
+
): Promise<MissionLineEvent> {
|
|
45
|
+
const payload: MissionLineInput = {
|
|
46
|
+
lineId: randomUUID(),
|
|
47
|
+
missionId: input.missionId,
|
|
48
|
+
attemptId: input.attemptId,
|
|
49
|
+
agent: input.agent,
|
|
50
|
+
type: 'progress',
|
|
51
|
+
source: input.source,
|
|
52
|
+
text: input.text,
|
|
53
|
+
...(input.state === undefined ? {} : { state: input.state }),
|
|
54
|
+
};
|
|
55
|
+
return postMissionLineEvent(payload, deps);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function readJsonField(raw: string, field: string): string | null {
|
|
59
|
+
try {
|
|
60
|
+
const parsed = JSON.parse(raw) as Record<string, unknown>;
|
|
61
|
+
return typeof parsed[field] === 'string' && (parsed[field] as string).trim() ? (parsed[field] as string).trim() : null;
|
|
62
|
+
} catch { return null; }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** child env 접근자 — 자격(missionId·attemptId)은 child env 에만 있다(파일·인자 저장 금지). */
|
|
66
|
+
function missionId(env: NodeJS.ProcessEnv): string {
|
|
67
|
+
return env.ELANOUS_MISSION_ID?.trim() ?? '';
|
|
68
|
+
}
|
|
69
|
+
function attemptId(env: NodeJS.ProcessEnv): string {
|
|
70
|
+
return env.ELANOUS_ATTEMPT_ID?.trim() ?? '';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** CLI: `bun src/agent-mission/hand-hooks.ts claude-code|codex-notify` — stdin JSON 훅 본문. fail-soft(exit 0). */
|
|
74
|
+
async function main(): Promise<number> {
|
|
75
|
+
const mode = process.argv[2] ?? '';
|
|
76
|
+
const env = process.env;
|
|
77
|
+
const mission = missionId(env);
|
|
78
|
+
const attempt = attemptId(env);
|
|
79
|
+
const token = env.ELANOUS_HAND_TOKEN?.trim();
|
|
80
|
+
// 자격은 child env 에만 존재한다 — 없으면 조용히 넘어간다(훅이 Claude Code/Codex 를 막지 않는다).
|
|
81
|
+
if (!mission || !attempt || !token) return 0;
|
|
82
|
+
const raw = await new Response(Bun.stdin.stream()).text();
|
|
83
|
+
const text = raw.slice(0, 200);
|
|
84
|
+
// 계약상 text 는 비어 있으면 안 된다 — 빈 훅 본문은 계약 위반 요청을 만들지 않고 조용히 넘어간다.
|
|
85
|
+
if (!text.trim()) return 0;
|
|
86
|
+
if (mode === 'claude-code') {
|
|
87
|
+
const event = readJsonField(raw, 'hook_event_name');
|
|
88
|
+
// 허용 이벤트만 progress — 그 외(예약 ask/answer/correct·final)는 여기서 만들지 않는다.
|
|
89
|
+
if (!event || !(CLAUDE_CODE_PROGRESS_EVENTS as readonly string[]).includes(event)) return 0;
|
|
90
|
+
await postHandProgress({ missionId: mission, attemptId: attempt, agent: 'claude', source: renderClaudeHandSource(event), text });
|
|
91
|
+
} else if (mode === 'codex-notify') {
|
|
92
|
+
const tool = readJsonField(raw, 'tool_name') ?? 'notify';
|
|
93
|
+
await postHandProgress({ missionId: mission, attemptId: attempt, agent: 'codex', source: renderCodexHandSource(tool), text });
|
|
94
|
+
}
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (import.meta.main) {
|
|
99
|
+
try { process.exit(await main()); }
|
|
100
|
+
catch { process.exit(0); } // fail-soft: 손 전달 실패가 훅 호출자를 막지 않는다.
|
|
101
|
+
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import { readFileSync } from 'node:fs';
|
|
8
8
|
import type { AgentBackend, AgentMissionResult, EvidenceMode } from './driver.js';
|
|
9
|
-
import type
|
|
9
|
+
import { runAgentMissionDuo, type DuoDeps, type DuoResult } from './duo.js';
|
|
10
|
+
import type { AgentCli, AgentCliDetection, AgentCliPreparation } from './tool-install.js';
|
|
10
11
|
import { buildAgentMissionDevSpec, executeAgentMissionReroute, type runDevPipeline } from '../self-dev/dev-pipeline.js';
|
|
11
12
|
import { parsePositiveInt } from '../self-dev/dev-cli.js';
|
|
12
13
|
import { parsePluginRef } from './in-agent-plugin.js';
|
|
@@ -17,7 +18,9 @@ export interface MissionCliOpts {
|
|
|
17
18
|
base?: string;
|
|
18
19
|
backend?: string;
|
|
19
20
|
chain?: string;
|
|
21
|
+
duo?: boolean;
|
|
20
22
|
headless?: boolean;
|
|
23
|
+
followUp?: string;
|
|
21
24
|
plugin?: string;
|
|
22
25
|
resources?: 'on' | 'off';
|
|
23
26
|
evidence?: string; // 'doc' | 'tsc' | 'test'
|
|
@@ -35,15 +38,17 @@ export interface MissionCliOpts {
|
|
|
35
38
|
export interface MissionCliDeps {
|
|
36
39
|
resolveBackend: (name?: string) => AgentBackend;
|
|
37
40
|
detectAgentCli?: (agent: 'claude' | 'codex') => AgentCliDetection;
|
|
41
|
+
prepareAgentCli?: (agent: AgentCli) => Promise<AgentCliPreparation>;
|
|
38
42
|
onStatus?: (line: string) => void;
|
|
39
43
|
signal?: AbortSignal;
|
|
40
44
|
readFile?: (path: string) => string;
|
|
41
45
|
runDevPipeline?: typeof runDevPipeline;
|
|
46
|
+
duoDeps?: DuoDeps;
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
export type MissionCliOutcome =
|
|
45
50
|
| { ok: false; message: string; exitCode: number }
|
|
46
|
-
| { ok: true; result: AgentMissionResult; exitCode: number };
|
|
51
|
+
| { ok: true; result: AgentMissionResult; duo?: DuoResult; exitCode: number };
|
|
47
52
|
|
|
48
53
|
/** mission CLI 글루 — 검증/구성/실행. process.exit·console 없음(호출부가 I/O). */
|
|
49
54
|
export async function runAgentMissionCliCommand(
|
|
@@ -53,8 +58,11 @@ export async function runAgentMissionCliCommand(
|
|
|
53
58
|
): Promise<MissionCliOutcome> {
|
|
54
59
|
// ── backend 검증(fail-fast·단일 resolve) ──
|
|
55
60
|
const chain = opts.chain?.split(',').map((item) => item.trim());
|
|
56
|
-
if (chain && (opts.commit === false || !['codex,claude,elanous', 'codex,claude,codex,elanous'].includes(chain.join(',')) || (opts.backend && opts.backend !== 'codex') || opts.headless)) {
|
|
57
|
-
return { ok: false, message: '--chain 은 codex,claude[,codex],elanous 형식이며 --backend 는 첫 backend 와 같아야 하고 --headless/--no-commit 은 함께 쓸 수 없습니다', exitCode: 1 };
|
|
61
|
+
if (chain && (opts.commit === false || !['codex,claude,elanous', 'codex,claude,codex,elanous'].includes(chain.join(',')) || (opts.backend && opts.backend !== 'codex') || opts.headless || opts.followUp !== undefined)) {
|
|
62
|
+
return { ok: false, message: '--chain 은 codex,claude[,codex],elanous 형식이며 --backend 는 첫 backend 와 같아야 하고 --headless/--follow-up/--no-commit 은 함께 쓸 수 없습니다', exitCode: 1 };
|
|
63
|
+
}
|
|
64
|
+
if (opts.duo && (chain || opts.backend || opts.headless || opts.followUp !== undefined || opts.plugin || opts.enhance === false)) {
|
|
65
|
+
return { ok: false, message: '--duo 는 Codex·Claude 병렬 기본값만 지원하며 --chain/--backend/--headless/--follow-up/--plugin/--no-enhance 와 함께 쓸 수 없습니다', exitCode: 1 };
|
|
58
66
|
}
|
|
59
67
|
let agentBackend: AgentBackend;
|
|
60
68
|
try { agentBackend = deps.resolveBackend(chain?.[0] ?? opts.backend); }
|
|
@@ -62,8 +70,14 @@ export async function runAgentMissionCliCommand(
|
|
|
62
70
|
if (opts.headless && agentBackend.name !== 'claude') {
|
|
63
71
|
return { ok: false, message: '--headless 는 --backend claude 전용입니다', exitCode: 1 };
|
|
64
72
|
}
|
|
73
|
+
if (opts.followUp !== undefined && !opts.followUp.trim()) {
|
|
74
|
+
return { ok: false, message: '--follow-up 은 비어 있지 않은 후속 프롬프트가 필요합니다', exitCode: 1 };
|
|
75
|
+
}
|
|
76
|
+
if (opts.followUp !== undefined && !['claude', 'codex'].includes(agentBackend.name)) {
|
|
77
|
+
return { ok: false, message: '--follow-up 은 Claude 또는 Codex backend 전용입니다', exitCode: 1 };
|
|
78
|
+
}
|
|
65
79
|
const plugin = opts.plugin ? parsePluginRef(opts.plugin) : null;
|
|
66
|
-
if (opts.plugin !== undefined && (!plugin || !['codex', 'claude'].includes(agentBackend.name) || opts.headless)) {
|
|
80
|
+
if (opts.plugin !== undefined && (!plugin || !['codex', 'claude'].includes(agentBackend.name) || opts.headless || opts.followUp !== undefined)) {
|
|
67
81
|
return { ok: false, message: '--plugin 은 codex/claude 대화형 backend 에서 <name>@<market> 형식이어야 합니다', exitCode: 1 };
|
|
68
82
|
}
|
|
69
83
|
if (opts.resources !== undefined && opts.resources !== 'on' && opts.resources !== 'off') {
|
|
@@ -108,6 +122,7 @@ export async function runAgentMissionCliCommand(
|
|
|
108
122
|
resources: opts.resources ?? 'on',
|
|
109
123
|
...(opts.backend ? { backendExplicit: opts.backend } : {}),
|
|
110
124
|
...(opts.headless ? { headless: true } : {}),
|
|
125
|
+
...(opts.followUp !== undefined ? { followUp: opts.followUp } : {}),
|
|
111
126
|
branch: opts.branch,
|
|
112
127
|
...(opts.base ? { base: opts.base } : {}),
|
|
113
128
|
...(opts.enhance === false ? { enhanceOff: true } : {}),
|
|
@@ -119,24 +134,44 @@ export async function runAgentMissionCliCommand(
|
|
|
119
134
|
});
|
|
120
135
|
// The production CLI injects the host probe; injected tests can assert this preflight
|
|
121
136
|
// without spawning an agent CLI. For a chain, inspect each external CLI before any launch.
|
|
122
|
-
const externalAgents = [...new Set((chain ?? [agentBackend.name]).filter(
|
|
137
|
+
const externalAgents: Array<'claude' | 'codex'> = opts.duo ? ['codex', 'claude'] : [...new Set((chain ?? [agentBackend.name]).filter(
|
|
123
138
|
(name): name is 'claude' | 'codex' => name === 'claude' || name === 'codex',
|
|
124
139
|
))];
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
if (deps.prepareAgentCli) {
|
|
141
|
+
for (const agent of externalAgents) {
|
|
142
|
+
const prepared = await deps.prepareAgentCli(agent);
|
|
143
|
+
if (!prepared.ready) return { ok: false, message: prepared.message, exitCode: 1 };
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
const detections = deps.detectAgentCli ? externalAgents.map((agent) => deps.detectAgentCli!(agent)) : [];
|
|
147
|
+
const statusLine = detections.map(({ message }) => message).join(' · ');
|
|
148
|
+
if (statusLine) deps.onStatus?.(statusLine);
|
|
149
|
+
const notReady = detections.find(({ installed, login }) => installed !== true || login !== 'ready');
|
|
150
|
+
if (notReady) {
|
|
151
|
+
const message = notReady.installed === false
|
|
152
|
+
? `${notReady.message}; 공식 설치 후 다시 실행`
|
|
153
|
+
: notReady.installed === null
|
|
154
|
+
? `${notReady.message}; 설치 상태를 확인한 뒤 다시 실행`
|
|
155
|
+
: notReady.login === 'api-key'
|
|
156
|
+
? `${notReady.message}; API 키 요금 고지와 동의 화면이 아직 없어 미션을 시작하지 않습니다 — Codex 구독 로그인(codex login) 후 다시 실행`
|
|
157
|
+
: notReady.login === 'needed'
|
|
158
|
+
? `${notReady.message}; ${notReady.agent} login 후 다시 실행`
|
|
159
|
+
: `${notReady.message}; 로그인 상태를 확인한 뒤 다시 실행`;
|
|
160
|
+
return { ok: false, message, exitCode: 1 };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (opts.duo) {
|
|
164
|
+
const duo = await runAgentMissionDuo([mission], {
|
|
165
|
+
left: 'codex', right: 'claude', branch: opts.branch, ...(opts.base ? { base: opts.base } : {}),
|
|
166
|
+
evidence: opts.evidence, ...(opts.docDir ? { docDir: opts.docDir } : {}), ...(opts.docGlob ? { docGlob: opts.docGlob } : {}),
|
|
167
|
+
...(opts.testPath ? { testPath: opts.testPath } : {}), ...(opts.file ? { file: opts.file } : {}),
|
|
168
|
+
maxRounds: opts.maxRounds, commit: opts.commit,
|
|
169
|
+
}, { ...deps.duoDeps, resolveBackend: deps.duoDeps?.resolveBackend ?? deps.resolveBackend });
|
|
170
|
+
const result = duo.sides.find((side) => side.result)?.result ?? {
|
|
171
|
+
ok: false, worktree: '', branch: null, rounds: 0, evidencePath: null, committed: false,
|
|
172
|
+
usedOmniCrawl: false, detail: duo.lines.join('\n'),
|
|
173
|
+
};
|
|
174
|
+
return { ok: true, result, duo, exitCode: duo.exitCode };
|
|
140
175
|
}
|
|
141
176
|
const { result, exitCode } = await executeAgentMissionReroute(
|
|
142
177
|
spec, agentBackend,
|