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
|
@@ -56,6 +56,7 @@ import { installHarnessCliSinkHook } from './harness-cli-sink.js';
|
|
|
56
56
|
import { addHarnessQueue, HarnessQueueDuplicateError, harnessQueueReceiptPath, listHarnessQueue, queueSeatForCwd, reconcileHarnessQueue, removeHarnessQueue, setHarnessQueuePriority, tickHarnessQueue, type HarnessQueueDeps, type QueueItem, type QueueSeat } from './harness-queue.js';
|
|
57
57
|
import { writeHarnessQueueReceipt } from './harness-queue-child.js';
|
|
58
58
|
import { decideBackpressure, readBackpressureSignals, type BackpressureReadDeps } from './dispatch-backpressure.js';
|
|
59
|
+
import { DISPATCH_SHADOW_COMPARE_ENV, recordDispatchShadowCompareFromEnv } from './dispatch-shadow-compare.js';
|
|
59
60
|
import { parseDoorSince, queryLaunchDoors, renderLaunchDoors, type DoorTable } from './launch-stamp.js';
|
|
60
61
|
import { resolveHarnessSubstrate, type ResolvedHarnessSubstrate } from './harness-substrate-default.js';
|
|
61
62
|
import { podChildProviderRefusal } from '../task-orchestrator/surfaces/pod-child-providers.js';
|
|
@@ -1061,6 +1062,13 @@ async function dispatchHarnessAskSay(
|
|
|
1061
1062
|
const takeQueue = intakeTakesQueue(intakeLabel, intakeRoute, queueEligible);
|
|
1062
1063
|
// 실제로 탄 간선을 전제 검사 «뒤»에 남긴다(그래프 답과 다르면 honored=false · 이유).
|
|
1063
1064
|
recordJourneyEdge(intakeRoute, takeQueue ? 'queue' : 'launch-gate', intakeRoute.to === 'queue' && !takeQueue ? (opts.queue === false ? '--no-queue' : process.env.ELANOUS_HARNESS_QUEUE_LAUNCH ? 'queue-child' : 'no-seat') : undefined);
|
|
1065
|
+
// OP TA dispatcher injects its decision snapshot. Join both policies at the product entry;
|
|
1066
|
+
// this is observation only and must not change queue/direct routing.
|
|
1067
|
+
recordDispatchShadowCompareFromEnv(process.env[DISPATCH_SHADOW_COMPARE_ENV], {
|
|
1068
|
+
entrance: dryRunPreview.entrance,
|
|
1069
|
+
productEntryAction: takeQueue ? 'queue' : 'launch-gate',
|
|
1070
|
+
productEntryReason: takeQueue ? 'graph-intake-queue' : `graph-intake-${intakeRoute.to}`,
|
|
1071
|
+
});
|
|
1064
1072
|
if (directSay && opts.queue === false) {
|
|
1065
1073
|
try { debug.log('harness.queue', 'bypass', { seat: stampedSeat ?? null, reason: '--no-queue' }); }
|
|
1066
1074
|
catch { /* Observation must not prevent an emergency launch. */ }
|
|
@@ -1190,7 +1198,9 @@ async function dispatchHarnessAskSay(
|
|
|
1190
1198
|
delete process.env[LAUNCH_DOOR_RECEIPT_ENV];
|
|
1191
1199
|
// 주입된 문이 없으면 생산 우주의 기본 문을 쓴다(시험 환경은 관문 관례와 같이 건너뛴다 — 시험 단언이 단일문 때문에 바뀌지 않는다).
|
|
1192
1200
|
const launchDoor = gate.launchDoor ?? (process.env.NODE_ENV === 'test' ? undefined : openLaunchRequestDoor({ source: dryRunPreview.entrance }));
|
|
1193
|
-
|
|
1201
|
+
// A hand parent already consumed a card/attempt-scoped request id. Reuse that id here;
|
|
1202
|
+
// direct harness requests still derive their stable id from the authored ask.
|
|
1203
|
+
const launchDoorRequestId = inheritedLaunchDoorReceipt ?? launchDoor?.requestId(identity);
|
|
1194
1204
|
const decision = await withJourneyNode('launch-gate', journey, async () => {
|
|
1195
1205
|
const { budget, budgetSource, snapshotAgeSec } = await resolveLaunchBudget({
|
|
1196
1206
|
provider: opts.childLlmProvider,
|
|
@@ -4,26 +4,31 @@
|
|
|
4
4
|
// allowlist skill 을 강하게 가리키면 그 skill 을 격리 실행(invokeResearch·Write/Edit deny)해 실제 출력을
|
|
5
5
|
// Planner grounding 에 얹는다("총동원" 북극성 인프라).
|
|
6
6
|
//
|
|
7
|
-
// ★★ 안전 경계 (
|
|
8
|
-
// ① **allowlist** —
|
|
9
|
-
// consensus
|
|
7
|
+
// ★★ 안전 경계 (allowlist 로만 자동 skill 실행을 열고, 강한 트리거·격리·fail-soft 유지):
|
|
8
|
+
// ① **allowlist** — 명시적으로 승인한 research·market·scoring skills 만 자동 경로에 편입한다.
|
|
9
|
+
// stochastic consensus 배치는 제외하고, 아래 기본 목록의 attractiveness-panel 은 OP 승인 예외다.
|
|
10
10
|
// ② **격리** — invokeResearch 경유 = withResearchIsolation(Write/Edit/NotebookEdit deny). 부작용 봉쇄.
|
|
11
11
|
// ③ **강한 게이트** — unambiguous + score>=2.0 + 명시 트리거 히트(설명 보너스만으론 안 뜸).
|
|
12
12
|
// ④ **fail-soft** — 실패/빈 출력 = null(상위가 skill-hint 로 폴백·plan 안 막음).
|
|
13
|
-
// ⚠️ omni-crawl 은 research seam 이 이미 커버 → allowlist 제외(중복 회피).
|
|
14
|
-
// ⚠️ 코딩 objective 에선 트리거 빈도 낮음(대개 코드 변경) — 이는 북극성 "총동원" 인프라이지 상시 경로 아님.
|
|
15
13
|
|
|
16
14
|
import { detectSkillTrigger } from '../skills/router.js';
|
|
17
15
|
import type { SkillIndexEntry } from '../skills/index.js';
|
|
18
16
|
import { invokeResearch } from '../research-bridge/invoke.js';
|
|
19
17
|
import { SKILL_HINT_MIN_SCORE } from './skill-hint.js';
|
|
20
18
|
|
|
21
|
-
/** 하니스 plan 단계에서 **자동 실행** 허용된 skill
|
|
22
|
-
*
|
|
19
|
+
/** 하니스 plan 단계에서 **자동 실행** 허용된 skill 기본값.
|
|
20
|
+
* Research·market·scoring skill 은 OP 승인 목록이며, 실제 자동 실행은 아래 strong-trigger 및 isolation 게이트를 통과해야 한다. */
|
|
23
21
|
export const HARNESS_EXEC_ALLOWLIST: ReadonlySet<string> = new Set<string>([
|
|
22
|
+
// Parent planning is grounding, not a child tool call. A child does not repeat
|
|
23
|
+
// it automatically; an explicit child crawl is a separately scoped follow-up.
|
|
24
|
+
'omni-crawl', // OP 2026-10-30: research child skill access
|
|
24
25
|
'omni-digest', // URL/문서 요약(참조 자료 확보)
|
|
25
26
|
'omni-market', // 금융 데이터 조회(read-only)
|
|
26
27
|
'kr-flow', // 한국 시장 수급(read-only)
|
|
28
|
+
'asset-attractiveness', // OP 2026-10-30: scoring research
|
|
29
|
+
'social-pulse', // OP 2026-10-30: social evidence research
|
|
30
|
+
'attractiveness-panel', // OP-approved exception to the generic -panel config block
|
|
31
|
+
'factor-backtest', // OP 2026-10-30: market research/backtesting
|
|
27
32
|
// 📧 Gmail·Calendar·Drive·Sheets. ⚠️ ***읽기 전용이 «아니다»*** — 이 목록의 앞 셋과 다른 성질이다.
|
|
28
33
|
// ⛔ 그래서 SKILL.md 가 규율을 못 박았다: 사용자가 「보내라·잡아라·지워라」를 «명시»하지 않으면
|
|
29
34
|
// ***초안까지만*** 한다(메일 전송·일정 생성·삭제는 되돌릴 수 없다).
|
|
@@ -40,6 +45,11 @@ const HARNESS_EXEC_BLOCK_PATTERNS: readonly RegExp[] = [
|
|
|
40
45
|
/consensus/i, // *-consensus — 다수 에이전트 투표
|
|
41
46
|
];
|
|
42
47
|
|
|
48
|
+
/** Explicitly OP-approved defaults may bypass a broad config pattern block. */
|
|
49
|
+
const HARNESS_EXEC_BLOCK_EXCEPTIONS: ReadonlySet<string> = new Set([
|
|
50
|
+
'attractiveness-panel',
|
|
51
|
+
]);
|
|
52
|
+
|
|
43
53
|
/** 선언된 속성만으로 자동실행 안전한가(순수). 미선언은 false(보수 기본·fail-safe).
|
|
44
54
|
* `SkillIndexEntry`의 선언값은 실행기와 같은 `parseSkillMd`가 같은 아티팩트에서 읽는다.
|
|
45
55
|
* 선언은 skill 저자의 authorization 신호다. 읽기만 + 경량일 때만 true. */
|
|
@@ -63,7 +73,9 @@ export function resolveHarnessExecAllowlist(
|
|
|
63
73
|
const addIfAllowed = (raw: string): void => {
|
|
64
74
|
const name = raw.trim();
|
|
65
75
|
if (!name) return;
|
|
66
|
-
const blocked =
|
|
76
|
+
const blocked = HARNESS_EXEC_BLOCK_EXCEPTIONS.has(name)
|
|
77
|
+
? undefined
|
|
78
|
+
: HARNESS_EXEC_BLOCK_PATTERNS.find((p) => p.test(name));
|
|
67
79
|
if (blocked) {
|
|
68
80
|
onReject?.(name, `자동 실행 대상 아님: 블록패턴 ${blocked} (Agent 배치·고비용 자동실행 금지). 대신 skill-hint 경로를 사용하세요. 이 판정을 넓히려면 skillRouter.harnessExecAllowlist와 HARNESS_EXEC_BLOCK_PATTERNS를 검토하세요.`);
|
|
69
81
|
return;
|
|
@@ -92,7 +104,7 @@ export async function execHarnessSkill(
|
|
|
92
104
|
index: readonly SkillIndexEntry[],
|
|
93
105
|
invoke: (objective: string, skill: string) => Promise<{ ok: boolean; output: string }> =
|
|
94
106
|
(obj, skill) => invokeResearch(obj, { skill }).then((r) => ({ ok: r.ok, output: r.output })),
|
|
95
|
-
allowlist: ReadonlySet<string> = HARNESS_EXEC_ALLOWLIST, // S2 — config 확장 주입(
|
|
107
|
+
allowlist: ReadonlySet<string> = HARNESS_EXEC_ALLOWLIST, // S2 — config 확장 주입(기본 목록·무회귀)
|
|
96
108
|
): Promise<SkillExecResult | null> {
|
|
97
109
|
if (!objective.trim() || index.length === 0) return null;
|
|
98
110
|
const detect = detectSkillTrigger(objective, index as SkillIndexEntry[]);
|
|
@@ -63,7 +63,7 @@ export async function selectHarnessSkill(
|
|
|
63
63
|
try { index = (deps.index ?? getSkillIndex()) as SkillIndexEntry[]; } catch { return null; }
|
|
64
64
|
if (!index.length) return null;
|
|
65
65
|
const invoke: InvokeFn = deps.invoke ?? ((obj, skill) => invokeResearch(obj, { skill }).then((r) => ({ ok: r.ok, output: r.output })));
|
|
66
|
-
const allowlist = deps.allowlist ?? HARNESS_EXEC_ALLOWLIST; // S2 — config 확장 주입(기본
|
|
66
|
+
const allowlist = deps.allowlist ?? HARNESS_EXEC_ALLOWLIST; // S2 — config 확장 주입(기본 승인 목록·무회귀)
|
|
67
67
|
|
|
68
68
|
// 1) luna 의미매칭(주경로) — allowlist ∩ luna픽 을 격리 실행. null=luna 실패(→fallback)·[]=관련없음(fallback 도 시도).
|
|
69
69
|
let picked: string[] = [];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Compute } from 'google-auth-library';
|
|
2
|
+
import type { ReceivedReport } from './error-report.js';
|
|
3
|
+
|
|
4
|
+
const GCS_SCOPE = 'https://www.googleapis.com/auth/devstorage.read_write';
|
|
5
|
+
const PUBSUB_SCOPE = 'https://www.googleapis.com/auth/pubsub';
|
|
6
|
+
const DEFAULT_PROJECT_ID = 'pearlplaygroud';
|
|
7
|
+
const DEFAULT_BUCKET = 'elanous-error-reports-pearl';
|
|
8
|
+
const DEFAULT_TOPIC = 'error-reports';
|
|
9
|
+
|
|
10
|
+
export type ErrorReportCloudStage = 'store' | 'publish';
|
|
11
|
+
|
|
12
|
+
export class ErrorReportCloudError extends Error {
|
|
13
|
+
constructor(readonly stage: ErrorReportCloudStage, cause?: unknown) {
|
|
14
|
+
super(`error report cloud ${stage} failed`, { cause });
|
|
15
|
+
this.name = 'ErrorReportCloudError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface GoogleRequestOptions {
|
|
20
|
+
url: string;
|
|
21
|
+
method: 'POST';
|
|
22
|
+
params?: Record<string, string | number>;
|
|
23
|
+
data: string | Record<string, unknown>;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
timeout?: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface CloudErrorReportPublisherOptions {
|
|
29
|
+
projectId?: string;
|
|
30
|
+
bucket?: string;
|
|
31
|
+
topic?: string;
|
|
32
|
+
request?: (options: GoogleRequestOptions) => Promise<unknown>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function reportObjectName(item: ReceivedReport): string {
|
|
36
|
+
const date = new Date(item.receivedAt);
|
|
37
|
+
if (!Number.isFinite(date.getTime())) throw new Error('receivedAt must be a valid date');
|
|
38
|
+
const year = String(date.getUTCFullYear());
|
|
39
|
+
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
40
|
+
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
41
|
+
return `${year}/${month}/${day}/${item.reportId}.json`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function statusCode(error: unknown): number | undefined {
|
|
45
|
+
if (!error || typeof error !== 'object') return undefined;
|
|
46
|
+
const response = 'response' in error ? error.response : undefined;
|
|
47
|
+
return response && typeof response === 'object' && 'status' in response && typeof response.status === 'number'
|
|
48
|
+
? response.status : undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Writes the validated original to private GCS, then publishes the same receipt for independent consumers. */
|
|
52
|
+
export function createCloudErrorReportPublisher(options: CloudErrorReportPublisherOptions = {}): (item: ReceivedReport) => Promise<void> {
|
|
53
|
+
const projectId = options.projectId ?? process.env.ELANOUS_ERROR_REPORT_GCP_PROJECT ?? DEFAULT_PROJECT_ID;
|
|
54
|
+
const bucket = options.bucket ?? process.env.ELANOUS_ERROR_REPORT_GCS_BUCKET ?? DEFAULT_BUCKET;
|
|
55
|
+
const topic = options.topic ?? process.env.ELANOUS_ERROR_REPORT_PUBSUB_TOPIC ?? DEFAULT_TOPIC;
|
|
56
|
+
let authRequest: ((request: GoogleRequestOptions) => Promise<unknown>) | undefined;
|
|
57
|
+
const request = options.request ?? (async (requestOptions: GoogleRequestOptions) => {
|
|
58
|
+
if (!authRequest) {
|
|
59
|
+
// Compute obtains short-lived credentials from the VM metadata server;
|
|
60
|
+
// it never falls back to a GOOGLE_APPLICATION_CREDENTIALS key file.
|
|
61
|
+
const client = new Compute({ scopes: [GCS_SCOPE, PUBSUB_SCOPE] });
|
|
62
|
+
authRequest = (value) => client.request(value);
|
|
63
|
+
}
|
|
64
|
+
return authRequest(requestOptions);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return async (item) => {
|
|
68
|
+
const name = reportObjectName(item);
|
|
69
|
+
const body = JSON.stringify(item);
|
|
70
|
+
try {
|
|
71
|
+
await request({
|
|
72
|
+
url: `https://storage.googleapis.com/upload/storage/v1/b/${encodeURIComponent(bucket)}/o`,
|
|
73
|
+
method: 'POST',
|
|
74
|
+
params: { uploadType: 'media', name, ifGenerationMatch: 0 },
|
|
75
|
+
data: body,
|
|
76
|
+
headers: { 'content-type': 'application/json' },
|
|
77
|
+
timeout: 10_000,
|
|
78
|
+
});
|
|
79
|
+
} catch (error) {
|
|
80
|
+
// A retry after a successful upload but lost response sees 412; keep the
|
|
81
|
+
// immutable original and proceed to publish the receipt.
|
|
82
|
+
if (statusCode(error) !== 412) throw new ErrorReportCloudError('store', error);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
await request({
|
|
87
|
+
url: `https://pubsub.googleapis.com/v1/projects/${encodeURIComponent(projectId)}/topics/${encodeURIComponent(topic)}:publish`,
|
|
88
|
+
method: 'POST',
|
|
89
|
+
data: {
|
|
90
|
+
messages: [{
|
|
91
|
+
data: Buffer.from(body, 'utf8').toString('base64'),
|
|
92
|
+
attributes: { reportId: item.reportId, dedupe: item.dedupe, schemaVersion: '1' },
|
|
93
|
+
}],
|
|
94
|
+
},
|
|
95
|
+
timeout: 10_000,
|
|
96
|
+
});
|
|
97
|
+
} catch (error) {
|
|
98
|
+
throw new ErrorReportCloudError('publish', error);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
package/src/hooks/receiver.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { HookQueue, type QueuedHook } from './queue.js';
|
|
|
7
7
|
import { recordGithubShadow, type ShadowReviewResult } from './github-shadow.js';
|
|
8
8
|
import { toExternalTask, verifyWebhook, type HookProvider } from './providers.js';
|
|
9
9
|
import { drainReports, handleReportPost, ReportLimiter, ReportQueue, type ReceivedReport } from './error-report.js';
|
|
10
|
+
import { createCloudErrorReportPublisher } from './error-report-cloud.js';
|
|
10
11
|
import { ConsultLimiter, ConsultQueue, drainConsults, handleConsultPost, type QueuedConsult } from './consult-intake.js';
|
|
11
12
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
12
13
|
|
|
@@ -28,6 +29,9 @@ export interface HookReceiverOptions {
|
|
|
28
29
|
wakeSeat?: HookWake;
|
|
29
30
|
/** ER2 — forward one queued error report to the Primary; default = POST /v1/reports/ingest over the tailnet. */
|
|
30
31
|
forwardReport?: (item: ReceivedReport) => Promise<boolean>;
|
|
32
|
+
/** ER3 — persist and fan out through GCS + Pub/Sub before using the legacy Primary path. */
|
|
33
|
+
publishCloudReport?: (item: ReceivedReport) => Promise<void>;
|
|
34
|
+
cloudReportsEnabled?: boolean;
|
|
31
35
|
/** CS1 — forward a queued consultation to the Primary's consult ledger. */
|
|
32
36
|
forwardConsult?: (item: QueuedConsult) => Promise<boolean>;
|
|
33
37
|
/** CS1 — the public consult route is a write path from the open internet, so it stays closed (404) until
|
|
@@ -99,6 +103,9 @@ export function startHookReceiver(options: HookReceiverOptions): { url: string;
|
|
|
99
103
|
const reportQueue = new ReportQueue(options.root ?? effectiveInstanceRoot(), (event, data) => debug.log('hooks.reports', event, data));
|
|
100
104
|
const reportLimiter = new ReportLimiter(options.now ?? Date.now);
|
|
101
105
|
const forwardReport = options.forwardReport ?? forwardReportToPrimary;
|
|
106
|
+
const publishCloudReport = options.publishCloudReport ?? createCloudErrorReportPublisher();
|
|
107
|
+
const cloudReportsEnabled = options.cloudReportsEnabled ?? process.env.ELANOUS_ERROR_REPORT_CLOUD_ENABLED === 'true';
|
|
108
|
+
debug.log('error-collect', cloudReportsEnabled ? 'cloud-enabled' : 'cloud-disabled', {});
|
|
102
109
|
const consultEnabled = options.consultEnabled ?? consultRouteEnabled();
|
|
103
110
|
debug.log('hooks.consult', consultEnabled ? 'route-open' : 'route-closed', {});
|
|
104
111
|
const consultQueue = new ConsultQueue(options.root ?? effectiveInstanceRoot(), (_event, data) =>
|
|
@@ -128,8 +135,28 @@ export function startHookReceiver(options: HookReceiverOptions): { url: string;
|
|
|
128
135
|
if (stopped || reportsDraining || Date.now() < reportNextAt) return;
|
|
129
136
|
reportsDraining = true;
|
|
130
137
|
try {
|
|
131
|
-
|
|
132
|
-
|
|
138
|
+
let cloudDelivered = 0;
|
|
139
|
+
let primaryFallbackDelivered = 0;
|
|
140
|
+
const deliver = async (item: ReceivedReport): Promise<boolean> => {
|
|
141
|
+
if (cloudReportsEnabled) {
|
|
142
|
+
try {
|
|
143
|
+
await publishCloudReport(item);
|
|
144
|
+
cloudDelivered++;
|
|
145
|
+
debug.log('error-collect', 'published', { reportId: item.reportId });
|
|
146
|
+
return true;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
const stage = error && typeof error === 'object' && 'stage' in error
|
|
149
|
+
&& (error.stage === 'store' || error.stage === 'publish') ? error.stage : 'unknown';
|
|
150
|
+
debug.log('error-collect', 'publish-failed', { reportId: item.reportId, stage });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const delivered = await forwardReport(item);
|
|
154
|
+
if (delivered) primaryFallbackDelivered++;
|
|
155
|
+
return delivered;
|
|
156
|
+
};
|
|
157
|
+
const result = await drainReports(reportQueue, deliver, (options.now ?? Date.now)());
|
|
158
|
+
if (primaryFallbackDelivered) debug.log('hooks.reports', 'forwarded', { delivered: primaryFallbackDelivered });
|
|
159
|
+
if (cloudDelivered) debug.log('error-collect', 'drained', { delivered: cloudDelivered });
|
|
133
160
|
if (result.failed) {
|
|
134
161
|
reportFailures++;
|
|
135
162
|
reportNextAt = Date.now() + Math.min(300_000, Math.max(1, options.retryBaseMs ?? 1000) * 2 ** Math.min(reportFailures - 1, 20));
|
package/src/index.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { isOldDoorInternalCall, refuseOldDoor } from './self-dev/old-door.js';
|
|
|
27
27
|
import { collectCommandEntrances, renderCommandEntrances } from './self-dev/entrance-inventory.js';
|
|
28
28
|
import { isGoalAuthorFileName } from './self-implement/goal-document.js';
|
|
29
29
|
import { DEV_PIPELINE_SINK_SURFACE } from './self-implement/self-cli-sink-surface.js';
|
|
30
|
+
import { DEFAULT_TUI_TEST_READY_TIMEOUT_MS } from './self-implement/elanous-tui-spawn.js';
|
|
30
31
|
|
|
31
32
|
import { applyTestStateDirFlagFromArgv } from './cli/test-state-dir-flag.js';
|
|
32
33
|
import { applyTestFlagFromArgv, observeTestFlagOwnership, uncoveredTestFlagPaths, staleTestFlagPaths } from './cli/test-flag.js';
|
|
@@ -97,6 +98,7 @@ function selectedIndexNextTuiRoot(args: readonly string[]): '__tui_next__' | und
|
|
|
97
98
|
const isCliEntry = import.meta.main || /[\\/]bin[\\/]elanous\.mjs$/.test(process.argv[1] ?? '');
|
|
98
99
|
const INDEX_FAST_ROOT = selectedIndexFastRoot(process.argv.slice(2))
|
|
99
100
|
?? (isCliEntry ? selectedIndexNextTuiRoot(process.argv.slice(2)) : undefined);
|
|
101
|
+
const shouldRegisterSetupCommand = !INDEX_FAST_ROOT || INDEX_FAST_ROOT === 'setup';
|
|
100
102
|
// Keep the historical index exports without forcing the agent engine into
|
|
101
103
|
// unrelated CLI commands at module load time.
|
|
102
104
|
export const runChatTurnCli: typeof import('./cli/agent-cli.js').runChatTurnCli =
|
|
@@ -153,6 +155,10 @@ const registerPrivateLedgerCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '_
|
|
|
153
155
|
const registerKnowCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'know'
|
|
154
156
|
? (() => undefined)
|
|
155
157
|
: (require('./cli/know-cli.js') as typeof import('./cli/know-cli.js')).registerKnowCommand) as typeof import('./cli/know-cli.js').registerKnowCommand;
|
|
158
|
+
// LIFE-KINDS(0.2.43) — 생애 종류·끝의 증거·반복 실행 시리즈의 생산 진입점(`eln life …`).
|
|
159
|
+
const registerLifeCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
|
|
160
|
+
? (() => undefined)
|
|
161
|
+
: (require('./life/life-cli.js') as typeof import('./life/life-cli.js')).registerLifeCommands) as typeof import('./life/life-cli.js').registerLifeCommands;
|
|
156
162
|
const registerSeatRequestsCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'seat'
|
|
157
163
|
? (() => undefined)
|
|
158
164
|
: (require('./cli/seat-requests-cli.js') as typeof import('./cli/seat-requests-cli.js')).registerSeatRequestsCommands) as typeof import('./cli/seat-requests-cli.js').registerSeatRequestsCommands;
|
|
@@ -278,6 +284,9 @@ const registerDoctorCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'doctor'
|
|
|
278
284
|
const registerProviderCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'provider'
|
|
279
285
|
? (() => undefined)
|
|
280
286
|
: (require('./cli/provider-cli.js') as typeof import('./cli/provider-cli.js')).registerProviderCommands) as typeof import('./cli/provider-cli.js').registerProviderCommands;
|
|
287
|
+
const registerCatalogCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'catalog'
|
|
288
|
+
? (() => undefined)
|
|
289
|
+
: (require('./cli/catalog-cli.js') as typeof import('./cli/catalog-cli.js')).registerCatalogCommands) as typeof import('./cli/catalog-cli.js').registerCatalogCommands;
|
|
281
290
|
const registerAgentCommands = (INDEX_FAST_ROOT
|
|
282
291
|
? (() => undefined)
|
|
283
292
|
: (require('./cli/agent-cli.js') as typeof import('./cli/agent-cli.js')).registerAgentCommands) as typeof import('./cli/agent-cli.js').registerAgentCommands;
|
|
@@ -287,9 +296,9 @@ const registerControlCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'control
|
|
|
287
296
|
const registerHooksCommands = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== '__full__'
|
|
288
297
|
? (() => undefined)
|
|
289
298
|
: (require('./cli/hooks-cli.js') as typeof import('./cli/hooks-cli.js')).registerHooksCommands) as typeof import('./cli/hooks-cli.js').registerHooksCommands;
|
|
290
|
-
const registerSetupCommand = (
|
|
291
|
-
? (()
|
|
292
|
-
: (
|
|
299
|
+
const registerSetupCommand = (shouldRegisterSetupCommand
|
|
300
|
+
? (require('./cli/setup-cli.js') as typeof import('./cli/setup-cli.js')).registerSetupCommand
|
|
301
|
+
: (() => undefined)) as typeof import('./cli/setup-cli.js').registerSetupCommand;
|
|
293
302
|
const registerStartCommand = (INDEX_FAST_ROOT && INDEX_FAST_ROOT !== 'start'
|
|
294
303
|
? (() => undefined)
|
|
295
304
|
: (require('./cli/start-cli.js') as typeof import('./cli/start-cli.js')).registerStartCommand) as typeof import('./cli/start-cli.js').registerStartCommand;
|
|
@@ -330,6 +339,7 @@ import { filterCliRootHelp } from './maturity/cli-maturity.js';
|
|
|
330
339
|
import type { AdPipelinePlan, AdPipelineResult } from './ad-pipeline/run.js';
|
|
331
340
|
import type { AcpPermissionApprover } from './acp/client.js';
|
|
332
341
|
import { runGitCommand } from './git-fs/runner.js';
|
|
342
|
+
import { loadWarmReuseEvidenceByConsumer } from './task-orchestrator/surfaces/warm-reuse-evidence.js';
|
|
333
343
|
import { debug, redactSecretText, redactSecrets } from './debug/log.js';
|
|
334
344
|
import type { HarnessAskSayChildLlmOptions, HarnessAskSayOptions, HarnessPlanOptions } from './harness/harness-cli-command.js';
|
|
335
345
|
import { CliUserError, formatCliUserError, isCliUserError } from './cli/cli-user-error.js';
|
|
@@ -1121,6 +1131,22 @@ async function runDevSayFromWords(
|
|
|
1121
1131
|
|
|
1122
1132
|
registerPtyTakeoverCommands(program);
|
|
1123
1133
|
registerPtyRecordCommand(program.commands.find((command) => command.name() === 'pty')!);
|
|
1134
|
+
program.command('tui')
|
|
1135
|
+
.description('test-universe TUI helpers')
|
|
1136
|
+
.command('test')
|
|
1137
|
+
.description('Prepare latest-main isolated test universe and return a held TUI PTY, runId, and snapshot')
|
|
1138
|
+
.option('--ready-timeout-ms <ms>', 'single held-PTY readiness deadline', String(DEFAULT_TUI_TEST_READY_TIMEOUT_MS))
|
|
1139
|
+
.option('--with-pwa-build', 'install/build PWA when its static export is missing')
|
|
1140
|
+
.action(async (opts: { readyTimeoutMs?: string; withPwaBuild?: boolean }) => {
|
|
1141
|
+
try {
|
|
1142
|
+
const { runTuiTestUniverse } = await import('./cli/tui-test-cli.js');
|
|
1143
|
+
const result = await runTuiTestUniverse({ readyTimeoutMs: Number(opts.readyTimeoutMs), withPwaBuild: opts.withPwaBuild });
|
|
1144
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
1145
|
+
} catch (error) {
|
|
1146
|
+
process.stderr.write(`tui test: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
1147
|
+
process.exitCode = 1;
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1124
1150
|
// Keep the public PR help slot but defer its large CI/landing import graph
|
|
1125
1151
|
// until the PR command is actually selected (including direct Commander use).
|
|
1126
1152
|
const prCommandOrder = program.commands.length;
|
|
@@ -1130,6 +1156,9 @@ const prShell = program.command('pr').description('PR landing commands');
|
|
|
1130
1156
|
prShell.command('supersede-drafts').description('확인된 병합 PR의 명시 Supersedes 같은 칸 draft만 정리')
|
|
1131
1157
|
.requiredOption('--pr <number>', '병합 PR 번호')
|
|
1132
1158
|
.option('--cwd <path>', '저장소 경로');
|
|
1159
|
+
prShell.command('lineage <pr>').description('PR 계보의 관측 사실만 JSON으로 읽기 (첫 조각 · 닫기 판정 없음)')
|
|
1160
|
+
.requiredOption('--json', 'JSON 관측 결과 출력')
|
|
1161
|
+
.option('--cwd <path>', '저장소 경로');
|
|
1133
1162
|
prShell.command('census').description('열린 PR 전체·골 문서만·2일 무커밋 draft·미닫힌 superseded 집계').option('--cwd <path>', '저장소 경로');
|
|
1134
1163
|
prShell.command('open-guard').description('새 PR 전에 같은 파일 OPEN PR·골 문서만·자리별 상한 검사')
|
|
1135
1164
|
.option('--cwd <path>', '작업 트리 경로').option('--base <ref>', '비교 base ref', 'origin/main')
|
|
@@ -1252,6 +1281,7 @@ registerLiveCommands(program);
|
|
|
1252
1281
|
registerResearchCommand(program);
|
|
1253
1282
|
registerReleaseCommands(program);
|
|
1254
1283
|
registerKnowCommand(program);
|
|
1284
|
+
registerLifeCommands(program);
|
|
1255
1285
|
registerNotifyCommand(program);
|
|
1256
1286
|
registerAwayCommand(program);
|
|
1257
1287
|
registerFreezeCommands(program);
|
|
@@ -1590,7 +1620,7 @@ registerDoctorCommand(program);
|
|
|
1590
1620
|
registerControlCommands(program);
|
|
1591
1621
|
registerHooksCommands(program);
|
|
1592
1622
|
registerSetupCommand(program);
|
|
1593
|
-
if (
|
|
1623
|
+
if (shouldRegisterSetupCommand) {
|
|
1594
1624
|
program.commands.find(command => command.name() === 'setup')!
|
|
1595
1625
|
.option('--terminal', 'Run the terminal onboarding wizard')
|
|
1596
1626
|
.hook('preAction', async (_command, action) => {
|
|
@@ -1701,6 +1731,27 @@ linearCmd.command('sync').requiredOption('--team <key>', 'Linear team key')
|
|
|
1701
1731
|
try { process.exitCode = await runLinearSync(opts); }
|
|
1702
1732
|
catch (error) { console.error(`connector linear sync: ${(error as Error).message}`); process.exitCode = 1; }
|
|
1703
1733
|
});
|
|
1734
|
+
linearCmd.command('daily-summary').description('Post one public-safe daily progress summary per referenced Linear issue')
|
|
1735
|
+
.option('--version <version>', 'Release checklist version (defaults to the current development version)')
|
|
1736
|
+
.option('--send', 'Post comments; without this flag only print the planned summaries')
|
|
1737
|
+
.option('--json', 'JSON output')
|
|
1738
|
+
.action(async (opts: { send?: boolean; json?: boolean; version?: string }) => {
|
|
1739
|
+
const { runLinearDailyProgress } = await import('./cli/connector-cli.js');
|
|
1740
|
+
try { process.exitCode = await runLinearDailyProgress(opts); }
|
|
1741
|
+
catch (error) { console.error(`connector linear daily-summary: ${(error as Error).message}`); process.exitCode = 1; }
|
|
1742
|
+
});
|
|
1743
|
+
linearCmd.command('secretary').description('Ground a request and create a Linear parent with 3–5 assigned subtasks')
|
|
1744
|
+
.argument('<request>', 'Request to break down; quote multi-word text, e.g. "11-04 demo preparation"')
|
|
1745
|
+
.action(async (request: string) => {
|
|
1746
|
+
const { runLinearSecretaryRequest } = await import('./intake-plane/linear-secretary-runtime.js');
|
|
1747
|
+
try {
|
|
1748
|
+
const result = await runLinearSecretaryRequest(request);
|
|
1749
|
+
console.log(result.replyCard);
|
|
1750
|
+
} catch (error) {
|
|
1751
|
+
console.error(`connector linear secretary: ${(error as Error).message}`);
|
|
1752
|
+
process.exitCode = 1;
|
|
1753
|
+
}
|
|
1754
|
+
});
|
|
1704
1755
|
linearCmd.command('receive').description('Internal signed webhook receiver; read raw payload from stdin')
|
|
1705
1756
|
.requiredOption('--signature <hex>', 'Linear-Signature header')
|
|
1706
1757
|
.requiredOption('--delivery <id>', 'Linear-Delivery header')
|
|
@@ -5642,7 +5693,17 @@ const selfOrchestrateCmd = selfCmd
|
|
|
5642
5693
|
if (childFlags.childLlmProvider?.trim()) debug.log('self-implement.pod', 'child-provider-named', { provider: childFlags.childLlmProvider.trim(), model: childFlags.childLlmModel ?? null, podProvider });
|
|
5643
5694
|
// BEDROCK-POD-PROVIDER-DROP — provider·account 는 한 곳(podLaunchProviderOptions)에서 — 손 나열이 bedrock 을 떨궈 codex(team)로 돌았다(10-11).
|
|
5644
5695
|
const podProviderOptions = (await import('./task-orchestrator/surfaces/pod-child-providers.js')).podLaunchProviderOptions(podProvider, { explicitPodAccount, grokApiKeyOptIn });
|
|
5645
|
-
const
|
|
5696
|
+
const warmReuseEvidence = () => {
|
|
5697
|
+
const sourceRef = opts.base ?? 'origin/HEAD';
|
|
5698
|
+
const source = runGitCommand(process.cwd(), ['rev-parse', '--verify', '--quiet', '--end-of-options', `${sourceRef}^{commit}`], { encoding: 'utf8', timeout: 5_000 });
|
|
5699
|
+
const main = runGitCommand(process.cwd(), ['rev-parse', '--verify', '--quiet', '--end-of-options', 'refs/remotes/origin/main^{commit}'], { encoding: 'utf8', timeout: 5_000 });
|
|
5700
|
+
const headSha = source.status === 0 ? source.stdout.trim() : '';
|
|
5701
|
+
const mainSha = main.status === 0 ? main.stdout.trim() : '';
|
|
5702
|
+
const identity = /^[a-f0-9]{40}$/i.test(headSha) && /^[a-f0-9]{40}$/i.test(mainSha)
|
|
5703
|
+
? { head: headSha, main: mainSha } : undefined;
|
|
5704
|
+
return loadWarmReuseEvidenceByConsumer(identity);
|
|
5705
|
+
};
|
|
5706
|
+
const podBase = { hostSupervised: opts.supervise === true, ...podChildLlm, ...(remoteOnlyPool ? { imageCommit: image.imageCommit } : {}), ...podProviderOptions, ...(accountBroker ? { accountBroker, rotationAccounts } : {}), passEnv, warmReuseConfig: () => getUserConfig().pod?.warmReuse, warmReuseEvidence, ...(pool ? { pool } : {}), ...((opts as { podSkillEnv?: boolean }).podSkillEnv ? { skillEnv: true } : {}), ...(podSource ? { source: podSource } : {}), ...(repairBaseHead && podSource?.kind === 'pr' ? { repairCommitOnly: { pr: podSource.number, baseHead: repairBaseHead } } : {}) };
|
|
5646
5707
|
if (benchArms) {
|
|
5647
5708
|
const { benchPodSpawn } = await import('./task-orchestrator/surfaces/self-implement-pod.js');
|
|
5648
5709
|
podSpawn = benchPodSpawn(benchArms, podBase);
|
|
@@ -6904,6 +6965,7 @@ registerFleetCommands(program);
|
|
|
6904
6965
|
|
|
6905
6966
|
// ── ops (운영 관측 — 지금 뭐 도나·이상 없나·상태 전이) ──
|
|
6906
6967
|
registerOpsCommands(program);
|
|
6968
|
+
registerCatalogCommands(program);
|
|
6907
6969
|
registerOutputsCommands(program);
|
|
6908
6970
|
|
|
6909
6971
|
registerPublishCommands(program);
|
|
@@ -6990,6 +7052,37 @@ agentCmd.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
|
6990
7052
|
} catch { /* fail-soft — 관측 실패가 명령 실행을 막지 않음 */ }
|
|
6991
7053
|
});
|
|
6992
7054
|
|
|
7055
|
+
agentCmd.command('mirror')
|
|
7056
|
+
.description('Codex 주인 호스트의 refresh 없는 접근 미러')
|
|
7057
|
+
.command('push <host>')
|
|
7058
|
+
.description('현재 주인 호스트의 사용 가능한 Codex 계정들을 원격 CLI 미러로 보낸다')
|
|
7059
|
+
.action(async (host: string) => {
|
|
7060
|
+
try {
|
|
7061
|
+
const [{ getUserConfig }, { hqFenceDecision }, parentHost, pod, auth, accountsStore] = await Promise.all([
|
|
7062
|
+
import('./user-config.js'), import('./hq/hq.js'), import('./task-agent/parent-host.js'),
|
|
7063
|
+
import('./task-orchestrator/surfaces/self-implement-pod.js'), import('./oauth/store.js'), import('./oauth/codex-account-store.js'),
|
|
7064
|
+
]);
|
|
7065
|
+
const { isCodexTokenOwnerHost } = await import('./oauth/codex-owner-mirror.js');
|
|
7066
|
+
if (!isCodexTokenOwnerHost(getUserConfig())) throw new Error('Codex 토큰 주인 호스트에서만 mirror push 를 실행할 수 있다');
|
|
7067
|
+
if (!hqFenceDecision('ledger-cli').run) throw new Error('HQ 주인 임대가 없어 Codex mirror push 를 거부한다');
|
|
7068
|
+
const target = parentHost.resolveParentHost({ host, cwd: process.cwd() }, { ...process.env, ELANOUS_TA_PARENT_HOST: undefined });
|
|
7069
|
+
if (!target) throw new Error('잘못된 원격 호스트 이름');
|
|
7070
|
+
const accounts = accountsStore.listCodexAccountsInStore();
|
|
7071
|
+
if (!accounts.length) throw new Error('주인 Codex 계정이 없다');
|
|
7072
|
+
if (accounts.length > 16) throw new Error('Codex 계정이 16개를 넘어 미러를 안전하게 교체할 수 없다');
|
|
7073
|
+
const mirrors: Array<{ account: string; elanousAuth: string; codexAuth: string }> = [];
|
|
7074
|
+
for (const account of accounts) {
|
|
7075
|
+
const credential = pod.hostCredentials(account.name, auth.authStorePath(), () => '', { requireExplicitChatgptAuthMode: true });
|
|
7076
|
+
mirrors.push({ account: account.name, elanousAuth: credential.elanousAuth, codexAuth: credential.codexAuth });
|
|
7077
|
+
}
|
|
7078
|
+
parentHost.installRemoteCodexCliMirror(target, mirrors);
|
|
7079
|
+
console.log(`Codex 접근 미러 설치 완료 · host=${target.host} · accounts=${mirrors.length} · refresh=미포함`);
|
|
7080
|
+
} catch (error) {
|
|
7081
|
+
console.error(`codex mirror push 실패: ${error instanceof Error ? error.message : String(error)}`);
|
|
7082
|
+
process.exitCode = 1;
|
|
7083
|
+
}
|
|
7084
|
+
});
|
|
7085
|
+
|
|
6993
7086
|
registerCapabilitiesCommand(agentCmd);
|
|
6994
7087
|
registerSupervisorMetricsCommand(agentCmd);
|
|
6995
7088
|
|
|
@@ -7086,9 +7179,11 @@ agentCmd
|
|
|
7086
7179
|
.option('--screens <dir>', '스크린 캡처 디렉토리')
|
|
7087
7180
|
.option('--backend <id>', `외부 에이전트 backend (${agentBackendHelpList}). 각 CLI auto-approve 모드로 PTY 구동. 미등록 지정 시 명시 에러(조용한 codex 폴백 없음·애그노스틱)`)
|
|
7088
7181
|
.option('--chain <backends>', '한 미션의 backend 사슬 (예: codex,claude,elanous)')
|
|
7182
|
+
.option('--duo', 'Codex와 Claude Code를 같은 과제로 병렬 실행하고 에이전트별 결과와 요약을 출력')
|
|
7089
7183
|
.option('--plugin <name@market>', '에이전트 화면 안에서 플러그인을 설치하고 그 스킬로 미션 실행 (codex/claude)')
|
|
7090
7184
|
.addOption(new Option('--resources <mode>', '미션 전 자원 판단 사다리 (on|off, 기본 on)').choices(['on', 'off']).default('on'))
|
|
7091
7185
|
.option('--headless', 'Claude 구독 CLI를 비대화형 stream-json 모드로 실행 (claude backend 전용)')
|
|
7186
|
+
.option('--follow-up <prompt>', '같은 Claude/Codex CLI 세션을 재개해 두 번째 사용자 턴을 보냄 (비대화형 선택 경로)')
|
|
7092
7187
|
.action(async (textParts: string[], opts: Record<string, any>) => {
|
|
7093
7188
|
// 구독 모드 보장 — 브레인(streamLLM)·codex 둘 다 ChatGPT 구독으로 (API 과금 회피).
|
|
7094
7189
|
delete process.env.OPENAI_API_KEY;
|
|
@@ -7096,7 +7191,7 @@ agentCmd
|
|
|
7096
7191
|
// ★ U4b — 액션 글루(backend 검증·mission-file/text·evidence·spec 빌드·통일 진입점 실행)는
|
|
7097
7192
|
// runAgentMissionCliCommand(테스트 가능 seam)로 추출. 액션은 I/O(print/exit)만 담당.
|
|
7098
7193
|
const { resolveBackend } = await import('./agent-mission/driver.js');
|
|
7099
|
-
const { detectAgentCli } = await import('./agent-mission/tool-install.js');
|
|
7194
|
+
const { detectAgentCli, prepareAgentCli } = await import('./agent-mission/tool-install.js');
|
|
7100
7195
|
const { runAgentMissionCliCommand } = await import('./agent-mission/mission-cli.js');
|
|
7101
7196
|
const controller = new AbortController();
|
|
7102
7197
|
const onSigint = (): void => { controller.abort(); };
|
|
@@ -7105,12 +7200,25 @@ agentCmd
|
|
|
7105
7200
|
try {
|
|
7106
7201
|
outcome = await runAgentMissionCliCommand(textParts, opts as import('./agent-mission/mission-cli.js').MissionCliOpts,
|
|
7107
7202
|
{ resolveBackend, detectAgentCli, onStatus: (line) => console.error(`[agent-mission] ${line}`), signal: controller.signal,
|
|
7203
|
+
prepareAgentCli: (agent) => prepareAgentCli(agent, {
|
|
7204
|
+
onStatus: (line) => console.error(`[agent-mission] ${line}`),
|
|
7205
|
+
confirmInstall: async (prompt) => {
|
|
7206
|
+
if (!process.stdin.isTTY || !process.stderr.isTTY) {
|
|
7207
|
+
console.error('[agent-mission] 설치 확인은 대화형 터미널에서만 받을 수 있습니다.');
|
|
7208
|
+
return false;
|
|
7209
|
+
}
|
|
7210
|
+
const { createInterface } = await import('node:readline/promises');
|
|
7211
|
+
const readline = createInterface({ input: process.stdin, output: process.stderr });
|
|
7212
|
+
try { return /^(?:y|yes|예)$/i.test((await readline.question(`${prompt} [y/N] `)).trim()); }
|
|
7213
|
+
finally { readline.close(); }
|
|
7214
|
+
},
|
|
7215
|
+
}),
|
|
7108
7216
|
...agentMissionCliDepsForTesting });
|
|
7109
7217
|
} finally {
|
|
7110
7218
|
process.removeListener('SIGINT', onSigint);
|
|
7111
7219
|
}
|
|
7112
7220
|
if (!outcome.ok) { console.error(`❌ ${outcome.message}`); process.exit(outcome.exitCode); }
|
|
7113
|
-
await writeStdoutJson(JSON.stringify(outcome.result, null, 2) + '\n');
|
|
7221
|
+
await writeStdoutJson(JSON.stringify(outcome.duo ?? outcome.result, null, 2) + '\n');
|
|
7114
7222
|
process.exit(outcome.exitCode);
|
|
7115
7223
|
});
|
|
7116
7224
|
|
|
@@ -7727,7 +7835,7 @@ const selfDevCmd = program
|
|
|
7727
7835
|
.option('--implement', 'self: headless implementation chat turn(--new·--tools·--goal-loop·interactive dispatch)')
|
|
7728
7836
|
.option('--elanous', 'self: 격리 bare elanous TUI child를 LLM 제어 루프로 목표까지 구동')
|
|
7729
7837
|
.option('--hold', 'elanous: brain 없이 띄우고 elanous pty 로 밖에서 몬다(--elanous 전용·--goal과 동시 사용 불가)')
|
|
7730
|
-
.option('--ready-timeout-ms <ms>',
|
|
7838
|
+
.option('--ready-timeout-ms <ms>', `elanous hold: PTY readiness 대기 상한(ms·양의 정수·기본 ${DEFAULT_TUI_TEST_READY_TIMEOUT_MS})`)
|
|
7731
7839
|
.option('-g, --goal <goal>', 'elanous 또는 셸 drive: child가 달성할 목표(--elanous 또는 <command> 또는 --attach와 함께)')
|
|
7732
7840
|
.option('-n, --max-steps <n>', 'elanous 또는 셸 drive: 최대 제어 스텝(기본 30)')
|
|
7733
7841
|
.option('-p, --poll-ms <ms>', 'elanous 또는 셸 drive: 제어 스텝 간 폴 간격(ms·0 허용·기본 800)')
|
|
@@ -8844,7 +8952,7 @@ program
|
|
|
8844
8952
|
return;
|
|
8845
8953
|
}
|
|
8846
8954
|
const cfg = reloadUserConfig();
|
|
8847
|
-
await
|
|
8955
|
+
await runChatTurnCli({
|
|
8848
8956
|
cfg,
|
|
8849
8957
|
userText: parts.join(' '),
|
|
8850
8958
|
explicitSessionId: opts.session,
|
|
@@ -12707,7 +12815,16 @@ async function main(): Promise<void> {
|
|
|
12707
12815
|
if (await runWebFirstSetup({ config: cfg, startedAt: firstRunStartedAt, startIfMissing: false }) === 'link-shown') return;
|
|
12708
12816
|
}
|
|
12709
12817
|
const { runFirstRun } = await import('./onboarding/first-run.js');
|
|
12710
|
-
if (
|
|
12818
|
+
if (process.stdin.isTTY === true) {
|
|
12819
|
+
const setupIO = (await import('./onboarding.js')).realIO();
|
|
12820
|
+
try {
|
|
12821
|
+
const result = await runFirstRun({ config: cfg, setupWhenNoProvider: async (config) => {
|
|
12822
|
+
const { runFirstRunProviderSetup } = await import('./cli/setup-keys.js');
|
|
12823
|
+
return runFirstRunProviderSetup(setupIO, { config });
|
|
12824
|
+
} });
|
|
12825
|
+
if (result.outcome !== 'ready') return;
|
|
12826
|
+
} finally { setupIO.close(); }
|
|
12827
|
+
} else if ((await runFirstRun({ config: cfg })).outcome !== 'ready') return;
|
|
12711
12828
|
}
|
|
12712
12829
|
|
|
12713
12830
|
// Active-provider banner so users know WHICH model/auth is about to
|