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
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
* Unlike `dispatchHeavyCheck` it never falls back to a local run: a busy host or an infra failure is «unmeasured».
|
|
4
4
|
* The only local commands are git (cat-file · rev-parse · push · diff). */
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
6
7
|
import { parseGateScenario, readGateScenarioFile } from './gate-scenario.js';
|
|
7
8
|
import { getDefaultLogStore } from '../mss/logging/log-store.js';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
|
|
11
|
+
import { saveGateReceipt, type GateReceipt } from './gate-receipt-registry.js';
|
|
8
12
|
import {
|
|
9
13
|
gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote,
|
|
10
14
|
type GateRemoteRunner, type GateRemoteSettings, type RemoteRunOutcome,
|
|
@@ -30,6 +34,51 @@ export interface TrainGateInput {
|
|
|
30
34
|
|
|
31
35
|
export interface TrainGateResult { outcome: TrainGateOutcome; host: string; ms?: number; rc?: number; reason?: string }
|
|
32
36
|
|
|
37
|
+
const GATE_RECEIPTS_MARKER = String.fromCharCode(10) + '__GATE_RECEIPTS__';
|
|
38
|
+
|
|
39
|
+
function sharedGateReceiptPath(repo: string, runner: GateRemoteRunner): string | undefined {
|
|
40
|
+
try {
|
|
41
|
+
const result = runner.local('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], repo);
|
|
42
|
+
const commonDir = result.stdout.trim();
|
|
43
|
+
return result.rc === 0 && commonDir ? join(commonDir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
|
|
44
|
+
} catch { return undefined; }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The exact persistent registry used by local train receipt merging. */
|
|
48
|
+
export function gateReceiptRegistryPathForRepo(repo: string): string | undefined {
|
|
49
|
+
const result = spawnSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], {
|
|
50
|
+
cwd: repo, encoding: 'utf8', timeout: 10_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
|
|
51
|
+
});
|
|
52
|
+
const commonDir = (result.stdout ?? '').trim();
|
|
53
|
+
return result.status === 0 && commonDir ? join(commonDir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Merge the existing remote-writer marker into the local common-dir registry. Invalid rows fail closed. */
|
|
57
|
+
export function mergeGateReceiptRegistryPayload(payload: string, path: string): number {
|
|
58
|
+
let saved = 0;
|
|
59
|
+
try {
|
|
60
|
+
const rows = JSON.parse(Buffer.from(payload, 'base64').toString('utf8')) as Record<string, unknown>;
|
|
61
|
+
for (const [key, value] of Object.entries(rows)) {
|
|
62
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
|
|
63
|
+
const receipt = value as GateReceipt;
|
|
64
|
+
if (receipt.key !== key) continue;
|
|
65
|
+
try { saveGateReceipt(path, receipt); saved++; }
|
|
66
|
+
catch { /* Invalid remote records are discarded; local gates remain fail-open. */ }
|
|
67
|
+
}
|
|
68
|
+
} catch { /* A malformed response never changes the measured gate verdict. */ }
|
|
69
|
+
return saved;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function mergeReturnedReceipts(outcome: RemoteRunOutcome, path: string | undefined): RemoteRunOutcome {
|
|
73
|
+
if (outcome.kind !== 'ran' || outcome.rc !== 0 || !path) return outcome;
|
|
74
|
+
const stdout = outcome.stdout.toString('utf8');
|
|
75
|
+
const marker = stdout.lastIndexOf(GATE_RECEIPTS_MARKER);
|
|
76
|
+
if (marker < 0) return outcome;
|
|
77
|
+
const payload = stdout.slice(marker + GATE_RECEIPTS_MARKER.length).trim();
|
|
78
|
+
mergeGateReceiptRegistryPayload(payload, path);
|
|
79
|
+
return { ...outcome, stdout: Buffer.from(stdout.slice(0, marker)) };
|
|
80
|
+
}
|
|
81
|
+
|
|
33
82
|
export interface TrainGateObservation {
|
|
34
83
|
host: string; commit: string; baseSha: string; outcome: TrainGateOutcome;
|
|
35
84
|
rc?: number; ms?: number; reason?: string; changedFiles: number;
|
|
@@ -42,22 +91,6 @@ export interface TrainGateDeps {
|
|
|
42
91
|
observe?: (entry: TrainGateObservation) => void;
|
|
43
92
|
}
|
|
44
93
|
|
|
45
|
-
const quote = (value: string) => `'${value.replaceAll("'", `'\\''`)}'`;
|
|
46
|
-
const TEST_FILE = /\.test\.[cm]?[jt]sx?$/;
|
|
47
|
-
|
|
48
|
-
/** The host-side shell body: each step runs only if the one before it passed. Exported for tests. */
|
|
49
|
-
export function trainGateScript(baseSha: string, changedFiles: readonly string[], deleted: ReadonlySet<string> = new Set(), scenarioTests: readonly string[] = []): string {
|
|
50
|
-
// A deleted test file is a changed path (tsc/PWA reach) but not something to run.
|
|
51
|
-
const changedTests = changedFiles.filter((file) => TEST_FILE.test(file) && !deleted.has(file));
|
|
52
|
-
const tests = scenarioTests.length ? [...new Set([...changedTests, ...scenarioTests])] : changedTests;
|
|
53
|
-
const steps = [
|
|
54
|
-
`TSC_BASE_REF=${quote(baseSha)} bun scripts/ci-typecheck-changed.ts --local`,
|
|
55
|
-
...(tests.length ? [`bun run test:deterministic ${tests.map(quote).join(' ')}`] : []),
|
|
56
|
-
`bun scripts/ci-pwa-build-gate.ts --changed-files ${changedFiles.map(quote).join(' ')}`,
|
|
57
|
-
];
|
|
58
|
-
return steps.join(' && ');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
94
|
async function loadSettings(): Promise<GateRemoteSettings> {
|
|
62
95
|
try {
|
|
63
96
|
const { getUserConfig } = await import('../user-config.js');
|
|
@@ -76,6 +109,10 @@ export const TRAIN_GATE_HOST = 'node-b';
|
|
|
76
109
|
|
|
77
110
|
export async function runTrainGateOnHost(input: TrainGateInput, runner: GateRemoteRunner = realGateRemoteRunner, deps: TrainGateDeps = {}): Promise<TrainGateResult> {
|
|
78
111
|
const settings = input.settings ?? await loadSettings();
|
|
112
|
+
const receiptPath = sharedGateReceiptPath(input.repo, runner);
|
|
113
|
+
// Each remote full gate writes into a fresh scratch registry; returned rows merge into the local shared registry.
|
|
114
|
+
// No existing registry contents are needed for receipt registration.
|
|
115
|
+
const payloadFiles = receiptPath ? [{ env: 'ELANOUS_GATE_RECEIPT_REGISTRY_PATH', content: '{}' }] : undefined;
|
|
79
116
|
const host = settings.host;
|
|
80
117
|
const hostCap = gateRemoteHostCap(settings, host);
|
|
81
118
|
let scenarioTests: string[] = [];
|
|
@@ -110,14 +147,21 @@ export async function runTrainGateOnHost(input: TrainGateInput, runner: GateRemo
|
|
|
110
147
|
const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
111
148
|
const now = deps.now ?? Date.now;
|
|
112
149
|
const deadline = now() + settings.slotWaitSeconds * 1000;
|
|
113
|
-
const script = trainGateScript(input.baseSha, input.changedFiles, new Set(input.deletedFiles ?? []), scenarioTests);
|
|
114
150
|
let outcome: RemoteRunOutcome;
|
|
115
151
|
for (;;) {
|
|
116
152
|
try {
|
|
117
153
|
outcome = runOnRemote({
|
|
118
154
|
repo: input.repo, host, mirror: settings.mirror, commit: input.commit, refs: [input.baseSha],
|
|
119
|
-
argv: ['
|
|
155
|
+
argv: ['bun', 'src/self-implement/train-gate-receipt.ts', JSON.stringify({
|
|
156
|
+
repo: input.repo,
|
|
157
|
+
commit: input.commit,
|
|
158
|
+
baseSha: input.baseSha,
|
|
159
|
+
changedFiles: input.changedFiles,
|
|
160
|
+
deletedFiles: input.deletedFiles ?? [],
|
|
161
|
+
scenarioTests,
|
|
162
|
+
})], installPwa: true, hostCap, ...(payloadFiles ? { payloadFiles } : {}),
|
|
120
163
|
}, runner);
|
|
164
|
+
outcome = mergeReturnedReceipts(outcome, receiptPath);
|
|
121
165
|
} catch (error) {
|
|
122
166
|
outcome = { kind: 'infra', reason: `exception: ${error instanceof Error ? error.message : String(error)}` };
|
|
123
167
|
}
|
package/src/session/chat.ts
CHANGED
|
@@ -42,9 +42,15 @@ import {
|
|
|
42
42
|
// ⭐ substrate 통합(PLAN-unified-autonomous-agent-substrate-2026-07-20) — goal-loop 아밍 시
|
|
43
43
|
// chat 툴루프를 canonical 엔진(runGoalLoop→runCoreTurn→streamLLMWithTools)으로 라우팅.
|
|
44
44
|
// ACP bridge(core-turn-bridge.ts)·dashboard(runGoalLoopHook)와 동일 엔진 재사용(재발명 제거).
|
|
45
|
-
import { runGoalLoop, type CoreTurnContext, type CoreTurnDispatchTool } from '../core-turn/index.js';
|
|
45
|
+
import { runCoreTurn, runGoalLoop, type CoreTurnContext, type CoreTurnDispatchTool } from '../core-turn/index.js';
|
|
46
46
|
import { composeChildContext, type ChildContextProfile } from '../self-implement/child-context-composition.js';
|
|
47
47
|
import { getHarnessSpace } from '../harness/harness-space.js';
|
|
48
|
+
import { isResearchAgentIntent } from '../tool-hints/signals.js';
|
|
49
|
+
import {
|
|
50
|
+
buildSessionRuntimeTurnSystemMessages,
|
|
51
|
+
createSessionPostureState,
|
|
52
|
+
resolveSessionTurnProfileWithHistory,
|
|
53
|
+
} from '../session-runtime/index.js';
|
|
48
54
|
|
|
49
55
|
export interface RunTurnOpts {
|
|
50
56
|
userConfig: UserConfig;
|
|
@@ -59,6 +65,8 @@ export interface RunTurnOpts {
|
|
|
59
65
|
/** Optional callback for each streamed text delta — telegram uses this to
|
|
60
66
|
* accumulate; CLI uses it to render live. */
|
|
61
67
|
onDelta?: (delta: string) => void;
|
|
68
|
+
/** Replace a provisional streamed answer after a grounded TUI synthesis completes. */
|
|
69
|
+
onReplaceText?: (fullText: string) => void;
|
|
62
70
|
/** Optional transient stream recovery status for the originating UI. */
|
|
63
71
|
onStatusLine?: (line: string) => void;
|
|
64
72
|
/** Optional provider override — for tests. */
|
|
@@ -294,6 +302,24 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
294
302
|
// just skip and continue.
|
|
295
303
|
let memoryIds: string[] = [];
|
|
296
304
|
let effectiveSystemPrompt = opts.systemPrompt;
|
|
305
|
+
// The Next TUI runs through this shared session adapter rather than the classic dashboard
|
|
306
|
+
// preamble. Give research turns the same verified-reconciliation instruction on this path.
|
|
307
|
+
if (meta.source === 'tui' && !effectiveSystemPrompt?.includes('## Proactive Reconciliation')) {
|
|
308
|
+
const priorUserTexts = messages
|
|
309
|
+
.filter(message => message.role === 'user' && typeof message.content === 'string')
|
|
310
|
+
.map(message => String(message.content));
|
|
311
|
+
const turnProfile = resolveSessionTurnProfileWithHistory({
|
|
312
|
+
userText: opts.userText,
|
|
313
|
+
priorUserTexts,
|
|
314
|
+
chatModeState: createSessionPostureState(),
|
|
315
|
+
});
|
|
316
|
+
const reconciliation = buildSessionRuntimeTurnSystemMessages(turnProfile, opts.userText)
|
|
317
|
+
.filter(message => String(message.content).includes('## Proactive Reconciliation'));
|
|
318
|
+
if (reconciliation.length > 0) {
|
|
319
|
+
const block = reconciliation.map(message => String(message.content)).join('\n\n');
|
|
320
|
+
effectiveSystemPrompt = effectiveSystemPrompt ? `${effectiveSystemPrompt}\n\n${block}` : block;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
297
323
|
if (!opts.skipMemoryInjection) {
|
|
298
324
|
try {
|
|
299
325
|
// LLM-judge recall(2026-07-19 · 기본 ON·대표 지시) — 키워드 대신 luna 의미판정으로 관련
|
|
@@ -485,7 +511,9 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
485
511
|
// streamLLMWithTools)으로 라우팅. 미아밍이면 아래 기존 single-turn 경로 그대로(회귀 0).
|
|
486
512
|
const goalLoopCfg = opts.userConfig.llm.goalLoop;
|
|
487
513
|
const armGoalLoop = opts.goalLoop === true || goalLoopCfg?.enabled === true;
|
|
488
|
-
|
|
514
|
+
const armResearchTurn = (opts.utteranceSurface === 'tui' || opts.utteranceSurface === 'ask')
|
|
515
|
+
&& turnTools.length > 0 && isResearchAgentIntent(opts.userText);
|
|
516
|
+
if (armGoalLoop || armResearchTurn) {
|
|
489
517
|
// ⭐ CHILD-CONTEXT-BUDGET(0.2.35 칸) — 구현 자식(self-implement 공간)의 첫 goal-loop
|
|
490
518
|
// 턴에서 실제 effectiveSystemPrompt·turnTools 스키마·userText(골)의 구성 바이트를
|
|
491
519
|
// composeChildContext 로 계측해 child.context-composition 사건 1회로 남긴다.
|
|
@@ -520,6 +548,7 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
520
548
|
signal: opts.signal ?? new AbortController().signal,
|
|
521
549
|
callbacks: {
|
|
522
550
|
onText: (delta) => { opts.onDelta?.(delta); },
|
|
551
|
+
onReplaceText: (fullText) => { opts.onReplaceText?.(fullText); },
|
|
523
552
|
onGoalInterim: (interimText) => {
|
|
524
553
|
appendMessage(opts.sessionId, {
|
|
525
554
|
role: 'assistant', content: interimText, ts: new Date().toISOString(),
|
|
@@ -535,13 +564,20 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
535
564
|
},
|
|
536
565
|
},
|
|
537
566
|
...(turnLlmOpts?.model ? { modelOverride: turnLlmOpts.model } : {}),
|
|
567
|
+
...(turnLlmOpts?.reasoningEffort ? { reasoningEffort: turnLlmOpts.reasoningEffort } : {}),
|
|
538
568
|
...(turnLlmOpts?.budgetGrant ? { budgetGrant: turnLlmOpts.budgetGrant } : {}),
|
|
539
569
|
...(guardedTurnLlmOpts?.requestSizeGuard
|
|
540
570
|
? { requestSizeGuard: guardedTurnLlmOpts.requestSizeGuard } : {}),
|
|
541
571
|
};
|
|
542
572
|
const maxIterations = opts.goalLoopMaxIterations ?? goalLoopCfg?.maxIterations;
|
|
543
|
-
|
|
544
|
-
|
|
573
|
+
if (armGoalLoop) {
|
|
574
|
+
const gl = await runGoalLoop(coreCtx, maxIterations !== undefined ? { maxIterations } : {});
|
|
575
|
+
text = gl.finalText;
|
|
576
|
+
} else {
|
|
577
|
+
const coreResult = await runCoreTurn(coreCtx);
|
|
578
|
+
text = coreResult.finalText;
|
|
579
|
+
if (coreResult.stopReason === 'auth_rejected') throw new Error(coreResult.errorMessage ?? 'Authentication was rejected');
|
|
580
|
+
}
|
|
545
581
|
} else {
|
|
546
582
|
text = await streamLLMWithTools(
|
|
547
583
|
kept,
|
|
@@ -224,6 +224,8 @@ export interface SessionChunkEvent {
|
|
|
224
224
|
seq: number;
|
|
225
225
|
/** 텍스트 델타(누적은 sink 의 라이브핸들이). */
|
|
226
226
|
delta?: string;
|
|
227
|
+
/** Replace the current assistant text accumulated for this stream. */
|
|
228
|
+
textOperation?: 'replace';
|
|
227
229
|
/** 툴 활동(⚙️…✓ inline 렌더용). */
|
|
228
230
|
tool?: { id: string; name: string; phase: 'call' | 'result'; ok?: boolean };
|
|
229
231
|
/** 🧠 추론(모드 gated·선택). */
|
|
@@ -36,7 +36,8 @@ export function createAcpStreamSink(broadcast: AcpBroadcast): StreamingSurfaceSi
|
|
|
36
36
|
if (!sessionId) return;
|
|
37
37
|
if (ev.delta) {
|
|
38
38
|
// push(chunk) 등가 — agent_message_chunk(byte-identical).
|
|
39
|
-
void broadcast(sessionId, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: ev.delta }
|
|
39
|
+
void broadcast(sessionId, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: ev.delta },
|
|
40
|
+
...(ev.textOperation === 'replace' ? { _meta: { elanous: { textOperation: 'replace' } } } : {}) });
|
|
40
41
|
}
|
|
41
42
|
if (ev.reasoning) {
|
|
42
43
|
// 🧠 추론 — agent_thought_chunk(ACP 의 thought 채널).
|
|
@@ -20,6 +20,7 @@ import { debug } from '../../debug/log.js';
|
|
|
20
20
|
* shadow 시엔 'acp' 구독자 부재 → tg/dc/pwa 미러만. reasoning 채널 추가 지원. */
|
|
21
21
|
export interface AcpChunkProducer {
|
|
22
22
|
delta: (text: string) => void;
|
|
23
|
+
replaceText: (text: string) => void;
|
|
23
24
|
/** ⭐ `result` 는 «결과 단계»에서만 뜻이 있고, 주면 ACP `rawOutput` 으로 실려 나간다.
|
|
24
25
|
*
|
|
25
26
|
* ⛔⭐⭐ **「안 줬다」의 «사유»를 여기서 만들지 않는다.**
|
|
@@ -53,6 +54,11 @@ export function makeAcpChunkProducer(sessionId: string, opts: { streamId?: strin
|
|
|
53
54
|
fo({ streamId, seq: seq++, delta: text });
|
|
54
55
|
deltas++;
|
|
55
56
|
},
|
|
57
|
+
replaceText(text: string): void {
|
|
58
|
+
accum = text;
|
|
59
|
+
fo({ streamId, seq: seq++, delta: text, textOperation: 'replace' });
|
|
60
|
+
deltas++;
|
|
61
|
+
},
|
|
56
62
|
tool(id, name, phase, ok, result): void {
|
|
57
63
|
fo({ streamId, seq: seq++, tool: {
|
|
58
64
|
id, name, phase,
|
|
@@ -46,9 +46,10 @@ export function createCompositorState(): CompositorState {
|
|
|
46
46
|
/** 청크 이벤트를 상태에 반영(순수·in-place). delta/reasoning/tool 을 흡수. */
|
|
47
47
|
export function applyChunk(
|
|
48
48
|
state: CompositorState,
|
|
49
|
-
ev: { delta?: string; reasoning?: string; tool?: { id: string; name: string; phase: 'call' | 'result'; ok?: boolean } },
|
|
49
|
+
ev: { delta?: string; textOperation?: 'replace'; reasoning?: string; tool?: { id: string; name: string; phase: 'call' | 'result'; ok?: boolean } },
|
|
50
50
|
): void {
|
|
51
|
-
if (ev.
|
|
51
|
+
if (ev.textOperation === 'replace') state.text = ev.delta ?? '';
|
|
52
|
+
else if (ev.delta) state.text += ev.delta;
|
|
52
53
|
if (ev.reasoning) state.reasoning = ev.reasoning; // keep-latest(추론은 누적 아닌 최신 요약)
|
|
53
54
|
if (ev.tool) {
|
|
54
55
|
if (ev.tool.phase === 'call') {
|
|
@@ -26,7 +26,7 @@ import type { ToolRunResult, ToolRuntime } from '../tool-runtime/types.js';
|
|
|
26
26
|
import { blockWriteToolSearchHydration, type ToolSearchRunResult } from '../tool-runtime/tool-search-runtime.js';
|
|
27
27
|
import { findNativeTool, isNativeToolModelExposed } from '../native-tool-catalog.js';
|
|
28
28
|
import { hasAstGrep } from '../skills/tools/ast-grep.js';
|
|
29
|
-
import { buildOmniSearchTool,
|
|
29
|
+
import { buildOmniSearchTool, researchOmniSearchAvailable } from '../skills/tools/omni-search.js';
|
|
30
30
|
import { buildWebSearchTool } from '../skills/tools/web-search.js';
|
|
31
31
|
import { buildWebFetchTool } from '../skills/tools/webfetch.js';
|
|
32
32
|
import { buildSelfImplementDaemonSpec } from '../boot/daemon-tools/self-implement.js';
|
|
@@ -170,6 +170,8 @@ export interface SessionPostureSnapshot {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
export interface SessionRuntimeDispatchDeps {
|
|
173
|
+
/** Current conversation session; used to scope background Agent receipts. */
|
|
174
|
+
sessionId?: string;
|
|
173
175
|
signal?: AbortSignal;
|
|
174
176
|
/** Current LLM tool call, for correlating a foreground harness stop target with the TUI call. */
|
|
175
177
|
toolCallId?: string;
|
|
@@ -183,6 +185,7 @@ export interface SessionRuntimeDispatchDeps {
|
|
|
183
185
|
dispatch: (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
184
186
|
workingDirectory: string;
|
|
185
187
|
};
|
|
188
|
+
inheritGeneralPurposeToolCatalog?: boolean;
|
|
186
189
|
searchPlannerState?: SearchPlannerState;
|
|
187
190
|
/** CC (2026-04-25) — forwarded from the LLM router's dispatch ctx
|
|
188
191
|
* (`turnIndex`). Lets the planner allow same-turn parallel fan-out
|
|
@@ -429,6 +432,7 @@ interface SessionNativeToolRule {
|
|
|
429
432
|
signal?: AbortSignal,
|
|
430
433
|
opts?: {
|
|
431
434
|
pathPolicy?: PathPolicy;
|
|
435
|
+
sessionId?: string;
|
|
432
436
|
agentHostTools?: LLMToolSpec[];
|
|
433
437
|
agentDispatchTool?: (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
434
438
|
buildChildToolCatalog?: (cwd: string) => {
|
|
@@ -436,6 +440,7 @@ interface SessionNativeToolRule {
|
|
|
436
440
|
dispatch: (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
437
441
|
workingDirectory: string;
|
|
438
442
|
};
|
|
443
|
+
inheritGeneralPurposeToolCatalog?: boolean;
|
|
439
444
|
},
|
|
440
445
|
): Promise<unknown>;
|
|
441
446
|
/** ⛔ Opt-IN to the ToolRuntime registry path instead of `dispatch` above.
|
|
@@ -512,10 +517,12 @@ const SESSION_NATIVE_TOOL_RULES: SessionNativeToolRule[] = [
|
|
|
512
517
|
build: () => buildAgentTool(),
|
|
513
518
|
match: () => false,
|
|
514
519
|
dispatch: async (args, signal, opts) => await dispatchAgent(args, {
|
|
520
|
+
parentSessionId: opts?.sessionId,
|
|
515
521
|
signal,
|
|
516
522
|
hostTools: opts?.agentHostTools,
|
|
517
523
|
dispatchTool: opts?.agentDispatchTool,
|
|
518
524
|
buildChildToolCatalog: opts?.buildChildToolCatalog,
|
|
525
|
+
inheritGeneralPurposeToolCatalog: opts?.inheritGeneralPurposeToolCatalog,
|
|
519
526
|
}),
|
|
520
527
|
preferRuntime: true,
|
|
521
528
|
},
|
|
@@ -587,10 +594,10 @@ const SESSION_NATIVE_TOOL_RULES: SessionNativeToolRule[] = [
|
|
|
587
594
|
description: 'Multi-source research and triangulation across external signals.',
|
|
588
595
|
build: () => buildOmniSearchTool(),
|
|
589
596
|
match: (text) => hasResearchSearchIntent(text),
|
|
590
|
-
isAvailable: () =>
|
|
597
|
+
isAvailable: () => researchOmniSearchAvailable(),
|
|
591
598
|
dispatch: async (args) => {
|
|
592
|
-
const {
|
|
593
|
-
return await
|
|
599
|
+
const { dispatchResearchOmniSearch } = await import('../skills/tools/omni-search.js');
|
|
600
|
+
return await dispatchResearchOmniSearch(args);
|
|
594
601
|
},
|
|
595
602
|
},
|
|
596
603
|
{
|
|
@@ -839,7 +846,7 @@ const SESSION_SURFACE_PROFILES: Record<SessionSurfaceId, Omit<SessionSurfaceProf
|
|
|
839
846
|
baselineContexts: ['external-world-guidance'],
|
|
840
847
|
defaultHostFamilyIds: ['self-ops'],
|
|
841
848
|
defaultRuntimeFamilyIds: [],
|
|
842
|
-
defaultNativeFamilyIds: ['web-search'],
|
|
849
|
+
defaultNativeFamilyIds: ['web-search', 'deep-research', 'web-fetch'],
|
|
843
850
|
},
|
|
844
851
|
'control/agent': {
|
|
845
852
|
id: 'control/agent',
|
|
@@ -969,9 +976,47 @@ export function buildSessionRuntimeTurnSystemMessages(
|
|
|
969
976
|
if (scopedGuidance) {
|
|
970
977
|
messages.push({ role: 'system', content: scopedGuidance });
|
|
971
978
|
}
|
|
979
|
+
const reconcileGuidance = buildProactiveReconcileGuidance(userText);
|
|
980
|
+
if (turnProfile.surface.domain === 'research') {
|
|
981
|
+
if (reconcileGuidance) {
|
|
982
|
+
messages.push({ role: 'system', content: PROACTIVE_RECONCILIATION_GUIDANCE.join('\n') });
|
|
983
|
+
}
|
|
984
|
+
} else if (reconcileGuidance) {
|
|
985
|
+
messages.push({ role: 'system', content: reconcileGuidance });
|
|
986
|
+
}
|
|
972
987
|
return messages;
|
|
973
988
|
}
|
|
974
989
|
|
|
990
|
+
/** A challenged tool/source claim is a request to repair the answer, not just
|
|
991
|
+
* to narrate whether the earlier answer was grounded. Keep this guidance
|
|
992
|
+
* scoped to explicit evidence challenges so ordinary turns stay unchanged. */
|
|
993
|
+
function buildProactiveReconcileGuidance(userText?: string): string | null {
|
|
994
|
+
const text = String(userText ?? '').toLowerCase();
|
|
995
|
+
if (!text.trim()) return null;
|
|
996
|
+
|
|
997
|
+
const explicitChallenge = [
|
|
998
|
+
/\b(?:did you|have you|were you)\b.{0,80}\b(?:actually|really|use|used|run|check|verify|consult|cite)\b/,
|
|
999
|
+
/\b(?:you (?:did not|didn't|never)\s+(?:use|run|check|verify|consult))\b/,
|
|
1000
|
+
/\b(?:verify|check|recheck|re-check|confirm)\b.{0,80}\b(?:previous|prior|original|earlier)\b/,
|
|
1001
|
+
/\b(?:earlier|previous|prior|last)\b.{0,40}\b(?:skill|tool|source|evidence)\b.{0,40}\b(?:used|ran|checked|verified|cited)\b.{0,30}\b(?:actually|really|right|correct)\b/,
|
|
1002
|
+
/(?:앞서|이전|직전|기존|그때).{0,40}(?:스킬|도구|툴).{0,40}(?:쓴|사용한|실행한).{0,30}(?:맞|했나|했는지)/,
|
|
1003
|
+
/(?:스킬|도구|툴).{0,40}(?:제대로|실제로).{0,40}(?:찾았는지|찾았나|사용했는지|사용했나|썼는지|썼나)/,
|
|
1004
|
+
/(?:라고\s*(?:했는데|했음에도|말했는데)|이야기했음에도).{0,80}(?:확인|결말|결론|답).{0,40}(?:조정|수정|바꾸|고치)/,
|
|
1005
|
+
/(?:스킬|도구|근거|출처).{0,60}(?:실제로\s*사용|제대로\s*사용|확인했나|썼나|쓴\s*게\s*맞|안\s*썼|못\s*찾|재확인)/,
|
|
1006
|
+
];
|
|
1007
|
+
if (!explicitChallenge.some(pattern => pattern.test(text))) return null;
|
|
1008
|
+
|
|
1009
|
+
return [
|
|
1010
|
+
'## Proactive Reconciliation — Tool-use Correction — Reconcile the Original Request This Turn',
|
|
1011
|
+
'',
|
|
1012
|
+
'The user is challenging whether the prior answer used the requested tool, skill, source, or evidence.',
|
|
1013
|
+
'Treat the original task as still open. Recover it and the prior conclusion from the conversation, then verify the challenged claim with an available capability.',
|
|
1014
|
+
'If verification changes or invalidates the prior conclusion, shows the original task was not completed, or finds that evidence is missing, incomplete, or insufficient, continue the original task in this same user turn with verified available tools and give a corrected, evidence-grounded result.',
|
|
1015
|
+
'If the requested capability is unavailable, say so plainly and continue the original task with another suitable available source when possible. Never claim a tool or skill ran when it did not.',
|
|
1016
|
+
'Do not stop at an apology or verification-only report, do not ask the user to repeat the task, and do not emit a raw JSON dump unless explicitly requested. Answer in concise prose.',
|
|
1017
|
+
].join('\n');
|
|
1018
|
+
}
|
|
1019
|
+
|
|
975
1020
|
function buildTurnScopedExplorationGuidance(userText?: string): string | null {
|
|
976
1021
|
if (isScopedAnalysisRequest(userText)) {
|
|
977
1022
|
return [
|
|
@@ -1239,6 +1284,7 @@ function buildSurfaceOperationalGuidance(surface: SessionSurfaceProfile): string
|
|
|
1239
1284
|
'Bias toward multi-source external investigation: use WebSearch, WebFetch, and OmniSearch before concluding.',
|
|
1240
1285
|
'WebSearch is provider-backed and may route through Grok live-search or Firecrawl; OmniSearch is the wider parallel path when you want triangulation across providers.',
|
|
1241
1286
|
'Prefer cited, current, cross-checked findings over repo-local assumptions when the question reaches beyond the workspace.',
|
|
1287
|
+
'',
|
|
1242
1288
|
].join('\n');
|
|
1243
1289
|
case 'research/turn':
|
|
1244
1290
|
return [
|
|
@@ -1247,6 +1293,7 @@ function buildSurfaceOperationalGuidance(surface: SessionSurfaceProfile): string
|
|
|
1247
1293
|
'You are in `research/turn`.',
|
|
1248
1294
|
'Handle the current turn as a lightweight external lookup. Prefer quick verification and concise sourced answers over deep autonomous exploration.',
|
|
1249
1295
|
'Keep WebSearch ready by default. It is provider-backed and may use Grok live-search or Firecrawl; use WebFetch for full page bodies and OmniSearch when the user asks for deeper cross-provider research.',
|
|
1296
|
+
'',
|
|
1250
1297
|
].join('\n');
|
|
1251
1298
|
case 'control/agent':
|
|
1252
1299
|
return [
|
|
@@ -1275,6 +1322,13 @@ function buildSurfaceOperationalGuidance(surface: SessionSurfaceProfile): string
|
|
|
1275
1322
|
}
|
|
1276
1323
|
}
|
|
1277
1324
|
|
|
1325
|
+
const PROACTIVE_RECONCILIATION_GUIDANCE = [
|
|
1326
|
+
'## Proactive Reconciliation — Tool-use Correction — Reconcile the Original Request This Turn',
|
|
1327
|
+
'When the user asks you to verify how an earlier answer was produced (tools, skills, or sources), check the actual results and compare them with the earlier conclusion.',
|
|
1328
|
+
'Treat the original task as still open. If verification changes or invalidates that conclusion, shows the original task was not completed, or finds that the evidence is missing, incomplete, or insufficient to support the conclusion, treat it as unreliable and continue in this same user turn: redo the original task with verified available tools and answer the original task with the corrected, evidence-grounded result in ordinary prose.',
|
|
1329
|
+
'Do not stop at an apology or verification-only report, do not ask the user to repeat the task, and do not emit a raw JSON dump unless explicitly requested. Answer in concise prose.',
|
|
1330
|
+
];
|
|
1331
|
+
|
|
1278
1332
|
export function createSessionPostureState(): SessionPostureState {
|
|
1279
1333
|
return createChatModeState();
|
|
1280
1334
|
}
|
|
@@ -1560,6 +1614,40 @@ export function resolveSessionTurnProfile(opts: {
|
|
|
1560
1614
|
};
|
|
1561
1615
|
}
|
|
1562
1616
|
|
|
1617
|
+
function isProactiveReconciliationFollowUp(userText: string): boolean {
|
|
1618
|
+
const referencesPrior = /(?:earlier|previous|prior|last|앞선|앞서|이전|직전|기존|그때|라고\s*(?:했|말)|이야기했|요청했)/i.test(userText);
|
|
1619
|
+
const referencesEvidence = /(?:answer|response|analysis|conclusion|tool|skill|source|evidence|답|응답|분석|결론|도구|툴|스킬|출처|근거)/i.test(userText);
|
|
1620
|
+
const asksToVerify = /(?:verify|recheck|check|confirm|validate|challenge|correct|used|맞|확인|검증|재확인|사용|사실|실제)/i.test(userText);
|
|
1621
|
+
return referencesPrior && referencesEvidence && asksToVerify;
|
|
1622
|
+
}
|
|
1623
|
+
|
|
1624
|
+
/** Preserve an active research turn's surface when the user challenges its prior evidence. */
|
|
1625
|
+
export function resolveSessionTurnProfileWithHistory(opts: {
|
|
1626
|
+
userText: string;
|
|
1627
|
+
priorUserTexts?: readonly string[];
|
|
1628
|
+
chatModeState: ChatModeState;
|
|
1629
|
+
inputSource?: InputSourceRef | null;
|
|
1630
|
+
}): SessionTurnProfile {
|
|
1631
|
+
const current = resolveSessionTurnProfile(opts);
|
|
1632
|
+
if (current.surface.domain === 'research' || !isProactiveReconciliationFollowUp(opts.userText)) return current;
|
|
1633
|
+
for (const priorUserText of [...(opts.priorUserTexts ?? [])].reverse()) {
|
|
1634
|
+
const prior = resolveSessionTurnProfile({
|
|
1635
|
+
userText: priorUserText,
|
|
1636
|
+
chatModeState: opts.chatModeState,
|
|
1637
|
+
inputSource: opts.inputSource,
|
|
1638
|
+
});
|
|
1639
|
+
if (prior.surface.domain === 'research') {
|
|
1640
|
+
return resolveSessionTurnProfile({
|
|
1641
|
+
userText: opts.userText,
|
|
1642
|
+
chatModeState: opts.chatModeState,
|
|
1643
|
+
preferredSurfaceId: prior.surface.id,
|
|
1644
|
+
inputSource: opts.inputSource,
|
|
1645
|
+
});
|
|
1646
|
+
}
|
|
1647
|
+
}
|
|
1648
|
+
return current;
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1563
1651
|
export function resolveSessionSurfaceStatus(opts: {
|
|
1564
1652
|
userText?: string;
|
|
1565
1653
|
chatModeState: ChatModeState;
|
|
@@ -1726,6 +1814,38 @@ function buildEssentialSessionRuntimeToolSpecs(opts: {
|
|
|
1726
1814
|
return [...nativeSpecs, ...hostSpecs, ...runtimeSpecs, ...mcpProxySpecs, ...optionalSpecs];
|
|
1727
1815
|
}
|
|
1728
1816
|
|
|
1817
|
+
/** Build the full TUI-visible catalog for Agent children. The parent model's
|
|
1818
|
+
* turn catalog is intentionally surface/tier narrowed; children inherit the
|
|
1819
|
+
* available TUI catalog instead, while `dispatchSessionRuntimeTool` remains
|
|
1820
|
+
* the policy boundary and `dispatchAgent` still strips recursive Agent. */
|
|
1821
|
+
export function buildSubagentSessionRuntimeToolSpecs(opts: {
|
|
1822
|
+
hostTools: readonly LLMToolDef[];
|
|
1823
|
+
runtimeTools: readonly ToolRuntime<Record<string, unknown>, ToolRunResult>[];
|
|
1824
|
+
optionalTools: readonly LLMToolSpec[];
|
|
1825
|
+
toolAvailability?: Readonly<Record<string, boolean>>;
|
|
1826
|
+
}): LLMToolSpec[] {
|
|
1827
|
+
const nativeSpecs = SESSION_NATIVE_TOOL_RULES.flatMap(rule => {
|
|
1828
|
+
const spec = rule.build();
|
|
1829
|
+
const catalogEntry = findNativeTool(spec.name);
|
|
1830
|
+
return (!catalogEntry || isNativeToolModelExposed(catalogEntry))
|
|
1831
|
+
&& isNativeToolAvailable(spec.name, rule, opts.toolAvailability)
|
|
1832
|
+
? [spec]
|
|
1833
|
+
: [];
|
|
1834
|
+
});
|
|
1835
|
+
const hostSpecs = opts.hostTools
|
|
1836
|
+
.filter(tool => isToolAvailable(tool.name, opts.toolAvailability))
|
|
1837
|
+
.map(toSpec);
|
|
1838
|
+
const runtimeSpecs = opts.runtimeTools
|
|
1839
|
+
.filter(tool => isToolAvailable(tool.spec.name, opts.toolAvailability))
|
|
1840
|
+
.map(tool => tool.spec);
|
|
1841
|
+
const optionalSpecs = opts.optionalTools
|
|
1842
|
+
.filter(tool => isToolAvailable(tool.name, opts.toolAvailability));
|
|
1843
|
+
return [...new Map(
|
|
1844
|
+
[...nativeSpecs, ...hostSpecs, ...runtimeSpecs, ...optionalSpecs]
|
|
1845
|
+
.map(spec => [spec.name, spec] as const),
|
|
1846
|
+
).values()];
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1729
1849
|
export function buildSessionRuntimeToolSpecs(opts: {
|
|
1730
1850
|
userText: string;
|
|
1731
1851
|
hostTools: readonly LLMToolDef[];
|
|
@@ -1736,6 +1856,7 @@ export function buildSessionRuntimeToolSpecs(opts: {
|
|
|
1736
1856
|
preferredSurfaceId?: SessionSurfaceId;
|
|
1737
1857
|
controlMode?: boolean;
|
|
1738
1858
|
}): LLMToolSpec[] {
|
|
1859
|
+
const catalogStartedAt = performance.now();
|
|
1739
1860
|
// TUI-DIET-D1-TAIL — the legacy userText-driven catalog (`rich !== false`) is gone;
|
|
1740
1861
|
// every caller already passed rich=false, so the essential catalog is the only path.
|
|
1741
1862
|
// The surface profile is still resolved for the always-on observation below.
|
|
@@ -1799,6 +1920,13 @@ export function buildSessionRuntimeToolSpecs(opts: {
|
|
|
1799
1920
|
userTextChars: opts.userText.length,
|
|
1800
1921
|
});
|
|
1801
1922
|
}
|
|
1923
|
+
try {
|
|
1924
|
+
debug.log('session-runtime.latency', 'tool-catalog-ready', {
|
|
1925
|
+
elapsedMs: Math.round((performance.now() - catalogStartedAt) * 10) / 10,
|
|
1926
|
+
toolCount: finalSpecs.length,
|
|
1927
|
+
surfaceId: surface.id,
|
|
1928
|
+
});
|
|
1929
|
+
} catch { /* observation must never delay a turn */ }
|
|
1802
1930
|
return finalSpecs;
|
|
1803
1931
|
}
|
|
1804
1932
|
|
|
@@ -2025,9 +2153,11 @@ export async function dispatchSessionRuntimeTool(
|
|
|
2025
2153
|
}
|
|
2026
2154
|
result = await nativeRule.dispatch(normalizedArgs, deps.signal, {
|
|
2027
2155
|
pathPolicy: deps.pathPolicy,
|
|
2156
|
+
sessionId: deps.sessionId,
|
|
2028
2157
|
agentHostTools: deps.agentHostTools,
|
|
2029
2158
|
agentDispatchTool: deps.agentDispatchTool,
|
|
2030
2159
|
buildChildToolCatalog: deps.buildChildToolCatalog,
|
|
2160
|
+
inheritGeneralPurposeToolCatalog: deps.inheritGeneralPurposeToolCatalog,
|
|
2031
2161
|
});
|
|
2032
2162
|
}
|
|
2033
2163
|
rememberCandidateListingResult(name, normalizedArgs, result, scopedAnalysis, deps.searchPlannerState);
|
|
@@ -226,7 +226,7 @@ export function providerNamesFromFallbackChain(chain: readonly string[]): string
|
|
|
226
226
|
const seen = new Set<string>();
|
|
227
227
|
for (const step of chain) {
|
|
228
228
|
// `codex-credits`(체인 마지막 칸 · 크레딧)도 provider 는 openai-codex 다 — 이미 앞에 있으면 중복이라 빠진다.
|
|
229
|
-
const name = step === 'grok' ? 'grok' : step === 'zai' ? 'glm'
|
|
229
|
+
const name = step === 'grok' ? 'grok' : step === 'zai' ? 'glm' : step === 'openrouter' ? 'openrouter'
|
|
230
230
|
: step === 'codex-rotate' || step === 'codex-credits' ? 'openai-codex' : undefined;
|
|
231
231
|
if (!name || seen.has(name)) continue;
|
|
232
232
|
seen.add(name);
|
|
@@ -325,7 +325,7 @@ function joinWithBlankLine(prefix: string, block: string): string {
|
|
|
325
325
|
|
|
326
326
|
function appendTextToMessage(msg: LLMMessage, block: string): LLMMessage {
|
|
327
327
|
if (typeof msg.content === 'string') {
|
|
328
|
-
return {
|
|
328
|
+
return { ...msg, content: joinWithBlankLine(msg.content, block) };
|
|
329
329
|
}
|
|
330
330
|
// ContentBlock[] — append to the LAST text block; if none exists,
|
|
331
331
|
// push a fresh one. Other block kinds (image / tool_use / tool_result)
|
|
@@ -336,11 +336,11 @@ function appendTextToMessage(msg: LLMMessage, block: string): LLMMessage {
|
|
|
336
336
|
if (b.type === 'text') {
|
|
337
337
|
const text = (b as { text?: string }).text ?? '';
|
|
338
338
|
blocks[i] = { ...b, text: joinWithBlankLine(text, block) };
|
|
339
|
-
return {
|
|
339
|
+
return { ...msg, content: blocks };
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
342
|
blocks.push({ type: 'text', text: block } as ContentBlock);
|
|
343
|
-
return {
|
|
343
|
+
return { ...msg, content: blocks };
|
|
344
344
|
}
|
|
345
345
|
|
|
346
346
|
/** Wave 2 W2.4 + W2.5 convenience — split specs AND inject the
|
|
@@ -168,6 +168,9 @@ export const AUXILIARY_AI_ENV_VARS: readonly AuxiliaryAiEnvVar[] = [
|
|
|
168
168
|
{ name: 'UPSTAGE_API_KEY', usedBy: 'document parse' },
|
|
169
169
|
] as const;
|
|
170
170
|
|
|
171
|
+
export { SERVICE_KEY_CATALOG, renderServiceKeyCatalogMarkdown } from './service-key-catalog.js';
|
|
172
|
+
export type { ServiceKeyCatalogEntry } from './service-key-catalog.js';
|
|
173
|
+
|
|
171
174
|
export function summarizeAuxiliaryAiEnv(
|
|
172
175
|
env: NodeJS.ProcessEnv = process.env,
|
|
173
176
|
): AuxiliaryAiEnvVar[] {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Service setup metadata shared by the CLI, runtime key loader, and manual. */
|
|
2
|
+
export interface ServiceKeyCatalogEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
kind: 'api-key' | 'subscription' | 'oauth' | 'cli' | 'local';
|
|
6
|
+
envNames: readonly string[];
|
|
7
|
+
setupUrl: string;
|
|
8
|
+
usedBy: string;
|
|
9
|
+
cost: 'account-plan' | 'usage-based' | 'plan-dependent' | 'local';
|
|
10
|
+
verification: string;
|
|
11
|
+
demoRequired: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SERVICE_KEY_CATALOG: readonly ServiceKeyCatalogEntry[] = [
|
|
15
|
+
{ id: 'codex', label: 'OpenAI Codex', kind: 'subscription', envNames: [], setupUrl: 'https://platform.openai.com/docs/codex/auth', usedBy: '씬 1 리서치 · 사이드탭 미션', cost: 'account-plan', verification: 'elanous auth status', demoRequired: true },
|
|
16
|
+
{ id: 'claude-code', label: 'Claude Code', kind: 'subscription', envNames: [], setupUrl: 'https://docs.anthropic.com/en/docs/claude-code/overview', usedBy: '씬 1 비교 · 사이드탭 미션', cost: 'account-plan', verification: 'claude auth status', demoRequired: true },
|
|
17
|
+
{ id: 'exa', label: 'Exa', kind: 'api-key', envNames: ['EXA_API_KEY'], setupUrl: 'https://dashboard.exa.ai/api-keys', usedBy: '씬 1 리서치 · 씬 2 흡수', cost: 'usage-based', verification: 'POST /search · 상태 코드만', demoRequired: true },
|
|
18
|
+
{ id: 'firecrawl', label: 'Firecrawl', kind: 'api-key', envNames: ['FIRECRAWL_API_KEY'], setupUrl: 'https://www.firecrawl.dev/app/api-keys', usedBy: '씬 2 흡수', cost: 'usage-based', verification: 'POST /v2/scrape · 상태 코드만', demoRequired: true },
|
|
19
|
+
{ id: 'xai', label: 'xAI / Grok API', kind: 'api-key', envNames: ['XAI_API_KEY', 'GROK_API_KEY'], setupUrl: 'https://console.x.ai/', usedBy: '씬 2 흡수 · Grok API', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: true },
|
|
20
|
+
{ id: 'tavily', label: 'Tavily', kind: 'api-key', envNames: ['TAVILY_API_KEY', 'TAVILY_KEY'], setupUrl: 'https://app.tavily.com/home', usedBy: '웹 검색 대체 경로', cost: 'usage-based', verification: 'POST /search · 상태 코드만', demoRequired: false },
|
|
21
|
+
{ id: 'openrouter', label: 'OpenRouter · GLM', kind: 'api-key', envNames: ['OPENROUTER_API_KEY'], setupUrl: 'https://openrouter.ai/keys', usedBy: 'GLM · OpenRouter 모델', cost: 'usage-based', verification: 'GET /api/v1/key · 상태 코드만', demoRequired: true },
|
|
22
|
+
{ id: 'linear', label: 'Linear API', kind: 'api-key', envNames: ['LINEAR_API_KEY'], setupUrl: 'https://linear.app/settings/api', usedBy: '씬 2 능동 비서', cost: 'plan-dependent', verification: 'GraphQL viewer · 상태 코드만', demoRequired: true },
|
|
23
|
+
{ id: 'telegram', label: 'Telegram bot', kind: 'api-key', envNames: ['ELANOUS_TELEGRAM_BOT_TOKEN'], setupUrl: 'https://t.me/BotFather', usedBy: '씬 2 · 씬 3 채널', cost: 'local', verification: 'getMe · 상태 코드만', demoRequired: true },
|
|
24
|
+
{ id: 'telegram-chat', label: 'Telegram chat ID', kind: 'api-key', envNames: ['ELANOUS_TELEGRAM_CHAT_ID'], setupUrl: 'https://core.telegram.org/bots/features#botfather', usedBy: '데모 알림 대상', cost: 'local', verification: 'getChat · 상태 코드만 · 미발송', demoRequired: true },
|
|
25
|
+
{ id: 'google-workspace', label: 'Google Workspace', kind: 'oauth', envNames: [], setupUrl: 'https://developers.google.com/workspace/guides/get-started', usedBy: 'Gmail · Drive 커넥터', cost: 'account-plan', verification: '로그인 상태 확인 · 토큰 미표시', demoRequired: false },
|
|
26
|
+
{ id: 'aside', label: 'Aside browser', kind: 'cli', envNames: [], setupUrl: 'https://github.com/elanous-ai/aside', usedBy: '브라우저 자동화', cost: 'plan-dependent', verification: 'aside status', demoRequired: true },
|
|
27
|
+
{ id: 'github', label: 'GitHub CLI', kind: 'cli', envNames: [], setupUrl: 'https://cli.github.com/', usedBy: '공개 저장소 · 개발 플러그인', cost: 'local', verification: 'gh auth status', demoRequired: true },
|
|
28
|
+
{ id: 'video-render', label: 'Video render', kind: 'local', envNames: [], setupUrl: 'https://ffmpeg.org/download.html', usedBy: '데모 하이라이트 렌더', cost: 'local', verification: 'ffmpeg -version', demoRequired: false },
|
|
29
|
+
{ id: 'openai-api', label: 'OpenAI API', kind: 'api-key', envNames: ['OPENAI_API_KEY'], setupUrl: 'https://platform.openai.com/api-keys', usedBy: 'OpenAI 모델 · Codex API-key 경로', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: false },
|
|
30
|
+
{ id: 'anthropic-api', label: 'Anthropic API', kind: 'api-key', envNames: ['ANTHROPIC_API_KEY'], setupUrl: 'https://console.anthropic.com/settings/keys', usedBy: 'Claude API', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: false },
|
|
31
|
+
{ id: 'gemini-api', label: 'Google Gemini API', kind: 'api-key', envNames: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'], setupUrl: 'https://aistudio.google.com/app/apikey', usedBy: 'Gemini 모델', cost: 'usage-based', verification: '모델 목록 · 상태 코드만', demoRequired: false },
|
|
32
|
+
{ id: 'opengateway', label: 'OpenGateway', kind: 'api-key', envNames: ['OPENGATEWAY_API_KEY'], setupUrl: 'https://apis.opengateway.ai/', usedBy: 'OpenAI 호환 모델 대체 경로', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: false },
|
|
33
|
+
{ id: 'supadata', label: 'Supadata', kind: 'api-key', envNames: ['SUPADATA_API_KEY'], setupUrl: 'https://supadata.ai/', usedBy: 'YouTube 자막', cost: 'usage-based', verification: '자막 API · 상태 코드만', demoRequired: false },
|
|
34
|
+
{ id: 'elevenlabs', label: 'ElevenLabs', kind: 'api-key', envNames: ['ELEVENLABS_API_KEY'], setupUrl: 'https://elevenlabs.io/app/settings/api-keys', usedBy: '음성 합성', cost: 'usage-based', verification: 'GET /v1/user · 상태 코드만', demoRequired: false },
|
|
35
|
+
{ id: 'brave-search', label: 'Brave Search', kind: 'api-key', envNames: ['BRAVE_API_KEY'], setupUrl: 'https://brave.com/search/api/', usedBy: '웹 검색 대체 경로', cost: 'usage-based', verification: '검색 API · 상태 코드만', demoRequired: false },
|
|
36
|
+
{ id: 'youtube-data', label: 'YouTube Data API', kind: 'api-key', envNames: ['YOUTUBE_API_KEY'], setupUrl: 'https://console.cloud.google.com/apis/credentials', usedBy: 'YouTube 메타데이터', cost: 'usage-based', verification: 'videos.list · 상태 코드만', demoRequired: false },
|
|
37
|
+
{ id: 'apify', label: 'Apify', kind: 'api-key', envNames: ['APIFY_TOKEN'], setupUrl: 'https://console.apify.com/account/integrations', usedBy: 'X 수집', cost: 'usage-based', verification: '사용자 API · 상태 코드만', demoRequired: false },
|
|
38
|
+
{ id: 'eodhd', label: 'EODHD', kind: 'api-key', envNames: ['EODHD_API_KEY'], setupUrl: 'https://eodhd.com/financial-apis/', usedBy: '시장 시세', cost: 'usage-based', verification: '시장 API · 상태 코드만', demoRequired: false },
|
|
39
|
+
{ id: 'fds', label: 'FDS market data', kind: 'api-key', envNames: ['FDS_API_KEY'], setupUrl: 'https://elanous.ai', usedBy: '시장 시세', cost: 'plan-dependent', verification: '연결 미니 호출 · 상태 코드만', demoRequired: false },
|
|
40
|
+
{ id: 'upstage', label: 'Upstage', kind: 'api-key', envNames: ['UPSTAGE_API_KEY'], setupUrl: 'https://console.upstage.ai/api-keys', usedBy: '문서 파싱', cost: 'usage-based', verification: '문서 API · 상태 코드만', demoRequired: false },
|
|
41
|
+
] as const;
|
|
42
|
+
|
|
43
|
+
export function renderServiceKeyCatalogMarkdown(): string {
|
|
44
|
+
const rows = SERVICE_KEY_CATALOG.map(item => `| ${item.id} | ${item.label} | ${item.kind} | ${item.envNames.join(', ') || '로그인/설치'} | ${item.setupUrl} | ${item.cost} | ${item.usedBy} | ${item.verification} | ${item.demoRequired ? '씬 사용' : '선택'} |`);
|
|
45
|
+
return ['| id | 서비스 | 인증 | 환경 이름 | 설정 위치 | 비용 유형 | 사용처 | 최소 확인 | 판정 |', '|---|---|---|---|---|---|---|---|---|', ...rows].join('\n');
|
|
46
|
+
}
|