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
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { getSecretAsync } from '../../src/nexus/config/secrets/index.js';
|
|
5
|
+
import { commentLinearIssue } from '../../src/connectors/linear.js';
|
|
6
|
+
import { listChecklist, type Checklist, type ChecklistItem } from '../../src/release-loop/checklist.js';
|
|
7
|
+
import { DecisionLedger, type DecisionEntry } from '../../src/decisions/decision-ledger.js';
|
|
8
|
+
import { effectiveInstanceRoot } from '../../src/instance/resolve.js';
|
|
9
|
+
import { debug } from '../../src/debug/log.js';
|
|
10
|
+
import { acquireLockAsync } from '../../src/storage/file-lock.js';
|
|
11
|
+
|
|
12
|
+
export type ProgressIssue = {
|
|
13
|
+
id: string; identifier: string; title: string; url: string; description: string; state: string;
|
|
14
|
+
};
|
|
15
|
+
export type ProgressLink = { issue: ProgressIssue; cells: ChecklistItem[]; decisions: DecisionEntry[]; sources: Array<{ cellId: string; field: string }> };
|
|
16
|
+
export type ProgressPreview = { identifier: string; body: string; sources: Array<{ cellId: string; field: string }> };
|
|
17
|
+
export type ProgressSyncResult = {
|
|
18
|
+
day: string; candidates: ProgressPreview[]; posted: string[]; alreadyPresent: string[];
|
|
19
|
+
skipped: string[]; failures: Array<{ identifier: string; reason: string }>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const kstDay = (date: Date) => new Date(date.getTime() + 9 * 3_600_000).toISOString().slice(0, 10);
|
|
23
|
+
const escapeRegExp = (value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
24
|
+
|
|
25
|
+
function exactReference(source: string, token: string): boolean {
|
|
26
|
+
return new RegExp(`(^|[^A-Z0-9_-])${escapeRegExp(token)}($|[^A-Z0-9_-])`).test(source);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function declaredIssueRefs(source: string): string[] {
|
|
30
|
+
const refs: string[] = [];
|
|
31
|
+
for (const declaration of source.matchAll(/\blinear-ref\s*[:=]\s*([^\r\n]+)/gi)) {
|
|
32
|
+
refs.push(...[...(declaration[1] ?? '').matchAll(/\b[A-Z]{2,8}-\d+\b/g)].map(match => match[0]!));
|
|
33
|
+
}
|
|
34
|
+
return [...new Set(refs)];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Only `linear-ref:` declarations in checklist fields and exact checklist IDs in issue descriptions create a link. */
|
|
38
|
+
export function resolveExplicitProgressLinks(issues: readonly ProgressIssue[], checklist: Checklist, decisions: readonly DecisionEntry[] = []): ProgressLink[] {
|
|
39
|
+
const links: ProgressLink[] = [];
|
|
40
|
+
for (const issue of issues) {
|
|
41
|
+
const cells = new Map<string, ChecklistItem>();
|
|
42
|
+
const sources: Array<{ cellId: string; field: string }> = [];
|
|
43
|
+
for (const cell of checklist.items) {
|
|
44
|
+
const declared: Array<[string, string]> = [
|
|
45
|
+
['title', cell.title], ['evidence', cell.evidence ?? ''], ['refs', (cell.refs ?? []).join('\n')],
|
|
46
|
+
];
|
|
47
|
+
for (const [field, value] of declared) {
|
|
48
|
+
if (declaredIssueRefs(value).includes(issue.identifier)) {
|
|
49
|
+
cells.set(cell.id, cell);
|
|
50
|
+
sources.push({ cellId: cell.id, field: `checklist.${field}` });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (exactReference(issue.description, cell.id)) {
|
|
54
|
+
cells.set(cell.id, cell);
|
|
55
|
+
sources.push({ cellId: cell.id, field: 'issue.description' });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const linkedDecisions = decisions.filter(decision => decision.refs?.some(ref => ref === issue.identifier || ref === issue.url));
|
|
59
|
+
for (const decision of linkedDecisions) sources.push({ cellId: decision.id, field: 'decision.refs' });
|
|
60
|
+
if (cells.size || linkedDecisions.length) links.push({ issue, cells: [...cells.values()], decisions: linkedDecisions, sources });
|
|
61
|
+
}
|
|
62
|
+
return links;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function changedStatuses(checklist: Checklist, cellIds: ReadonlySet<string>, day: string): Array<{ id: string; from: string; to: string }> {
|
|
66
|
+
return checklist.history.flatMap(entry => {
|
|
67
|
+
if (!cellIds.has(entry.id) || entry.field !== 'status' || !entry.at || kstDay(new Date(entry.at)) !== day) return [];
|
|
68
|
+
return [{ id: entry.id, from: String(entry.from ?? 'unknown'), to: String(entry.to ?? 'unknown') }];
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function renderProgressPreview(link: ProgressLink, checklist: Checklist, day: string): ProgressPreview {
|
|
73
|
+
const ids = new Set(link.cells.map(cell => cell.id));
|
|
74
|
+
const transitions = changedStatuses(checklist, ids, day);
|
|
75
|
+
const statusLines = link.cells.map(cell => {
|
|
76
|
+
const evidence = cell.evidence ?? '';
|
|
77
|
+
const simulated = cell.status === 'green' && /green\(sim\)/i.test(evidence);
|
|
78
|
+
const e4Pending = simulated && /(?:설치본|installed)(?: CLI)?[^\n.]{0,24}E4[^\n.]{0,24}(?:미완|incomplete|not complete|not done)/i.test(evidence);
|
|
79
|
+
return `- 연결 칸: ${cell.id} — ${simulated ? `green(sim)${e4Pending ? ' · 설치본 E4 미완' : ''}` : cell.status}`;
|
|
80
|
+
});
|
|
81
|
+
const transitionLines = transitions.map(change => `- 오늘 상태 변화: ${change.id} ${change.from} → ${change.to}`);
|
|
82
|
+
const decisionLines = link.decisions.filter(decision => {
|
|
83
|
+
const timestamp = decision.decidedAt ?? decision.withdrawnAt ?? decision.raisedAt;
|
|
84
|
+
return !!timestamp && kstDay(new Date(timestamp)) === day;
|
|
85
|
+
})
|
|
86
|
+
.map(decision => `- 연결 결정: ${decision.id} — ${decision.status}`);
|
|
87
|
+
const landedPrs = [...new Set(link.cells.flatMap(cell => {
|
|
88
|
+
const text = cell.evidence ?? '';
|
|
89
|
+
return [...text.matchAll(/\bPR\s*#(\d+)\b[^\n]{0,120}\bmerged\b/gi)].map(match => `#${match[1]}`);
|
|
90
|
+
}))];
|
|
91
|
+
const nextCell = link.cells.find(cell => cell.status !== 'green' && cell.status !== 'done');
|
|
92
|
+
const simulatedCell = link.cells.find(cell => cell.status === 'green' && /green\(sim\)/i.test(cell.evidence ?? ''));
|
|
93
|
+
const simulatedEvidence = simulatedCell?.evidence ?? '';
|
|
94
|
+
const simulatedE4Pending = !!simulatedCell && /(?:설치본|installed)(?: CLI)?[^\n.]{0,24}E4[^\n.]{0,24}(?:미완|incomplete|not complete|not done)/i.test(simulatedEvidence);
|
|
95
|
+
const next = nextCell ? `연결 칸 ${nextCell.id}의 남은 완료 경계 진행`
|
|
96
|
+
: simulatedCell ? `연결 칸 ${simulatedCell.id}의 ${simulatedE4Pending ? '설치본 E4 실물 증거 확보' : '설치본 실물 증거 확인'}` : '연결된 칸은 현재 green/done';
|
|
97
|
+
const body = [
|
|
98
|
+
`${day} 진행 요약`,
|
|
99
|
+
`- 상태: ${link.issue.state} — ${link.issue.url}`,
|
|
100
|
+
...statusLines,
|
|
101
|
+
...transitionLines,
|
|
102
|
+
...decisionLines,
|
|
103
|
+
...(landedPrs.length ? [`- 연결 착지 PR: ${landedPrs.join(', ')}`] : []),
|
|
104
|
+
`- 다음: ${next}`,
|
|
105
|
+
`<!-- elanous-linear-progress:${day}:${link.issue.identifier} -->`,
|
|
106
|
+
].join('\n');
|
|
107
|
+
return { identifier: link.issue.identifier, body, sources: link.sources };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function fetchTeamIssues(apiKey: string, teamKey: string): Promise<ProgressIssue[]> {
|
|
111
|
+
const query = `query LinearProgressIssues($teamKey: String!, $after: String) {
|
|
112
|
+
issues(filter: { team: { key: { eq: $teamKey } } }, first: 100, after: $after) {
|
|
113
|
+
nodes { id identifier title url description state { name } }
|
|
114
|
+
pageInfo { hasNextPage endCursor }
|
|
115
|
+
}
|
|
116
|
+
}`;
|
|
117
|
+
const issues: ProgressIssue[] = [];
|
|
118
|
+
const cursors = new Set<string>();
|
|
119
|
+
let after: string | null = null;
|
|
120
|
+
do {
|
|
121
|
+
const response = await fetch('https://api.linear.app/graphql', {
|
|
122
|
+
method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' },
|
|
123
|
+
body: JSON.stringify({ query, variables: { teamKey, after } }),
|
|
124
|
+
});
|
|
125
|
+
if (!response.ok) throw new Error(`Linear GraphQL HTTP ${response.status}`);
|
|
126
|
+
const result = await response.json() as { errors?: unknown[]; data?: { issues?: { nodes?: Array<Record<string, unknown>>; pageInfo?: { hasNextPage: boolean; endCursor: string | null } } } };
|
|
127
|
+
const page = result.data?.issues;
|
|
128
|
+
if (result.errors?.length || !Array.isArray(page?.nodes)) throw new Error(`Linear ${teamKey} issue query failed`);
|
|
129
|
+
for (const node of page.nodes) {
|
|
130
|
+
if (typeof node.id !== 'string' || typeof node.identifier !== 'string' || typeof node.title !== 'string' || typeof node.url !== 'string') continue;
|
|
131
|
+
const state = node.state && typeof node.state === 'object' ? (node.state as { name?: unknown }).name : undefined;
|
|
132
|
+
issues.push({ id: node.id, identifier: node.identifier, title: node.title, url: node.url,
|
|
133
|
+
description: typeof node.description === 'string' ? node.description : '', state: typeof state === 'string' ? state : 'unknown' });
|
|
134
|
+
}
|
|
135
|
+
const info = page.pageInfo;
|
|
136
|
+
if (info?.hasNextPage && (!info.endCursor || cursors.has(info.endCursor))) throw new Error(`Linear ${teamKey} cursor missing or repeated`);
|
|
137
|
+
after = info?.hasNextPage ? info.endCursor : null;
|
|
138
|
+
if (after) cursors.add(after);
|
|
139
|
+
} while (after);
|
|
140
|
+
return issues;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function fetchAllowlistedIssue(apiKey: string, identifier: string): Promise<ProgressIssue | null> {
|
|
144
|
+
const query = `query LinearAllowlistedProgressIssue($identifier: String!) {
|
|
145
|
+
issue(id: $identifier) { id identifier title url description state { name } }
|
|
146
|
+
}`;
|
|
147
|
+
const response = await fetch('https://api.linear.app/graphql', {
|
|
148
|
+
method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' },
|
|
149
|
+
body: JSON.stringify({ query, variables: { identifier } }),
|
|
150
|
+
});
|
|
151
|
+
if (!response.ok) throw new Error(`Linear ${identifier} lookup HTTP ${response.status}`);
|
|
152
|
+
const result = await response.json() as { errors?: unknown[]; data?: { issue?: Record<string, unknown> | null } };
|
|
153
|
+
const node = result.data?.issue;
|
|
154
|
+
if (result.errors?.length) throw new Error(`Linear ${identifier} lookup failed`);
|
|
155
|
+
if (!node || typeof node.id !== 'string' || typeof node.identifier !== 'string' || typeof node.title !== 'string' || typeof node.url !== 'string') return null;
|
|
156
|
+
const state = node.state && typeof node.state === 'object' ? (node.state as { name?: unknown }).name : undefined;
|
|
157
|
+
return { id: node.id, identifier: node.identifier, title: node.title, url: node.url,
|
|
158
|
+
description: typeof node.description === 'string' ? node.description : '', state: typeof state === 'string' ? state : 'unknown' };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async function countMarker(apiKey: string, issueId: string, marker: string): Promise<number> {
|
|
162
|
+
const query = `query LinearProgressComments($id: String!, $after: String) {
|
|
163
|
+
issue(id: $id) { comments(first: 100, after: $after) { nodes { body } pageInfo { hasNextPage endCursor } } }
|
|
164
|
+
}`;
|
|
165
|
+
const cursors = new Set<string>();
|
|
166
|
+
let after: string | null = null;
|
|
167
|
+
let count = 0;
|
|
168
|
+
do {
|
|
169
|
+
const response = await fetch('https://api.linear.app/graphql', {
|
|
170
|
+
method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' },
|
|
171
|
+
body: JSON.stringify({ query, variables: { id: issueId, after } }),
|
|
172
|
+
});
|
|
173
|
+
if (!response.ok) throw new Error(`Linear comment lookup HTTP ${response.status}`);
|
|
174
|
+
const result = await response.json() as { errors?: unknown[]; data?: { issue?: { comments?: { nodes?: Array<{ body?: unknown }>; pageInfo?: { hasNextPage: boolean; endCursor: string | null } } } } };
|
|
175
|
+
const comments = result.data?.issue?.comments;
|
|
176
|
+
if (result.errors?.length || !Array.isArray(comments?.nodes)) throw new Error('Linear comment lookup failed');
|
|
177
|
+
count += comments.nodes.filter(comment => typeof comment.body === 'string' && comment.body.includes(marker)).length;
|
|
178
|
+
const info = comments.pageInfo;
|
|
179
|
+
if (info?.hasNextPage && (!info.endCursor || cursors.has(info.endCursor))) throw new Error('Linear comment cursor missing or repeated');
|
|
180
|
+
after = info?.hasNextPage ? info.endCursor : null;
|
|
181
|
+
if (after) cursors.add(after);
|
|
182
|
+
} while (after);
|
|
183
|
+
return count;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export async function runLinearProgressSync(options: {
|
|
187
|
+
version: string; now?: Date; root?: string; apply?: boolean;
|
|
188
|
+
allowIssueIdentifiers?: readonly string[];
|
|
189
|
+
checklist?: Checklist; issues?: readonly ProgressIssue[]; decisions?: readonly DecisionEntry[];
|
|
190
|
+
getApiKey?: (id: string) => Promise<string | undefined>;
|
|
191
|
+
countMarker?: (issue: ProgressIssue, marker: string) => Promise<number>;
|
|
192
|
+
postComment?: (issue: ProgressIssue, body: string) => Promise<void>;
|
|
193
|
+
log?: (event: string, data: Record<string, unknown>) => void;
|
|
194
|
+
}): Promise<ProgressSyncResult> {
|
|
195
|
+
const now = options.now ?? new Date();
|
|
196
|
+
const day = kstDay(now);
|
|
197
|
+
const root = options.root ?? effectiveInstanceRoot();
|
|
198
|
+
const checklist = options.checklist ?? listChecklist(options.version, root);
|
|
199
|
+
const decisions = options.decisions ?? new DecisionLedger({ stateDir: root }).list({ status: 'all' });
|
|
200
|
+
const apiKey = (options.getApiKey ?? getSecretAsync)('connector.linear.apiKey');
|
|
201
|
+
const resolvedKey = await apiKey;
|
|
202
|
+
if (!resolvedKey) throw new Error('connector.linear.apiKey missing');
|
|
203
|
+
const allowedIdentifiers = [...new Set(options.allowIssueIdentifiers ?? [])];
|
|
204
|
+
const lookupFailures: Array<{ identifier: string; reason: string }> = [];
|
|
205
|
+
let issues: ProgressIssue[];
|
|
206
|
+
if (options.issues) issues = [...options.issues];
|
|
207
|
+
else if (options.apply) {
|
|
208
|
+
const lookups = await Promise.all(allowedIdentifiers.map(async identifier => {
|
|
209
|
+
try {
|
|
210
|
+
const issue = await fetchAllowlistedIssue(resolvedKey, identifier);
|
|
211
|
+
if (!issue) lookupFailures.push({ identifier, reason: 'allowlisted issue not found' });
|
|
212
|
+
return issue;
|
|
213
|
+
} catch (error) {
|
|
214
|
+
lookupFailures.push({ identifier, reason: (error instanceof Error ? error.message : String(error)).slice(0, 200) });
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}));
|
|
218
|
+
issues = lookups.filter((issue): issue is ProgressIssue => issue !== null);
|
|
219
|
+
} else issues = (await Promise.all(['ELA', 'DEMO'].map(key => fetchTeamIssues(resolvedKey, key)))).flat();
|
|
220
|
+
const links = resolveExplicitProgressLinks(issues, checklist, decisions);
|
|
221
|
+
const previews = links.map(link => renderProgressPreview(link, checklist, day));
|
|
222
|
+
const linkedIdentifiers = new Set(links.map(link => link.issue.identifier));
|
|
223
|
+
const fetchedIdentifiers = new Set(issues.map(issue => issue.identifier));
|
|
224
|
+
const lookupFailureIdentifiers = new Set(lookupFailures.map(failure => failure.identifier));
|
|
225
|
+
const missingApproved = options.apply ? allowedIdentifiers.filter(identifier => !fetchedIdentifiers.has(identifier) && !lookupFailureIdentifiers.has(identifier))
|
|
226
|
+
.map(identifier => ({ identifier, reason: 'allowlisted issue not found' })) : [];
|
|
227
|
+
const unlinkedApproved = options.apply ? allowedIdentifiers.filter(identifier => issues.some(issue => issue.identifier === identifier) && !linkedIdentifiers.has(identifier))
|
|
228
|
+
.map(identifier => ({ identifier, reason: 'allowlisted issue has no explicit checklist/decision link' })) : [];
|
|
229
|
+
const unresolvedApproved = [...lookupFailures, ...missingApproved, ...unlinkedApproved];
|
|
230
|
+
const result: ProgressSyncResult = { day, candidates: previews, posted: [], alreadyPresent: [], skipped: [], failures: unresolvedApproved };
|
|
231
|
+
const log = (event: string, data: Record<string, unknown>) => {
|
|
232
|
+
const enriched = { day, ...data };
|
|
233
|
+
if (options.log) options.log(event, enriched);
|
|
234
|
+
else debug.log('loop.rhythm-daily.linear-progress', event, enriched);
|
|
235
|
+
};
|
|
236
|
+
const check = options.countMarker ?? ((issue: ProgressIssue, marker: string) => countMarker(resolvedKey, issue.id, marker));
|
|
237
|
+
const post = options.postComment ?? ((issue: ProgressIssue, body: string) => commentLinearIssue({ apiKey: resolvedKey, issueId: issue.id, body }));
|
|
238
|
+
for (const failure of unresolvedApproved) log('approved-issue-unresolved', failure);
|
|
239
|
+
for (const preview of previews) {
|
|
240
|
+
const issue = links.find(link => link.issue.identifier === preview.identifier)!.issue;
|
|
241
|
+
const marker = `<!-- elanous-linear-progress:${day}:${issue.identifier} -->`;
|
|
242
|
+
let release: (() => void) | undefined;
|
|
243
|
+
let stillHeld: (() => boolean) | undefined;
|
|
244
|
+
try {
|
|
245
|
+
if (options.apply && !options.allowIssueIdentifiers?.includes(issue.identifier)) {
|
|
246
|
+
result.skipped.push(issue.identifier);
|
|
247
|
+
log('not-approved', { identifier: issue.identifier, sources: preview.sources });
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (options.apply) {
|
|
251
|
+
const lockDir = join(root, 'rhythm', 'linear-progress-sync');
|
|
252
|
+
mkdirSync(lockDir, { recursive: true, mode: 0o700 });
|
|
253
|
+
const lockName = createHash('sha256').update(`${day}:${issue.id}`).digest('hex');
|
|
254
|
+
const lock = await acquireLockAsync(join(lockDir, `${lockName}.lock`), { staleMs: 120_000, maxTries: 240 });
|
|
255
|
+
release = lock.release;
|
|
256
|
+
stillHeld = lock.stillHeld;
|
|
257
|
+
if (!stillHeld()) throw new Error('Linear progress lock lost before marker check');
|
|
258
|
+
}
|
|
259
|
+
const existing = await check(issue, marker);
|
|
260
|
+
if (existing > 1) {
|
|
261
|
+
result.failures.push({ identifier: issue.identifier, reason: `duplicate-marker-count=${existing}` });
|
|
262
|
+
log('duplicate-marker', { identifier: issue.identifier, markerCount: existing, sources: preview.sources });
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (existing === 1) {
|
|
266
|
+
result.alreadyPresent.push(issue.identifier);
|
|
267
|
+
log('already-present', { identifier: issue.identifier, markerCount: 1, sources: preview.sources });
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
if (!options.apply) {
|
|
271
|
+
result.skipped.push(issue.identifier);
|
|
272
|
+
log('dry-run', { identifier: issue.identifier, markerCount: 0, sources: preview.sources });
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (!release || !stillHeld?.()) throw new Error('Linear progress write lock unavailable or lost');
|
|
276
|
+
await post(issue, preview.body);
|
|
277
|
+
const verified = await check(issue, marker);
|
|
278
|
+
if (verified !== 1) throw new Error(`post-verification-marker-count=${verified}`);
|
|
279
|
+
result.posted.push(issue.identifier);
|
|
280
|
+
log('posted', { identifier: issue.identifier, markerCount: verified, sources: preview.sources });
|
|
281
|
+
} catch (error) {
|
|
282
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
283
|
+
result.failures.push({ identifier: issue.identifier, reason: reason.slice(0, 200) });
|
|
284
|
+
log('failed', { identifier: issue.identifier, reason: reason.slice(0, 200), sources: preview.sources });
|
|
285
|
+
} finally {
|
|
286
|
+
release?.();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (import.meta.main) {
|
|
293
|
+
const version = process.argv.find((arg, index) => process.argv[index - 1] === '--version');
|
|
294
|
+
if (!version) throw new Error('--version required');
|
|
295
|
+
if (process.argv.includes('--apply')) throw new Error('live posting requires the approved scheduled daily path');
|
|
296
|
+
const result = await runLinearProgressSync({ version, apply: false });
|
|
297
|
+
console.log(JSON.stringify(result));
|
|
298
|
+
}
|
|
@@ -1092,7 +1092,15 @@ async function plan() {
|
|
|
1092
1092
|
ovSelections = sel.selections.map((x) => ({ overlayId: x.overlayId, verdict: x.verdict, detail: x.detail }));
|
|
1093
1093
|
if (sel.applied.length > 0) {
|
|
1094
1094
|
const applied = applyGraphOverlays(decl.template, sel.applied);
|
|
1095
|
-
if (applied.ok) ovPatches = applied.patches.map((x) =>
|
|
1095
|
+
if (applied.ok) ovPatches = applied.patches.map((x) => {
|
|
1096
|
+
if (x.field === 'edge-rerouted') return {
|
|
1097
|
+
overlayId: x.overlayId, node: x.from, field: x.field, before: x.was, after: x.to,
|
|
1098
|
+
};
|
|
1099
|
+
if (x.field === 'node-added') return {
|
|
1100
|
+
overlayId: x.overlayId, node: x.node, field: x.field, before: null, after: x.kind,
|
|
1101
|
+
};
|
|
1102
|
+
return { overlayId: x.overlayId, node: x.node, field: x.field, before: x.before, after: x.after };
|
|
1103
|
+
});
|
|
1096
1104
|
else ovError = `얹다가 거절됐다 — ${applied.rejections.map((r) => r.kind).join(', ')}`;
|
|
1097
1105
|
}
|
|
1098
1106
|
}
|
|
@@ -4,6 +4,7 @@ import { dirname, isAbsolute, join } from 'node:path';
|
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { userConfigPath } from '../src/user-config.js';
|
|
7
|
+
import type { WarmWorkerCandidate } from '../src/task-orchestrator/surfaces/pod-warm-worker-provider.js';
|
|
7
8
|
|
|
8
9
|
const TOKEN = /^[a-f0-9]{64}$/;
|
|
9
10
|
const SHA = /^[a-f0-9]{40}$/;
|
|
@@ -14,7 +15,7 @@ const TIERS = new Set(['lite', 'standard']);
|
|
|
14
15
|
type JsonObject = Record<string, unknown>;
|
|
15
16
|
|
|
16
17
|
export interface WarmPoolProviderConfig {
|
|
17
|
-
candidates: [];
|
|
18
|
+
candidates: WarmWorkerCandidate[];
|
|
18
19
|
poolTemplates: Array<{
|
|
19
20
|
host: string;
|
|
20
21
|
tier: 'lite' | 'standard';
|
|
@@ -47,6 +48,25 @@ export interface AssembleWarmPoolProviderConfigInput {
|
|
|
47
48
|
machineTokens: Record<string, string>;
|
|
48
49
|
}
|
|
49
50
|
|
|
51
|
+
/** Keep a deployment canary to one explicit worker instead of expanding its profile quota. */
|
|
52
|
+
export function selectSingleWarmPoolCandidate(config: WarmPoolProviderConfig, selection: string): WarmPoolProviderConfig {
|
|
53
|
+
const match = /^([a-zA-Z0-9][a-zA-Z0-9._-]*)\/(lite|standard)$/.exec(selection);
|
|
54
|
+
if (!match) throw new Error('--single-candidate must be HOST/lite or HOST/standard');
|
|
55
|
+
const [, host, tier] = match;
|
|
56
|
+
const template = config.poolTemplates.find(candidate => candidate.host === host && candidate.tier === tier);
|
|
57
|
+
if (!template) throw new Error(`warm pool template not found: ${host}/${tier}`);
|
|
58
|
+
const index = 1;
|
|
59
|
+
return {
|
|
60
|
+
...config,
|
|
61
|
+
candidates: [{ host, tier: tier as 'lite' | 'standard', spec: {
|
|
62
|
+
...template.spec,
|
|
63
|
+
name: `warm-${host}-${tier}-${index}`,
|
|
64
|
+
workerId: `${template.spec.workerId}-${tier}-${index}`,
|
|
65
|
+
} }],
|
|
66
|
+
poolTemplates: [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
50
70
|
function object(value: unknown, label: string): JsonObject {
|
|
51
71
|
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${label} is required`);
|
|
52
72
|
return value as JsonObject;
|
|
@@ -183,11 +203,12 @@ interface CliOptions {
|
|
|
183
203
|
output: string;
|
|
184
204
|
dryRun: boolean;
|
|
185
205
|
serve: boolean;
|
|
206
|
+
singleCandidate?: string;
|
|
186
207
|
}
|
|
187
208
|
|
|
188
209
|
function parseArgs(argv: readonly string[]): CliOptions {
|
|
189
210
|
let configPath = userConfigPath(), controlUrl = '', memberTokenFile = '', output = '';
|
|
190
|
-
let dryRun = false, serve = false;
|
|
211
|
+
let dryRun = false, serve = false, singleCandidate: string | undefined;
|
|
191
212
|
const machineTokenFiles: Record<string, string> = {};
|
|
192
213
|
for (let index = 0; index < argv.length; index++) {
|
|
193
214
|
const arg = argv[index];
|
|
@@ -206,14 +227,15 @@ function parseArgs(argv: readonly string[]): CliOptions {
|
|
|
206
227
|
} else if (arg === '--output') output = next();
|
|
207
228
|
else if (arg === '--dry-run') dryRun = true;
|
|
208
229
|
else if (arg === '--serve') serve = true;
|
|
230
|
+
else if (arg === '--single-candidate') singleCandidate = next();
|
|
209
231
|
else throw new Error(`unknown argument: ${arg}`);
|
|
210
232
|
}
|
|
211
233
|
if (!isAbsolute(configPath) || !controlUrl || !isAbsolute(memberTokenFile))
|
|
212
|
-
throw new Error('usage: --config ABSOLUTE --control-url URL --member-token-file ABSOLUTE --machine-token HOST=ABSOLUTE [--output ABSOLUTE] [--dry-run|--serve]');
|
|
234
|
+
throw new Error('usage: --config ABSOLUTE --control-url URL --member-token-file ABSOLUTE --machine-token HOST=ABSOLUTE [--output ABSOLUTE] [--single-candidate HOST/TIER] [--dry-run|--serve]');
|
|
213
235
|
if (Object.values(machineTokenFiles).some(file => !isAbsolute(file))) throw new Error('machine token files must be absolute');
|
|
214
236
|
if (dryRun && serve) throw new Error('--dry-run and --serve cannot be combined');
|
|
215
237
|
return { configPath, controlUrl, memberTokenFile, machineTokenFiles,
|
|
216
|
-
output: output || join(dirname(configPath), 'warm-pod-provider.json'), dryRun, serve };
|
|
238
|
+
output: output || join(dirname(configPath), 'warm-pod-provider.json'), dryRun, serve, singleCandidate };
|
|
217
239
|
}
|
|
218
240
|
|
|
219
241
|
function readPrivateToken(path: string, label: string): string {
|
|
@@ -228,8 +250,9 @@ export async function runWarmPoolProviderConfig(argv: readonly string[]): Promis
|
|
|
228
250
|
.map(([host, path]) => [host, readPrivateToken(path, `machine token for ${host}`)]));
|
|
229
251
|
const assembled = assembleWarmPoolProviderConfig({ config, controlUrl: options.controlUrl,
|
|
230
252
|
memberToken: readPrivateToken(options.memberTokenFile, 'member token'), machineTokens });
|
|
231
|
-
|
|
232
|
-
|
|
253
|
+
const selected = options.singleCandidate ? selectSingleWarmPoolCandidate(assembled, options.singleCandidate) : assembled;
|
|
254
|
+
if (!options.dryRun) writeWarmPoolProviderConfig(options.output, selected);
|
|
255
|
+
process.stdout.write(`${JSON.stringify({ output: options.output, config: redact(selected),
|
|
233
256
|
...(options.serve ? { serve: { command: `ELANOUS_WARM_POD_PROVIDER_CONFIG=${shellQuote(options.output)} bun src/task-orchestrator/surfaces/pod-warm-worker-provider.ts --serve` } } : {}) })}\n`);
|
|
234
257
|
if (!options.serve) return;
|
|
235
258
|
const provider = fileURLToPath(new URL('../src/task-orchestrator/surfaces/pod-warm-worker-provider.ts', import.meta.url));
|
package/src/acp/agent-manager.ts
CHANGED
|
@@ -76,6 +76,7 @@ export class AcpAgentManager {
|
|
|
76
76
|
agent = new CodexAppServerAgent({
|
|
77
77
|
backendId,
|
|
78
78
|
...opts,
|
|
79
|
+
remoteSocketPath: process.env.ELANOUS_CODEX_REMOTE_SIDETAB_SOCKET || undefined,
|
|
79
80
|
elicitationHandler: createAskUserElicitationHandler(),
|
|
80
81
|
}) as unknown as AcpAgent;
|
|
81
82
|
} else {
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
import {
|
|
32
32
|
CodexAppServerClient,
|
|
33
33
|
spawnCodexAppServer,
|
|
34
|
+
spawnCodexRemoteTui,
|
|
34
35
|
type SpawnCodexAppServerOpts,
|
|
35
36
|
type SpawnedCodexAppServer,
|
|
36
37
|
} from './codex-app-server-client.js';
|
|
@@ -713,6 +714,8 @@ export interface CodexAppServerAgentOpts {
|
|
|
713
714
|
readonly codexBinary?: string;
|
|
714
715
|
/** Session-scoped argv forwarded to `spawnCodexAppServer`. */
|
|
715
716
|
readonly codexArgs?: readonly string[];
|
|
717
|
+
/** Explicit opt-in Codex remote side-tab Unix socket path. */
|
|
718
|
+
readonly remoteSocketPath?: string;
|
|
716
719
|
readonly env?: Record<string, string>;
|
|
717
720
|
readonly log?: (msg: string) => void;
|
|
718
721
|
/** Called after a successful initialize with this backend's advertised capabilities.
|
|
@@ -770,6 +773,7 @@ export interface CodexAppServerAgentOpts {
|
|
|
770
773
|
readonly _spawnFactory?: (
|
|
771
774
|
opts: SpawnCodexAppServerOpts,
|
|
772
775
|
) => SpawnedCodexAppServer;
|
|
776
|
+
readonly _remoteTuiSpawnForTesting?: typeof spawnCodexRemoteTui;
|
|
773
777
|
}
|
|
774
778
|
|
|
775
779
|
export class CodexAppServerAgent {
|
|
@@ -777,12 +781,14 @@ export class CodexAppServerAgent {
|
|
|
777
781
|
private readonly cwd?: string;
|
|
778
782
|
private readonly codexBinary?: string;
|
|
779
783
|
private readonly codexArgs?: readonly string[];
|
|
784
|
+
private readonly remoteSocketPath?: string;
|
|
780
785
|
private readonly env?: Record<string, string>;
|
|
781
786
|
private readonly log: (msg: string) => void;
|
|
782
787
|
private readonly onCapabilities: ((capabilities: ElanousCapabilities) => void) | undefined;
|
|
783
788
|
|
|
784
789
|
private client: CodexAppServerClient | null;
|
|
785
790
|
private child: SpawnedCodexAppServer['child'] | null = null;
|
|
791
|
+
private remoteTuiChild: ReturnType<typeof spawnCodexRemoteTui> | null = null;
|
|
786
792
|
private initialized = false;
|
|
787
793
|
|
|
788
794
|
private readonly approvalAdapter: CodexApprovalAdapter;
|
|
@@ -877,12 +883,14 @@ export class CodexAppServerAgent {
|
|
|
877
883
|
private readonly _spawnFactory:
|
|
878
884
|
| ((opts: SpawnCodexAppServerOpts) => SpawnedCodexAppServer)
|
|
879
885
|
| undefined;
|
|
886
|
+
private readonly _remoteTuiSpawnForTesting: typeof spawnCodexRemoteTui | undefined;
|
|
880
887
|
|
|
881
888
|
constructor(opts: CodexAppServerAgentOpts) {
|
|
882
889
|
this.backendId = opts.backendId;
|
|
883
890
|
this.cwd = opts.cwd;
|
|
884
891
|
this.codexBinary = opts.codexBinary;
|
|
885
892
|
this.codexArgs = opts.codexArgs ? [...opts.codexArgs] : undefined;
|
|
893
|
+
this.remoteSocketPath = opts.remoteSocketPath;
|
|
886
894
|
this.env = opts.env;
|
|
887
895
|
this.log = opts.log ?? ((msg) => debug.log('acp.cxn.appserver.agent', msg));
|
|
888
896
|
this.onCapabilities = opts.onCapabilities;
|
|
@@ -894,6 +902,7 @@ export class CodexAppServerAgent {
|
|
|
894
902
|
this.imageTempDir = opts.imageTempDir ?? defaultImageTempDir();
|
|
895
903
|
this._clientForTesting = opts._clientForTesting;
|
|
896
904
|
this._spawnFactory = opts._spawnFactory;
|
|
905
|
+
this._remoteTuiSpawnForTesting = opts._remoteTuiSpawnForTesting;
|
|
897
906
|
this.threadIndex = opts._threadIndexForTesting ?? globalCasThreadIndex();
|
|
898
907
|
// M6 · idle hibernate config. Env override only applies when opts
|
|
899
908
|
// didn't set it explicitly so tests can pin a value regardless of
|
|
@@ -979,6 +988,7 @@ export class CodexAppServerAgent {
|
|
|
979
988
|
env: { ...rotatedCodexChildEnv(childEnv), ...(this.env ?? {}) },
|
|
980
989
|
codexBinary,
|
|
981
990
|
codexArgs: this.codexArgs,
|
|
991
|
+
remoteSocketPath: this.remoteSocketPath,
|
|
982
992
|
};
|
|
983
993
|
const spawned = spawnFn(spawnOpts);
|
|
984
994
|
this.client = spawned.client;
|
|
@@ -1069,6 +1079,13 @@ export class CodexAppServerAgent {
|
|
|
1069
1079
|
/* swallow */
|
|
1070
1080
|
}
|
|
1071
1081
|
}
|
|
1082
|
+
if (this.remoteTuiChild) {
|
|
1083
|
+
try {
|
|
1084
|
+
this.remoteTuiChild.kill('SIGTERM');
|
|
1085
|
+
} catch {
|
|
1086
|
+
/* swallow */
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1072
1089
|
if (this.child) {
|
|
1073
1090
|
try {
|
|
1074
1091
|
this.child.kill('SIGTERM');
|
|
@@ -1078,6 +1095,7 @@ export class CodexAppServerAgent {
|
|
|
1078
1095
|
}
|
|
1079
1096
|
this.client = null;
|
|
1080
1097
|
this.child = null;
|
|
1098
|
+
this.remoteTuiChild = null;
|
|
1081
1099
|
this.initialized = false;
|
|
1082
1100
|
this.sessionToThread.clear();
|
|
1083
1101
|
this.threadToSession.clear();
|
|
@@ -1110,6 +1128,7 @@ export class CodexAppServerAgent {
|
|
|
1110
1128
|
* disabled. unref() so a CLI can still exit cleanly when the daemon
|
|
1111
1129
|
* is the only thing keeping the loop alive. */
|
|
1112
1130
|
private armIdleTimer(): void {
|
|
1131
|
+
if (this.remoteSocketPath) return;
|
|
1113
1132
|
if (this.idleTimerHandle !== null) return;
|
|
1114
1133
|
if (this.idleTimeoutMs <= 0) return;
|
|
1115
1134
|
this.idleTimerHandle = setInterval(() => {
|
|
@@ -1328,6 +1347,20 @@ export class CodexAppServerAgent {
|
|
|
1328
1347
|
// M6 · brand-new sessions are alive in the current daemon by
|
|
1329
1348
|
// definition · no thread/resume needed before the first turn.
|
|
1330
1349
|
this.currentDaemonSessions.add(sessionId);
|
|
1350
|
+
if (this.remoteSocketPath && !this.remoteTuiChild) {
|
|
1351
|
+
const explicitEnv = this.env ?? {};
|
|
1352
|
+
const tuiEnv = {
|
|
1353
|
+
...rotatedCodexChildEnv({ ...process.env, ...explicitEnv }),
|
|
1354
|
+
...explicitEnv,
|
|
1355
|
+
};
|
|
1356
|
+
const spawnRemoteTui = this._remoteTuiSpawnForTesting ?? spawnCodexRemoteTui;
|
|
1357
|
+
this.remoteTuiChild = spawnRemoteTui({
|
|
1358
|
+
codexBinary: this.codexBinary ?? resolvePreferredCodexBinary(),
|
|
1359
|
+
socketPath: this.remoteSocketPath,
|
|
1360
|
+
cwd: this.cwd,
|
|
1361
|
+
env: tuiEnv,
|
|
1362
|
+
});
|
|
1363
|
+
}
|
|
1331
1364
|
debug.log('acp.client', 'session-new', { backendId: this.backendId, sessionId });
|
|
1332
1365
|
return sessionId;
|
|
1333
1366
|
}
|