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
package/src/dashboard/index.ts
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
// layout via the plugin host.
|
|
5
5
|
|
|
6
6
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
7
|
-
import { join } from 'path';
|
|
8
7
|
import { fileURLToPath } from 'node:url';
|
|
9
8
|
import { createRunningBuildStatus } from './running-build-status.js';
|
|
10
9
|
import { reportTuiAbortRequested, reportTuiProgress, reportTuiTurn } from '../pty-shell/tui-run-state.js';
|
|
@@ -165,7 +164,7 @@ function loadLastSelection(): LastSelection | null {
|
|
|
165
164
|
import { getLocalSkills, executeSync } from '../sync.js';
|
|
166
165
|
import { computeDiff } from '../smart.js';
|
|
167
166
|
import { summarizeDiff, isAnalyzerAvailable } from '../grok.js';
|
|
168
|
-
import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, termSize, pad, stripAnsi, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey } from '../tui.js';
|
|
167
|
+
import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, termSize, pad, stripAnsi, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey, setExternalTuiKeyRoute } from '../tui.js';
|
|
169
168
|
import { paintCursor, type CursorState } from '../display/cursor-state.js';
|
|
170
169
|
import type { CursorDecision } from '../display/cursor-owner.js';
|
|
171
170
|
import type { Key, RenderOptions } from '../tui.js';
|
|
@@ -775,6 +774,24 @@ export function getEscAbortRunningCount(
|
|
|
775
774
|
return Math.max(1, registeredRunning);
|
|
776
775
|
}
|
|
777
776
|
}
|
|
777
|
+
|
|
778
|
+
/** The classic dashboard's ACP callbacks use this exact tested mission adapter. */
|
|
779
|
+
export function createDashboardClassicSidetabMissionCallbacks(
|
|
780
|
+
runMission: (agent: 'codex' | 'claude', mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionResult>,
|
|
781
|
+
cancelMission?: (interactionId: string) => Promise<boolean>,
|
|
782
|
+
runMissionPair?: (agent: 'codex' | 'claude', mission: string, parallelMission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionPairResult>,
|
|
783
|
+
handReply?: (input: ClassicSidetabHandReplyInput) => Promise<{ ok: boolean; body: string }>,
|
|
784
|
+
runMissionTrio?: (mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionTrioResult>,
|
|
785
|
+
): ClassicSidetabMissionIntegration {
|
|
786
|
+
return createClassicSidetabMissionIntegration(runMission, cancelMission, runMissionPair, handReply, runMissionTrio);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
/** Bind the classic sidetab runtime to the ACP tool callbacks used by the dashboard. */
|
|
790
|
+
export function createDashboardClassicSidetabMissionAcpBridge(runtime: {
|
|
791
|
+
runMission: (agent: 'codex' | 'claude', mission: string) => Promise<ClassicSidetabMissionResult>;
|
|
792
|
+
}): ClassicSidetabMissionIntegration {
|
|
793
|
+
return createDashboardClassicSidetabMissionCallbacks((agent, mission) => runtime.runMission(agent, mission));
|
|
794
|
+
}
|
|
778
795
|
import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
|
|
779
796
|
import {
|
|
780
797
|
getUserConfig, reloadUserConfig, saveUserConfig,
|
|
@@ -955,7 +972,16 @@ import {
|
|
|
955
972
|
runDashboardScratchExportAction,
|
|
956
973
|
} from './context-menu-action-runtime.js';
|
|
957
974
|
import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
|
|
958
|
-
import { createDashboardSidetabRuntime } from './sidetab-runtime.js';
|
|
975
|
+
import { createDashboardSidetabRuntime, mergeLocalAgentSessions, runDashboardAgentMission } from './sidetab-runtime.js';
|
|
976
|
+
import { CLASSIC_SIDETAB_MISSION_TOOL_NAME, createClassicSidetabMissionIntegration, createClassicSidetabMissionPairSessionRegistry, type ClassicSidetabHandReplyInput, type ClassicSidetabMissionAgent, type ClassicSidetabMissionDispatchContext, type ClassicSidetabMissionIntegration, type ClassicSidetabMissionPairResult, type ClassicSidetabMissionResult, type ClassicSidetabMissionTrioResult } from './classic-sidetab-mission.js';
|
|
977
|
+
import { cancelClassicMissionCli, startClassicMissionCli } from './mission-cli-consumer.js';
|
|
978
|
+
import { enqueueClassicSidetabMissionCompletion } from './classic-sidetab-mission-job.js';
|
|
979
|
+
import { startClassicSidetabMissionPair } from './classic-sidetab-mission-pair.js';
|
|
980
|
+
import { startClassicSidetabMissionTrio } from './classic-sidetab-mission-trio.js';
|
|
981
|
+
import { createDashboardPluginWizardRuntime } from './plugin-wizard-runtime.js';
|
|
982
|
+
import { TUI_PLUGIN_WIZARD_TOOL_NAME } from './plugin-wizard-tool.js';
|
|
983
|
+
import { probeGrokLogin } from '../agent-mission/grok-auth-status.js';
|
|
984
|
+
import { loadSidetabRows } from '../sidetab-core/model.js';
|
|
959
985
|
import { toggleDashboardAssistantRenderState } from './assistant-render-state-runtime.js';
|
|
960
986
|
import { bootDashboardAcpBgSweep } from './acp-bg-sweep-boot.js';
|
|
961
987
|
import { bootDashboardConfigTools } from './config-tools-boot.js';
|
|
@@ -1094,8 +1120,10 @@ import {
|
|
|
1094
1120
|
import { initElementObservability } from '../element-registry/index.js';
|
|
1095
1121
|
import {
|
|
1096
1122
|
createSearchPlannerState,
|
|
1123
|
+
buildSubagentSessionRuntimeToolSpecs,
|
|
1097
1124
|
buildSessionRuntimeToolSpecs,
|
|
1098
1125
|
buildSessionDashboardStatusLines,
|
|
1126
|
+
resolveDynamicSessionNativeToolSpecs,
|
|
1099
1127
|
consumeSessionQuickControl,
|
|
1100
1128
|
createSessionPostureState,
|
|
1101
1129
|
enterSessionControlMode,
|
|
@@ -1165,7 +1193,7 @@ import { userMessagePositions, truncateBeforeNthUser } from '../acp/session-fork
|
|
|
1165
1193
|
import { resolveEscEscRewind } from '../chat/esc-esc-rewind.js';
|
|
1166
1194
|
import { wirePersistence } from '../terminal/session-persistence.js';
|
|
1167
1195
|
import { renderMarkdown as renderMarkdownGlow } from '../markdown-preview.js';
|
|
1168
|
-
import { basename, dirname } from 'path';
|
|
1196
|
+
import { basename, dirname, isAbsolute, join, resolve } from 'path';
|
|
1169
1197
|
import { statSync } from 'fs';
|
|
1170
1198
|
import {
|
|
1171
1199
|
FIGURES, toolHeader, toolResult,
|
|
@@ -7629,7 +7657,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7629
7657
|
try { refreshSkills(skillView); refreshSkillFiles(skillView); } catch { /* missing root fine */ }
|
|
7630
7658
|
// SK2 — a skill the index could not read is a one-line notice with the repair command, never a crash.
|
|
7631
7659
|
try {
|
|
7632
|
-
|
|
7660
|
+
const skillIndexStartedAt = performance.now();
|
|
7661
|
+
const skillIndex = getSkillIndex();
|
|
7662
|
+
debug.log('tui.skill-index', 'startup-ready', {
|
|
7663
|
+
elapsedMs: Math.round((performance.now() - skillIndexStartedAt) * 10) / 10,
|
|
7664
|
+
skillCount: skillIndex.length,
|
|
7665
|
+
});
|
|
7633
7666
|
const problems = skillIndexProblems();
|
|
7634
7667
|
const notice = skillRepairNotice(problems);
|
|
7635
7668
|
if (notice) chatLines.push(C.info(notice));
|
|
@@ -13547,11 +13580,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13547
13580
|
// single line.
|
|
13548
13581
|
type TerminalPopupRequest =
|
|
13549
13582
|
| { kind: 'shell'; cwd: string; command?: string; env?: Record<string, string> }
|
|
13550
|
-
| { kind: 'coding-agent'; brand: 'claude-code' | 'codex' | 'gemini'; cwd: string; extraArgs?: readonly string[] };
|
|
13583
|
+
| { kind: 'coding-agent'; brand: 'claude-code' | 'codex' | 'gemini' | 'grok'; cwd: string; extraArgs?: readonly string[]; env?: Record<string, string>; id?: string };
|
|
13551
13584
|
|
|
13552
13585
|
const openInteractiveTerminalPopup = (req: TerminalPopupRequest): TerminalSession | null => {
|
|
13553
13586
|
const { cols: tc, rows: tr } = termSize();
|
|
13554
13587
|
let spawnedSessionId: string | null = null;
|
|
13588
|
+
let releaseExternalKeyRoute: () => void = () => {};
|
|
13555
13589
|
const sessionLabel = req.kind === 'coding-agent' ? req.brand : 'shell';
|
|
13556
13590
|
|
|
13557
13591
|
if (debug.enabled) {
|
|
@@ -13566,6 +13600,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13566
13600
|
if (terminalModalRouter.current()?.id === s.id) {
|
|
13567
13601
|
terminalModalRouter.set(null);
|
|
13568
13602
|
}
|
|
13603
|
+
releaseExternalKeyRoute();
|
|
13569
13604
|
try { s.modal?.dispose(); } catch { /* ignore */ }
|
|
13570
13605
|
s.modal = null;
|
|
13571
13606
|
chatLines.push(C.muted(` terminal exited: ${s.id}`));
|
|
@@ -13624,6 +13659,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13624
13659
|
if (terminalModalRouter.current()?.id === sid) {
|
|
13625
13660
|
terminalModalRouter.set(null);
|
|
13626
13661
|
}
|
|
13662
|
+
releaseExternalKeyRoute();
|
|
13627
13663
|
try {
|
|
13628
13664
|
if (action === 'minimize') sessionRegistry.detach(sid);
|
|
13629
13665
|
else sessionRegistry.kill(sid);
|
|
@@ -13660,7 +13696,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13660
13696
|
{
|
|
13661
13697
|
brand: req.brand,
|
|
13662
13698
|
cwd: req.cwd,
|
|
13699
|
+
id: req.id,
|
|
13663
13700
|
extraArgs: req.extraArgs ? [...req.extraArgs] : undefined,
|
|
13701
|
+
env: req.env,
|
|
13664
13702
|
onExit: handleExit,
|
|
13665
13703
|
onTitleAction: handleTitleAction,
|
|
13666
13704
|
},
|
|
@@ -13673,6 +13711,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13673
13711
|
const installLabel =
|
|
13674
13712
|
req.brand === 'claude-code' ? 'Claude Code'
|
|
13675
13713
|
: req.brand === 'gemini' ? 'Gemini CLI (@google/gemini-cli)'
|
|
13714
|
+
: req.brand === 'grok' ? 'Grok CLI'
|
|
13676
13715
|
: 'Codex CLI';
|
|
13677
13716
|
chatLines.push(C.muted(
|
|
13678
13717
|
` Install ${installLabel} first, then try again.`,
|
|
@@ -13694,7 +13733,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13694
13733
|
|
|
13695
13734
|
if (session.modal) {
|
|
13696
13735
|
terminalModalRouter.set(session.modal, {
|
|
13697
|
-
onClose: () => { sessionRegistry.detach(session.id); draw(); },
|
|
13736
|
+
onClose: () => { releaseExternalKeyRoute(); sessionRegistry.detach(session.id); draw(); },
|
|
13737
|
+
});
|
|
13738
|
+
releaseExternalKeyRoute = setExternalTuiKeyRoute((key) => {
|
|
13739
|
+
if (terminalModalRouter.current()?.id !== session.id) return false;
|
|
13740
|
+
const result = terminalModalRouter.handleKey(toDashboardKeyEvent(key));
|
|
13741
|
+
if (result === 'closed') draw();
|
|
13742
|
+
return true;
|
|
13698
13743
|
});
|
|
13699
13744
|
if (debug.enabled) {
|
|
13700
13745
|
debug.log('window.terminalModalRouter.set', session.modal.id, {
|
|
@@ -13747,6 +13792,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13747
13792
|
const classicSidetabRuntime = createDashboardSidetabRuntime({
|
|
13748
13793
|
currentSessionId: () => currentChatPersonaSessionId(),
|
|
13749
13794
|
termSize,
|
|
13795
|
+
loadRows: (sessionId) => mergeLocalAgentSessions(loadSidetabRows(false, sessionId), sessionRegistry.list()),
|
|
13750
13796
|
pushModal: (surface) => {
|
|
13751
13797
|
attachSurfaceToWorkspace(surface, currentWorkspaceOwnerId());
|
|
13752
13798
|
const handle = display.pushModal(surface);
|
|
@@ -13782,6 +13828,65 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13782
13828
|
});
|
|
13783
13829
|
},
|
|
13784
13830
|
spawnShell: () => { spawnGlobalTerminalModal(); },
|
|
13831
|
+
spawnAgent: (agent) => {
|
|
13832
|
+
void (async () => {
|
|
13833
|
+
try {
|
|
13834
|
+
const prepared = await prepareClassicSidetabAgentCli(agent);
|
|
13835
|
+
if (!prepared.ready) {
|
|
13836
|
+
chatLines.push(C.warning(` ${prepared.message}`));
|
|
13837
|
+
chatScrollOffset = -1;
|
|
13838
|
+
draw();
|
|
13839
|
+
return;
|
|
13840
|
+
}
|
|
13841
|
+
TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open();
|
|
13842
|
+
} catch {
|
|
13843
|
+
chatLines.push(C.warning(` ${agent}: 설치·로그인 상태를 확인하지 못했습니다`));
|
|
13844
|
+
chatScrollOffset = -1;
|
|
13845
|
+
draw();
|
|
13846
|
+
}
|
|
13847
|
+
})();
|
|
13848
|
+
},
|
|
13849
|
+
runMission: async (agent, mission, requestedOutputPath) => {
|
|
13850
|
+
try {
|
|
13851
|
+
const prepared = await prepareClassicSidetabAgentCli(agent);
|
|
13852
|
+
if (!prepared.ready) return {
|
|
13853
|
+
ok: false, path: requestedOutputPath ?? '', promptReady: false,
|
|
13854
|
+
missionVisible: false, promptReturned: false, completionMarker: false,
|
|
13855
|
+
error: prepared.message,
|
|
13856
|
+
};
|
|
13857
|
+
} catch {
|
|
13858
|
+
return {
|
|
13859
|
+
ok: false, path: requestedOutputPath ?? '', promptReady: false,
|
|
13860
|
+
missionVisible: false, promptReturned: false, completionMarker: false,
|
|
13861
|
+
error: `${agent}: 설치·로그인 상태를 확인하지 못했습니다`,
|
|
13862
|
+
};
|
|
13863
|
+
}
|
|
13864
|
+
return runDashboardAgentMission({
|
|
13865
|
+
agent,
|
|
13866
|
+
requestedOutputPath,
|
|
13867
|
+
open: () => TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open() ?? undefined,
|
|
13868
|
+
modal: (session) => session.modal,
|
|
13869
|
+
outputPath: (session, requestedPath) => requestedPath
|
|
13870
|
+
? (isAbsolute(requestedPath) ? requestedPath : resolve(session.cwd, requestedPath))
|
|
13871
|
+
: join(session.cwd, '.elanous', 'mission-results', `classic-sidetab-${Date.now()}.md`),
|
|
13872
|
+
run: async (session, modal, outputPath) => {
|
|
13873
|
+
const [{ runVisibleAgentMission }, { codexBackend, claudeBackend }] = await Promise.all([
|
|
13874
|
+
import('../sidetab-core/visible-agent-mission.js'),
|
|
13875
|
+
import('../agent-mission/driver.js'),
|
|
13876
|
+
]);
|
|
13877
|
+
const backend = agent === 'codex' ? codexBackend : claudeBackend;
|
|
13878
|
+
return runVisibleAgentMission({
|
|
13879
|
+
pty: modal,
|
|
13880
|
+
mission,
|
|
13881
|
+
outputPath,
|
|
13882
|
+
handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
|
|
13883
|
+
});
|
|
13884
|
+
},
|
|
13885
|
+
close: (session) => {
|
|
13886
|
+
if (terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
|
|
13887
|
+
},
|
|
13888
|
+
});
|
|
13889
|
+
},
|
|
13785
13890
|
detach: (row) => {
|
|
13786
13891
|
if (row?.currentProcess) {
|
|
13787
13892
|
chatLines.push(C.muted(' 현재 classic TUI는 분리할 수 없습니다'));
|
|
@@ -13822,6 +13927,270 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13822
13927
|
},
|
|
13823
13928
|
});
|
|
13824
13929
|
closeClassicSidetabRuntime = () => classicSidetabRuntime.close();
|
|
13930
|
+
const classicMissionPairSessions = createClassicSidetabMissionPairSessionRegistry();
|
|
13931
|
+
const cancelClassicSidetabMission = async (interactionId: string): Promise<boolean> => {
|
|
13932
|
+
const paired = classicMissionPairSessions.cancel(
|
|
13933
|
+
interactionId,
|
|
13934
|
+
(sessionId) => Boolean(sessionRegistry.get(sessionId)),
|
|
13935
|
+
(sessionId) => sessionRegistry.kill(sessionId),
|
|
13936
|
+
);
|
|
13937
|
+
return paired ?? cancelClassicMissionCli(interactionId);
|
|
13938
|
+
};
|
|
13939
|
+
const handReplyTargets = new Map<string, { missionId: string; attemptId: string; agent: 'codex' | 'claude'; token: string; nexusUrl: string; ptyId: string; runId: string }>();
|
|
13940
|
+
const prepareClassicSidetabAgentCli = async (agent: 'codex' | 'claude') => {
|
|
13941
|
+
const [{ prepareAgentCli }, { requestConfirmation }] = await Promise.all([
|
|
13942
|
+
import('../agent-mission/tool-install.js'), import('../hitl/confirm.js'),
|
|
13943
|
+
]);
|
|
13944
|
+
return prepareAgentCli(agent, {
|
|
13945
|
+
onStatus: (line) => {
|
|
13946
|
+
chatLines.push(C.muted(` ${line}`));
|
|
13947
|
+
chatScrollOffset = -1;
|
|
13948
|
+
draw();
|
|
13949
|
+
},
|
|
13950
|
+
confirmInstall: async (prompt) => (await requestConfirmation({
|
|
13951
|
+
prompt,
|
|
13952
|
+
detail: '확인하면 공식 npm 설치 명령을 실행한 뒤 설치 버전과 로그인을 다시 확인합니다.',
|
|
13953
|
+
agentKind: 'agent-cli',
|
|
13954
|
+
onTimeout: () => false,
|
|
13955
|
+
})).answer,
|
|
13956
|
+
});
|
|
13957
|
+
};
|
|
13958
|
+
const pluginWizardPairCompletions = new Map<string, Promise<import('./classic-sidetab-mission-job.js').ClassicSidetabMissionPairCompletionResult>>();
|
|
13959
|
+
const classicSidetabMission = createDashboardClassicSidetabMissionCallbacks(async (agent, mission, context) => {
|
|
13960
|
+
const started = await startClassicMissionCli({
|
|
13961
|
+
agent,
|
|
13962
|
+
prompt: mission,
|
|
13963
|
+
...(context?.linearIssueId ? { linearIssueId: context.linearIssueId } : {}),
|
|
13964
|
+
onInteractionId: (interactionId) => debug.log('classic-sidetab.mission', 'started', {
|
|
13965
|
+
interactionId,
|
|
13966
|
+
toolCallId: context?.callId ?? null,
|
|
13967
|
+
}),
|
|
13968
|
+
}, { prepareAgentCli: prepareClassicSidetabAgentCli });
|
|
13969
|
+
if (!('completion' in started)) return started;
|
|
13970
|
+
const job = started;
|
|
13971
|
+
enqueueClassicSidetabMissionCompletion(job, agent, (notification) => globalTaskNotificationQueue.enqueue(notification));
|
|
13972
|
+
return {
|
|
13973
|
+
ok: true,
|
|
13974
|
+
status: 'running',
|
|
13975
|
+
interactionId: job.interactionId,
|
|
13976
|
+
path: job.path,
|
|
13977
|
+
content: 'Independent sidetab job started; this conversation can continue.',
|
|
13978
|
+
};
|
|
13979
|
+
}, cancelClassicSidetabMission, async (agent, mission, parallelMission, context) => {
|
|
13980
|
+
for (const member of ['codex', 'claude'] as const) {
|
|
13981
|
+
const prepared = await prepareClassicSidetabAgentCli(member);
|
|
13982
|
+
if (!prepared.ready) {
|
|
13983
|
+
const failed = (error: string) => ({ ok: false, status: 'failed' as const, error });
|
|
13984
|
+
return {
|
|
13985
|
+
pairId: 'agent-cli-not-ready',
|
|
13986
|
+
codex: member === 'codex' ? failed(prepared.message) : failed('Pair 실행을 시작하지 않았습니다'),
|
|
13987
|
+
claude: member === 'claude' ? failed(prepared.message) : failed('Pair 실행을 시작하지 않았습니다'),
|
|
13988
|
+
};
|
|
13989
|
+
}
|
|
13990
|
+
}
|
|
13991
|
+
const [{ createMissionLineStore }, { missionChildEnv, renderMissionAgentInstructions, createMissionOutStore }, { effectiveInstanceRoot }, { resolveDaemonEndpoint }] = await Promise.all([
|
|
13992
|
+
import('../agent-mission/mission-line.js'), import('../agent-mission/mission-out.js'),
|
|
13993
|
+
import('../instance/resolve.js'), import('../nexus/daemon-endpoint.js'),
|
|
13994
|
+
]);
|
|
13995
|
+
const stateRoot = effectiveInstanceRoot();
|
|
13996
|
+
const missionStore = createMissionOutStore(stateRoot);
|
|
13997
|
+
const endpoint = (process.env.ELANOUS_NEXUS_URL?.trim() || resolveDaemonEndpoint()?.baseUrl || '').replace(/\/$/, '');
|
|
13998
|
+
const handLines = new Map<string, { attemptId: string; handLine?: ReturnType<ReturnType<typeof createMissionLineStore>['issue']> }>();
|
|
13999
|
+
const spawnVisible = (member: 'codex' | 'claude', missionId: string, attemptId: string) => {
|
|
14000
|
+
const ptyId = crypto.randomUUID();
|
|
14001
|
+
const handLine = endpoint ? createMissionLineStore(stateRoot).issue({
|
|
14002
|
+
missionId, attemptId, agent: member,
|
|
14003
|
+
who: member === 'claude' ? 'Claude' : 'Codex', what: mission.replace(/\s+/g, ' ').trim().slice(0, 180) || 'sidetab mission',
|
|
14004
|
+
runId: ptyId, ptyId,
|
|
14005
|
+
}) : undefined;
|
|
14006
|
+
handLines.set(missionId, { attemptId, handLine });
|
|
14007
|
+
try {
|
|
14008
|
+
const env = handLine && endpoint
|
|
14009
|
+
? Object.fromEntries(Object.entries(missionChildEnv(stateRoot, missionId, process.env, { ...handLine, agent: member, nexusUrl: endpoint, runId: ptyId, ptyId })).filter((entry): entry is [string, string] => typeof entry[1] === 'string'))
|
|
14010
|
+
: undefined;
|
|
14011
|
+
const session = TerminalPopup.agent(member === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).id(ptyId).env(env ?? {}).open();
|
|
14012
|
+
if (session && terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
|
|
14013
|
+
if (session) debug.log('classic-sidetab.mission-pair', 'started', { pairMember: member, interactionId: session.id, toolCallId: context?.callId ?? null });
|
|
14014
|
+
return session;
|
|
14015
|
+
} catch {
|
|
14016
|
+
return null;
|
|
14017
|
+
}
|
|
14018
|
+
};
|
|
14019
|
+
const runVisible = async (member: 'codex' | 'claude', prompt: string, session: TerminalSession | null, missionId?: string): Promise<ClassicSidetabMissionResult> => {
|
|
14020
|
+
const outputPath = session
|
|
14021
|
+
? join(session.cwd, '.elanous', 'mission-results', `classic-pair-${session.id}-${Date.now()}.md.tmp`)
|
|
14022
|
+
: '';
|
|
14023
|
+
if (!session) return { ok: false, status: 'failed', path: outputPath, error: `${member} sidetab PTY could not start` };
|
|
14024
|
+
let missionFinished = false;
|
|
14025
|
+
let askMonitor: Promise<void> | undefined;
|
|
14026
|
+
try {
|
|
14027
|
+
const [{ runVisibleAgentMission }, { codexBackend, claudeBackend }] = await Promise.all([
|
|
14028
|
+
import('../sidetab-core/visible-agent-mission.js'),
|
|
14029
|
+
import('../agent-mission/driver.js'),
|
|
14030
|
+
]);
|
|
14031
|
+
const targetOutputPath = outputPath.slice(0, -4);
|
|
14032
|
+
missionStore.create({ missionId: missionId!, agent: member, prompt, cwd: session.cwd, outputPath, targetOutputPath });
|
|
14033
|
+
const lineIdentity = handLines.get(missionId!);
|
|
14034
|
+
if (lineIdentity?.handLine && endpoint) handReplyTargets.set(missionId!, {
|
|
14035
|
+
missionId: missionId!, attemptId: lineIdentity.attemptId, agent: member,
|
|
14036
|
+
token: lineIdentity.handLine.token, nexusUrl: endpoint, ptyId: session.id, runId: session.id,
|
|
14037
|
+
});
|
|
14038
|
+
const backend = member === 'codex' ? codexBackend : claudeBackend;
|
|
14039
|
+
askMonitor = (async () => {
|
|
14040
|
+
const seen = new Set<number>();
|
|
14041
|
+
while (!missionFinished) {
|
|
14042
|
+
for (const event of missionStore.replies(missionId!).filter((reply) => reply.kind === 'ask' && !seen.has(reply.sequence))) {
|
|
14043
|
+
seen.add(event.sequence);
|
|
14044
|
+
try {
|
|
14045
|
+
globalTaskNotificationQueue.enqueue({
|
|
14046
|
+
taskId: `${missionId}:ask:${event.sequence}`,
|
|
14047
|
+
...(context?.parentSessionId ? { parentSessionId: context.parentSessionId } : {}),
|
|
14048
|
+
agentName: member === 'claude' ? 'Claude Code' : 'Codex',
|
|
14049
|
+
label: 'sidetab mission ask', state: 'done', truncated: false,
|
|
14050
|
+
output: JSON.stringify({
|
|
14051
|
+
missionId, sequence: event.sequence, runId: session.id, ptyId: session.id,
|
|
14052
|
+
actor: member, question: event.text, options: null,
|
|
14053
|
+
defaults: event.defaults ?? '', deadline: event.deadline ?? null,
|
|
14054
|
+
instruction: 'Call HandReply with missionId, replyTo=sequence, actor=agent, runId, kind=answer/correct, and text; correct also needs scope/stop/priority. After the deadline the child uses its default.',
|
|
14055
|
+
}),
|
|
14056
|
+
durationMs: 0, finishedAt: Date.now(),
|
|
14057
|
+
});
|
|
14058
|
+
} catch { /* notification delivery cannot interrupt the PTY mission */ }
|
|
14059
|
+
}
|
|
14060
|
+
await new Promise((resolve) => setTimeout(resolve, 400));
|
|
14061
|
+
}
|
|
14062
|
+
})();
|
|
14063
|
+
const resultPromise = Promise.resolve().then(() => runVisibleAgentMission({
|
|
14064
|
+
pty: {
|
|
14065
|
+
snapshot: () => session.preview.renderForLLM(),
|
|
14066
|
+
write: (bytes) => session.preview.write(bytes),
|
|
14067
|
+
isAlive: () => session.preview.isAlive,
|
|
14068
|
+
},
|
|
14069
|
+
mission: `${renderMissionAgentInstructions(missionId!, stateRoot)}\n\nTask:\n${prompt}`,
|
|
14070
|
+
outputPath,
|
|
14071
|
+
handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
|
|
14072
|
+
}));
|
|
14073
|
+
const result = await resultPromise.finally(() => { missionFinished = true; });
|
|
14074
|
+
await askMonitor;
|
|
14075
|
+
handReplyTargets.delete(missionId!);
|
|
14076
|
+
if (result.ok) await missionStore.complete(missionId!);
|
|
14077
|
+
else await missionStore.finish(missionId!, { status: 'failed', error: result.error ?? 'visible mission failed' });
|
|
14078
|
+
return { ...result, status: result.ok ? 'completed' as const : 'failed' as const, interactionId: missionId };
|
|
14079
|
+
} catch (error) {
|
|
14080
|
+
missionFinished = true;
|
|
14081
|
+
await askMonitor?.catch(() => undefined);
|
|
14082
|
+
if (missionId) handReplyTargets.delete(missionId);
|
|
14083
|
+
if (missionId && missionStore.read(missionId)?.status === 'running') {
|
|
14084
|
+
await missionStore.finish(missionId, { status: 'failed', error: error instanceof Error ? error.message : String(error) }).catch(() => undefined);
|
|
14085
|
+
}
|
|
14086
|
+
return { ok: false, status: 'failed' as const, interactionId: missionId, path: outputPath, error: error instanceof Error ? error.message : String(error) };
|
|
14087
|
+
}
|
|
14088
|
+
};
|
|
14089
|
+
const started = startClassicSidetabMissionPair({
|
|
14090
|
+
agent,
|
|
14091
|
+
mission,
|
|
14092
|
+
parallelMission,
|
|
14093
|
+
context,
|
|
14094
|
+
spawnVisible,
|
|
14095
|
+
runVisible,
|
|
14096
|
+
registry: classicMissionPairSessions,
|
|
14097
|
+
hasSession: (sessionId) => Boolean(sessionRegistry.get(sessionId)),
|
|
14098
|
+
killSession: (sessionId) => sessionRegistry.kill(sessionId),
|
|
14099
|
+
enqueue: (notification) => globalTaskNotificationQueue.enqueue(notification),
|
|
14100
|
+
});
|
|
14101
|
+
if (context?.callId?.startsWith('plugin-wizard:')) {
|
|
14102
|
+
pluginWizardPairCompletions.set(context.callId, started.completion);
|
|
14103
|
+
}
|
|
14104
|
+
void started.completion;
|
|
14105
|
+
return started.result;
|
|
14106
|
+
}, async (input) => {
|
|
14107
|
+
const target = handReplyTargets.get(input.missionId);
|
|
14108
|
+
if (!target) {
|
|
14109
|
+
const [{ effectiveInstanceRoot }, { createMissionOutStore }, { recordHeadlessMissionHandReply }] = await Promise.all([
|
|
14110
|
+
import('../instance/resolve.js'), import('../agent-mission/mission-out.js'), import('../agent-mission/mission-hand-reply.js'),
|
|
14111
|
+
]);
|
|
14112
|
+
const store = createMissionOutStore(effectiveInstanceRoot());
|
|
14113
|
+
const result = await recordHeadlessMissionHandReply(input, store);
|
|
14114
|
+
return { ok: result.ok, body: result.ok ? `Recorded ${input.kind} on headless mission line (record-only; no PTY input).` : result.reason };
|
|
14115
|
+
}
|
|
14116
|
+
const { recordAndDeliverMissionHandReply } = await import('../agent-mission/mission-hand-reply.js');
|
|
14117
|
+
const result = await recordAndDeliverMissionHandReply({ target, ...input });
|
|
14118
|
+
const delivery = result.ok ? result.delivery === 'ask-ledger' ? 'recorded in the mission ledger for a matching ask waiter' : 'delivered through PTY arbiter' : '';
|
|
14119
|
+
return { ok: result.ok, body: result.ok ? `Recorded ${input.kind} and ${delivery} (line ${result.lineId}).` : `${result.reason}; recorded=${result.recorded}, delivered=${result.delivered}${result.lineId ? ` (line ${result.lineId})` : ''}.` };
|
|
14120
|
+
}, async (mission, context) => {
|
|
14121
|
+
const { codexBackend, claudeBackend, grokBackend } = await import('../agent-mission/driver.js');
|
|
14122
|
+
const spawnVisible = (member: ClassicSidetabMissionAgent, missionId: string) => {
|
|
14123
|
+
try {
|
|
14124
|
+
const brand = member === 'claude' ? 'claude-code' : member;
|
|
14125
|
+
const backend = member === 'codex' ? codexBackend : member === 'claude' ? claudeBackend : grokBackend;
|
|
14126
|
+
const session = TerminalPopup.agent(brand).cwd(workingDir.cwd).id(missionId).args(backend.args).open();
|
|
14127
|
+
if (session && terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
|
|
14128
|
+
if (session) debug.log('classic-sidetab.mission-trio', 'started', { member, interactionId: session.id, toolCallId: context?.callId ?? null });
|
|
14129
|
+
return session;
|
|
14130
|
+
} catch (error) {
|
|
14131
|
+
debug.log('classic-sidetab.mission-trio', 'spawn-failed', { member, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
14132
|
+
return null;
|
|
14133
|
+
}
|
|
14134
|
+
};
|
|
14135
|
+
const runVisible = async (member: ClassicSidetabMissionAgent, prompt: string, session: TerminalSession | null, missionId?: string): Promise<ClassicSidetabMissionResult> => {
|
|
14136
|
+
const outputPath = session ? join(session.cwd, '.elanous', 'mission-results', `classic-trio-${member}-${session.id}-${Date.now()}.md.tmp`) : '';
|
|
14137
|
+
if (!session) return { ok: false, status: 'failed', path: outputPath, error: `${member} sidetab PTY could not start` };
|
|
14138
|
+
try {
|
|
14139
|
+
const { runVisibleAgentMission } = await import('../sidetab-core/visible-agent-mission.js');
|
|
14140
|
+
const backend = member === 'codex' ? codexBackend : member === 'claude' ? claudeBackend : grokBackend;
|
|
14141
|
+
const result = await runVisibleAgentMission({
|
|
14142
|
+
pty: { snapshot: () => session.preview.renderForLLM(), write: (bytes) => session.preview.write(bytes), isAlive: () => session.preview.isAlive },
|
|
14143
|
+
mission: prompt,
|
|
14144
|
+
outputPath,
|
|
14145
|
+
handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
|
|
14146
|
+
});
|
|
14147
|
+
return { ...result, status: result.ok ? 'completed' : 'failed', interactionId: missionId, finalScreen: session.preview.renderForLLM() };
|
|
14148
|
+
} catch (error) {
|
|
14149
|
+
return {
|
|
14150
|
+
ok: false,
|
|
14151
|
+
status: 'failed',
|
|
14152
|
+
path: outputPath,
|
|
14153
|
+
interactionId: missionId,
|
|
14154
|
+
error: error instanceof Error ? error.message : String(error),
|
|
14155
|
+
finalScreen: session.preview.renderForLLM(),
|
|
14156
|
+
};
|
|
14157
|
+
}
|
|
14158
|
+
};
|
|
14159
|
+
const started = await startClassicSidetabMissionTrio({
|
|
14160
|
+
mission,
|
|
14161
|
+
context,
|
|
14162
|
+
checkGrokAuth: probeGrokLogin,
|
|
14163
|
+
spawnVisible: (member, missionId) => spawnVisible(member, missionId),
|
|
14164
|
+
runVisible,
|
|
14165
|
+
registry: classicMissionPairSessions,
|
|
14166
|
+
hasSession: (sessionId) => Boolean(sessionRegistry.get(sessionId)),
|
|
14167
|
+
killSession: (sessionId) => sessionRegistry.kill(sessionId),
|
|
14168
|
+
enqueue: (notification) => globalTaskNotificationQueue.enqueue(notification),
|
|
14169
|
+
});
|
|
14170
|
+
void started.completion;
|
|
14171
|
+
return started.result;
|
|
14172
|
+
});
|
|
14173
|
+
const tuiPluginWizard = createDashboardPluginWizardRuntime({
|
|
14174
|
+
getWorkspace: () => getSessionCwd(),
|
|
14175
|
+
runMissionPair: async ({ runId, prompt, context }) => {
|
|
14176
|
+
const pairCallId = `plugin-wizard:${runId}`;
|
|
14177
|
+
const started = await classicSidetabMission.dispatchTool('RunSidetabMission', {
|
|
14178
|
+
agent: 'codex', mission: prompt, parallelMission: prompt,
|
|
14179
|
+
}, { callId: pairCallId, ...(context?.parentSessionId ? { parentSessionId: context.parentSessionId } : {}) });
|
|
14180
|
+
const completion = pluginWizardPairCompletions.get(pairCallId);
|
|
14181
|
+
if (!completion || started?.status === 'error') {
|
|
14182
|
+
pluginWizardPairCompletions.delete(pairCallId);
|
|
14183
|
+
throw new Error(started?.body ?? 'Codex/Claude pair did not start');
|
|
14184
|
+
}
|
|
14185
|
+
try {
|
|
14186
|
+
const result = await completion;
|
|
14187
|
+
return {
|
|
14188
|
+
codex: { ok: result.codex.ok, ...(result.codex.content ? { content: result.codex.content } : {}), ...(result.codex.error ? { error: result.codex.error } : {}) },
|
|
14189
|
+
claude: { ok: result.claude.ok, ...(result.claude.content ? { content: result.claude.content } : {}), ...(result.claude.error ? { error: result.claude.error } : {}) },
|
|
14190
|
+
};
|
|
14191
|
+
} finally { pluginWizardPairCompletions.delete(pairCallId); }
|
|
14192
|
+
},
|
|
14193
|
+
});
|
|
13825
14194
|
disposeClassicSigquit = registerClassicSigquitHandler(() => {
|
|
13826
14195
|
classicSidetabRuntime.beginPrefix();
|
|
13827
14196
|
});
|
|
@@ -15323,6 +15692,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15323
15692
|
// pure assembly over already-loaded specs.
|
|
15324
15693
|
getPreamble: ({ sessionId, userText }) => {
|
|
15325
15694
|
const runtime = acpToolRuntime;
|
|
15695
|
+
const turnUserConfig = getUserConfig();
|
|
15696
|
+
const activeModel = inspectActiveProvider().model;
|
|
15326
15697
|
const tools = runtime
|
|
15327
15698
|
? buildSessionRuntimeToolSpecs({
|
|
15328
15699
|
userText,
|
|
@@ -15332,6 +15703,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15332
15703
|
surface: acpTurnRef.turnProfile?.surface,
|
|
15333
15704
|
})
|
|
15334
15705
|
: [];
|
|
15706
|
+
const surface = acpTurnRef.turnProfile?.surface;
|
|
15707
|
+
const researchDefaults = surface?.id === 'research/agent'
|
|
15708
|
+
? resolveDynamicSessionNativeToolSpecs({
|
|
15709
|
+
userText,
|
|
15710
|
+
defaultFamilyIds: surface.defaultNativeFamilyIds,
|
|
15711
|
+
surfaceId: surface.id,
|
|
15712
|
+
}).filter(tool => ['WebSearch', 'OmniSearch', 'WebFetch'].includes(tool.name))
|
|
15713
|
+
: [];
|
|
15714
|
+
const withSurfaceDefaults = [...new Map(
|
|
15715
|
+
[...researchDefaults, ...tools].map(tool => [tool.name, tool] as const),
|
|
15716
|
+
).values()];
|
|
15717
|
+
const classicTools = runtime ? classicSidetabMission.getTools(withSurfaceDefaults) : withSurfaceDefaults;
|
|
15718
|
+
const tuiTools = tuiPluginWizard.getTools(classicTools);
|
|
15335
15719
|
return [
|
|
15336
15720
|
...tuiChatPersonaMessages(currentChatPersonaSessionId(), chatPersonaSelection),
|
|
15337
15721
|
...buildDashboardTurnPreamble({
|
|
@@ -15339,20 +15723,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15339
15723
|
sessionId,
|
|
15340
15724
|
cwd: getSessionCwd(),
|
|
15341
15725
|
turnProfile: acpTurnRef.turnProfile,
|
|
15342
|
-
userConfig:
|
|
15726
|
+
userConfig: turnUserConfig,
|
|
15727
|
+
skillCatalog: applySkillFilter(getSkillIndex(), turnUserConfig.skills),
|
|
15728
|
+
skillCatalogModelId: activeModel,
|
|
15343
15729
|
// Resolved per-turn so a mid-session model switch (codex →
|
|
15344
15730
|
// claude or vice-versa) takes effect immediately. Drives the
|
|
15345
15731
|
// codex-only behavioral addendum (fix L-1) inside the
|
|
15346
15732
|
// universal preamble.
|
|
15347
|
-
modelFamily: getModelFamily(
|
|
15348
|
-
enabledTools:
|
|
15733
|
+
modelFamily: getModelFamily(activeModel),
|
|
15734
|
+
enabledTools: tuiTools.map(t => t.name),
|
|
15349
15735
|
seatBoot: true,
|
|
15350
15736
|
}),
|
|
15351
15737
|
];
|
|
15352
15738
|
},
|
|
15353
15739
|
getTools: ({ userText }) => {
|
|
15354
15740
|
const runtime = acpToolRuntime;
|
|
15355
|
-
if (!runtime) return [];
|
|
15741
|
+
if (!runtime) return tuiPluginWizard.getTools([]);
|
|
15356
15742
|
const tools = buildSessionRuntimeToolSpecs({
|
|
15357
15743
|
userText,
|
|
15358
15744
|
hostTools: pluginHost.hostLLMTools(),
|
|
@@ -15360,6 +15746,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15360
15746
|
optionalTools: acpTurnRef.optionalSpecs,
|
|
15361
15747
|
surface: acpTurnRef.turnProfile?.surface,
|
|
15362
15748
|
});
|
|
15749
|
+
const surface = acpTurnRef.turnProfile?.surface;
|
|
15750
|
+
const researchDefaults = surface?.id === 'research/agent'
|
|
15751
|
+
? resolveDynamicSessionNativeToolSpecs({
|
|
15752
|
+
userText,
|
|
15753
|
+
defaultFamilyIds: surface.defaultNativeFamilyIds,
|
|
15754
|
+
surfaceId: surface.id,
|
|
15755
|
+
}).filter(tool => ['WebSearch', 'OmniSearch', 'WebFetch'].includes(tool.name))
|
|
15756
|
+
: [];
|
|
15757
|
+
const withSurfaceDefaults = [...new Map(
|
|
15758
|
+
[...researchDefaults, ...tools].map(tool => [tool.name, tool] as const),
|
|
15759
|
+
).values()];
|
|
15760
|
+
const classicTools = classicSidetabMission.getTools(withSurfaceDefaults);
|
|
15761
|
+
const tuiTools = tuiPluginWizard.getTools(classicTools);
|
|
15363
15762
|
// ⭐ Remember this turn's catalog so a spawned sub-agent can inherit it.
|
|
15364
15763
|
//
|
|
15365
15764
|
// `dispatchAgent` computes `childTools = (hostTools ?? []).filter(...)`,
|
|
@@ -15367,8 +15766,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15367
15766
|
// or edit anything, which is the whole point of delegating code work.
|
|
15368
15767
|
// Exposing `Agent` without this wiring is worse than not exposing it:
|
|
15369
15768
|
// the model picks a delegate that provably cannot act.
|
|
15370
|
-
acpTurnToolSpecs =
|
|
15371
|
-
return
|
|
15769
|
+
acpTurnToolSpecs = tuiTools.filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME && tool.name !== TUI_PLUGIN_WIZARD_TOOL_NAME);
|
|
15770
|
+
return tuiTools;
|
|
15372
15771
|
},
|
|
15373
15772
|
// R2 essential TUI execution boundary: ACP receives the same
|
|
15374
15773
|
// Codex-first decision as every other surface. The core bridge now
|
|
@@ -15384,6 +15783,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15384
15783
|
// Count at the server-side boundary, before any tool effect and
|
|
15385
15784
|
// before the ACP notification can reach the TUI client.
|
|
15386
15785
|
acpToolDispatchCount++;
|
|
15786
|
+
const pluginWizardResult = tuiPluginWizard.dispatchTool(name, args, {
|
|
15787
|
+
callId: ctx?.callId,
|
|
15788
|
+
parentSessionId: ctx?.sessionId,
|
|
15789
|
+
});
|
|
15790
|
+
if (pluginWizardResult) return await pluginWizardResult;
|
|
15791
|
+
const classicMissionResult = classicSidetabMission.dispatchTool(name, args, {
|
|
15792
|
+
callId: ctx?.callId,
|
|
15793
|
+
parentSessionId: ctx?.sessionId,
|
|
15794
|
+
});
|
|
15795
|
+
if (classicMissionResult) return classicMissionResult;
|
|
15796
|
+
// For Agent with no `hand` or `hand: internal`, the sidetab
|
|
15797
|
+
// interceptor deliberately returns undefined; keep the established
|
|
15798
|
+
// session-runtime Agent dispatcher below as the built-in fallback.
|
|
15387
15799
|
const runtime = acpToolRuntime;
|
|
15388
15800
|
const persist = acpPersistToolOutputPreview;
|
|
15389
15801
|
if (!runtime || !persist) {
|
|
@@ -15403,6 +15815,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15403
15815
|
signalAlreadyAborted: turnSignal.aborted,
|
|
15404
15816
|
});
|
|
15405
15817
|
const dispatchPromise = dispatchDashboardSessionRuntimeTool(name, args, {
|
|
15818
|
+
sessionId: ctx?.sessionId,
|
|
15406
15819
|
contextUserText,
|
|
15407
15820
|
turnRefUserText,
|
|
15408
15821
|
muted: C.muted,
|
|
@@ -15410,6 +15823,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15410
15823
|
draw,
|
|
15411
15824
|
signal: turnSignal,
|
|
15412
15825
|
toolCallId: ctx?.callId,
|
|
15826
|
+
inheritGeneralPurposeToolCatalog: true,
|
|
15413
15827
|
// ⛔⭐ 폴백은 `''` 가 아니라 `undefined` 다 — 「안 넘김」과 「말했는데 어휘가 없음」은 «다른 값»이다.
|
|
15414
15828
|
// harnessMentionState(session-runtime 소비처)는 `undefined → 'absent'` · `'' → 'not-matched'` 로
|
|
15415
15829
|
// 가른다. `?? ''` 로 접으면 그 둘이 같은 값이 되고, 그것이 2026-08-06 에 「TUI 가 하니스에게
|
|
@@ -15434,14 +15848,42 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15434
15848
|
dispatchToolRuntime: (toolName, input, toolCallId) =>
|
|
15435
15849
|
runtime.dispatchToolByName(toolName, input, {
|
|
15436
15850
|
surface: 'tui',
|
|
15851
|
+
parentSessionId: ctx?.sessionId,
|
|
15437
15852
|
toolCallId,
|
|
15438
15853
|
signal: hasParentTurnAbortSignal ? turnSignal : undefined,
|
|
15854
|
+
inheritGeneralPurposeToolCatalog: true,
|
|
15439
15855
|
// ⭐ Agent-family context. Without these two the sub-agent runs
|
|
15440
15856
|
// text-only (see getTools above). `agentDispatchTool` routes the
|
|
15441
15857
|
// child's calls back through THIS dispatcher so the child gets the
|
|
15442
15858
|
// same policy/truncation treatment as the parent — not a second,
|
|
15443
15859
|
// laxer path.
|
|
15444
15860
|
agentHostTools: acpTurnToolSpecs,
|
|
15861
|
+
// Agent children inherit the full TUI-visible tool catalog,
|
|
15862
|
+
// not only this turn's surface/tier-selected model catalog.
|
|
15863
|
+
// Calls still route through this parent dispatcher, preserving
|
|
15864
|
+
// availability and dangerous-tool policy checks.
|
|
15865
|
+
buildChildToolCatalog: (childCwd) => {
|
|
15866
|
+
const childCatalog = buildSubagentSessionRuntimeToolSpecs({
|
|
15867
|
+
hostTools: pluginHost.hostLLMTools(),
|
|
15868
|
+
// Runtime can disappear between the parent turn and a child
|
|
15869
|
+
// spawn. In that case keep the captured TUI host catalog below.
|
|
15870
|
+
runtimeTools: runtime?.listToolRuntimes('tui') ?? [],
|
|
15871
|
+
optionalTools: acpTurnRef.optionalSpecs,
|
|
15872
|
+
});
|
|
15873
|
+
const specs = [...new Map(
|
|
15874
|
+
[...acpTurnToolSpecs, ...childCatalog]
|
|
15875
|
+
.filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME && tool.name !== TUI_PLUGIN_WIZARD_TOOL_NAME)
|
|
15876
|
+
.map(tool => [tool.name, tool] as const),
|
|
15877
|
+
).values()];
|
|
15878
|
+
return {
|
|
15879
|
+
specs,
|
|
15880
|
+
dispatch: (childName: string, childArgs: Record<string, unknown>) =>
|
|
15881
|
+
acpDispatchToolSelf
|
|
15882
|
+
? acpDispatchToolSelf(childName, childArgs, ctx)
|
|
15883
|
+
: Promise.resolve({ error: 'parent dispatcher unavailable' }),
|
|
15884
|
+
workingDirectory: childCwd,
|
|
15885
|
+
};
|
|
15886
|
+
},
|
|
15445
15887
|
// ⛔ Forward the parent's `ctx` — without it `turnIndex` is lost and
|
|
15446
15888
|
// the child's output is attributed to the wrong turn by the
|
|
15447
15889
|
// truncation/persist path (and the search planner loses its
|
|
@@ -17535,6 +17977,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17535
17977
|
const slashCtx: DashboardSlashContext = {
|
|
17536
17978
|
ad: { run: (args) => dispatchDashboardAdSlash(adSlashRuntime, [...args], () => { draw(); }) },
|
|
17537
17979
|
chatLines,
|
|
17980
|
+
classicSidetabAgent: {
|
|
17981
|
+
loadRows: (sessionId) => classicSidetabRuntime.loadRows(sessionId),
|
|
17982
|
+
openAgent: (agent) => classicSidetabRuntime.openAgent(agent),
|
|
17983
|
+
runMission: (agent, mission, outputPath) => classicSidetabRuntime.runMission(agent, mission, outputPath),
|
|
17984
|
+
},
|
|
17538
17985
|
getStatusLines: getDashboardStatusLines,
|
|
17539
17986
|
...(clarificationSurfaceUx ? { surfaceUx: clarificationSurfaceUx } : {}),
|
|
17540
17987
|
attachmentRowMap,
|
|
@@ -17671,11 +18118,32 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17671
18118
|
},
|
|
17672
18119
|
agentLauncher: {
|
|
17673
18120
|
open: (brand, agentArgs) => {
|
|
17674
|
-
TerminalPopup
|
|
18121
|
+
const launch = () => TerminalPopup
|
|
17675
18122
|
.agent(brand)
|
|
17676
18123
|
.cwd(getSessionCwd())
|
|
17677
18124
|
.args([...agentArgs])
|
|
17678
18125
|
.open();
|
|
18126
|
+
if (brand === 'gemini') {
|
|
18127
|
+
launch();
|
|
18128
|
+
return;
|
|
18129
|
+
}
|
|
18130
|
+
const agent = brand === 'claude-code' ? 'claude' : 'codex';
|
|
18131
|
+
void (async () => {
|
|
18132
|
+
try {
|
|
18133
|
+
const prepared = await prepareClassicSidetabAgentCli(agent);
|
|
18134
|
+
if (!prepared.ready) {
|
|
18135
|
+
chatLines.push(C.warning(` ${prepared.message}`));
|
|
18136
|
+
chatScrollOffset = -1;
|
|
18137
|
+
draw();
|
|
18138
|
+
return;
|
|
18139
|
+
}
|
|
18140
|
+
launch();
|
|
18141
|
+
} catch {
|
|
18142
|
+
chatLines.push(C.warning(` ${agent}: 설치·로그인 상태를 확인하지 못했습니다`));
|
|
18143
|
+
chatScrollOffset = -1;
|
|
18144
|
+
draw();
|
|
18145
|
+
}
|
|
18146
|
+
})();
|
|
17679
18147
|
},
|
|
17680
18148
|
},
|
|
17681
18149
|
theme: {
|
|
@@ -18765,16 +19233,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18765
19233
|
// project. The raw index cache stays shared across callers —
|
|
18766
19234
|
// this filter is applied on read.
|
|
18767
19235
|
const skillsCfg = getUserConfig().skills;
|
|
18768
|
-
const
|
|
19236
|
+
const skillIndexStartedAt = performance.now();
|
|
19237
|
+
const skillIndex = getSkillIndex();
|
|
19238
|
+
const visibleIndex = applySkillFilter(skillIndex, {
|
|
18769
19239
|
allow: skillsCfg.allow, deny: skillsCfg.deny,
|
|
18770
19240
|
});
|
|
19241
|
+
try {
|
|
19242
|
+
debug.log('chat.turn.stage', 'skill-index-ready', {
|
|
19243
|
+
elapsedMs: Math.round((performance.now() - skillIndexStartedAt) * 10) / 10,
|
|
19244
|
+
skillCount: skillIndex.length,
|
|
19245
|
+
visibleSkillCount: visibleIndex.length,
|
|
19246
|
+
});
|
|
19247
|
+
} catch { /* observation must never delay a turn */ }
|
|
18771
19248
|
let detection: DetectResult = { candidates: [], top: null, unambiguous: false };
|
|
19249
|
+
const routeStartedAt = performance.now();
|
|
19250
|
+
let routeOutcome: 'complete' | 'aborted' | 'failed' = 'failed';
|
|
18772
19251
|
try {
|
|
18773
19252
|
// Tier-aware full-menu routing (2026-07-20): pass the active
|
|
18774
19253
|
// model tier so a T1 frontier model can route the whole skill
|
|
18775
19254
|
// menu when keyword matching is weak/empty (Korean prompts).
|
|
18776
19255
|
const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
|
|
18777
|
-
const routeStartedAt = Date.now();
|
|
18778
19256
|
const route = await runAbortableDashboardSkillRoute({
|
|
18779
19257
|
attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
|
|
18780
19258
|
detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
|
|
@@ -18789,12 +19267,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18789
19267
|
}),
|
|
18790
19268
|
});
|
|
18791
19269
|
if (route.aborted) {
|
|
18792
|
-
debug.log('skill.router', 'route-aborted-by-esc', { elapsedMs:
|
|
19270
|
+
debug.log('skill.router', 'route-aborted-by-esc', { elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10 });
|
|
19271
|
+
routeOutcome = 'aborted';
|
|
18793
19272
|
thinking.stop({ status: 'interrupted' });
|
|
18794
19273
|
draw();
|
|
18795
19274
|
continue;
|
|
18796
19275
|
}
|
|
18797
19276
|
detection = route.detection;
|
|
19277
|
+
routeOutcome = 'complete';
|
|
18798
19278
|
// Observability (2026-07-20) — the routing DECISION had no
|
|
18799
19279
|
// debug category (only surfaced as a UI hint). Emit it so
|
|
18800
19280
|
// `elanous logs --category skill.router` shows trigger/triage
|
|
@@ -18809,8 +19289,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18809
19289
|
unambiguous: detection.unambiguous,
|
|
18810
19290
|
});
|
|
18811
19291
|
} catch (err) {
|
|
18812
|
-
debug.log('skill.router', 'decision-error', {
|
|
19292
|
+
debug.log('skill.router', 'decision-error', {
|
|
19293
|
+
text: tok.text.slice(0, 80),
|
|
19294
|
+
error: (err as any)?.message ?? String(err),
|
|
19295
|
+
elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10,
|
|
19296
|
+
}, { level: 'error' });
|
|
18813
19297
|
/* router must never block chat */
|
|
19298
|
+
} finally {
|
|
19299
|
+
try {
|
|
19300
|
+
debug.log('chat.turn.stage', 'skill-router-complete', {
|
|
19301
|
+
elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10,
|
|
19302
|
+
outcome: routeOutcome,
|
|
19303
|
+
llmFallback: userCfg.llmFallback,
|
|
19304
|
+
visibleSkillCount: visibleIndex.length,
|
|
19305
|
+
candidateCount: detection.candidates.length,
|
|
19306
|
+
});
|
|
19307
|
+
} catch { /* observation must never delay a turn */ }
|
|
18814
19308
|
}
|
|
18815
19309
|
|
|
18816
19310
|
// Session 21 — session-scoped decline short-circuit. If the
|
|
@@ -18945,6 +19439,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18945
19439
|
getActivePluginName: () => pluginHost.active()?.name,
|
|
18946
19440
|
},
|
|
18947
19441
|
inputSource,
|
|
19442
|
+
chat.history
|
|
19443
|
+
.filter(message => message.role === 'user' && typeof message.content === 'string')
|
|
19444
|
+
.map(message => String(message.content)),
|
|
18948
19445
|
),
|
|
18949
19446
|
buildTurnMessage: (args) => buildDashboardTurnMessage({
|
|
18950
19447
|
userText: args.userText,
|
|
@@ -18986,6 +19483,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18986
19483
|
cwd: args.cwd,
|
|
18987
19484
|
turnProfile: args.turnProfile as SessionTurnProfile,
|
|
18988
19485
|
userConfig: args.userConfig,
|
|
19486
|
+
skillCatalog: applySkillFilter(getSkillIndex(), args.userConfig.skills),
|
|
19487
|
+
skillCatalogModelId: inspectActiveProvider().model,
|
|
18989
19488
|
enabledTools: tools.map(t => t.name),
|
|
18990
19489
|
seatBoot: true,
|
|
18991
19490
|
}),
|