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
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Skill-essence extraction of ~/.claude/skills/omni-crawl/. Different
|
|
4
4
|
// from WebSearch (cascade — first available wins): omni_search runs
|
|
5
|
-
//
|
|
6
|
-
//
|
|
5
|
+
// every selected provider in parallel and merges hits. Research dispatch
|
|
6
|
+
// has a narrower Exa/Firecrawl allowlist; Grok is reserved for explicit X intent.
|
|
7
7
|
//
|
|
8
8
|
// Probe: at least 2 providers available. With only 1, plain WebSearch
|
|
9
9
|
// is sufficient — no point paying the parallel-fan-out cost.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// by-engine — group hits under per-provider headings
|
|
14
14
|
|
|
15
15
|
import type { LLMToolSpec } from '../../llm.js';
|
|
16
|
-
import { getAvailableWebSearchProviders } from '../../web-search/index.js';
|
|
16
|
+
import { getAvailableResearchWebSearchProviders, getAvailableWebSearchProviders } from '../../web-search/index.js';
|
|
17
17
|
import type { WebSearchHit } from '../../web-search/provider.js';
|
|
18
18
|
|
|
19
19
|
export interface OmniSearchArgs {
|
|
@@ -43,6 +43,8 @@ export interface OmniSearchDispatchOpts {
|
|
|
43
43
|
/** Observational only: callback failures must not interrupt a provider search. */
|
|
44
44
|
onEngine?: (event: OmniSearchEngineEvent) => void;
|
|
45
45
|
onSource?: (source: WebSearchHit & { engine: string }) => void;
|
|
46
|
+
/** Test seam for verifying that sequential research providers share one deadline. */
|
|
47
|
+
now?: () => number;
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
const DEFAULT_LIMIT = 5;
|
|
@@ -52,9 +54,9 @@ export function buildOmniSearchTool(): LLMToolSpec {
|
|
|
52
54
|
return {
|
|
53
55
|
name: 'OmniSearch',
|
|
54
56
|
description:
|
|
55
|
-
'Multi-provider web search — fans out to
|
|
56
|
-
'merges hits. Wider coverage than WebSearch (cascade).
|
|
57
|
-
'
|
|
57
|
+
'Multi-provider web search — fans out to configured search providers in parallel and ' +
|
|
58
|
+
'merges hits. Wider coverage than WebSearch (cascade). Research searches use bounded ' +
|
|
59
|
+
'Exa / Firecrawl routes; Grok is reserved for explicit X/Twitter intent. Probe-gated: requires at ' +
|
|
58
60
|
'least 2 available providers (otherwise WebSearch already covers it).',
|
|
59
61
|
parameters: {
|
|
60
62
|
type: 'object',
|
|
@@ -73,13 +75,22 @@ export function buildOmniSearchTool(): LLMToolSpec {
|
|
|
73
75
|
};
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
const
|
|
78
|
+
const RESEARCH_SEARCH_BUDGET_MS = 14_500;
|
|
79
|
+
const RESEARCH_WEB_FALLBACK_IDS = ['exa', 'firecrawl'];
|
|
80
|
+
const RESEARCH_EXA_TIMEOUT_MS = 4_500;
|
|
81
|
+
const researchHits = new WeakMap<OmniSearchResult, Record<string, WebSearchHit[]>>();
|
|
77
82
|
|
|
78
83
|
export async function dispatchOmniSearch(
|
|
79
84
|
rawArgs: Record<string, unknown>,
|
|
80
85
|
opts: OmniSearchDispatchOpts = {},
|
|
81
86
|
): Promise<OmniSearchResult> {
|
|
82
|
-
|
|
87
|
+
const args = validate(rawArgs);
|
|
88
|
+
const allowed = getAvailableResearchProviders();
|
|
89
|
+
const requested = args.engines === undefined ? undefined : new Set(args.engines.map(id => id.toLowerCase()));
|
|
90
|
+
const providers = requested === undefined
|
|
91
|
+
? allowed
|
|
92
|
+
: allowed.filter(provider => requested.has(provider.id.toLowerCase()));
|
|
93
|
+
return dispatchWithProviders(args, opts, providers);
|
|
83
94
|
}
|
|
84
95
|
|
|
85
96
|
export async function dispatchResearchOmniSearch(
|
|
@@ -87,19 +98,104 @@ export async function dispatchResearchOmniSearch(
|
|
|
87
98
|
opts: OmniSearchDispatchOpts = {},
|
|
88
99
|
): Promise<OmniSearchResult> {
|
|
89
100
|
const args = validate(rawArgs);
|
|
101
|
+
const now = opts.now ?? Date.now;
|
|
102
|
+
const deadlineAt = now() + RESEARCH_SEARCH_BUDGET_MS;
|
|
90
103
|
const selected = getAvailableResearchProviders();
|
|
91
104
|
const requested = args.engines === undefined ? undefined : new Set(args.engines.map(id => id.toLowerCase()));
|
|
92
105
|
const providers = requested === undefined
|
|
93
106
|
? selected
|
|
94
107
|
: selected.filter(provider => requested.has(provider.id.toLowerCase()));
|
|
95
|
-
|
|
108
|
+
const webFallback = providers.filter(provider => RESEARCH_WEB_FALLBACK_IDS.includes(provider.id));
|
|
109
|
+
const webResult = await dispatchResearchWebFallback(args, opts, webFallback, deadlineAt);
|
|
110
|
+
return combineResearchResults(args, emptyOmniSearchResult(args), webResult);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function emptyOmniSearchResult(args: OmniSearchArgs): OmniSearchResult {
|
|
114
|
+
const result: OmniSearchResult = {
|
|
115
|
+
output: '',
|
|
116
|
+
metadata: { perEngine: {}, totalHits: 0, merge: args.merge ?? 'interleave' },
|
|
117
|
+
};
|
|
118
|
+
researchHits.set(result, {});
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function dispatchResearchWebFallback(
|
|
123
|
+
args: OmniSearchArgs,
|
|
124
|
+
opts: OmniSearchDispatchOpts,
|
|
125
|
+
providers: ReturnType<typeof getAvailableWebSearchProviders>,
|
|
126
|
+
deadlineAt: number,
|
|
127
|
+
): Promise<OmniSearchResult> {
|
|
128
|
+
const accumulated = emptyOmniSearchResult(args);
|
|
129
|
+
for (const provider of providers) {
|
|
130
|
+
const result = await dispatchWithProviders(args, opts, [provider], {
|
|
131
|
+
deadlineAt,
|
|
132
|
+
now: opts.now ?? Date.now,
|
|
133
|
+
});
|
|
134
|
+
Object.assign(accumulated.metadata.perEngine, result.metadata.perEngine);
|
|
135
|
+
accumulated.metadata.totalHits += result.metadata.totalHits;
|
|
136
|
+
accumulated.output += accumulated.output && result.output ? `\n\n${result.output}` : result.output;
|
|
137
|
+
Object.assign(researchHits.get(accumulated)!, researchHits.get(result));
|
|
138
|
+
const details = result.metadata.perEngine[provider.id];
|
|
139
|
+
// A successful but empty response is no usable research evidence, so continue to the next provider.
|
|
140
|
+
if (details && !details.error && details.hits > 0) break;
|
|
141
|
+
}
|
|
142
|
+
return accumulated;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function combineResearchResults(
|
|
146
|
+
args: OmniSearchArgs,
|
|
147
|
+
grokResult: OmniSearchResult,
|
|
148
|
+
webResult: OmniSearchResult,
|
|
149
|
+
): OmniSearchResult {
|
|
150
|
+
const perEngine = { ...grokResult.metadata.perEngine, ...webResult.metadata.perEngine };
|
|
151
|
+
const hitsByEngine = { ...researchHits.get(grokResult), ...researchHits.get(webResult) };
|
|
152
|
+
const merge = args.merge ?? 'interleave';
|
|
153
|
+
const limit = Math.max(1, Math.min(args.limit ?? DEFAULT_LIMIT, MAX_LIMIT));
|
|
154
|
+
const merged = (merge === 'interleave'
|
|
155
|
+
? interleaveHits(Object.fromEntries(Object.entries(hitsByEngine).map(([id, hits]) => [id, { hits }])))
|
|
156
|
+
: groupByEngine(Object.fromEntries(Object.entries(hitsByEngine).map(([id, hits]) => [id, { hits }]))))
|
|
157
|
+
.slice(0, limit);
|
|
158
|
+
const selectedByEngine = new Map<string, WebSearchHit[]>();
|
|
159
|
+
for (const [id, hits] of Object.entries(hitsByEngine)) selectedByEngine.set(id, []);
|
|
160
|
+
// Keep merge order for the global limit while retaining each source heading.
|
|
161
|
+
for (const hit of merged) {
|
|
162
|
+
const id = Object.keys(hitsByEngine).find(engine => hitsByEngine[engine]!.includes(hit));
|
|
163
|
+
if (id) selectedByEngine.get(id)!.push(hit);
|
|
164
|
+
}
|
|
165
|
+
const output: string[] = [`omni_search "${args.query}" — ${merged.length} hits across ${Object.keys(perEngine).length} provider${Object.keys(perEngine).length === 1 ? '' : 's'}`];
|
|
166
|
+
for (const [id, info] of Object.entries(perEngine)) {
|
|
167
|
+
output.push(` ${id}: ${selectedByEngine.get(id)?.length ?? 0} hits in ${info.durationMs}ms${info.error ? ` ERROR: ${info.error}` : ''}`);
|
|
168
|
+
}
|
|
169
|
+
output.push('');
|
|
170
|
+
if (merge === 'by-engine') {
|
|
171
|
+
for (const [id, hits] of selectedByEngine) {
|
|
172
|
+
if (hits.length === 0) continue;
|
|
173
|
+
output.push(`## ${id}`);
|
|
174
|
+
for (const hit of hits) output.push(formatHit(hit));
|
|
175
|
+
output.push('');
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
for (const hit of merged) output.push(formatHit(hit));
|
|
179
|
+
}
|
|
180
|
+
const result: OmniSearchResult = {
|
|
181
|
+
output: output.join('\n'),
|
|
182
|
+
metadata: {
|
|
183
|
+
perEngine: Object.fromEntries(Object.entries(perEngine).map(([id, info]) => [id, {
|
|
184
|
+
...info, hits: selectedByEngine.get(id)?.length ?? 0,
|
|
185
|
+
}])),
|
|
186
|
+
totalHits: merged.length,
|
|
187
|
+
merge,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
researchHits.set(result, hitsByEngine);
|
|
191
|
+
return result;
|
|
96
192
|
}
|
|
97
193
|
|
|
98
194
|
async function dispatchWithProviders(
|
|
99
195
|
args: OmniSearchArgs,
|
|
100
196
|
opts: OmniSearchDispatchOpts,
|
|
101
197
|
selectedProviders?: ReturnType<typeof getAvailableWebSearchProviders>,
|
|
102
|
-
researchLimits?: {
|
|
198
|
+
researchLimits?: { deadlineAt: number; now: () => number },
|
|
103
199
|
): Promise<OmniSearchResult> {
|
|
104
200
|
const merge = args.merge ?? 'interleave';
|
|
105
201
|
const limit = Math.max(1, Math.min(args.limit ?? DEFAULT_LIMIT, MAX_LIMIT));
|
|
@@ -136,7 +232,12 @@ async function dispatchWithProviders(
|
|
|
136
232
|
recencyDays: args.recency_days,
|
|
137
233
|
};
|
|
138
234
|
let result;
|
|
139
|
-
if (researchLimits
|
|
235
|
+
if (researchLimits) {
|
|
236
|
+
const remainingMs = researchLimits.deadlineAt - researchLimits.now();
|
|
237
|
+
const timeoutMs = p.id === 'exa'
|
|
238
|
+
? Math.min(RESEARCH_EXA_TIMEOUT_MS, remainingMs)
|
|
239
|
+
: remainingMs;
|
|
240
|
+
if (timeoutMs <= 0) throw new DOMException('Research search budget exhausted', 'TimeoutError');
|
|
140
241
|
const controller = new AbortController();
|
|
141
242
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
142
243
|
try {
|
|
@@ -145,8 +246,8 @@ async function dispatchWithProviders(
|
|
|
145
246
|
new Promise<never>((_, reject) => {
|
|
146
247
|
timer = setTimeout(() => {
|
|
147
248
|
controller.abort();
|
|
148
|
-
reject(new DOMException(`
|
|
149
|
-
},
|
|
249
|
+
reject(new DOMException(`Research search timed out after ${timeoutMs}ms`, 'TimeoutError'));
|
|
250
|
+
}, timeoutMs);
|
|
150
251
|
}),
|
|
151
252
|
]);
|
|
152
253
|
} finally {
|
|
@@ -196,7 +297,7 @@ async function dispatchWithProviders(
|
|
|
196
297
|
for (const h of merged) lines.push(formatHit(h));
|
|
197
298
|
}
|
|
198
299
|
|
|
199
|
-
|
|
300
|
+
const result: OmniSearchResult = {
|
|
200
301
|
output: lines.join('\n'),
|
|
201
302
|
metadata: {
|
|
202
303
|
perEngine: Object.fromEntries(Object.entries(perEngine).map(([k, v]) => [k, {
|
|
@@ -206,16 +307,18 @@ async function dispatchWithProviders(
|
|
|
206
307
|
merge,
|
|
207
308
|
},
|
|
208
309
|
};
|
|
310
|
+
researchHits.set(result, Object.fromEntries(Object.entries(perEngine).map(([id, info]) => [id, info.hits])));
|
|
311
|
+
return result;
|
|
209
312
|
}
|
|
210
313
|
|
|
211
|
-
/** Probe-compatible: at least 2
|
|
314
|
+
/** Probe-compatible: at least 2 Exa/Firecrawl providers available for omni_search. */
|
|
212
315
|
export function omniSearchAvailable(): boolean {
|
|
213
|
-
return
|
|
316
|
+
return getAvailableResearchProviders().length >= 2;
|
|
214
317
|
}
|
|
215
318
|
|
|
216
|
-
/** Research-only probe: require
|
|
319
|
+
/** Research-only probe: require one bounded Exa/Firecrawl web route. */
|
|
217
320
|
export function researchOmniSearchAvailable(): boolean {
|
|
218
|
-
return getAvailableResearchProviders().
|
|
321
|
+
return getAvailableResearchProviders().some(provider => RESEARCH_WEB_FALLBACK_IDS.includes(provider.id));
|
|
219
322
|
}
|
|
220
323
|
|
|
221
324
|
export function getAvailableResearchSearchEngineIds(): string[] {
|
|
@@ -223,13 +326,8 @@ export function getAvailableResearchSearchEngineIds(): string[] {
|
|
|
223
326
|
}
|
|
224
327
|
|
|
225
328
|
function getAvailableResearchProviders(): ReturnType<typeof getAvailableWebSearchProviders> {
|
|
226
|
-
const available =
|
|
227
|
-
|
|
228
|
-
?? available.find(provider => provider.id === 'grok-api');
|
|
229
|
-
return [
|
|
230
|
-
...(grok ? [grok] : []),
|
|
231
|
-
...available.filter(provider => provider.id === 'firecrawl'),
|
|
232
|
-
];
|
|
329
|
+
const available = getAvailableResearchWebSearchProviders();
|
|
330
|
+
return RESEARCH_WEB_FALLBACK_IDS.flatMap(id => available.filter(provider => provider.id === id));
|
|
233
331
|
}
|
|
234
332
|
|
|
235
333
|
function interleaveHits(perEngine: Record<string, { hits: WebSearchHit[] }>): WebSearchHit[] {
|
|
@@ -582,6 +582,16 @@ export function installRemoteCodexAccessBatch(target: ParentHostConfig, mirrors:
|
|
|
582
582
|
if (result.status !== 0) throw new Error(`remote Codex access mirror batch failed (ssh rc=${result.status ?? 'unknown'})`);
|
|
583
583
|
}
|
|
584
584
|
|
|
585
|
+
/** Install the same refresh-free snapshot for direct CLI use, outside per-launch parent credentials. */
|
|
586
|
+
export const REMOTE_CODEX_CLI_MIRROR_DIR = '$HOME/.elanous/remote-parent-credentials/cli-mirror';
|
|
587
|
+
export function installRemoteCodexCliMirror(
|
|
588
|
+
target: ParentHostConfig,
|
|
589
|
+
mirrors: readonly { elanousAuth: string; codexAuth: string; account: string }[],
|
|
590
|
+
ssh: SshRunner = defaultSshRunner,
|
|
591
|
+
): void {
|
|
592
|
+
installRemoteCodexAccessBatch({ ...target, configDir: REMOTE_CODEX_CLI_MIRROR_DIR }, mirrors, ssh);
|
|
593
|
+
}
|
|
594
|
+
|
|
585
595
|
// ── 관측: 원격 런 원장 거울 ─────────────────────────────────────────────────────────────
|
|
586
596
|
|
|
587
597
|
const RUN_ID_RE = /^run-[A-Za-z0-9_-]{4,64}$/;
|
|
@@ -27,3 +27,68 @@ export function measureRepairOutcomes(cards: readonly Pick<TaskCard, 'id' | 'his
|
|
|
27
27
|
}
|
|
28
28
|
return { ...counts, cards: affected.size };
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
export interface RepairTierModelCall {
|
|
32
|
+
card: string;
|
|
33
|
+
runId: string;
|
|
34
|
+
at: string;
|
|
35
|
+
tier: string;
|
|
36
|
+
model: string;
|
|
37
|
+
status: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Measure repair launch records in the requested window; missing dimensions stay explicit. */
|
|
41
|
+
export function measureRepairTierModels(
|
|
42
|
+
cards: readonly Pick<TaskCard, 'id' | 'history' | 'repairs' | 'tier'>[],
|
|
43
|
+
window: { since: number; until: number },
|
|
44
|
+
) {
|
|
45
|
+
const attempts = new Map<string, RepairTierModelCall & { called: boolean }>();
|
|
46
|
+
let invalidTimestamp = 0;
|
|
47
|
+
let missingRunId = 0;
|
|
48
|
+
for (const card of cards) {
|
|
49
|
+
for (const repair of card.repairs ?? []) {
|
|
50
|
+
const at = Date.parse(repair.at);
|
|
51
|
+
if (!Number.isFinite(at)) { invalidTimestamp++; continue; }
|
|
52
|
+
if (at < window.since || at >= window.until) continue;
|
|
53
|
+
if (!repair.runId) { missingRunId++; continue; }
|
|
54
|
+
const key = `${card.id}\0${repair.runId}`;
|
|
55
|
+
const previous = attempts.get(key);
|
|
56
|
+
if (previous && Date.parse(previous.at) > at) continue;
|
|
57
|
+
const called = card.history.some((entry) => entry.runId === repair.runId
|
|
58
|
+
&& (entry.event === 'harness.role-llm' || entry.event === 'repair-result'));
|
|
59
|
+
attempts.set(key, {
|
|
60
|
+
card: card.id,
|
|
61
|
+
runId: repair.runId,
|
|
62
|
+
at: repair.at,
|
|
63
|
+
tier: card.tier ?? 'unknown',
|
|
64
|
+
model: repair.toModel || 'unknown',
|
|
65
|
+
status: repair.status,
|
|
66
|
+
called,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const rows = [...attempts.values()].sort((a, b) => a.at.localeCompare(b.at) || a.card.localeCompare(b.card) || a.runId.localeCompare(b.runId));
|
|
71
|
+
const grouped = new Map<string, number>();
|
|
72
|
+
for (const row of rows) {
|
|
73
|
+
const key = `${row.tier}\0${row.model}`;
|
|
74
|
+
grouped.set(key, (grouped.get(key) ?? 0) + 1);
|
|
75
|
+
}
|
|
76
|
+
const tiers = ['하', '중', '상', '특', ...(rows.some((row) => !['하', '중', '상', '특'].includes(row.tier)) ? ['unknown'] : [])];
|
|
77
|
+
const models = [...new Set([...rows.map((row) => row.model), 'openai-codex/gpt-6-sol'])];
|
|
78
|
+
const byTierModel = tiers.flatMap((tier) => models.map((model) => {
|
|
79
|
+
const observedN = grouped.get(`${tier}\0${model}`) ?? 0;
|
|
80
|
+
return { tier, model, n: observedN || null, measured: observedN > 0, observedN };
|
|
81
|
+
})).sort((a, b) => a.tier.localeCompare(b.tier) || a.model.localeCompare(b.model));
|
|
82
|
+
const publicRow = ({ called: _called, ...row }: RepairTierModelCall & { called: boolean }): RepairTierModelCall => row;
|
|
83
|
+
const solRows = rows.filter((row) => row.model.includes('gpt-6-sol'));
|
|
84
|
+
return {
|
|
85
|
+
samples: rows.length,
|
|
86
|
+
measured: rows.length > 0,
|
|
87
|
+
unmeasuredReason: rows.length ? null : 'no repair attempts in the requested window',
|
|
88
|
+
byTierModel,
|
|
89
|
+
solCalls: solRows.filter((row) => row.called).map(publicRow),
|
|
90
|
+
solCallUnmeasured: solRows.filter((row) => !row.called).map(publicRow),
|
|
91
|
+
invalidTimestamp,
|
|
92
|
+
missingRunId,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -15,6 +15,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
15
15
|
import { parse as parseYaml } from 'yaml';
|
|
16
16
|
import { runGraph, validateUnitCalls, type GraphRunOptions, type GraphRunState } from '../graph-runner/runner.js';
|
|
17
17
|
import type { GraphWizardDeps } from '../graph-wizard/generate.js';
|
|
18
|
+
import type { PluginWizardDeps, PluginWizardInput } from '../graph-wizard/mission-compose.js';
|
|
18
19
|
import { parseGraphTemplateYaml } from '../self-implement/graph-yaml.js';
|
|
19
20
|
import { resolveDaemonHarnessTarget } from '../intake-plane/harness-target.js';
|
|
20
21
|
import { getUserConfig } from '../user-config.js';
|
|
@@ -192,15 +193,19 @@ export const COMPOSITION_ROOT = join(dirname(fileURLToPath(import.meta.url)), '.
|
|
|
192
193
|
export function selectTaskComposition(completion: CompletionKind, root?: string): CompositionSelection;
|
|
193
194
|
export function selectTaskComposition(completion: CompletionKind, root: string, mission: {
|
|
194
195
|
text: string; ledgerPath: string; cardId: string; callLLM?: GraphWizardDeps['callLLM']; onPersist?: (persist: () => void) => void;
|
|
196
|
+
pluginWizard?: PluginWizardInput; pluginWizardDeps?: PluginWizardDeps;
|
|
195
197
|
}): Promise<CompositionSelection>;
|
|
196
198
|
export function selectTaskComposition(completion: CompletionKind, root = COMPOSITION_ROOT, mission?: {
|
|
197
199
|
text: string; ledgerPath: string; cardId: string; callLLM?: GraphWizardDeps['callLLM']; onPersist?: (persist: () => void) => void;
|
|
200
|
+
pluginWizard?: PluginWizardInput; pluginWizardDeps?: PluginWizardDeps;
|
|
198
201
|
}): CompositionSelection | Promise<CompositionSelection> {
|
|
199
202
|
if (mission) {
|
|
200
203
|
const standard = selectTaskComposition(completion, root);
|
|
201
204
|
return import('../graph-wizard/mission-compose.js').then(async ({ composeMissionGraph }) => {
|
|
202
205
|
const result = await composeMissionGraph({ text: mission.text, completion, root, ledgerPath: mission.ledgerPath,
|
|
203
|
-
cardId: mission.cardId, standard
|
|
206
|
+
cardId: mission.cardId, standard, ...(mission.pluginWizard ? { pluginWizard: mission.pluginWizard } : {}) },
|
|
207
|
+
{ callLLM: mission.callLLM, deferPersistence: mission.onPersist !== undefined,
|
|
208
|
+
...(mission.pluginWizardDeps ? { pluginWizard: mission.pluginWizardDeps } : {}) });
|
|
204
209
|
mission.onPersist?.(result.persist);
|
|
205
210
|
return result.selection;
|
|
206
211
|
});
|
|
@@ -1135,6 +1140,10 @@ export interface HandTaskOptions {
|
|
|
1135
1140
|
composeGraph?: boolean;
|
|
1136
1141
|
/** Injectable LLM boundary for isolated composition tests. */
|
|
1137
1142
|
composeCallLLM?: GraphWizardDeps['callLLM'];
|
|
1143
|
+
/** Explicit missing-tool handoff from the active assistant; keeps the wizard opt-in and uses the same task graph path. */
|
|
1144
|
+
pluginWizard?: Omit<PluginWizardInput, 'mission' | 'root'> & { root?: string };
|
|
1145
|
+
/** Host surfaces for Telegram, side-tab agents, trial/use, and progress reporting. */
|
|
1146
|
+
pluginWizardDeps?: PluginWizardDeps;
|
|
1138
1147
|
/** `--live` 일 때만 불린다. */
|
|
1139
1148
|
launcher?: TaskLauncher;
|
|
1140
1149
|
/**
|
|
@@ -1189,7 +1198,7 @@ export class TaskLaunchError extends Error {
|
|
|
1189
1198
|
}
|
|
1190
1199
|
}
|
|
1191
1200
|
|
|
1192
|
-
export interface HandTaskResult { card: TaskCard; move: TaskCardMove; mode: 'shadow' | 'live'; launched: boolean; cwd?: string }
|
|
1201
|
+
export interface HandTaskResult { card: TaskCard; move: TaskCardMove; mode: 'shadow' | 'live'; launched: boolean; reason?: string; cwd?: string }
|
|
1193
1202
|
|
|
1194
1203
|
/** Dispatch evidence for a handed deliverable card; unlike handTask, this never launches work. */
|
|
1195
1204
|
export function dispatchDeliverableCompletion(id: string, input: { ref: string; receipt?: boolean }, path: string, now: () => Date = () => new Date()): boolean {
|
|
@@ -1335,9 +1344,12 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1335
1344
|
})
|
|
1336
1345
|
: undefined;
|
|
1337
1346
|
let persistComposition: (() => void) | undefined;
|
|
1338
|
-
const
|
|
1347
|
+
const pluginWizard = opts.pluginWizard ? { ...opts.pluginWizard, mission: text,
|
|
1348
|
+
root: opts.pluginWizard.root ?? opts.compositionRoot ?? COMPOSITION_ROOT } : undefined;
|
|
1349
|
+
const selected = (pluginWizard !== undefined || (opts.composeGraph ?? (process.env.ELANOUS_MISSION_GRAPH_COMPOSE === '1')))
|
|
1339
1350
|
? await selectTaskComposition(completion, opts.compositionRoot ?? COMPOSITION_ROOT,
|
|
1340
1351
|
{ text, ledgerPath: path, cardId: id, callLLM: opts.composeCallLLM,
|
|
1352
|
+
...(pluginWizard ? { pluginWizard, pluginWizardDeps: opts.pluginWizardDeps } : {}),
|
|
1341
1353
|
onPersist: persist => { persistComposition = persist; } })
|
|
1342
1354
|
: selectTaskComposition(completion, opts.compositionRoot);
|
|
1343
1355
|
// 2판 — launcher 'graph-run' 조합(단위 해석까지 완료)은 실제 graph run 으로 발사한다. 더 이상 거부하지 않는다.
|
|
@@ -1604,11 +1616,12 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1604
1616
|
reason: knowhow.reason, repoPath: knowhowRepo, repoRevision,
|
|
1605
1617
|
repoSource: project ? 'project' : configuredRepo ? 'harness.defaultRepo' : 'package' }); } catch { /* fail-soft */ }
|
|
1606
1618
|
}
|
|
1607
|
-
// LAUNCH-SINGLE-DOOR
|
|
1608
|
-
//
|
|
1619
|
+
// LAUNCH-SINGLE-DOOR — hand 재시도는 새 카드/시도이므로 문면만으로 만든 영구 requestId 를 재사용하지 않는다.
|
|
1620
|
+
// 실제 실행 중인 같은 골은 자식 harness 의 active-run gate 가 막는다. 부모 영수증은 그 자식에 한 번 상속한다.
|
|
1609
1621
|
const launchDoor = opts.launchRequestDoor
|
|
1610
1622
|
?? (process.env.NODE_ENV === 'test' ? undefined : openLaunchRequestDoor({ source: 'hand' }));
|
|
1611
|
-
const
|
|
1623
|
+
const launchAttemptKey = `${card.id}\n${card.createdAt}\n${randomBytes(12).toString('hex')}\n${card.text}`;
|
|
1624
|
+
const launchDoorRequestId = launchDoor?.requestId(launchAttemptKey);
|
|
1612
1625
|
let inheritedLaunchDoorReceipt: string | undefined;
|
|
1613
1626
|
if (launchDoor !== undefined && launchDoorRequestId !== undefined) {
|
|
1614
1627
|
const doorConsumption = launchDoor.consume(launchDoorRequestId);
|
|
@@ -1617,7 +1630,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1617
1630
|
const refused: TaskCard = { ...card, history: [...card.history, { at, event: LAUNCH_REFUSED_DUPLICATE_EVENT, detail: doorConsumption.reason }] };
|
|
1618
1631
|
writeCard(path, refused);
|
|
1619
1632
|
try { debug.log('task-agent', 'launch-refused-duplicate', { taskId: id, requestId: launchDoorRequestId, reason: doorConsumption.reason }); } catch { /* fail-soft */ }
|
|
1620
|
-
return { card: refused, move, mode, launched: false, ...(project ? { cwd: project.target } : {}) };
|
|
1633
|
+
return { card: refused, move, mode, launched: false, reason: `${LAUNCH_REFUSED_DUPLICATE_EVENT}: ${doorConsumption.reason}`, ...(project ? { cwd: project.target } : {}) };
|
|
1621
1634
|
}
|
|
1622
1635
|
// 소비 영수증을 자식 say 에 물려줘 그 문을 다시 두드리지 않게 한다(한 번만 상속).
|
|
1623
1636
|
inheritedLaunchDoorReceipt = doorConsumption.status === 'consumed' ? launchDoorRequestId : undefined;
|
|
@@ -32,6 +32,8 @@ import {
|
|
|
32
32
|
type AcceptanceReport,
|
|
33
33
|
} from './acceptance.js';
|
|
34
34
|
import { recordOpsEventSafe, type OpsEventInput } from '../domains/ops-log.js';
|
|
35
|
+
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
36
|
+
import { collectLinearCaptureArtifacts } from './linear-capture-events.js';
|
|
35
37
|
import { defaultAnomalyCluster, extractContainerExit, type AnomalyCluster } from '../loops/orchestrator/anomaly-cluster.js';
|
|
36
38
|
|
|
37
39
|
// ───────────────────────── Concurrency caps ────────────────────────
|
|
@@ -309,7 +311,18 @@ export class TaskDispatcher {
|
|
|
309
311
|
const kind = task.surface.kind;
|
|
310
312
|
let savedExecution = false;
|
|
311
313
|
try {
|
|
312
|
-
const
|
|
314
|
+
const completedExecution = { ...await res.promise, id: res.executionId };
|
|
315
|
+
// The run identity is taken from this dispatcher process, never from child-reported execution output.
|
|
316
|
+
const runId = getHarnessRunId();
|
|
317
|
+
let captureArtifacts: TaskExecution['captureArtifacts'] = [];
|
|
318
|
+
if (runId) {
|
|
319
|
+
try {
|
|
320
|
+
captureArtifacts = collectLinearCaptureArtifacts({ runId, startedAt: completedExecution.startedAt,
|
|
321
|
+
endedAt: completedExecution.endedAt ?? this.now() });
|
|
322
|
+
} catch { /* Capture observation is optional; an unavailable log store must not block task completion. */ }
|
|
323
|
+
}
|
|
324
|
+
const exec: TaskExecution = { ...completedExecution, runId: runId || undefined,
|
|
325
|
+
captureArtifacts: captureArtifacts.length ? captureArtifacts : undefined };
|
|
313
326
|
// Keep the task row and execution in the same store read by GET /v1/tasks/:id.
|
|
314
327
|
this.opts.store?.saveTask(this.opts.graph.getTask(task.id)!);
|
|
315
328
|
this.opts.store?.saveExecution(exec);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { LogStore, logsDbPath, type LogStoreRow } from '../mss/logging/log-store.js';
|
|
3
|
+
import type { TaskCaptureArtifact } from './types.js';
|
|
4
|
+
|
|
5
|
+
export interface LinearCaptureEventWindow { runId: string; startedAt: number; endedAt: number }
|
|
6
|
+
export type LinearCaptureEventStore = Pick<LogStore, 'queryByDataKeys' | 'close'>;
|
|
7
|
+
|
|
8
|
+
function parseCaptureEvent(row: LogStoreRow, expectedRunId: string): TaskCaptureArtifact | undefined {
|
|
9
|
+
if (row.event !== 'executed' || !row.data) return undefined;
|
|
10
|
+
let data: Record<string, unknown>;
|
|
11
|
+
try {
|
|
12
|
+
const parsed: unknown = JSON.parse(row.data);
|
|
13
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return undefined;
|
|
14
|
+
data = parsed as Record<string, unknown>;
|
|
15
|
+
} catch { return undefined; }
|
|
16
|
+
if (data.action !== 'read' || data.mode !== 'screenshot' || data.ok !== true || data.captureOutcome !== 'saved') return undefined;
|
|
17
|
+
const capture = data.capture;
|
|
18
|
+
if (!capture || typeof capture !== 'object' || Array.isArray(capture)) return undefined;
|
|
19
|
+
const descriptor = capture as Record<string, unknown>;
|
|
20
|
+
if (typeof descriptor.path !== 'string' || !descriptor.path || typeof descriptor.mimeType !== 'string' ||
|
|
21
|
+
descriptor.runId !== expectedRunId || typeof descriptor.linearIssueId !== 'string' || !descriptor.linearIssueId ||
|
|
22
|
+
descriptor.externalShare !== true || typeof descriptor.sensitivity !== 'string' ||
|
|
23
|
+
typeof descriptor.createdAt !== 'number' || !Number.isFinite(descriptor.createdAt)) return undefined;
|
|
24
|
+
return {
|
|
25
|
+
path: descriptor.path,
|
|
26
|
+
mimeType: descriptor.mimeType,
|
|
27
|
+
runId: expectedRunId,
|
|
28
|
+
linearIssueId: descriptor.linearIssueId,
|
|
29
|
+
externalShare: true,
|
|
30
|
+
sensitivity: descriptor.sensitivity,
|
|
31
|
+
createdAt: descriptor.createdAt,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Read only approved browser screenshot events emitted during this exact TOX execution. */
|
|
36
|
+
export function collectLinearCaptureArtifacts(window: LinearCaptureEventWindow, deps: {
|
|
37
|
+
dbPath?: string;
|
|
38
|
+
openStore?: (path: string) => LinearCaptureEventStore;
|
|
39
|
+
} = {}): TaskCaptureArtifact[] {
|
|
40
|
+
const runId = window.runId.trim();
|
|
41
|
+
if (!runId || !Number.isFinite(window.startedAt) || !Number.isFinite(window.endedAt) || window.endedAt < window.startedAt) return [];
|
|
42
|
+
const path = deps.dbPath ?? logsDbPath();
|
|
43
|
+
if (!existsSync(path)) return [];
|
|
44
|
+
const store = (deps.openStore ?? LogStore.openReadOnly)(path);
|
|
45
|
+
try {
|
|
46
|
+
const rows = store.queryByDataKeys({ exactCategories: ['harness.browser-action'], runIds: [runId] });
|
|
47
|
+
const found = new Map<string, TaskCaptureArtifact>();
|
|
48
|
+
for (const row of rows) {
|
|
49
|
+
if (row.ts_ms < window.startedAt || row.ts_ms > window.endedAt) continue;
|
|
50
|
+
const capture = parseCaptureEvent(row, runId);
|
|
51
|
+
if (capture) found.set(capture.path, capture);
|
|
52
|
+
}
|
|
53
|
+
return [...found.values()].sort((a, b) => a.createdAt - b.createdAt || a.path.localeCompare(b.path));
|
|
54
|
+
} finally { store.close(); }
|
|
55
|
+
}
|
|
@@ -56,7 +56,8 @@ import type {
|
|
|
56
56
|
// v3 (Mission Fabric 통합 U1 · 2026-07-09) — tox_missions.autopilot_json
|
|
57
57
|
// (PFC Layer2 자율 메타 흡수 · apm Mission 병렬 table 제거 준비)
|
|
58
58
|
// v4 — external task identity and approval
|
|
59
|
-
|
|
59
|
+
// v5 — run-scoped browser capture artifacts on executions
|
|
60
|
+
export const TOX_SCHEMA_VERSION = 5;
|
|
60
61
|
|
|
61
62
|
// ─────────────────────── Row shapes ────────────────────────────────
|
|
62
63
|
|
|
@@ -114,6 +115,8 @@ interface ExecutionRow {
|
|
|
114
115
|
model_id: string | null;
|
|
115
116
|
host_id: string | null;
|
|
116
117
|
hostname: string | null;
|
|
118
|
+
run_id: string | null;
|
|
119
|
+
capture_artifacts_json: string | null;
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
interface EventRow {
|
|
@@ -262,7 +265,9 @@ export class TaskStore {
|
|
|
262
265
|
token_input INTEGER,
|
|
263
266
|
token_output INTEGER,
|
|
264
267
|
cost_usd REAL,
|
|
265
|
-
model_id TEXT
|
|
268
|
+
model_id TEXT,
|
|
269
|
+
run_id TEXT,
|
|
270
|
+
capture_artifacts_json TEXT
|
|
266
271
|
);
|
|
267
272
|
|
|
268
273
|
CREATE TABLE IF NOT EXISTS tox_events (
|
|
@@ -314,6 +319,8 @@ export class TaskStore {
|
|
|
314
319
|
this.db.exec('CREATE INDEX IF NOT EXISTS idx_tox_missions_project ON tox_missions(project_id)');
|
|
315
320
|
this.addColumnIfMissing('tox_executions', 'host_id', 'TEXT');
|
|
316
321
|
this.addColumnIfMissing('tox_executions', 'hostname', 'TEXT');
|
|
322
|
+
this.addColumnIfMissing('tox_executions', 'run_id', 'TEXT');
|
|
323
|
+
this.addColumnIfMissing('tox_executions', 'capture_artifacts_json', 'TEXT');
|
|
317
324
|
this.db.exec('CREATE INDEX IF NOT EXISTS idx_tox_executions_host ON tox_executions(host_id, started_at)');
|
|
318
325
|
this.addColumnIfMissing('tox_tasks', 'approval_json', 'TEXT');
|
|
319
326
|
this.addColumnIfMissing('tox_tasks', 'external_provider', 'TEXT');
|
|
@@ -477,8 +484,8 @@ export class TaskStore {
|
|
|
477
484
|
`INSERT OR REPLACE INTO tox_executions (
|
|
478
485
|
id, task_id, started_at, ended_at, duration_ms, status, surface_json,
|
|
479
486
|
surface_address, output, output_path, error_json, token_input,
|
|
480
|
-
token_output, cost_usd, model_id, host_id, hostname
|
|
481
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
487
|
+
token_output, cost_usd, model_id, host_id, hostname, run_id, capture_artifacts_json
|
|
488
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
482
489
|
)
|
|
483
490
|
.run(
|
|
484
491
|
exec.id,
|
|
@@ -497,7 +504,9 @@ export class TaskStore {
|
|
|
497
504
|
exec.costUsd ?? null,
|
|
498
505
|
exec.modelId ?? null,
|
|
499
506
|
hostId ?? null,
|
|
500
|
-
hostname ?? null
|
|
507
|
+
hostname ?? null,
|
|
508
|
+
exec.runId ?? null,
|
|
509
|
+
exec.captureArtifacts ? JSON.stringify(exec.captureArtifacts) : null
|
|
501
510
|
));
|
|
502
511
|
}
|
|
503
512
|
|
|
@@ -769,6 +778,8 @@ export class TaskStore {
|
|
|
769
778
|
modelId: row.model_id ?? undefined,
|
|
770
779
|
...(row.host_id !== null ? { hostId: row.host_id } : {}),
|
|
771
780
|
...(row.hostname !== null ? { hostname: row.hostname } : {}),
|
|
781
|
+
...(row.run_id !== null ? { runId: row.run_id } : {}),
|
|
782
|
+
...(row.capture_artifacts_json ? { captureArtifacts: JSON.parse(row.capture_artifacts_json) as TaskExecution['captureArtifacts'] } : {}),
|
|
772
783
|
};
|
|
773
784
|
}
|
|
774
785
|
}
|
|
@@ -102,6 +102,10 @@ export function podNoResultDiagnostic(ledger: string): string | null {
|
|
|
102
102
|
try {
|
|
103
103
|
const entry = JSON.parse(line) as { event?: unknown; data?: Record<string, unknown> };
|
|
104
104
|
if (!entry || typeof entry !== 'object' || !entry.data || typeof entry.data !== 'object' || typeof entry.event !== 'string' || entry.event === 'pod-ledger-incomplete') continue;
|
|
105
|
+
// Route evidence is not a child execution stage. The observer writes the category
|
|
106
|
+
// (`graph.path`) only to the log store; the run ledger keeps the event name
|
|
107
|
+
// (`path-signature`), which may be appended after the child failure.
|
|
108
|
+
if (entry.event === 'graph.path' || entry.event === 'path-signature') continue;
|
|
105
109
|
if (typeof entry.data.round === 'number' && Number.isSafeInteger(entry.data.round)) round = entry.data.round;
|
|
106
110
|
if (entry.event !== 'run-origin') stage = entry.event;
|
|
107
111
|
// `reviewed` carries pointers only (count + finding ids); the text stays in the review artifact.
|