elanous 0.2.41 → 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/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.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/{6874.d5cf7eb8edb2cabe.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/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.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/{9048.212083de42d25be3.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/3095.dc44586a5f83b86d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.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/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.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/4199.ce86b281fd0a60b7.js +1 -0
- 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/{530.d26346e18089640a.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/4894.fec2ca9e99caefa2.js +1 -0
- 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/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
- 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/5628.6ddb2d5ffba4ff4c.js +309 -0
- package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.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/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
- 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/{5574.f35accf4f132b29d.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/7483.427a2fe2049e388d.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
- 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/{5947-135e26537d80a6b9.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/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
- 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/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.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/923.2034d10ae91e9c20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
- 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/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
- 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-9ee28f7df07428ea.js +1 -0
- 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-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
- 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-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
- 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/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
- 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/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- 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 +24 -25
- 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 +23 -23
- 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 +24 -25
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +24 -25
- 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/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/heal/heal-loop.yaml +1 -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/overlays/stop-heal-ladder.yaml +113 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/units/verbs/recipes.yaml +11 -11
- package/graphs/work/research-report.yaml +10 -2
- 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/heal/run-role.ts +99 -5
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/landing-heal/land-plan.ts +57 -0
- package/scripts/lib/decompose-ab.ts +1 -0
- package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
- package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
- package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
- package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
- package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
- package/scripts/lib/tui-regress-checks.ts +33 -13
- 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-baseline-receipt.ts +47 -9
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +463 -64
- package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
- package/scripts/release-loop/gate-radius-live.ts +97 -13
- package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/preflight.ts +362 -8
- package/scripts/release-loop/resume-release.ts +83 -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/ux-sim.ts +18 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +286 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- 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 +27 -9
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -0
- package/src/agent/registry.ts +2 -0
- package/src/agent/task-notification.ts +25 -5
- package/src/agent/types.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 +63 -4
- 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 +833 -0
- package/src/agent-mission/tool-install.ts +200 -3
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +178 -13
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-turn.ts +211 -53
- package/src/autopilot/pr-manager.ts +69 -10
- package/src/autopilot/pty-control-loop.ts +2 -0
- 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/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- 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/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
- 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 +75 -5
- package/src/cli/pr-land-overlap-evidence.ts +113 -2
- package/src/cli/pr-land-pod-shadow-job.ts +202 -4
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +57 -19
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +13 -5
- 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 +61 -9
- package/src/cli/tui-test-cli.ts +186 -0
- package/src/compact/auto.ts +8 -1
- 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/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- 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 +606 -95
- package/src/core-turn/run-goal-loop.ts +18 -0
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +161 -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 +347 -0
- package/src/dashboard/index.ts +517 -18
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
- package/src/dashboard/mission-cli-consumer.ts +165 -0
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/seat-boot-preamble.ts +171 -1
- package/src/dashboard/side-basic-runtime.ts +54 -1
- package/src/dashboard/sidetab-runtime.ts +90 -1
- package/src/dashboard/skill-catalog-preamble.ts +101 -0
- package/src/dashboard/skill-detection-runtime.ts +55 -15
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/turn-preamble.ts +53 -15
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- 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-cli.ts +23 -7
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/runner.ts +86 -18
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- 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/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-stop.ts +155 -11
- 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 +159 -13
- package/src/instance/spawn-elanous.ts +6 -4
- 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 +168 -9
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +13 -0
- package/src/maturity/feature-maturity.ts +4 -4
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +38 -4
- package/src/nexus/api/harness-traversal.ts +11 -0
- 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 +133 -2
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/release-loop/checklist-target-path-hint.ts +13 -0
- package/src/release-loop/checklist.ts +9 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +136 -16
- package/src/research/bloom-exemplars.ts +3 -1
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/decompose.ts +119 -5
- 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-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +13 -3
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +42 -4
- package/src/self-dev/run-types.ts +4 -0
- 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 +118 -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 +684 -7
- package/src/self-implement/graph-overlay-yaml.ts +37 -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/headless-elanous-driver.ts +31 -2
- package/src/self-implement/heal-intake.ts +112 -4
- package/src/self-implement/heal-triage.ts +20 -0
- package/src/self-implement/host-regate.ts +27 -4
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +365 -25
- package/src/self-implement/regate-detail.ts +38 -1
- package/src/self-implement/rework-child-provider.ts +25 -0
- package/src/self-implement/run-chart.ts +122 -0
- package/src/self-implement/run-ledger.ts +162 -11
- package/src/self-implement/run-stop.ts +188 -4
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/stop-autoheal.ts +13 -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 +40 -4
- 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 +135 -5
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/session-runtime/tier-flip.ts +3 -3
- 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/model.ts +19 -5
- package/src/sidetab-core/visible-agent-mission.ts +262 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +53 -6
- package/src/skills/tools/omni-search.ts +173 -13
- package/src/task-agent/parent-host.ts +10 -0
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +47 -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-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +178 -16
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
- 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/tokens.ts +35 -2
- package/src/tool-hints/gate.ts +1 -0
- package/src/tool-runtime/agent-runtime.ts +2 -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/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui/entry.ts +38 -5
- package/src/tui/sidetab/attach.ts +177 -1
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -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-kubectl.ts +37 -3
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- 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 +93 -0
- package/src/ux-sim/mock-scenario-catalog.ts +274 -0
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/scenario.ts +185 -48
- 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/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/grok.ts +5 -9
- 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/1115.434ae2ecb0ad986d.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
- package/apps/pwa/out/_next/static/chunks/4702.4a4adc1f16d7c93b.js +0 -64
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
- package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +0 -62
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8050-9b364bdef8f71927.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
- package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
|
@@ -245,8 +245,9 @@ const FALLBACK_GENERAL_PURPOSE: AgentDefinition = {
|
|
|
245
245
|
systemPrompt:
|
|
246
246
|
'You are a sub-agent spawned by a parent task. Run the work in the prompt to ' +
|
|
247
247
|
'completion using the tools you have, then return ONE final message containing ' +
|
|
248
|
-
'the deliverable.
|
|
249
|
-
|
|
248
|
+
'the deliverable. The parent provides the available tool catalog; Agent recursion is removed ' +
|
|
249
|
+
'and all calls still pass through the parent dispatcher and its policy checks. ' +
|
|
250
|
+
'Be terse — your output goes back into the parent\'s context.',
|
|
250
251
|
};
|
|
251
252
|
|
|
252
253
|
export interface AgentToolArgs {
|
|
@@ -271,6 +272,10 @@ export interface AgentToolArgs {
|
|
|
271
272
|
* child keeps running; completion emits a task-notification
|
|
272
273
|
* (P2) which the parent sees in the next turn's user message. */
|
|
273
274
|
run_in_background?: boolean;
|
|
275
|
+
/** How a background completion reaches an idle parent TUI. */
|
|
276
|
+
completion_delivery?: 'follow-up' | 'supplement';
|
|
277
|
+
/** Best-effort wall-clock budget for a research child, in minutes. */
|
|
278
|
+
budget_minutes?: number;
|
|
274
279
|
/** When true, a background launch that hits the fan-out ceiling WAITS on
|
|
275
280
|
* the session's shared admission queue instead of being refused: it spawns
|
|
276
281
|
* as soon as a live background agent terminals (subagent waits are
|
|
@@ -349,8 +354,9 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
349
354
|
'Delegate heavy multistep work that would overflow your context, fan out independent units in parallel, ' +
|
|
350
355
|
'and hand off long investigations; use run_in_background for long-running work so you can keep coordinating ' +
|
|
351
356
|
'and finish after the results arrive.\n' +
|
|
357
|
+
'For parallel research, prefer completion_delivery="supplement" and budget_minutes=8: ask each child for its best verified evidence within the budget; late results appear as one chat line without reopening a TUI turn.\n' +
|
|
352
358
|
'\n' +
|
|
353
|
-
'The sub-agent
|
|
359
|
+
'The sub-agent inherits the parent-provided tool catalog by default (Agent recursion is removed) and its own ' +
|
|
354
360
|
'turn budget (default 20). It returns ONE final message which becomes your tool_result. ' +
|
|
355
361
|
'Pass everything the worker needs (data, persona, framing) inside `prompt` — the worker ' +
|
|
356
362
|
'starts with no memory of your conversation.',
|
|
@@ -377,6 +383,17 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
377
383
|
type: 'boolean',
|
|
378
384
|
description: 'When true, returns the spawn handle immediately instead of waiting for completion. The child keeps running; its final message arrives in your next turn as a <task-notification> user message. Use for long-running explorations (multi-minute research, 10+ tool calls) so you can keep working in parallel.',
|
|
379
385
|
},
|
|
386
|
+
completion_delivery: {
|
|
387
|
+
type: 'string',
|
|
388
|
+
enum: ['follow-up', 'supplement'],
|
|
389
|
+
description: 'Background-only routing. supplement adds one concise chat line when the child finishes and never opens a new TUI turn; follow-up keeps default result retrieval.',
|
|
390
|
+
},
|
|
391
|
+
budget_minutes: {
|
|
392
|
+
type: 'number',
|
|
393
|
+
minimum: 1,
|
|
394
|
+
maximum: 60,
|
|
395
|
+
description: 'Background-only best-effort wall-clock research budget. Ask the child to stop researching at this point and return currently verified evidence; default 8 minutes for supplement delivery.',
|
|
396
|
+
},
|
|
380
397
|
wait_for_slot: {
|
|
381
398
|
type: 'boolean',
|
|
382
399
|
description: 'Only meaningful with run_in_background. When the per-session background fan-out ceiling is already full, this launch waits on the shared admission queue instead of being refused, and spawns as soon as one live background agent finishes. Waiting subagent spawns (ones that name a subagent_type) are admitted before general-purpose ones; launches with the same class keep arrival order. Omit it to get the immediate "NOT SPAWNED" refusal and re-issue later.',
|
|
@@ -423,6 +440,8 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
423
440
|
}
|
|
424
441
|
|
|
425
442
|
export interface DispatchAgentOpts {
|
|
443
|
+
/** Owning conversation session, copied to background completion receipts. */
|
|
444
|
+
parentSessionId?: string;
|
|
426
445
|
/** Tools the host makes available — typically the same tool list the
|
|
427
446
|
* parent skill is using, MINUS the Agent tool itself (no recursion).
|
|
428
447
|
* When omitted, the sub-agent runs with no tools (text-only). */
|
|
@@ -439,6 +458,10 @@ export interface DispatchAgentOpts {
|
|
|
439
458
|
dispatch: (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
440
459
|
workingDirectory: string;
|
|
441
460
|
};
|
|
461
|
+
/** Allow the default general-purpose worker to inherit this host's catalog.
|
|
462
|
+
* Opt-in for the TUI's policy-filtered catalog; CLI and MCP keep their
|
|
463
|
+
* agent-definition allowlists unless they explicitly request inheritance. */
|
|
464
|
+
inheritGeneralPurposeToolCatalog?: boolean;
|
|
442
465
|
/** Provider override (test stubs). When omitted, runner picks via
|
|
443
466
|
* agent definition's `model` field or parent default. */
|
|
444
467
|
provider?: LLMProvider;
|
|
@@ -483,6 +506,8 @@ export interface DispatchAgentOpts {
|
|
|
483
506
|
}) => void;
|
|
484
507
|
}
|
|
485
508
|
|
|
509
|
+
const BUILTIN_GENERAL_PURPOSE_DEFAULT_TOOLS = ['Bash', 'Read', 'Edit', 'Grep', 'WebFetch'] as const;
|
|
510
|
+
|
|
486
511
|
export async function dispatchAgent(
|
|
487
512
|
args: Record<string, unknown>,
|
|
488
513
|
opts: DispatchAgentOpts = {},
|
|
@@ -507,6 +532,10 @@ export async function dispatchAgent(
|
|
|
507
532
|
|
|
508
533
|
// PFC-S1 P1: new optional fields.
|
|
509
534
|
const runInBackground = args.run_in_background === true;
|
|
535
|
+
const completionDelivery = args.completion_delivery === 'supplement' ? 'supplement' : 'follow-up';
|
|
536
|
+
const requestedBudgetMinutes = typeof args.budget_minutes === 'number' && Number.isFinite(args.budget_minutes)
|
|
537
|
+
? Math.max(1, Math.min(60, Math.floor(args.budget_minutes)))
|
|
538
|
+
: (completionDelivery === 'supplement' ? 8 : undefined);
|
|
510
539
|
const waitsForSlot = args.wait_for_slot === true;
|
|
511
540
|
const spawnName = typeof args.name === 'string' && args.name.trim() ? args.name.trim() : undefined;
|
|
512
541
|
const teamName = typeof args.team_name === 'string' && args.team_name.trim() ? args.team_name.trim() : undefined;
|
|
@@ -923,9 +952,12 @@ export async function dispatchAgent(
|
|
|
923
952
|
}
|
|
924
953
|
|
|
925
954
|
const hasNoTools = childTools.length === 0;
|
|
926
|
-
const
|
|
955
|
+
const budgetPrompt = runInBackground && completionDelivery === 'supplement' && requestedBudgetMinutes
|
|
956
|
+
? `\n\n[Research time budget: ${requestedBudgetMinutes} minutes]\nReturn the best currently verified evidence within this budget. Do not wait for more sources or extend the research; state remaining uncertainty in the final message.`
|
|
957
|
+
: '';
|
|
958
|
+
const childPrompt = (hasNoTools
|
|
927
959
|
? `${prompt}\n\nNo tools are available; if a request requires reading files or executing commands, report that as unavailable rather than guessing.`
|
|
928
|
-
: prompt;
|
|
960
|
+
: prompt) + budgetPrompt;
|
|
929
961
|
|
|
930
962
|
debug.log('agent.spawn', 'dispatch', {
|
|
931
963
|
cid: debugCorrelationId,
|
|
@@ -935,14 +967,28 @@ export async function dispatchAgent(
|
|
|
935
967
|
promptChars: childPrompt.length,
|
|
936
968
|
model: definition.model || '(inherit)',
|
|
937
969
|
maxTurns: requestedMaxTurns,
|
|
970
|
+
...(runInBackground ? { completionDelivery, ...(requestedBudgetMinutes ? { researchBudgetMinutes: requestedBudgetMinutes } : {}) } : {}),
|
|
938
971
|
tools: childTools.map(t => t.name),
|
|
939
972
|
noTools: hasNoTools,
|
|
940
973
|
});
|
|
941
974
|
|
|
975
|
+
// The built-in general-purpose definition's standard CLI allowlist is
|
|
976
|
+
// replaced only for TUI callers that explicitly opt into the already
|
|
977
|
+
// policy-filtered TUI catalog. MCP/CLI and user/project definitions keep
|
|
978
|
+
// their own allowlists.
|
|
979
|
+
const isBuiltinGeneralPurposeDefault = definition.name === 'general-purpose'
|
|
980
|
+
&& definition.source === 'builtin'
|
|
981
|
+
&& definition.tools?.length === BUILTIN_GENERAL_PURPOSE_DEFAULT_TOOLS.length
|
|
982
|
+
&& BUILTIN_GENERAL_PURPOSE_DEFAULT_TOOLS.every((name, index) => definition.tools?.[index] === name);
|
|
983
|
+
const spawnDefinition = opts.inheritGeneralPurposeToolCatalog === true && isBuiltinGeneralPurposeDefault
|
|
984
|
+
? { ...definition, tools: childTools.map(tool => tool.name) }
|
|
985
|
+
: definition;
|
|
986
|
+
|
|
942
987
|
const startedAt = Date.now();
|
|
943
988
|
const handle = globalAgentRegistry.spawn({
|
|
944
|
-
definition,
|
|
989
|
+
definition: spawnDefinition,
|
|
945
990
|
prompt: childPrompt,
|
|
991
|
+
...(opts.parentSessionId ? { parentSessionId: opts.parentSessionId } : {}),
|
|
946
992
|
label: spawnName ?? description, // PFC-S1 P1: explicit `name`
|
|
947
993
|
// wins, else fall back to the task label
|
|
948
994
|
// (kept for existing callers).
|
|
@@ -963,6 +1009,7 @@ export async function dispatchAgent(
|
|
|
963
1009
|
...(teamName ? { teamName } : {}),
|
|
964
1010
|
...(childCwd ? { cwd: childCwd } : {}),
|
|
965
1011
|
...(runInBackground ? { background: true } : {}),
|
|
1012
|
+
...(runInBackground ? { completionDelivery } : {}),
|
|
966
1013
|
});
|
|
967
1014
|
|
|
968
1015
|
// Terminal release for this dispatch's reserved fan-out slot: the
|
|
@@ -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,16 +75,133 @@ export function buildOmniSearchTool(): LLMToolSpec {
|
|
|
73
75
|
};
|
|
74
76
|
}
|
|
75
77
|
|
|
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[]>>();
|
|
82
|
+
|
|
76
83
|
export async function dispatchOmniSearch(
|
|
77
84
|
rawArgs: Record<string, unknown>,
|
|
78
85
|
opts: OmniSearchDispatchOpts = {},
|
|
79
86
|
): Promise<OmniSearchResult> {
|
|
80
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);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function dispatchResearchOmniSearch(
|
|
97
|
+
rawArgs: Record<string, unknown>,
|
|
98
|
+
opts: OmniSearchDispatchOpts = {},
|
|
99
|
+
): Promise<OmniSearchResult> {
|
|
100
|
+
const args = validate(rawArgs);
|
|
101
|
+
const now = opts.now ?? Date.now;
|
|
102
|
+
const deadlineAt = now() + RESEARCH_SEARCH_BUDGET_MS;
|
|
103
|
+
const selected = getAvailableResearchProviders();
|
|
104
|
+
const requested = args.engines === undefined ? undefined : new Set(args.engines.map(id => id.toLowerCase()));
|
|
105
|
+
const providers = requested === undefined
|
|
106
|
+
? selected
|
|
107
|
+
: selected.filter(provider => requested.has(provider.id.toLowerCase()));
|
|
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;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async function dispatchWithProviders(
|
|
195
|
+
args: OmniSearchArgs,
|
|
196
|
+
opts: OmniSearchDispatchOpts,
|
|
197
|
+
selectedProviders?: ReturnType<typeof getAvailableWebSearchProviders>,
|
|
198
|
+
researchLimits?: { deadlineAt: number; now: () => number },
|
|
199
|
+
): Promise<OmniSearchResult> {
|
|
81
200
|
const merge = args.merge ?? 'interleave';
|
|
82
201
|
const limit = Math.max(1, Math.min(args.limit ?? DEFAULT_LIMIT, MAX_LIMIT));
|
|
83
202
|
|
|
84
|
-
let providers = getAvailableWebSearchProviders();
|
|
85
|
-
if (args.engines && args.engines.length > 0) {
|
|
203
|
+
let providers = selectedProviders ?? getAvailableWebSearchProviders();
|
|
204
|
+
if (!selectedProviders && args.engines && args.engines.length > 0) {
|
|
86
205
|
const wanted = new Set(args.engines.map(e => e.toLowerCase()));
|
|
87
206
|
providers = providers.filter(p => wanted.has(p.id.toLowerCase()));
|
|
88
207
|
}
|
|
@@ -105,13 +224,38 @@ export async function dispatchOmniSearch(
|
|
|
105
224
|
const start = Date.now();
|
|
106
225
|
emit({ engine: p.id, phase: 'start' });
|
|
107
226
|
try {
|
|
108
|
-
const
|
|
227
|
+
const query = {
|
|
109
228
|
query: args.query,
|
|
110
229
|
limit,
|
|
111
230
|
allowDomains: args.allow_domains,
|
|
112
231
|
blockDomains: args.block_domains,
|
|
113
232
|
recencyDays: args.recency_days,
|
|
114
|
-
}
|
|
233
|
+
};
|
|
234
|
+
let result;
|
|
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');
|
|
241
|
+
const controller = new AbortController();
|
|
242
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
243
|
+
try {
|
|
244
|
+
result = await Promise.race([
|
|
245
|
+
p.search(query, controller.signal),
|
|
246
|
+
new Promise<never>((_, reject) => {
|
|
247
|
+
timer = setTimeout(() => {
|
|
248
|
+
controller.abort();
|
|
249
|
+
reject(new DOMException(`Research search timed out after ${timeoutMs}ms`, 'TimeoutError'));
|
|
250
|
+
}, timeoutMs);
|
|
251
|
+
}),
|
|
252
|
+
]);
|
|
253
|
+
} finally {
|
|
254
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
255
|
+
}
|
|
256
|
+
} else {
|
|
257
|
+
result = await p.search(query);
|
|
258
|
+
}
|
|
115
259
|
perEngine[p.id] = { hits: result.hits, durationMs: Date.now() - start };
|
|
116
260
|
for (const hit of result.hits) {
|
|
117
261
|
try {
|
|
@@ -153,7 +297,7 @@ export async function dispatchOmniSearch(
|
|
|
153
297
|
for (const h of merged) lines.push(formatHit(h));
|
|
154
298
|
}
|
|
155
299
|
|
|
156
|
-
|
|
300
|
+
const result: OmniSearchResult = {
|
|
157
301
|
output: lines.join('\n'),
|
|
158
302
|
metadata: {
|
|
159
303
|
perEngine: Object.fromEntries(Object.entries(perEngine).map(([k, v]) => [k, {
|
|
@@ -163,11 +307,27 @@ export async function dispatchOmniSearch(
|
|
|
163
307
|
merge,
|
|
164
308
|
},
|
|
165
309
|
};
|
|
310
|
+
researchHits.set(result, Object.fromEntries(Object.entries(perEngine).map(([id, info]) => [id, info.hits])));
|
|
311
|
+
return result;
|
|
166
312
|
}
|
|
167
313
|
|
|
168
|
-
/** Probe-compatible: at least 2
|
|
314
|
+
/** Probe-compatible: at least 2 Exa/Firecrawl providers available for omni_search. */
|
|
169
315
|
export function omniSearchAvailable(): boolean {
|
|
170
|
-
return
|
|
316
|
+
return getAvailableResearchProviders().length >= 2;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/** Research-only probe: require one bounded Exa/Firecrawl web route. */
|
|
320
|
+
export function researchOmniSearchAvailable(): boolean {
|
|
321
|
+
return getAvailableResearchProviders().some(provider => RESEARCH_WEB_FALLBACK_IDS.includes(provider.id));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export function getAvailableResearchSearchEngineIds(): string[] {
|
|
325
|
+
return getAvailableResearchProviders().map(provider => provider.id);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function getAvailableResearchProviders(): ReturnType<typeof getAvailableWebSearchProviders> {
|
|
329
|
+
const available = getAvailableResearchWebSearchProviders();
|
|
330
|
+
return RESEARCH_WEB_FALLBACK_IDS.flatMap(id => available.filter(provider => provider.id === id));
|
|
171
331
|
}
|
|
172
332
|
|
|
173
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';
|
|
@@ -29,10 +30,12 @@ import { checkCompletionEvidence, deliverableReceiptEvidence } from './completio
|
|
|
29
30
|
import { judgeNextMove } from './judge.js';
|
|
30
31
|
import { checklistDevVersion, listChecklist } from '../release-loop/checklist.js';
|
|
31
32
|
import { loadRunLedger, runLedgerDir } from '../self-implement/run-ledger.js';
|
|
33
|
+
import { POD_DISTRIBUTOR_ENTRY_ENV, TASK_HAND_POD_DISTRIBUTOR_ENTRY } from './pod-distributor-entry.js';
|
|
32
34
|
// Keep doctor-visit recording synchronous: updateTaskCard callers observe it before the transition returns.
|
|
33
35
|
import { recordTaskAgentNeedsOwnerVisit } from '../self-implement/doctor-visit.js';
|
|
34
36
|
import { applyRunIdentityTag, applyRunIdentityTags, deriveBirthIdentity, parseRunIdentityTag, runIdentityFieldText, runIdentityQueuePriority, runPriorityClass, validateRunIdentity, type RunIdentity, type RunIdentityCell, type RunIdentityOrigin } from './run-identity.js';
|
|
35
37
|
import { parseWorkOrder, renderWorkOrderGoal, WORK_ORDER_FILE_PATTERN, type WorkOrder } from './work-order.js';
|
|
38
|
+
import { recordCoordinatorShadowDispatch, resolveCoordinatorShadowRoot } from '../loops/orchestrator/coordinator-shadow.js';
|
|
36
39
|
import { inspectPrelaunchAlreadyDone, type AlreadyDoneDecision, type AlreadyDoneCandidate,
|
|
37
40
|
type PrelaunchGitRunnerForTest } from './prelaunch-already-done.js';
|
|
38
41
|
import { draftClaimComment, draftClaimRecordLive, draftClaimState, draftReleaseComment } from '../self-dev/draft-triage-rules.js';
|
|
@@ -190,15 +193,19 @@ export const COMPOSITION_ROOT = join(dirname(fileURLToPath(import.meta.url)), '.
|
|
|
190
193
|
export function selectTaskComposition(completion: CompletionKind, root?: string): CompositionSelection;
|
|
191
194
|
export function selectTaskComposition(completion: CompletionKind, root: string, mission: {
|
|
192
195
|
text: string; ledgerPath: string; cardId: string; callLLM?: GraphWizardDeps['callLLM']; onPersist?: (persist: () => void) => void;
|
|
196
|
+
pluginWizard?: PluginWizardInput; pluginWizardDeps?: PluginWizardDeps;
|
|
193
197
|
}): Promise<CompositionSelection>;
|
|
194
198
|
export function selectTaskComposition(completion: CompletionKind, root = COMPOSITION_ROOT, mission?: {
|
|
195
199
|
text: string; ledgerPath: string; cardId: string; callLLM?: GraphWizardDeps['callLLM']; onPersist?: (persist: () => void) => void;
|
|
200
|
+
pluginWizard?: PluginWizardInput; pluginWizardDeps?: PluginWizardDeps;
|
|
196
201
|
}): CompositionSelection | Promise<CompositionSelection> {
|
|
197
202
|
if (mission) {
|
|
198
203
|
const standard = selectTaskComposition(completion, root);
|
|
199
204
|
return import('../graph-wizard/mission-compose.js').then(async ({ composeMissionGraph }) => {
|
|
200
205
|
const result = await composeMissionGraph({ text: mission.text, completion, root, ledgerPath: mission.ledgerPath,
|
|
201
|
-
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 } : {}) });
|
|
202
209
|
mission.onPersist?.(result.persist);
|
|
203
210
|
return result.selection;
|
|
204
211
|
});
|
|
@@ -1089,6 +1096,10 @@ export type TaskLauncher = (args: string[], cwd?: string, context?: TaskLaunchCo
|
|
|
1089
1096
|
export interface HandTaskOptions {
|
|
1090
1097
|
text: string;
|
|
1091
1098
|
seat?: TaskSeat;
|
|
1099
|
+
/** Validated order parsed by the CLI; its canonical rendering is used only for shadow evidence. */
|
|
1100
|
+
workOrder?: WorkOrder;
|
|
1101
|
+
/** Repository root for shadow dispatch evidence; production defaults to the invoking repository. */
|
|
1102
|
+
coordinatorShadowRoot?: string;
|
|
1092
1103
|
checklistId?: string;
|
|
1093
1104
|
completion?: TaskCard['completion'];
|
|
1094
1105
|
/** `--project <id> --target <dir>` — target 은 존재 확인 뒤 절대 경로로 바꿔 싣는다. */
|
|
@@ -1129,6 +1140,10 @@ export interface HandTaskOptions {
|
|
|
1129
1140
|
composeGraph?: boolean;
|
|
1130
1141
|
/** Injectable LLM boundary for isolated composition tests. */
|
|
1131
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;
|
|
1132
1147
|
/** `--live` 일 때만 불린다. */
|
|
1133
1148
|
launcher?: TaskLauncher;
|
|
1134
1149
|
/**
|
|
@@ -1183,7 +1198,7 @@ export class TaskLaunchError extends Error {
|
|
|
1183
1198
|
}
|
|
1184
1199
|
}
|
|
1185
1200
|
|
|
1186
|
-
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 }
|
|
1187
1202
|
|
|
1188
1203
|
/** Dispatch evidence for a handed deliverable card; unlike handTask, this never launches work. */
|
|
1189
1204
|
export function dispatchDeliverableCompletion(id: string, input: { ref: string; receipt?: boolean }, path: string, now: () => Date = () => new Date()): boolean {
|
|
@@ -1329,9 +1344,12 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1329
1344
|
})
|
|
1330
1345
|
: undefined;
|
|
1331
1346
|
let persistComposition: (() => void) | undefined;
|
|
1332
|
-
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')))
|
|
1333
1350
|
? await selectTaskComposition(completion, opts.compositionRoot ?? COMPOSITION_ROOT,
|
|
1334
1351
|
{ text, ledgerPath: path, cardId: id, callLLM: opts.composeCallLLM,
|
|
1352
|
+
...(pluginWizard ? { pluginWizard, pluginWizardDeps: opts.pluginWizardDeps } : {}),
|
|
1335
1353
|
onPersist: persist => { persistComposition = persist; } })
|
|
1336
1354
|
: selectTaskComposition(completion, opts.compositionRoot);
|
|
1337
1355
|
// 2판 — launcher 'graph-run' 조합(단위 해석까지 완료)은 실제 graph run 으로 발사한다. 더 이상 거부하지 않는다.
|
|
@@ -1598,11 +1616,12 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1598
1616
|
reason: knowhow.reason, repoPath: knowhowRepo, repoRevision,
|
|
1599
1617
|
repoSource: project ? 'project' : configuredRepo ? 'harness.defaultRepo' : 'package' }); } catch { /* fail-soft */ }
|
|
1600
1618
|
}
|
|
1601
|
-
// LAUNCH-SINGLE-DOOR
|
|
1602
|
-
//
|
|
1619
|
+
// LAUNCH-SINGLE-DOOR — hand 재시도는 새 카드/시도이므로 문면만으로 만든 영구 requestId 를 재사용하지 않는다.
|
|
1620
|
+
// 실제 실행 중인 같은 골은 자식 harness 의 active-run gate 가 막는다. 부모 영수증은 그 자식에 한 번 상속한다.
|
|
1603
1621
|
const launchDoor = opts.launchRequestDoor
|
|
1604
1622
|
?? (process.env.NODE_ENV === 'test' ? undefined : openLaunchRequestDoor({ source: 'hand' }));
|
|
1605
|
-
const
|
|
1623
|
+
const launchAttemptKey = `${card.id}\n${card.createdAt}\n${randomBytes(12).toString('hex')}\n${card.text}`;
|
|
1624
|
+
const launchDoorRequestId = launchDoor?.requestId(launchAttemptKey);
|
|
1606
1625
|
let inheritedLaunchDoorReceipt: string | undefined;
|
|
1607
1626
|
if (launchDoor !== undefined && launchDoorRequestId !== undefined) {
|
|
1608
1627
|
const doorConsumption = launchDoor.consume(launchDoorRequestId);
|
|
@@ -1611,7 +1630,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1611
1630
|
const refused: TaskCard = { ...card, history: [...card.history, { at, event: LAUNCH_REFUSED_DUPLICATE_EVENT, detail: doorConsumption.reason }] };
|
|
1612
1631
|
writeCard(path, refused);
|
|
1613
1632
|
try { debug.log('task-agent', 'launch-refused-duplicate', { taskId: id, requestId: launchDoorRequestId, reason: doorConsumption.reason }); } catch { /* fail-soft */ }
|
|
1614
|
-
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 } : {}) };
|
|
1615
1634
|
}
|
|
1616
1635
|
// 소비 영수증을 자식 say 에 물려줘 그 문을 다시 두드리지 않게 한다(한 번만 상속).
|
|
1617
1636
|
inheritedLaunchDoorReceipt = doorConsumption.status === 'consumed' ? launchDoorRequestId : undefined;
|
|
@@ -1625,6 +1644,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1625
1644
|
...(cardPrNumber(card) ? { ELANOUS_TASK_BOUND_PR: String(cardPrNumber(card)) } : {}),
|
|
1626
1645
|
...(card.checklistId ? { ELANOUS_POD_SLOT_ID: card.checklistId } : {}),
|
|
1627
1646
|
...(card.seat ? { ELANOUS_POD_OWNER_KIND: 'seat', ELANOUS_POD_OWNER_ID: card.seat } : {}),
|
|
1647
|
+
...(podLaunch ? { [POD_DISTRIBUTOR_ENTRY_ENV]: TASK_HAND_POD_DISTRIBUTOR_ENTRY } : {}),
|
|
1628
1648
|
...(card.taLand ? { [TA_LAND_ENV]: '1' } : {}) }, cardLabelContext: taskCardLabelContext(card),
|
|
1629
1649
|
// An omitted card provider uses the established Pod default. Carry the effective value explicitly so
|
|
1630
1650
|
// remote-parent code never has to infer a provider from the serialized CLI argv.
|
|
@@ -1645,6 +1665,26 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1645
1665
|
try { debug.log('task-agent', 'launch-failed', { taskId: id, seat: card.seat ?? null, reason }); } catch { /* fail-soft */ }
|
|
1646
1666
|
throw new TaskLaunchError(failed, reason);
|
|
1647
1667
|
}
|
|
1668
|
+
// Record only an accepted dispatch: failed launcher attempts must not create a three-day retirement signal.
|
|
1669
|
+
if (opts.workOrder !== undefined) {
|
|
1670
|
+
const agent = process.env.ELANOUS_SEAT?.trim() || process.env.AI_AGENT?.trim();
|
|
1671
|
+
if (agent) {
|
|
1672
|
+
try {
|
|
1673
|
+
const directive = createHash('sha256').update(renderWorkOrderGoal(opts.workOrder)).digest('hex');
|
|
1674
|
+
recordCoordinatorShadowDispatch(resolveCoordinatorShadowRoot(opts.coordinatorShadowRoot ?? process.cwd()), {
|
|
1675
|
+
date: (opts.now ?? (() => new Date()))().toISOString().slice(0, 10),
|
|
1676
|
+
agent,
|
|
1677
|
+
...(opts.seat ? { recipient: opts.seat } : {}),
|
|
1678
|
+
cell: opts.workOrder.cellId,
|
|
1679
|
+
directive,
|
|
1680
|
+
});
|
|
1681
|
+
} catch (error) {
|
|
1682
|
+
try { debug.log('task-agent.work-order', 'shadow-dispatch-record-failed', {
|
|
1683
|
+
cellId: opts.workOrder.cellId, reason: error instanceof Error ? error.message : String(error),
|
|
1684
|
+
}, { level: 'warn' }); } catch { /* shadow evidence is fail-soft */ }
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1648
1688
|
const launchedAt = (opts.now ?? (() => new Date()))().toISOString();
|
|
1649
1689
|
const receivedRunId = receipt && typeof receipt.runId === 'string' ? receipt.runId.trim() : '';
|
|
1650
1690
|
// 넘긴 런 id 와 «같은» 영수증만 — 다른 id 면 env 로 넘긴 런과 카드가 어긋난다(묶지 않는다).
|