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
|
@@ -174,7 +174,7 @@ import { ZAI_POD_EGRESS_LABEL, checkZaiPodSecret, countActiveZaiJobs, decideZaiP
|
|
|
174
174
|
import { ZAI_CODING_DEFAULT_MODEL, ZAI_OPENROUTER_FALLBACK_MODEL, zaiSettingsFromConfig, type ZaiCodingPlanSettings } from '../../llm/zai-coding-plan.js';
|
|
175
175
|
import { normalizePlanningFallbackReason, selectEnhanceLlm } from '../../prompt-enhance/enhance.js';
|
|
176
176
|
import { inferProviderFromModel } from '../../llm.js';
|
|
177
|
-
import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
|
|
177
|
+
import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podChildProviderFailureFact, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
|
|
178
178
|
import { kubectlTransientReason, retryKubectlTransient } from './kubectl-transient-retry.js';
|
|
179
179
|
import { OLD_DOOR_STAMP_ENV } from '../../self-dev/old-door.js';
|
|
180
180
|
import { resolveDefaultSourceHead, seedMirrorOnce, type MirrorSeedResult } from './pod-mirror-seed.js';
|
|
@@ -409,7 +409,8 @@ async function measureHostBudgetSnapshot(childLlm: PodBudgetChildLlm, env: NodeJ
|
|
|
409
409
|
const host = resolveHostId(env);
|
|
410
410
|
const measuredAt = Date.now();
|
|
411
411
|
const { readBudgetInputsLive, CODEX_PROVIDER, GROK_PROVIDER } = await import('../../self-implement/budget-gate.js');
|
|
412
|
-
const
|
|
412
|
+
const { budgetInputsWithLiveSupply } = await import('../../live-supply/budget-consumer.js');
|
|
413
|
+
const inputs = budgetInputsWithLiveSupply(await readBudgetInputsLive(inputDeps));
|
|
413
414
|
const { decision } = harnessLaunchBudgetDecision(inputs, { ...(childLlm.provider ? { childLlmProvider: childLlm.provider } : {}), ...(childLlm.model ? { childLlmModel: childLlm.model } : {}) });
|
|
414
415
|
const provider = decision.provider ?? childLlm.provider ?? 'chain';
|
|
415
416
|
const used = provider === GROK_PROVIDER
|
|
@@ -1618,6 +1619,22 @@ export function repairPodExitCode(input: { state: string; repairCommitOnly: bool
|
|
|
1618
1619
|
return input.disposition?.stage !== 'host-regate-failed' && input.disposition?.ok !== false ? 0 : 1;
|
|
1619
1620
|
}
|
|
1620
1621
|
|
|
1622
|
+
export function parsePodRepairExportEvidence(output: string): { exportExitCode: number | null; podExitCode: number | null; exported: boolean;
|
|
1623
|
+
reasonCode: 'none' | 'no-new-commit' | 'source-head-mismatch' | 'export-failed' } | null {
|
|
1624
|
+
const outcomes = [
|
|
1625
|
+
...[...output.matchAll(/^ELANOUS_POD_REPAIR_FAILED ([^\r\n]+)$/gm)].map((match) => ({ index: match.index!, failure: match[1]! })),
|
|
1626
|
+
...[...output.matchAll(/^ELANOUS_POD_REPAIR_COMMIT ([1-9]\d*) ([0-9a-f]{40}) ([0-9a-f]{40})$/gm)].map((match) => ({ index: match.index!, failure: null })),
|
|
1627
|
+
].sort((a, b) => a.index - b.index);
|
|
1628
|
+
const outcome = outcomes.at(-1);
|
|
1629
|
+
if (!outcome) return null;
|
|
1630
|
+
const podRc = [...output.matchAll(/__ELANOUS_POD_DONE__[^\r\n]*\brc=(\d+)/g)].at(-1)?.[1];
|
|
1631
|
+
const reasonCode = outcome.failure === null ? 'none' : outcome.failure === 'repair made no new commit' ? 'no-new-commit'
|
|
1632
|
+
: outcome.failure === 'source-head-mismatch' ? 'source-head-mismatch' : 'export-failed';
|
|
1633
|
+
const exported = outcome.failure === null;
|
|
1634
|
+
return { exportExitCode: exported ? 0 : reasonCode === 'source-head-mismatch' ? null : 1,
|
|
1635
|
+
podExitCode: podRc === undefined ? null : Number(podRc), exported, reasonCode };
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1621
1638
|
export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplementJobSpawn {
|
|
1622
1639
|
if (options.repairCommitOnly && (options.source?.kind !== 'pr' || options.source.number !== options.repairCommitOnly.pr || !/^[0-9a-f]{40}$/.test(options.repairCommitOnly.baseHead))) {
|
|
1623
1640
|
throw new Error('repair commit-only requires a matching PR source and exact head');
|
|
@@ -1635,6 +1652,46 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1635
1652
|
const resultMarkerOn = options.resultMarker ?? !options.kubectl;
|
|
1636
1653
|
const writeWarmLedger = options.siWarmLedger
|
|
1637
1654
|
?? ((entry: RunLedgerEntry) => appendRunLedgerEntry(entry, runLedgerDir(env.ELANOUS_STATE_DIR)));
|
|
1655
|
+
const recordFinalTaskFailure = (input: Parameters<SelfImplementJobSpawn>[0], result: SelfImplementJobDone,
|
|
1656
|
+
ledgerStartIndex: number): SelfImplementJobDone => {
|
|
1657
|
+
// Match createSelfImplementAdapter: a nonzero process exit is failed even if it also emitted an ok disposition.
|
|
1658
|
+
if (result.error?.code === 'aborted' || (result.exitCode === 0 && result.disposition?.ok !== false)) return result;
|
|
1659
|
+
const ledgerRunId = env.ELANOUS_RUN_ID ?? input.spaceId;
|
|
1660
|
+
const ledgerDir = runLedgerDir(env.ELANOUS_STATE_DIR);
|
|
1661
|
+
const job = podJobName(input.spaceId);
|
|
1662
|
+
try {
|
|
1663
|
+
const entries = loadRunLedger(ledgerRunId, ledgerDir) ?? [];
|
|
1664
|
+
const currentEntries = entries.slice(ledgerStartIndex);
|
|
1665
|
+
const childStart = currentEntries.slice().reverse().find((entry) => entry.event === 'pod-child-run' && entry.data?.job === job);
|
|
1666
|
+
const childRunId = typeof childStart?.data?.childRunId === 'string' ? childStart.data.childRunId : null;
|
|
1667
|
+
const attemptValue = childStart?.data?.attempt;
|
|
1668
|
+
const attempt = typeof attemptValue === 'number' && Number.isSafeInteger(attemptValue) && attemptValue > 0 ? attemptValue : 1;
|
|
1669
|
+
const evidence = childRunId ? currentEntries.slice().reverse().find((entry) => entry.event === 'pod-child-evidence'
|
|
1670
|
+
&& entry.data?.job === job && entry.data?.childRunId === childRunId) : undefined;
|
|
1671
|
+
const childResult = evidence?.data?.childResult && typeof evidence.data.childResult === 'object'
|
|
1672
|
+
? evidence.data.childResult as Record<string, unknown> : undefined;
|
|
1673
|
+
const rawError = typeof result.disposition?.error === 'string' && result.disposition.error.trim() ? result.disposition.error
|
|
1674
|
+
: typeof childResult?.error === 'string' && childResult.error.trim() ? childResult.error
|
|
1675
|
+
: result.error?.message ?? result.output;
|
|
1676
|
+
const podTermination = evidence?.data?.podTermination && typeof evidence.data.podTermination === 'object'
|
|
1677
|
+
? evidence.data.podTermination : null;
|
|
1678
|
+
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-task-failure', data: {
|
|
1679
|
+
spaceId: input.spaceId,
|
|
1680
|
+
taskId: input.taskId ?? null,
|
|
1681
|
+
job,
|
|
1682
|
+
attempt,
|
|
1683
|
+
childRunId,
|
|
1684
|
+
childStage: typeof result.disposition?.stage === 'string' ? result.disposition.stage
|
|
1685
|
+
: typeof childResult?.stage === 'string' ? childResult.stage : 'unknown',
|
|
1686
|
+
childError: redactSecretText(rawError).replace(/\s+/gu, ' ').trim().slice(0, 500) || 'unknown',
|
|
1687
|
+
podTermination,
|
|
1688
|
+
} }, ledgerDir);
|
|
1689
|
+
} catch (error) {
|
|
1690
|
+
debug.log('self-implement.pod', 'task-failure-write-failed', { job, childRunId: null,
|
|
1691
|
+
reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
1692
|
+
}
|
|
1693
|
+
return result;
|
|
1694
|
+
};
|
|
1638
1695
|
return (input) => {
|
|
1639
1696
|
if (options.repairCommitOnly && (input.autoMerge || input.openPr || input.base !== `pr-${options.repairCommitOnly.pr}`)) {
|
|
1640
1697
|
throw new Error('repair commit-only refuses auto merge, new PR, or a different base');
|
|
@@ -1642,6 +1699,19 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1642
1699
|
if (options.siWarmAttempt && !options.siWarmHostPostprocess) {
|
|
1643
1700
|
throw new Error('si-v1 warm execution requires cold-path host postprocess parity');
|
|
1644
1701
|
}
|
|
1702
|
+
const taskLedgerDir = runLedgerDir(env.ELANOUS_STATE_DIR);
|
|
1703
|
+
let taskLedgerStartIndex = Number.MAX_SAFE_INTEGER;
|
|
1704
|
+
try { taskLedgerStartIndex = (loadRunLedger(env.ELANOUS_RUN_ID ?? input.spaceId, taskLedgerDir) ?? []).length; }
|
|
1705
|
+
catch (error) { debug.log('self-implement.pod', 'task-failure-baseline-unavailable', {
|
|
1706
|
+
spaceId: input.spaceId, reason: error instanceof Error ? error.message : String(error),
|
|
1707
|
+
}, { level: 'warn' }); }
|
|
1708
|
+
const recordFailure = (result: SelfImplementJobDone) => recordFinalTaskFailure(input, result, taskLedgerStartIndex);
|
|
1709
|
+
const recordRejectedFailure = (error: unknown): never => {
|
|
1710
|
+
if (!input.signal?.aborted && !(error instanceof Error && error.name === 'AbortError')) {
|
|
1711
|
+
recordFailure({ exitCode: 1, output: '', error: { code: 'pod-promise-rejected', message: error instanceof Error ? error.message : String(error) } });
|
|
1712
|
+
}
|
|
1713
|
+
throw error;
|
|
1714
|
+
};
|
|
1645
1715
|
let siWarmEnabled = true;
|
|
1646
1716
|
const taskCard = env.ELANOUS_POD_TASK_CARD ?? env.ELANOUS_TASK_CARD_ID;
|
|
1647
1717
|
if (taskCard) {
|
|
@@ -1956,7 +2026,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
1956
2026
|
return { exitCode: 1, output: log.slice(-4096), disposition: hostDisposition,
|
|
1957
2027
|
error: { code: 'si-warm-host-postprocess-failed', message } };
|
|
1958
2028
|
}
|
|
1959
|
-
})();
|
|
2029
|
+
})().then(recordFailure, recordRejectedFailure);
|
|
1960
2030
|
return { address: `self-impl:${input.spaceId}`, done };
|
|
1961
2031
|
}
|
|
1962
2032
|
const name = podJobName(input.spaceId);
|
|
@@ -2122,6 +2192,23 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2122
2192
|
const detail = unfit.map((u) => `${u.context} ${Math.round(u.allocatableMemoryBytes / 2 ** 30 * 10) / 10}GiB`).join(' · ');
|
|
2123
2193
|
return { exitCode: 1, output: '', error: { code: 'pod-pool-unfit', message: `모든 풀 멤버의 할당 가능 메모리가 이 Job 의 한도 ${memoryLimit} 보다 작다 — 영원히 배치될 수 없다(${detail}) · --pod-memory 를 낮추거나 다른 풀로` } };
|
|
2124
2194
|
};
|
|
2195
|
+
// PRLAND-OOM-RETRY-POOL-FIT: whether the NEXT memory limit can ever be placed decides the retry before
|
|
2196
|
+
// anything is written or deleted. Read-only — an all-unfit pool ends the run here, so no retry intent
|
|
2197
|
+
// is journaled, the OOM Job stays, and no second Job is applied. A fit member leaves the single retry intact.
|
|
2198
|
+
const retryPoolFit = async (nextLimit: string, from: string): Promise<SelfImplementJobDone | null> => {
|
|
2199
|
+
const pool = options.pool as { unfitMembers?: (b: number) => Promise<Array<{ context: string; allocatableMemoryBytes: number }>>; members?: readonly PodPoolMember[] } | undefined;
|
|
2200
|
+
if (!pool || typeof pool.unfitMembers !== 'function' || !Array.isArray(pool.members) || !pool.members.length) return null;
|
|
2201
|
+
const limitBytes = memoryQuantityBytes(nextLimit);
|
|
2202
|
+
if (limitBytes === null) return null;
|
|
2203
|
+
const unfit = await pool.unfitMembers(limitBytes);
|
|
2204
|
+
const unfitContextsForRetry = new Set(unfit.map((u) => u.context));
|
|
2205
|
+
const fit = pool.members.filter((m) => !unfitContextsForRetry.has(m.context)).map((m) => m.context);
|
|
2206
|
+
debug.log('self-implement.pod', 'oom-retry-pool-fit', { job: name, from, to: nextLimit, fit, unfit: unfit.map((u) => u.context) }, { level: fit.length ? 'info' : 'warn' });
|
|
2207
|
+
if (fit.length) return null;
|
|
2208
|
+
const detail = unfit.map((u) => `${u.context} ${Math.round(u.allocatableMemoryBytes / 2 ** 30 * 10) / 10}GiB`).join(' · ');
|
|
2209
|
+
const poolLimit = `${Math.round(Math.max(...unfit.map((u) => u.allocatableMemoryBytes)) / 2 ** 30 * 10) / 10}GiB`;
|
|
2210
|
+
return { exitCode: 1, output: '', error: { code: 'pod-pool-unfit', message: `Job ${name} 이 OOMKilled(137) 로 ${from} 에서 죽었고 다음 한도는 ${nextLimit} 이지만 어느 풀 멤버도 그 한도를 받을 수 없다 — 재시도 Job 을 만들 수 없다(필요 ${nextLimit} · 풀 한계 ${poolLimit} · ${detail}) · --pod-memory 를 낮추거나 다른 풀로` } };
|
|
2211
|
+
};
|
|
2125
2212
|
const acquireSlot = async (): Promise<PodPoolMember | null> => {
|
|
2126
2213
|
if (!options.pool) return null;
|
|
2127
2214
|
// Each actual acquisition is a separate observation, including the OOM retry in this
|
|
@@ -2184,8 +2271,9 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2184
2271
|
if (unfitDone) return unfitDone;
|
|
2185
2272
|
// HARNESS-FULL-GRAPH — Pod 입장(입장 관문 ⊕ 멤버 슬롯)은 그래프 노드 pool-admit 이다.
|
|
2186
2273
|
// 2판: decompose →(substrate=pod) pool-admit 간선은 «여기»(Pod 입장 직전 · 실제 단계 경계)에서 남긴다.
|
|
2187
|
-
|
|
2188
|
-
|
|
2274
|
+
const journeyRunId = parentRunId ?? childRunId;
|
|
2275
|
+
if (options.repairCommitOnly) routeJourneyEdge('dispatch', 'pr-source', { source: 'pr', substrate: 'pod' }, { runId: journeyRunId });
|
|
2276
|
+
else routeJourneyEdge('decompose', 'pod', { substrate: 'pod' }, { runId: journeyRunId });
|
|
2189
2277
|
enterJourneyNode('pool-admit', { provenance: 'self-implement-pod', data: { spaceId: input.spaceId } });
|
|
2190
2278
|
// ⛔ 감싸는 함수(async 래퍼)를 쓰지 않는다 — 마이크로태스크가 늘면 Job apply 순서가 밀린다(시험이 잡았다). 같은 자리 try/catch 로.
|
|
2191
2279
|
const podAdmitError = (error: unknown): void => {
|
|
@@ -2300,6 +2388,11 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
2300
2388
|
collectPodArtifacts(full.stdout, { dir: join(effectiveInstanceRoot(), 'pod-artifacts'), job: name, log: record });
|
|
2301
2389
|
}
|
|
2302
2390
|
catch (error) { record('self-implement.pod', 'artifact-collect-incomplete', { job: name, reason: error instanceof Error ? error.message : String(error) }); }
|
|
2391
|
+
const repairExportEvidence = options.repairCommitOnly ? parsePodRepairExportEvidence(full.stdout) : null;
|
|
2392
|
+
if (repairExportEvidence) {
|
|
2393
|
+
try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-repair-export', data: { job: name, ...repairExportEvidence } }, ledgerDir); }
|
|
2394
|
+
catch (error) { record('self-implement.pod', 'repair-export-ledger-incomplete', { job: name, reason: error instanceof Error ? error.message : String(error) }); }
|
|
2395
|
+
}
|
|
2303
2396
|
for (const line of full.stdout.split(/\r?\n/)) {
|
|
2304
2397
|
const bundle = /^ELANOUS_POD_SALVAGE_BUNDLE (pod-salvage\/[a-zA-Z0-9._-]+\.bundle) ([0-9]+) ([0-9]+)(?: ([0-9a-f]{40,64}))?$/.exec(line);
|
|
2305
2398
|
if (bundle) {
|
|
@@ -3413,6 +3506,32 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3413
3506
|
for (const row of usagePlan.rows) debug.log(row.category, row.event, row.data);
|
|
3414
3507
|
const parsed = parseSelfImplementJson(logs);
|
|
3415
3508
|
const terminal = parseSelfImplementJson(logs.trimEnd().split('\n').at(-1) ?? '');
|
|
3509
|
+
const terminalObservation = podChildTerminalResultObservation(logs);
|
|
3510
|
+
const providerSignature = {
|
|
3511
|
+
grokUnavailableCount: logs.match(/Grok unavailable:\s*run `grok login`/gu)?.length ?? 0,
|
|
3512
|
+
structuredProviderErrors: terminal?.providerErrors ?? parsed?.providerErrors ?? null,
|
|
3513
|
+
};
|
|
3514
|
+
const childResultObservation = {
|
|
3515
|
+
job: name,
|
|
3516
|
+
childRunId: liveChildRunId,
|
|
3517
|
+
jobState: state,
|
|
3518
|
+
containerExitCode: containerExitCode ?? null,
|
|
3519
|
+
ledgerCompleteness,
|
|
3520
|
+
terminalResultObserved: terminalObservation.observed,
|
|
3521
|
+
terminalStage: terminalObservation.stage,
|
|
3522
|
+
terminalOk: terminalObservation.ok,
|
|
3523
|
+
terminalOutcome: terminalObservation.outcome,
|
|
3524
|
+
terminalFailureClassification: terminalObservation.failureClassification,
|
|
3525
|
+
providerSignature,
|
|
3526
|
+
};
|
|
3527
|
+
debug.log('self-implement.pod', 'child-terminal-result-observed', childResultObservation);
|
|
3528
|
+
try {
|
|
3529
|
+
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-terminal-result-observation', data: childResultObservation }, ledgerDir);
|
|
3530
|
+
} catch (error) {
|
|
3531
|
+
debug.log('self-implement.pod', 'child-terminal-result-observation-write-failed', {
|
|
3532
|
+
job: name, childRunId: liveChildRunId, reason: error instanceof Error ? error.message : String(error),
|
|
3533
|
+
}, { level: 'warn' });
|
|
3534
|
+
}
|
|
3416
3535
|
const nextAccount = codexAccounts?.find((candidate) => candidate !== account);
|
|
3417
3536
|
if (state === 'failed' && containerExitCode === 7 && !input.signal?.aborted) {
|
|
3418
3537
|
debug.log('self-implement.pod', 'gh-login-failed', { job: name, attempt: ghLoginRetried ? 2 : 1, tokenExpiresInSec: ghTokenExpiresAt === null ? null : Math.floor((ghTokenExpiresAt - now()) / 1000) });
|
|
@@ -3751,6 +3870,9 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3751
3870
|
}
|
|
3752
3871
|
if (actual < (memoryGi(nextLimit) ?? actual)) {
|
|
3753
3872
|
const from = reattachedMemoryLimit ?? memoryLimit;
|
|
3873
|
+
// A retry nobody can place is not a retry: decide pool fitness for the next limit first.
|
|
3874
|
+
const retryUnfit = await retryPoolFit(nextLimit, from);
|
|
3875
|
+
if (retryUnfit) return retryUnfit;
|
|
3754
3876
|
appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-oom-retry-intent', data: { attempt: 2, from, to: nextLimit, tier: nextTier, reason: 'OOMKilled', job: name, executionKey, fromChildRunId: liveChildRunId } }, ledgerDir);
|
|
3755
3877
|
debug.log('self-implement.pod', 'oom-retry', { from, to: nextLimit, tier: nextTier, reason: 'OOMKilled', job: name });
|
|
3756
3878
|
const deleted = kubectl(['-n', namespace, 'delete', 'job', name, '--ignore-not-found', '--wait=true']);
|
|
@@ -3798,6 +3920,12 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3798
3920
|
}
|
|
3799
3921
|
// The host still has the complete Pod log here. The CLI only retains a short stdout tail,
|
|
3800
3922
|
// so preserve the parsed child facts in the parent ledger before that tail is returned.
|
|
3923
|
+
// OBS-GAP-BATCH-1030 — 자식 LLM 실패의 공급자·HTTP status 를 부모 원장 행에 붙인다.
|
|
3924
|
+
// 줄이 공급자를 이름하지 않으면 이 Pod 의 자식 provider(Pod 옵션 ⊕ 위임 플래그)를 정규 id 로만 쓴다.
|
|
3925
|
+
// ⛔ 본문·자격증명은 담지 않는다 — 귀속은 두 스칼라뿐이다.
|
|
3926
|
+
const childProviderFailure = podChildProviderFailureFact(logs, {
|
|
3927
|
+
providerHint: options.provider ?? podChildProviderOf(podDelegatedChildLlm(jobArgs)?.provider),
|
|
3928
|
+
});
|
|
3801
3929
|
const childEvidenceRow = podChildEvidenceLedgerRow({
|
|
3802
3930
|
job: name,
|
|
3803
3931
|
childRunId: liveChildRunId,
|
|
@@ -3806,6 +3934,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3806
3934
|
noResultDiagnostic,
|
|
3807
3935
|
noResultLogEvidence,
|
|
3808
3936
|
podTermination,
|
|
3937
|
+
providerFailure: childProviderFailure,
|
|
3809
3938
|
});
|
|
3810
3939
|
if (childEvidenceRow) {
|
|
3811
3940
|
// Every terminal attempt writes a marker, including one with no parseable child facts.
|
|
@@ -3927,7 +4056,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
|
|
|
3927
4056
|
} finally {
|
|
3928
4057
|
releaseAdmission?.();
|
|
3929
4058
|
}
|
|
3930
|
-
})();
|
|
4059
|
+
})().then(recordFailure, recordRejectedFailure);
|
|
3931
4060
|
return { address, done };
|
|
3932
4061
|
};
|
|
3933
4062
|
}
|
|
@@ -4095,6 +4224,43 @@ export function readPodNoResultLogTail(args: {
|
|
|
4095
4224
|
}
|
|
4096
4225
|
}
|
|
4097
4226
|
|
|
4227
|
+
/** Keep the terminal result row separate from provider-error text in the same child log. */
|
|
4228
|
+
function podChildTerminalResultObservation(logs: string): {
|
|
4229
|
+
observed: boolean;
|
|
4230
|
+
stage: string | null;
|
|
4231
|
+
ok: boolean | null;
|
|
4232
|
+
outcome: string | null;
|
|
4233
|
+
failureClassification: string | null;
|
|
4234
|
+
} {
|
|
4235
|
+
const lines = logs.split(/\r\n|\n|\r/u);
|
|
4236
|
+
for (let index = lines.length - 1; index >= 0; index--) {
|
|
4237
|
+
const line = lines[index]!.trim();
|
|
4238
|
+
if (!line.startsWith('{')) continue;
|
|
4239
|
+
let value: unknown;
|
|
4240
|
+
try { value = JSON.parse(line); } catch { continue; }
|
|
4241
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
|
|
4242
|
+
const row = value as Record<string, unknown>;
|
|
4243
|
+
const terminal = podTerminalRow(row);
|
|
4244
|
+
if (!terminal) continue;
|
|
4245
|
+
const nested = (row.kind === 'self' || row.kind === 'external')
|
|
4246
|
+
&& row.result && typeof row.result === 'object' && !Array.isArray(row.result)
|
|
4247
|
+
? row.result as Record<string, unknown> : row;
|
|
4248
|
+
const abandoned = nested.abandonedClassification && typeof nested.abandonedClassification === 'object'
|
|
4249
|
+
&& !Array.isArray(nested.abandonedClassification) ? nested.abandonedClassification as Record<string, unknown> : null;
|
|
4250
|
+
return {
|
|
4251
|
+
observed: true,
|
|
4252
|
+
stage: terminal.stage,
|
|
4253
|
+
ok: terminal.ok,
|
|
4254
|
+
outcome: typeof nested.outcome === 'string' ? nested.outcome
|
|
4255
|
+
: typeof nested.completionDisposition === 'string' ? nested.completionDisposition
|
|
4256
|
+
: typeof nested.terminationReason === 'string' ? nested.terminationReason : null,
|
|
4257
|
+
failureClassification: typeof nested.failureClassification === 'string' ? nested.failureClassification
|
|
4258
|
+
: typeof abandoned?.classification === 'string' ? abandoned.classification : null,
|
|
4259
|
+
};
|
|
4260
|
+
}
|
|
4261
|
+
return { observed: false, stage: null, ok: null, outcome: null, failureClassification: null };
|
|
4262
|
+
}
|
|
4263
|
+
|
|
4098
4264
|
/** 사람용 런 결과 한 줄 — 수확 브랜치가 있으면 «수확할 브랜치: …» 를 붙인다. */
|
|
4099
4265
|
export function podRunResultLine(logs: string, branches: readonly string[]): string {
|
|
4100
4266
|
const result = logs.split('\n').filter((line) => !line.startsWith('ELANOUS_MEM ')).join('\n').slice(-4000);
|
|
@@ -31,6 +31,7 @@ import { isAbandonedClassification, type AbandonedClassificationResult } from '.
|
|
|
31
31
|
import { createExecution, type Task, type TaskExecution } from '../types.js';
|
|
32
32
|
import type { DispatchContext, DispatchResult } from '../surface-registry.js';
|
|
33
33
|
import { nestedPodResult } from './pod-failure-reason.js';
|
|
34
|
+
import { isTddRecordTag, TDD_RECORD_TAGS, type TddRecordTag } from '../../self-implement/tdd-evidence-tags.js';
|
|
34
35
|
import { SCOPE_EXPANSION_CAP, SCOPE_STOP_REASONS, isProtectedScopePath, type ScopeStopReason } from '../../self-implement/scope-adjacency.js';
|
|
35
36
|
|
|
36
37
|
/** Result of one self-implement subprocess. */
|
|
@@ -145,6 +146,8 @@ export interface PodChildEvidence {
|
|
|
145
146
|
supervisorVerdict?: unknown;
|
|
146
147
|
goalCauseObserved?: true;
|
|
147
148
|
terminationReason?: unknown;
|
|
149
|
+
/** TDD report-deficit facts carried as named fields, independent of clipped detail text. */
|
|
150
|
+
tddEvidenceFailure?: { reason: 'tdd-evidence-missing'; round: number; missing: TddRecordTag[] };
|
|
148
151
|
accountAvailability?: Record<string, unknown>;
|
|
149
152
|
prFailure?: {
|
|
150
153
|
stage: 'pr-open-failed';
|
|
@@ -217,6 +220,20 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
217
220
|
if (o.ok !== false || typeof value !== 'string' || !value.trim()) return undefined;
|
|
218
221
|
return redactSecretText(value).slice(0, 4_000);
|
|
219
222
|
};
|
|
223
|
+
const rawTddEvidenceFailure = object(o.tddEvidenceFailure);
|
|
224
|
+
const rawTddMissing = rawTddEvidenceFailure?.missing;
|
|
225
|
+
const tddEvidenceFailure = o.ok === false && o.terminationReason === 'tdd-evidence-missing'
|
|
226
|
+
&& rawTddEvidenceFailure?.reason === 'tdd-evidence-missing'
|
|
227
|
+
&& typeof rawTddEvidenceFailure.round === 'number' && Number.isSafeInteger(rawTddEvidenceFailure.round) && rawTddEvidenceFailure.round >= 1
|
|
228
|
+
&& Array.isArray(rawTddMissing) && rawTddMissing.length > 0 && rawTddMissing.length <= TDD_RECORD_TAGS.length
|
|
229
|
+
&& rawTddMissing.every(isTddRecordTag)
|
|
230
|
+
&& new Set(rawTddMissing).size === rawTddMissing.length
|
|
231
|
+
? {
|
|
232
|
+
reason: 'tdd-evidence-missing' as const,
|
|
233
|
+
round: rawTddEvidenceFailure.round,
|
|
234
|
+
missing: rawTddMissing as TddRecordTag[],
|
|
235
|
+
}
|
|
236
|
+
: undefined;
|
|
220
237
|
const failureExitCode = o.ok === false && typeof o.exitCode === 'number'
|
|
221
238
|
&& Number.isInteger(o.exitCode) && o.exitCode >= 0 && o.exitCode <= 255 ? o.exitCode : undefined;
|
|
222
239
|
const outOfScopeEdits = scrubValue(o.outOfScopeEdits);
|
|
@@ -248,7 +265,10 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
248
265
|
...(abandoned ? { abandonedClassification: abandoned } : {}),
|
|
249
266
|
...(o.supervisorVerdict !== undefined ? { supervisorVerdict: scrubValue(o.supervisorVerdict) } : {}),
|
|
250
267
|
...(o.goalCauseObserved === true ? { goalCauseObserved: true } : {}),
|
|
251
|
-
...(o.terminationReason
|
|
268
|
+
...(o.terminationReason === 'tdd-evidence-missing'
|
|
269
|
+
? (tddEvidenceFailure ? { terminationReason: 'tdd-evidence-missing' } : {})
|
|
270
|
+
: o.terminationReason !== undefined ? { terminationReason: scrubValue(o.terminationReason) } : {}),
|
|
271
|
+
...(tddEvidenceFailure ? { tddEvidenceFailure } : {}),
|
|
252
272
|
...(accountAvailability ? { accountAvailability } : {}),
|
|
253
273
|
...(o.harvestable === true && typeof o.branch === 'string' && o.branch.trim() ? { harvestable: true } : {}),
|
|
254
274
|
...(typeof o.prNumber === 'number' && Number.isSafeInteger(o.prNumber) && o.prNumber > 0 ? { prNumber: o.prNumber } : {}),
|
|
@@ -294,6 +314,8 @@ export interface SelfImplementJobSpawn {
|
|
|
294
314
|
draft?: boolean;
|
|
295
315
|
/** Distinct-per-job harness-space id → own screen/log buffer. */
|
|
296
316
|
spaceId: string;
|
|
317
|
+
/** Orchestrator task identity, preserved with terminal Pod failure evidence. */
|
|
318
|
+
taskId?: string;
|
|
297
319
|
signal?: AbortSignal;
|
|
298
320
|
/** Optional TC-owned warm-worker command. The warm request is advisory; this feature Job remains authoritative. */
|
|
299
321
|
warmWorkerCommand?: WarmWorkerCommand;
|
|
@@ -394,6 +416,7 @@ export function createSelfImplementAdapter(opts: SelfImplementAdapterOptions) {
|
|
|
394
416
|
...(surface.openPr !== undefined ? { openPr: surface.openPr } : {}),
|
|
395
417
|
...(surface.draft !== undefined ? { draft: surface.draft } : {}),
|
|
396
418
|
spaceId,
|
|
419
|
+
taskId: task.id,
|
|
397
420
|
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
398
421
|
});
|
|
399
422
|
address = res.address;
|
|
@@ -606,8 +629,9 @@ export function reviewGateFields(o: Record<string, unknown>): Pick<SelfImplement
|
|
|
606
629
|
export function reportUnmappedDispositionFields(
|
|
607
630
|
raw: Record<string, unknown>,
|
|
608
631
|
mapped: SelfImplementDisposition,
|
|
632
|
+
knownRawFields: readonly string[] = [],
|
|
609
633
|
): readonly string[] {
|
|
610
|
-
const known = new Set(Object.keys(mapped));
|
|
634
|
+
const known = new Set([...Object.keys(mapped), ...knownRawFields]);
|
|
611
635
|
const unmapped = Object.keys(raw).filter((key) => !known.has(key) && raw[key] !== undefined);
|
|
612
636
|
if (unmapped.length > 0) {
|
|
613
637
|
try {
|
|
@@ -716,7 +740,7 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
|
|
|
716
740
|
&& ((o.review as { mustFix: unknown[] }).mustFix).every((item) => typeof item === 'string')
|
|
717
741
|
? { mustFix: (o.review as { mustFix: string[] }).mustFix } : {}),
|
|
718
742
|
};
|
|
719
|
-
reportUnmappedDispositionFields(o, mapped);
|
|
743
|
+
reportUnmappedDispositionFields(o, mapped, ['terminationReason', 'tddEvidenceFailure']);
|
|
720
744
|
return mapped;
|
|
721
745
|
} catch { /* not this line */ }
|
|
722
746
|
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/** Durable, fail-closed evidence written only from an observed warm-worker lease. */
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, rmdirSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { effectiveInstanceRoot } from '../../instance/resolve.js';
|
|
6
|
+
import { debug } from '../../debug/log.js';
|
|
7
|
+
import type { WarmReuseEvidence, WarmReuseEvidenceByConsumer, WarmReuseConsumer } from './pod-warm-switch.js';
|
|
8
|
+
|
|
9
|
+
const SHA = /^[0-9a-f]{40}$/i;
|
|
10
|
+
const LOCK_HASH = /^[0-9a-f]{64}$/i;
|
|
11
|
+
const MAX_BYTES = 4 * 1024 * 1024;
|
|
12
|
+
const MAX_ROWS = 256;
|
|
13
|
+
export const WARM_REUSE_EVIDENCE_MAX_AGE_MS = 60 * 60_000;
|
|
14
|
+
|
|
15
|
+
export interface WarmReuseEvidenceRow {
|
|
16
|
+
schema: 1;
|
|
17
|
+
consumer: WarmReuseEvidenceConsumer;
|
|
18
|
+
pr?: number;
|
|
19
|
+
head: string;
|
|
20
|
+
main: string;
|
|
21
|
+
recordedAt: string;
|
|
22
|
+
/** Actual warm provider lease identity. Omitted on cold/fallback/timeout. */
|
|
23
|
+
leaseId?: string;
|
|
24
|
+
workerId?: string;
|
|
25
|
+
generation?: number;
|
|
26
|
+
expectedLockHash?: string;
|
|
27
|
+
workerLockHash?: string;
|
|
28
|
+
leaseValid?: boolean;
|
|
29
|
+
canaryPassed?: boolean;
|
|
30
|
+
agree?: boolean;
|
|
31
|
+
reason?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type WarmReuseEvidenceConsumer = 'gate-recheck' | 'land' | 'ta';
|
|
35
|
+
|
|
36
|
+
export interface ActualWarmLeaseEvidence {
|
|
37
|
+
workerId: string;
|
|
38
|
+
leaseId: string;
|
|
39
|
+
generation: number;
|
|
40
|
+
expectedLockHash: string;
|
|
41
|
+
workerLockHash: string;
|
|
42
|
+
leaseValid: boolean;
|
|
43
|
+
canaryPassed: boolean;
|
|
44
|
+
agree: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function warmReuseEvidencePath(root = effectiveInstanceRoot()): string {
|
|
48
|
+
return join(root, 'warm-reuse-evidence.jsonl');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function validRow(value: unknown): value is WarmReuseEvidenceRow {
|
|
52
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
53
|
+
const row = value as Partial<WarmReuseEvidenceRow>;
|
|
54
|
+
return row.schema === 1 && ['gate-recheck', 'land', 'ta'].includes(row.consumer ?? '')
|
|
55
|
+
&& (row.pr === undefined || typeof row.pr === 'number' && Number.isSafeInteger(row.pr) && row.pr > 0)
|
|
56
|
+
&& typeof row.head === 'string' && SHA.test(row.head) && typeof row.main === 'string' && SHA.test(row.main)
|
|
57
|
+
&& typeof row.recordedAt === 'string' && Number.isFinite(Date.parse(row.recordedAt))
|
|
58
|
+
&& (row.leaseId === undefined || typeof row.leaseId === 'string' && row.leaseId.length > 0)
|
|
59
|
+
&& (row.workerId === undefined || typeof row.workerId === 'string' && row.workerId.length > 0)
|
|
60
|
+
&& (row.generation === undefined || typeof row.generation === 'number' && Number.isSafeInteger(row.generation) && row.generation > 0)
|
|
61
|
+
&& (row.expectedLockHash === undefined || typeof row.expectedLockHash === 'string' && LOCK_HASH.test(row.expectedLockHash))
|
|
62
|
+
&& (row.workerLockHash === undefined || typeof row.workerLockHash === 'string' && LOCK_HASH.test(row.workerLockHash))
|
|
63
|
+
&& (row.leaseValid === undefined || typeof row.leaseValid === 'boolean')
|
|
64
|
+
&& (row.canaryPassed === undefined || typeof row.canaryPassed === 'boolean')
|
|
65
|
+
&& (row.agree === undefined || typeof row.agree === 'boolean')
|
|
66
|
+
&& (row.reason === undefined || typeof row.reason === 'string');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Append a bounded JSONL observation. A missing/invalid warm lease is recorded as unmeasured, never green. */
|
|
70
|
+
export function recordWarmReuseEvidence(path: string, row: WarmReuseEvidenceRow): void {
|
|
71
|
+
if (!validRow(row)) throw new Error('invalid warm reuse evidence row');
|
|
72
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
73
|
+
const lock = `${path}.lock`;
|
|
74
|
+
const deadline = Date.now() + 10_000;
|
|
75
|
+
for (;;) {
|
|
76
|
+
try { mkdirSync(lock); break; }
|
|
77
|
+
catch {
|
|
78
|
+
try { if (Date.now() - statSync(lock).mtimeMs > 30_000) { rmdirSync(lock); continue; } } catch { continue; }
|
|
79
|
+
if (Date.now() >= deadline) throw new Error('timed out locking warm reuse evidence');
|
|
80
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
let rows: string[] = [];
|
|
85
|
+
try {
|
|
86
|
+
const contents = readFileSync(path, 'utf8');
|
|
87
|
+
if (Buffer.byteLength(contents) <= MAX_BYTES) rows = contents.split(/\r?\n/).filter(Boolean).slice(-(MAX_ROWS - 1));
|
|
88
|
+
} catch { /* first write */ }
|
|
89
|
+
const safe = typeof row.leaseValid === 'boolean' && row.leaseId && row.workerId && row.generation && row.expectedLockHash
|
|
90
|
+
&& row.workerLockHash && row.canaryPassed !== undefined && row.agree !== undefined
|
|
91
|
+
? row
|
|
92
|
+
: { schema: 1 as const, consumer: row.consumer, ...(row.pr ? { pr: row.pr } : {}), head: row.head, main: row.main,
|
|
93
|
+
recordedAt: row.recordedAt, reason: row.reason ?? 'warm-lease-unmeasured' };
|
|
94
|
+
const body = [...rows, JSON.stringify(safe)].join('\n') + '\n';
|
|
95
|
+
const tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
96
|
+
try { writeFileSync(tempPath, body, { mode: 0o600, flag: 'wx' }); renameSync(tempPath, path); }
|
|
97
|
+
catch (error) { rmSync(tempPath, { force: true }); throw error; }
|
|
98
|
+
} finally { try { rmdirSync(lock); } catch { /* best-effort release */ } }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Read only exact head/main rows. Invalid, oversized, or absent files produce no evidence. */
|
|
102
|
+
export function readWarmReuseEvidence(path: string, identity: { consumer: WarmReuseEvidenceConsumer; pr?: number; head: string; main: string }, limit = 32, now = Date.now()): WarmReuseEvidenceRow[] | undefined {
|
|
103
|
+
if (!['gate-recheck', 'land', 'ta'].includes(identity.consumer) || (identity.pr !== undefined && (!Number.isSafeInteger(identity.pr) || identity.pr <= 0)) || !SHA.test(identity.head) || !SHA.test(identity.main)
|
|
104
|
+
|| !Number.isSafeInteger(limit) || limit < 1 || !Number.isFinite(now)) return undefined;
|
|
105
|
+
try {
|
|
106
|
+
if (!existsSync(path)) return undefined;
|
|
107
|
+
const contents = readFileSync(path, 'utf8');
|
|
108
|
+
if (Buffer.byteLength(contents) > MAX_BYTES) return undefined;
|
|
109
|
+
const lines = contents.split(/\r?\n/).filter(Boolean);
|
|
110
|
+
if (lines.length > MAX_ROWS) return undefined;
|
|
111
|
+
const rows: WarmReuseEvidenceRow[] = [];
|
|
112
|
+
for (const line of lines) {
|
|
113
|
+
let row: unknown;
|
|
114
|
+
try { row = JSON.parse(line); } catch { return undefined; }
|
|
115
|
+
if (!validRow(row)) return undefined;
|
|
116
|
+
if (row.consumer === identity.consumer && (identity.pr === undefined || row.pr === identity.pr)
|
|
117
|
+
&& row.head === identity.head && row.main === identity.main) {
|
|
118
|
+
const recordedAt = Date.parse(row.recordedAt);
|
|
119
|
+
if (recordedAt > now) return undefined;
|
|
120
|
+
if (now - recordedAt <= WARM_REUSE_EVIDENCE_MAX_AGE_MS) rows.push(row);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
rows.splice(0, Math.max(0, rows.length - limit));
|
|
124
|
+
return rows.length ? rows : undefined;
|
|
125
|
+
} catch { return undefined; }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Read exact source-pair evidence for each consumer and summarize only observed rows. */
|
|
129
|
+
export function loadWarmReuseEvidenceByConsumer(
|
|
130
|
+
identity: { head: string; main: string } | undefined, path = warmReuseEvidencePath(),
|
|
131
|
+
): WarmReuseEvidenceByConsumer | undefined {
|
|
132
|
+
const result: WarmReuseEvidenceByConsumer = {};
|
|
133
|
+
const consumers: readonly WarmReuseEvidenceConsumer[] = ['gate-recheck', 'land', 'ta'];
|
|
134
|
+
const exactIdentity = identity && SHA.test(identity.head) && SHA.test(identity.main) ? identity : undefined;
|
|
135
|
+
for (const consumer of consumers) {
|
|
136
|
+
const rows = exactIdentity ? readWarmReuseEvidence(path, { consumer, ...exactIdentity }) : undefined;
|
|
137
|
+
const latest = rows?.[rows.length - 1];
|
|
138
|
+
if (!rows?.length || !latest) {
|
|
139
|
+
try { debug.log('pod.warm', 'evidence-supplied', { consumer, measured: false }); } catch { /* observation only */ }
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const lock = latest.expectedLockHash ?? '';
|
|
143
|
+
let consecutiveMatchSamples = 0;
|
|
144
|
+
for (let index = rows.length - 1; index >= 0; index--) {
|
|
145
|
+
const row = rows[index]!;
|
|
146
|
+
const identityComplete = !!row.leaseId && !!row.workerId && Number.isSafeInteger(row.generation)
|
|
147
|
+
&& !!row.expectedLockHash && !!row.workerLockHash;
|
|
148
|
+
if (!identityComplete || row.workerId !== latest.workerId || row.expectedLockHash !== lock || row.workerLockHash !== lock
|
|
149
|
+
|| row.leaseValid !== true || row.canaryPassed !== true || row.agree !== true) break;
|
|
150
|
+
consecutiveMatchSamples++;
|
|
151
|
+
}
|
|
152
|
+
const evidence: WarmReuseEvidence = {
|
|
153
|
+
consecutiveMatchSamples,
|
|
154
|
+
recentMismatchCount: rows.filter((row) => row.agree === false).length,
|
|
155
|
+
...(typeof latest.leaseValid === 'boolean'
|
|
156
|
+
? { leaseValid: latest.leaseValid && !!latest.leaseId && !!latest.workerId && Number.isSafeInteger(latest.generation) }
|
|
157
|
+
: {}),
|
|
158
|
+
...(typeof latest.canaryPassed === 'boolean' ? { canaryPassed: latest.canaryPassed } : {}),
|
|
159
|
+
expected: { head: exactIdentity!.head, main: exactIdentity!.main, lock },
|
|
160
|
+
worker: { head: exactIdentity!.head, main: exactIdentity!.main, lock: latest.workerLockHash ?? '' },
|
|
161
|
+
};
|
|
162
|
+
result[consumer as WarmReuseConsumer] = evidence;
|
|
163
|
+
const measured = typeof latest.leaseValid === 'boolean' && !!latest.leaseId && !!latest.workerId
|
|
164
|
+
&& Number.isSafeInteger(latest.generation) && typeof latest.canaryPassed === 'boolean'
|
|
165
|
+
&& !!latest.expectedLockHash && !!latest.workerLockHash && typeof latest.agree === 'boolean';
|
|
166
|
+
try { debug.log('pod.warm', 'evidence-supplied', { consumer, measured }); } catch { /* observation only */ }
|
|
167
|
+
}
|
|
168
|
+
return Object.keys(result).length ? result : undefined;
|
|
169
|
+
}
|
|
@@ -531,6 +531,17 @@ export type TaskExecutionStatus =
|
|
|
531
531
|
| 'timeout'
|
|
532
532
|
| 'cancelled';
|
|
533
533
|
|
|
534
|
+
/** Explicit browser capture provenance forwarded from the run-scoped harness event. */
|
|
535
|
+
export interface TaskCaptureArtifact {
|
|
536
|
+
path: string;
|
|
537
|
+
mimeType: string;
|
|
538
|
+
runId: string;
|
|
539
|
+
linearIssueId: string;
|
|
540
|
+
externalShare: boolean;
|
|
541
|
+
sensitivity: string;
|
|
542
|
+
createdAt: number;
|
|
543
|
+
}
|
|
544
|
+
|
|
534
545
|
export interface TaskExecution {
|
|
535
546
|
readonly id: string; // 'exec:<hex>'
|
|
536
547
|
readonly taskId: string;
|
|
@@ -548,6 +559,9 @@ export interface TaskExecution {
|
|
|
548
559
|
/** The agent ran, but its reported outcome needs human review rather than automatic completion. */
|
|
549
560
|
reviewRequired?: boolean;
|
|
550
561
|
outputPath?: string;
|
|
562
|
+
/** Harness run identity and approved captures observed during this exact execution window. */
|
|
563
|
+
runId?: string;
|
|
564
|
+
captureArtifacts?: TaskCaptureArtifact[];
|
|
551
565
|
error?: { code: string; message: string; stack?: string };
|
|
552
566
|
tokenUsage?: { input: number; output: number };
|
|
553
567
|
costUsd?: number;
|
package/src/telegram.ts
CHANGED
|
@@ -1820,23 +1820,21 @@ export class TelegramBot {
|
|
|
1820
1820
|
if (!fromVoice && ctx.text && !ctx.text.startsWith('/')) {
|
|
1821
1821
|
try {
|
|
1822
1822
|
const ambientMode = this.slashContext?.userConfig.intake.telegram.ambientCapture ?? 'off';
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1823
|
+
const { maybeHandleTelegramAmbientMessage } = await import('./intake-plane/adapters/telegram-ambient.js');
|
|
1824
|
+
const ambientReply = await maybeHandleTelegramAmbientMessage({
|
|
1825
|
+
text: ctx.text,
|
|
1826
|
+
chatId: ctx.chatId,
|
|
1827
|
+
userId: ctx.userId,
|
|
1828
|
+
...(ctx.userName ? { userName: ctx.userName } : {}),
|
|
1829
|
+
...(ctx.threadId != null ? { threadId: ctx.threadId } : {}),
|
|
1830
|
+
ambientCapture: ambientMode,
|
|
1831
|
+
});
|
|
1832
|
+
if (ambientReply) {
|
|
1833
|
+
await this.sendMessage(ctx.chatId, ambientReply, {
|
|
1834
|
+
replyTo: ctx.messageId,
|
|
1835
|
+
threadId: ctx.threadId,
|
|
1832
1836
|
});
|
|
1833
|
-
|
|
1834
|
-
await this.sendMessage(ctx.chatId, ambientReply, {
|
|
1835
|
-
replyTo: ctx.messageId,
|
|
1836
|
-
threadId: ctx.threadId,
|
|
1837
|
-
});
|
|
1838
|
-
return;
|
|
1839
|
-
}
|
|
1837
|
+
return;
|
|
1840
1838
|
}
|
|
1841
1839
|
} catch (err) {
|
|
1842
1840
|
this.log(`telegram ambient-intake failed: ${err instanceof Error ? err.message : String(err)}`);
|